この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ちゃだいん(@chazuke4649)です。
IAMロールによるアクション実行者を特定しやすくする、"ソースID属性"(Source identity attribute)が使えるようになりました!
何が嬉しいの?
今回新しくソースID属性(Source identity attribute)が追加されました。端的にいうと、これによってCloudTrailでAPIアクティビティを調査する際、IAMロールアクションの本当の実行者の特定が容易になります。
似たようなものとして「セッションタグ」や「ロールセッション名」がありますが、「ソースID」がこれらと異なる点として、ソースIDはロールセッションの中で変更できず、そのロールセッションで行われるあらゆるアクションに対して保持されます。ロールチェーン(IAMロールが別のIAMロールにAsuumeRoleすること)も対象です。
(追記)図解の匠より、超わかりやすいイメージ図をもらったので追加します。要はこういうことがまとめられています。
設定方法の概要やできることは以下の通りです。
- IAMユーザー:
sts:AssumeRole
以外にsts:SetSourceIdentity
も許可する - IAMロール:
condition
で"StringEquals": {"sts:SourceIdentity": "IAMUserName"
を加える - CLI
aws sts assume-role
時に--source-identity
を指定する - CloudTrail
sourceIdentity
でクエリできる
詳細はぜひ公式ドキュメントを参照ください。
Monitor and control actions taken with assumed roles - AWS Identity and Access Management
注意点
スイッチロールは未対応
現時点でソースID属性はマネジメントコンソールによるスイッチロールでは使えません。AWS CLIやAWS SDKによる`AssumeRole`API経由時のみ使用できます。
やってみた
それでは実際にやってみます。
基本的には以下ドキュメントのサンプルを参考にします。
Monitor and control actions taken with assumed roles - AWS Identity and Access Management
1.IAMユーザーの作成
IAMコンソールからIAMユーザーを作成します。
- IAMユーザー名:
TestUserForSourceID
- IAMポリシー:以下に記載
そのIAMユーザーに以下ポリシーTestPolicyForSourceID
を作成します。ドキュメントのサンプルほぼそのままです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AssumeRole",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::123456789012:role/TestRoleForSourceID"
},
{
"Sid": "SetAWSUserNameAsSourceIdentity", // アンダーバーがあると怒られたので取り除いています
"Effect": "Allow",
"Action": "sts:SetSourceIdentity",
"Resource": "arn:aws:iam::123456789012:role/TestRoleForSourceID",
"Condition": {
"StringLike": {"sts:SourceIdentity": "${aws:username}"}
}
}
]
}
ここで最新機能ならではな事象がありましたが、どうやら現時点ではまだIAMポリシーチェック機能でsts:SourceIdentity
は未対応のようなので、当該文言箇所にエラーが表示されます。
エラーを気にせずそのままポリシーは作成し、IAMユーザーにアタッチします。
2.IAMロールの作成
IAMロールを作成します。
- IAMロール名:
TestRoleForSourceID
- 信頼ポリシー:以下に記載
- IAMポリシー:
AmazonS3FullAccess
IAMロールを一度作成してから、信頼ポリシーを以下に修正します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowDevUserAssumeRole",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/TestUserForSourceID"
},
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity"
],
"Condition": {
"StringEquals": {
"sts:SourceIdentity": "TestUserForSourceID"
}
}
}
]
}
準備は以上です。
3.AWS CLIで試す
AWS CLIで試すには、SourceIdentiyパラメータをサポートした最新の2.1.37
へアップグレードする必要があります。
2.1.37 api-change:sts: This release adds the SourceIdentity parameter that can be set when assuming a role.
aws-cli/CHANGELOG.rst at v2 · aws/aws-cli
最新バージョン2.1.37
のCLIにアップグレードします。
% aws --version
aws-cli/2.1.37 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off
aws configure
コマンドでIAMユーザーのアクセスキーを登録します。以下結果です。
% aws sts get-caller-identity
{
"UserId": "EXAMPLEL7QQ5H2YISVC",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/TestUserForSourceID"
}
assume-role
を行います。
サンプルでは--source-identity
パラメータにてIAMユーザー名を指定する必要があります。
まずは、パラメータなしでコマンドを実行してみます。
% aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/TestRoleForSourceID \
--role-session-name Dev-project
An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::123456789012:user/TestUserForSourceID is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/TestRoleForSourceID
上記の通り、エラーになりました。
では、当該パラメータを指定してコマンドを実行してみます。
% aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/TestRoleForSourceID \
--role-session-name Dev-project \
--source-identity TestUserForSourceID \
{
"Credentials": {
"AccessKeyId": "EXAMPLEEXAMPLE",
"SecretAccessKey": "EXAMPLEugCP8+PN2Ly8tulICprEXAMPLE",
"SessionToken": "EXAMPLEluX2VjEKT//////////wEaDmFwLW5vcnRoZWFzdC0xIkYwRAIgH1HBvbUDUHyXtd4VXT2n40tJrSEtdk8ekTKQR
<中略>
9I+mtAcUh6ThhgW6nz2efqY6QmMVgDOWIkh0Sg8RoYeDtBFA==",
"Expiration": "2021-04-15T05:14:36+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "EXAMPLEVTJGYYOJF:Dev-project",
"Arn": "arn:aws:sts::123456789012:assumed-role/TestRoleForSourceID/Dev-project"
},
"SourceIdentity": "TestUserForSourceID"
}
上記の通り、IAMロールの一時認証情報を取得することができました。
上記を環境変数に設定します。
$ export AWS_ACCESS_KEY_ID=EXAMPLEAAAAAA
$ export AWS_SECRET_ACCESS_KEY=EXAMPLEAAAAAA
$ export AWS_SESSION_TOKEN=EXAMPLEAAAAAA<中略>AAAAAAAA
一時認証情報を設定しました。
% aws sts get-caller-identity
{
"UserId": "EXAMPLEVL7QVTJGYYOJF:Dev-project",
"Account": "123456789012",
"Arn": "arn:aws:sts::123456789012:assumed-role/TestRoleForSourceID/Dev-project"
}
それではS3コマンドが実行できるかどうか試してみます。
% aws s3 ls
2020-02-14 16:17:57 20190717-handson-minilake-chadain
2021-04-06 17:43:43 alb-logs-123456789012
2021-03-06 18:58:06 amplify-boyaki-production-123456-deployment
% aws s3 mb s3://testbucket-for-sourceid
make_bucket: testbucket-for-sourceid
上記の通り、S3コマンドを実行することができました。
4.CloudTrailイベントを確認する
CloudTrailで確認してみましょう。
今回CreateBuckets
のEventNameで当該イベントを探します。
すると以下の通り、新しい属性sourceIdentity
が追加されたCloudTrailイベントを確認できました。
{
"eventVersion": "1.08",
"userIdentity": {
"type": "AssumedRole",
"principalId": "EXAMPLE7QVTJGYYOJF:Dev-project",
"arn": "arn:aws:sts::123456789012:assumed-role/TestRoleForSourceID/Dev-project",
"accountId": "123456789012",
"accessKeyId": "EXAMPLEEXMAPLES5MW",
"sessionContext": {
"sessionIssuer": {
"type": "Role",
"principalId": "EXAMPLEEXAMPLE",
"arn": "arn:aws:iam::123456789012:role/TestRoleForSourceID",
"accountId": "123456789012",
"userName": "TestRoleForSourceID"
},
"webIdFederationData": {},
"attributes": {
"mfaAuthenticated": "false",
"creationDate": "2021-04-15T04:14:36Z"
},
"sourceIdentity": "TestUserForSourceID"
}
},
"eventTime": "2021-04-15T04:23:19Z",
"eventSource": "s3.amazonaws.com",
"eventName": "CreateBucket",
...以下省略...
CloudTrailコンソールのイベント履歴ではまだ絞り込むことはできませんが、Athenaで簡単にクエリできそうです。
4.マネジメントコンソールからスイッチロールしてみる
ドキュメントにはコンソール上でスイッチロールすることはできないと書いてあったので、試してみました。
すると、やはり以下の通り、エラーがでてスイッチロールできませんでした。
終わりに
CLIやSDKによるIAMロール使用者を特定する、制御する新しい機能が追加されました。スイッチロールできない点は注意が必要ですが、うまく活用すれば、CLIやSDKレベルのアクション時の匿名性回避・実行者特定に役立ちそうです。
それではこの辺で。ちゃだいん(@chazuke4649)でした。