[アップデート] IAMロールによるアクション実行者を特定・制御できる、”ソースID属性”(Source identity attribute)が使えるようになりました!

ガチでIAMロールの真の実行者を特定・制御したいなら、このソースID属性を使うべし!
2021.04.15

ちゃだいん(@chazuke4649)です。

IAMロールによるアクション実行者を特定しやすくする、"ソースID属性"(Source identity attribute)が使えるようになりました!

AWS Identity and Access Management now makes it easier to relate a user's IAM role activity to their corporate identity

何が嬉しいの?

今回新しくソース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)でした。