メインコンテンツまでスキップ

外部IdPを使用してAWSにアクセスする(SAML 2.0編)

· 約7分
moritalous

AWSへアクセスする際は使用するIAMでは、ユーザー管理機能が提供されていますが、外部のIDプロバイダー(IdP)で管理されているユーザーにAWSへのアクセス許可を与えることが可能です。

ID プロバイダーとフェデレーション - AWS Identity and Access Management
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers.html

IAMがサポートする外部IdPは以下の2つです。

  • SAML 2.0 (Security Assertion Markup Language 2.0)
  • OpenID Connect (OIDC)

外部IdPとしてAuth0を使用し、SAML 2.0での連携を行う方法を紹介します。

設定手順

  1. Auth0にユーザー追加
  2. Auth0にアプリケーションを作成
  3. IAMの外部IDプロバイダーを登録
  4. IAMロールを作成
  5. Auth0にルールを作成

Auth0にユーザー追加

Auth0の管理画面を開き、Auth0にユーザーを追加します。

image.png

Auth0にアプリケーションを作成

Applicationの管理画面へ移動します。Create Applicationボタンをクリックします。

image.png

任意のNameを入力し、アプリケーションのタイプとしてNativeを選択し、Createボタンをクリックします。

image.png

作成したアプリケーションのAddonsタブを選択し、SAML2を選択します。

image.png

UsageタブのIdentity Provider Metadataのリンクをクリックし、メタデータファイルをダウンロードします。また、Identity Provider Login URLに表示されているURLをコピーしておきます。

image.png

Settingsタブに移動し以下の内容を入力します。

  • Application Callback URL
https://signin.aws.amazon.com/saml
  • Settings
項目
発行者URLメタデータファイル内のEntityDescriptor要素のentityID属性
SSOサービスの場所メタデータファイル内のSingleSignOnService要素のLocation属性
Settings
{
"audience": "<<発行者URL>>",
"destination": "<<SSOサービスの場所>>",
"mappings": {
"email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
"name": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
},
"createUpnClaim": false,
"passthroughClaimsWithNoMapping": false,
"mapUnknownClaimsAsIs": false,
"mapIdentities": false,
"nameIdentifierFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",
"nameIdentifierProbes": [
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
]
}
注記

発行者URLとSSOサービスの場所は後の手順でIAMの管理画面に表示されるのでそちらからコピーしてもOKです

入力後、画面下部のEnableボタンをクリックして保存します。

image.png

IAMの外部IDプロバイダーを登録

ここからはAWSのマネジメントコンソールで操作します。

IAMの管理画面のIDプロバイダメニューに移動し、プロバイダを追加ボタンをクリックします。

image.png

プロバイダのタイプとしてSAMLを選択し、任意のプロバイダ名を入力します。メタデータドキュメントとして先程ダウンロードしたメタデータファイルをアップロードします。 プロバイダを追加ボタンをクリックします。

image.png

登録後のプロバイダの詳細画面に発行者URLSSOサービスの場所が表示されます。

image.png

IAMロールを作成

プロバイダの詳細画面のロールの割り当てボタンをクリックし、新しいロールを作成を選択して次へボタンをクリックします。 IAMロール作成画面に遷移します。

image.png

エンティティの種類やSAMLプロバイダーは自動で入力されます。プログラムによるアクセスとAWSマネジメントコンソールによるアクセスを許可するを選択すると属性が自動入力されます。 次のステップボタンをクリックします。

image.png

このさきは通常のIAMロール作成と変わりません。割り当てるポリシーを選択し、名前をつけてIAMロールを作成します。

image.png

image.png

Auth0にルールを作成

再度Auth0の管理画面に戻り、ルールを作成します。Rulesメニューに移動し、Createボタンをクリックします。

image.png

Empty ruleを選択します。

image.png

  • Script

user.awsRoleIAMロールのARNIDプロバイダーのARN,で結合した文字列をセットします。

function (user, context, callback) {

user.awsRole = '<<IAMロールARN>>,<<IDプロバイダーARN>>';
user.awsRoleSession = user.name;

context.samlConfiguration.mappings = {
'https://aws.amazon.com/SAML/Attributes/Role': 'awsRole',
'https://aws.amazon.com/SAML/Attributes/RoleSessionName': 'awsRoleSession'
};

callback(null, user, context);

}
注記

ユーザーごとに異なるロールを割り当てることも可能です。詳細はこちらを参考にしてください。

設定は以上で完了です。

AWS環境へアクセス

AWS環境へアクセスします。

マネジメントコンソールでアクセス

まずはマネジメントコンソールでのアクセスを試してみましょう。 Auth0のSAML 2.0設定の際に取得したIdentity Provider Login URLにアクセスします。

image.png

ログインに成功するとAWSのマネジメントコンソールにアクセスが可能です。

image.png

CLIでアクセス

CLIでアクセスする際にはSAML Responseの文字列をが必要となります。Auth0のデバッグ機能を使用するとSAML Responseが取得できます。 デバッグ機能で取得したSAML Responseを使用してsts:AssumeRoleWithSAMLを実施するため、IAMロールの信頼関係にデバッグ機能のURLを追加します。

 {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::547194329427:saml-provider/Auth0-SAML"
},
"Action": "sts:AssumeRoleWithSAML",
"Condition": {
"StringEquals": {
- "SAML:aud": "https://signin.aws.amazon.com/saml"
+ "SAML:aud": [
+ "https://signin.aws.amazon.com/saml",
+ "https://manage.auth0.com/tester/samlp"
+ ]
}
}
}
]
}

デバッグ機能はこの画面のDebugボタンからアクセスします。

image.png

ログイン後、SAML Responseが表示されます。Encoded SAML Responseをコピーし、samlresponse.logとしてファイルに保存します。

image.png

AWS CLIでaws sts assume-role-with-samlを実行します。

shell
aws sts assume-role-with-saml \
--role-arn {IAMロールARN} \
--principal-arn {IDプロバイダーARN} \
--saml-assertion file://samlresponse.log
{
"Credentials": {
"AccessKeyId": "...",
"SecretAccessKey": "...",
"SessionToken": "...",
"Expiration": "..."
},
"AssumedRoleUser": {
"AssumedRoleId": "...",
"Arn": "..."
},
"Subject": "...",
"SubjectType": "...",
"Issuer": "...",
"Audience": "...",
"NameQualifier": "..."
}
注記

aws sts assume-role-with-samlリクエストを実行する際にAWSの認証情報は不要です。

AWS CLIで使用するCredentialsの取得ができました。 有効期限が切れた際には再度ブラウザでアクセスしSAML Responseを取得する必要があるため、少し手間がかかることがわかりました。