AWSへアクセスする際は使用するIAMでは、ユーザー管理機能が提供されていますが、外部のIDプロバイダー(IdP)で管理されているユーザーにAWSへのアクセス許可を与えることが可能です。
IAMがサポートする外部IdPは以下の2つです。
- SAML 2.0 (Security Assertion Markup Language 2.0)
- OpenID Connect (OIDC)
外部IdPとしてAuth0を使用し、SAML 2.0での連携を行う方法を紹介します。
設定手順
- Auth0にユーザー追加
- Auth0にアプリケーションを作成
- IAMの外部IDプロバイダーを登録
- IAMロールを作成
- Auth0にルールを作成
Auth0にユーザー追加
Auth0の管理画面を開き、Auth0にユーザーを追加します。
Auth0にアプリケーションを作成
Applicationの管理画面へ移動します。Create Application
ボタンをクリックします。
任意のName
を入力し、アプリケーションのタイプとしてNative
を選択し、Create
ボタンをクリックします。
作成したアプリケーションのAddons
タブを選択し、SAML2
を選択します。
Usage
タブのIdentity Provider Metadata
のリンクをクリックし、メタデータファイルをダウンロードします。また、Identity Provider Login URL
に表示されているURLをコピーしておきます。
Settings
タブに移動し以下の内容を入力します。
- Application Callback URL
https://signin.aws.amazon.com/saml
- Settings
項目 | 値 |
---|---|
発行者URL | メタデータファイル内のEntityDescriptor 要素のentityID 属性 |
SSOサービスの場所 | メタデータファイル内のSingleSignOnService 要素のLocation 属性 |
{
"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
ボタンをクリックして保存します。
IAMの外部IDプロバイダーを登録
ここからはAWSのマネジメントコンソールで操作します。
IAMの管理画面のIDプロバイダ
メニューに移動し、プロバイダを追加
ボタンをクリックします。
プロバイダのタイプ
としてSAML
を選択し、任意のプロバイダ名
を入力します。メタデータドキュメントとして先程ダウンロードしたメタデータファイルをアップロードします。
プロバイダを追加
ボタンをクリックします。
登録後のプロバイダの詳細画面に発行者URL
とSSOサービスの場所
が表示されます。
IAMロールを作成
プロバイダの詳細画面のロールの割り当て
ボタンをクリックし、新しいロールを作成
を選択して次へ
ボタンをクリックします。
IAMロール作成画面に遷移します。
エンティティの種類やSAMLプロバイダーは自動で入力されます。プログラムによるアクセスとAWSマネジメントコンソールによるアクセスを許可する
を選択すると属性
と値
が自動入力されます。
次のステップ
ボタンをクリックします。
このさきは通常のIAMロール作成と変わりません。割り当てるポリシーを選択し、名前をつけてIAMロールを作成します。
Auth0にルールを作成
再度Auth0の管理画面に戻り、ルールを作成します。Rules
メニューに移動し、Create
ボタンをクリックします。
Empty rule
を選択します。
- Script
user.awsRole
はIAMロールのARN
とIDプロバイダーの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
にアクセスします。
ログインに成功するとAWSのマネジメントコンソールにアクセスが可能です。
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
ボタンからアクセスします。
ログイン後、SAML Responseが表示されます。Encoded SAML Response
をコピーし、samlresponse.log
としてファイルに保存します。
AWS CLIでaws sts assume-role-with-saml
を実行します。
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を取得する必要があるため、少し手間がかかることがわかりました。