2014-01-05

SalesforceからAWSにAssumeRoleWithSAMLをコールするときの注意点

この記事を参考にSalesforceからAWSにSAMLAssertionを投げて、AWSのコンソール画面にシングルサインオンするっていうのは出来たが、対象のRoleの一時的なAccessKeyIdやSecretAccessKeyを取得するためのAssumeRoleWithSAML のREST APIが通そうとしたところ、こんな感じのエラーが出てしまった。

<ErrorResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
  <Error>
    <Type>Sender</Type>
    <Code>AccessDenied</Code>
    <Message>Not authorized to perform sts:AssumeRoleWithSAML</Message>
  </Error>
  <RequestId>********-****-****-****-************</RequestId>
</ErrorResponse>

これはSSO用のロール作成で、[Grant Web Single Sign-On(WebSSO) access to SAML providers]のロールタイプを選んだ時に自動的に条件の"SAML:aud"にAWS ConsoleのSAML Endpointが設定されてしまうのが原因です。

"Condition": {
  "StringEquals": {
    "SAML:aud": "https://signin.aws.amazon.com/saml"
  }
}

CreateRole

SalesforceでSAMLアサーションを使ってAssumeRoleWithSAMLをコールする場合は

  1. ACS URLにVisualforce Page等のURLをセットして
  2. 開始URLにアクセス→設定したVisualforce Pageに画面遷移(HTTP-POST)
  3. 呼び出されたVisualforce PageからAssumeRoleWithSAMLをコール
という流れで、Visualforce PageからSAMLアサーションを送るので、"SAML:aud"はVisualforce PageのURLにしないといけません。

ということで、対象RoleのTrust Relationshipはこんな感じになります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "1",
      "Effect": "Allow",
      "Principal": {
        "Federated": "Input Your SAML Provider Arn"
      },
      "Action": "sts:AssumeRoleWithSAML",
      "Condition": {
        "StringEquals": {
          "SAML:aud": "https://signin.aws.amazon.com/saml"
        }
      }
    },
    {
      "Sid": "2",
      "Effect": "Allow",
      "Principal": {
        "Federated": "Input Your SAML Provider Arn"
      },
      "Action": "sts:AssumeRoleWithSAML",
      "Condition": {
        "StringEquals": {
          "SAML:aud": "Input Your SAML Visualforce Page(ACS URL)"
        }
      }
    }
  ]
}

あるいは"SAML:iss"は"https://[MyDomain].my.salesforce.com"でどちらのケースも変わらないので、これを設定するだけでもOKです。

このエントリーをはてなブックマークに追加