AWS STSを使ってみる


STSとは...

AWS Security Token Serviceの略称で、一時的な認証情報を発行。
認証情報として、「アクセスキー」、「シークレットキー」、「セッショントークン」の3つが発行されるが、
あくまで期限付きで一時的に権限を付与する用途で用いられる。

STSで権限付与を行うためには、以下IAMユーザとIAMロールが必要になる。
これらはお互いに同じアカウントに所属していても、違うアカウントに所属していても良い。

  1. 権限を引き受けるIAMユーザ
  2. 付与する権限の塊であるIAMロール

また、それぞれが下記のポリシー/信頼関係を持つ必要がある。(ロールには、実際にユーザが使いたい権限(EC2操作など)も付与)

既存の下記ポリシーをAssume RoleするIAMユーザへ追加する

1.権限を引き受けるIAMユーザに付与するポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::<アカウントID>:role/<Assume RoleするIAMロール名>"
            ]
        }
    ]
}

ロール作成時に「信頼関係」を編集。IAMユーザからのAssume Roleを引き受けるために信頼関係を定義

2.付与する権限の塊であるIAMロールに付与する信頼関係
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<アカウントID>:user/<Assume Role実行するIAMユーザ名>"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

ロールがユーザに権限を付与する最大制限時間はロールの下記の部分から指定可能である。 (1時間〜12時間まで)。
後続の②のduration-secondではこの時間の範囲内で時間指定可能。

この状態でSTSが下記のユースケースで可能。

①IAMユーザでAWSコンソールログイン状態でスイッチロールが可能

②IAMユーザのクレデンシャル情報をセットしたEC2などでAsuume Roleを実行してAWS CLI/SDKで利用

AssumeRole実行前
# aws ec2 describe-instances

An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.
AssumeRole実行
# aws sts assume-role \
>   --role-arn          arn:aws:iam::<アカウントID>:role/sts_role \
>   --role-session-name sts-session \
>   --duration-second   900 \
>   --profile          default

{
    "AssumedRoleUser": {
        "AssumedRoleId": "xxxxxxxxxxxxxx:sts-session", 
        "Arn": "arn:aws:sts::<アカウントID>:assumed-role/sts_role/sts-session"
    }, 
    "Credentials": {
        "SecretAccessKey": "xxxxxxxxxxxxxxxxxxxx", 
        "SessionToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
        "Expiration": "2020-02-29T03:29:34Z", 
        "AccessKeyId": "xxxxxxxxxxxxxxxxxxxx"
    }
}

AssumeRole実行後

# export AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxxx"
# export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxx"
# export AWS_SESSION_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# aws ec2 describe-instances
→duration-secondで指定した期間は実行可能

→duration-secondで指定した期間外は実行不可能
「An error occurred (RequestExpired) when calling the DescribeInstances operation: Request has expired.」