IAMユーザにアクセスキーの発行・削除権限を与えて、動作を確認してみる

IAMアクセスキーのローテーションをAWS CLIで実施してみました。
2022.06.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWSアクセスキーは、90日のローテーションが推奨されています。AWS Security Hubでもローテーションのルールがあります。

何らかのSaaSで使っているアクセスキーは、人間がローテーションせざるを得ないことが多いと思います。 しかし、自分たちで開発しているソフトウェアで利用している場合は、AWSアクセスキーのローテーションを自動化できるかも?と思ったので、動作を確認してみました。

AWSアクセスキーのローテーション自動化を推奨するものではありません。組織のルール、付与されている権限の内容、扱っている情報、などによって判断してください。

おすすめの方

  • AWSアクセスキーをプログラム等でローテーションしたい方

IAMユーザを作成する

アクセスキーの作成・削除の権限を付与します。また、実験用にS3バケットの一覧取得の権限も付与します。

CloudFormationテンプレート

iam.yaml

AWSTemplateFormatVersion: 2010-09-09
Description: IAM User Sample

Resources:
  User:
    Type: AWS::IAM::User
    Properties:
      UserName: accesskey-rotate-sample-user

  UserPoricy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: accesskey-rotate-sample-user-policy
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - s3:ListBuckets
              - s3:ListAllMyBuckets
            Resource: "*"
          - Effect: Allow
            Action:
              - iam:CreateAccessKey
              - iam:DeleteAccessKey
            Resource: !GetAtt User.Arn
      Users:
        - !Ref User

デプロイ

デプロイします。

aws cloudformation deploy \
    --template-file iam.yaml \
    --stack-name IAM-User-Sample-Stack \
    --capabilities CAPABILITY_NAMED_IAM

AWSアクセスキーの取得

アクセスキーを取得します。

aws iam create-access-key \
    --user-name accesskey-rotate-sample-user

動作確認

さきほど取得したアクセスキーを環境変数に設定します。

export AWS_ACCESS_KEY_ID=aaa
export AWS_SECRET_ACCESS_KEY=bbbb

S3バケットの一覧を取得できることを確認します。

aws s3 ls

新しいアクセスキーを発行したあと、このアクセスキーが使えなくなることを確認します。

IAMユーザのアクセスキーをローテーションする

新しいアクセスキーを取得する

新しいアクセスキーを取得します。

aws iam create-access-key \
    --user-name accesskey-rotate-sample-user

新しいアクセスキーが使えることを確認する

新しいアクセスキーを環境変数に設定します。

export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=yyy

新しいアクセスキーでS3バケットの一覧が取得できることを確認します。

aws s3 ls

古いアクセスキーを削除する

古いアクセスキーを削除します。これ自体は、新しいアクセスキーで実行します(さきほど新しいアクセスキーに切り替えています)。

aws iam delete-access-key \
    --access-key-id aaa \
    --user-name accesskey-rotate-sample-user

古いアクセスキーが使えないことを確認する

最初に取得したアクセスキーに切り替えます。

export AWS_ACCESS_KEY_ID=aaa
export AWS_SECRET_ACCESS_KEY=bbb

無事に使えなくなっています。

aws s3 ls

An error occurred (InvalidAccessKeyId) when calling the ListBuckets operation: The AWS Access Key Id you provided does not exist in our records.

さいごに

IAMユーザのアクセスキー更新をAWS CLIで試してみました。 AWS SDKでも可能なので、ユースケースによっては、アクセスキーのローテーションを自動化できそうです。

参考