やりたいこと
自社既存のIDP(Identity Provider)でシングルサインオンし、AWSのリソース(S3とか)へアクセスしたい
①、既存のIDPでIDとパスで認証
②、OKな場合、IDPがSAMLアサーションを返す
③、SAMLアサーションをAWS(Service Provider)に送信、(AssumeRoleWithSAMLのAPI呼び出し)
④、AWSのSTSがアサーションを検証し、OKな場合はロールを付与
⑤、ユーザーがリソースにアクセス
必要な設定
・IAMロールの作成:信頼されたエンティティタイプとして「SAML 2.0 フェデレーション」を選択、ユーザーが必要とする権限(例:EC2、S3など)に応じたポリシーを付与
・SAMLプロバイダーの作成:「プロバイダーの種類」として「SAML」を選択、自社IDPのSAMLメタデータをアップロード
・IDP側の設定:SAMLアサーション内の属性設定(AWS IAMロールのARNとSAMLプロバイダーのARNを指定)
AssumeRoleWithSAMLとは
AWSのSTS(Security Token Service)で提供されるAPIの1つで、SAML認証を使用して一時的なセキュリティクレデンシャルを取得し、AWSリソースへのアクセスを許可するために使われます。
このAPIは、IDプロバイダー(IdP)によって発行されたSAMLアサーションを受け取り、指定されたIAMロールに対して一時的なアクセスを付与します。
AssumeRoleWithSAML API呼び出しには、以下の主なパラメータが必要です。
・RoleArn (必須):
ユーザーが一時的に引き受けるIAMロールのARN(Amazon Resource Name)。
例: arn:aws:iam::123456789012:role/SAMLRole
・PrincipalArn (必須):
SAMLプロバイダーのARN。これは、AWS IAMに設定されたSAMLプロバイダーを指します。
例: arn:aws:iam::123456789012:saml-provider/YourProviderName
・SAMLAssertion (必須):
IDプロバイダーから取得したSAMLアサーションをBase64エンコードしたもの。このアサーションには、ユーザーの属性や権限が含まれます。
・Policy (任意):
このAPI呼び出しによって付与されるアクセス権限を制限するIAMポリシー(JSON形式)。これにより、ロールが持つポリシーに追加の制約をかけることができます。
・DurationSeconds (任意):
セッションの有効期間(秒)。最短900秒(15分)から最長43200秒(12時間)まで設定可能。デフォルトは3600秒(1時間)。
実装イメージ
import boto3
# STSクライアントを作成
sts_client = boto3.client('sts')
# AssumeRoleWithSAMLを呼び出し
response = sts_client.assume_role_with_saml(
RoleArn='arn:aws:iam::123456789012:role/SAMLRole',
PrincipalArn='arn:aws:iam::123456789012:saml-provider/YourProviderName',
SAMLAssertion='Base64EncodedSAMLAssertion',
DurationSeconds=3600
)
# 一時的なクレデンシャルの取得
credentials = response['Credentials']
print("AccessKeyId: ", credentials['AccessKeyId'])
print("SecretAccessKey: ", credentials['SecretAccessKey'])
print("SessionToken: ", credentials['SessionToken'])
参考サイト