Q32 — AWS SAA-C03 第17章

第 32/89 問 | ← 第17章

Q1332. ある会社は、AWSアカウントAでAWS Lambda関数を使用しています。また、AWSアカウントBでAmazon S3バケットを管理しています。アカウントAのLambda関数は、アカウントBのS3バケット内のオブジェクトを読み取る必要があります。ソリューションアーキテクトは、クロスアカウントアクセスのためのセキュアなソリューションを設計し、最小権限の原則を維持する必要があります。これらの要件を満たすソリューションはどれですか?

正解: A. アカウントBに、必要なS3アクセス許可とアカウントAとの信頼関係を持つIAMロールを作成します。Lambda関数がこのIAMロールを引き受けるように設定します。

解説

正解: A アカウントBに、必要なS3アクセス許可とアカウントAとの信頼関係を持つIAMロールを作成し、Lambda関数がこのIAMロールを引き受けるように設定します。 なぜこのソリューションが最適か? このアプローチは、アカウントAのLambda関数によるアカウントBのS3バケットへの安全なクロスアカウントアクセスを実現しつつ、最小権限の原則を厳守します。その理由は以下の通りです。 ・アカウントB(リソース所有アカウント)におけるIAMロール S3バケットを所有するアカウントBにロールを作成することで、アクセス許可の細かい制御が可能になります。このロールには、s3:GetObjectやs3:ListBucketなど、必要な最小限のS3アクセス許可のみ付与されます。 ・アカウントAとの信頼関係 ロールの信頼ポリシーでは、明示的にアカウントA(またはアカウントAのLambda実行ロール)がこのロールを引き受けられることを許可します。 例(信頼ポリシー): { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::ACCOUNT_A_ID:role/LambdaExecutionRole"}, "Action": "sts:AssumeRole" } ] } ・Lambda関数によるロールの引き受け アカウントAのLambda関数は、AWS Security Token Service(STS)を用いて、アカウントBのクロスアカウントロールを引き受けます。そのためには、Lambdaの実行ロールが、そのクロスアカウントロールに対してsts:AssumeRoleを呼び出す権限を持っている必要があります。 例(Lambda実行ロールの許可): { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::ACCOUNT_B_ID:role/CrossAccountS3AccessRole" } ] } ・セキュリティと最小権限 ・ハードコードされた資格情報は不要:IAMロールは一時的なセキュリティトークンを利用するため、長期的な認証情報の管理リスクがありません。 ・最小限の権限:アカウントAのLambda関数のみがこのロールを引き受けられ、かつS3アクセスに限定されます。 ・監査可能性:すべてのクロスアカウントアクセスはAWS CloudTrailで記録され、追跡可能です。 他の選択肢が不適切な理由: B:ロールをアカウントA(リソース所有者ではないアカウント)に作成するのは誤りです。また、アカウントBにIAMユーザーを作成するのは、長期的な資格情報を導入することになり、最小権限の原則に反します。 C:IAMユーザーは長期的な資格情報を伴うため、セキュリティリスクが高く、サーバーレス環境では非推奨です。さらに、手動での資格情報管理が必要となり、過剰な複雑さと最小権限違反を招きます。 D:Lambda関数は実行ロールを用いてロールを引き受けるべきであり、IAMユーザーを介する必要はありません。これは不要な複雑さを追加し、AWSのベストプラクティスから逸脱します。 最終的な推奨: 選択肢Aは、クロスアカウントS3アクセスにおいて、最もセキュアでスケーラブルかつAWSネイティブなソリューションです。 実装手順: ・アカウントB(S3バケット所有者):  – S3アクセス許可(s3:GetObject、s3:ListBucketなど)を持つIAMロール(例:CrossAccountS3AccessRole)を作成。  – このロールの信頼ポリシーに、アカウントAのLambda実行ロールからの引き受けを許可する設定を追加。 ・アカウントA(Lambda所有者):  – Lambda実行ロールに、クロスアカウントロールに対するsts:AssumeRole許可を付与。  – Lambda関数がS3にアクセスする際に、このクロスアカウントロールを引き受けるよう設定。 ・アクセステスト:  – Lambda関数からsts:AssumeRoleを呼び出して一時的な資格情報を取得。  – その資格情報を用いて、アカウントBのS3バケットからオブジェクトを読み取り。 これにより、ハードコードされた資格情報を使わず、セキュアかつ最小権限に基づくクロスアカウントアクセスが実現されます。