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でも可能なので、ユースケースによっては、アクセスキーのローテーションを自動化できそうです。