みなさん、おはようございます。小寺です。
アクセスキーをローテ―トさせるのに今まで180日にしていたのですが、90日に変更しようと改めてキーローテーションに必要な作業をまとめてみました。

なぜ90日なのか?Security Hubの AWS基礎セキュリティベストプラクティス のIAM3.「IAM ユーザーのアクセスキーは 90 日以内にローテーションする必要があります」に準拠するためです!

アクセスキーの利用の大前提

AWS利用の大前提としてベストプラクティスは、アクセスキーのような長期的認証情報ではなく一時的なセキュリティ認証情報 (IAM ロール) を使用して、AWS アカウントのアクセスキーは作成しないようにします。
ただ、どうしてもアクセスキー以外で使えないサービスも中にはあるかもしれません。その場合は、IAMユーザーのアクセスキーを定期的に更新(変更)することが推奨です。
認証情報をローテーションすることによって、キーが流出した際のリスクを下げることが可能になります。

ここで、IAMのアクセスキーが必須となるシーンを少し考えてみます。アプリケーションからAWSやSAML2.0へアクセスするときは、たいていロールベースでのアクセス権付与ができそうです。ただ、接続先がオンプレミス等の場合はロール付与が仕組み的に難しいためアクセスキーを利用することもあるかもしれません。

アクセスキーのローテーションを行う仕組み

ローテーションを忘れずに、PDCAを回す方法を考えてみました。

(1)Secuity Hubから通知を出して、通知後に手動でアクセスキーの更新を行う
ここは、カレンダーにタスクとして登録しておくでも問題ないかもしれないです。
(2)GitHubのOSSとして公開されているGithub Revolverを使う
(3)AWS Organizations と AWS Secrets Manager を使用して、IAM ユーザーアクセスキーのローテーションを行う

手動でアクセスキーの更新を行う方法

アクセスキーの更新については、本番のサービス提供であれば、アプリケーションでのサービス提供を継続したまま更新したいですよね。
AWSマネジメントコンソール、CLI、APIから更新を行うことができます。アクセスキーは2つ保持できるので、1つ目が有効なまま、2つ目を作ってみます。

(1)対象のIAMユーザー名を選び、[セキュリティ認証情報] タブを選択します。

(2)Access keys セクションで、「アクセスキーを作成」 をクリックします。

(3)Access key best practices & alternatives ページで、その他、次への順にクリックします。

(4)タグを付けて「アクセスキーを作成」をクリックします。

(5)「アクセスキーが作成されました」メッセージが表示されます。

ここで、シークレット アクセスキーから、「表示」をクリックしてユーザーのシークレットアクセスキーの値を表示するか、「csv ファイルをダウンロード」 からCSVをダウンロードします。

※ファイルをダウンロードしたら情報が公開されないよう十分に注意して、対応を行いましょう。

(6)アクセスキーを確認すると、アクセスキー1、2が表示されていることが確認できます。

(7)新しいアクセスキーのみを使用して、アプリケーションが動作するかどうかを確認を行います。
動作確認で問題なければ、数日後に最初のアクセスキーの削除を行います。

GitHubのOSSとして公開されているGithub Revolverを使ってみる

YAMLでアクセスキーの発行元となるAWS IAM Userとそのアクセスキーの利用先のプラットフォームの指定を行うことができます。

OSSでGitHubに公開されています!!

用途としてはAWSのIAMユーザアクセスキーのローテーションをCircleCI や Terraform Cloudでの使うときにも当てはまります。
この場合、キーのローテーションに必要なタスクは次のとおりです。

・AWS IAMユーザのアクセスキーの発行
・アクセスキー利用先の入れ替え
・AWS IAMユーザの古いアクセスキーの入れ替え

上記のステップの自動化を行うことができます。

キーのローテーションには以下コマンドを使います。
evolver rotate --config rotations.yaml

IAM Roleでswitch roleするような運用にしておけば、ひとつのAWSアカウントの権限ですべてのIAM Userのキーローテーションを行うことができますね。

AWS Organizations と AWS Secrets Manager を使用して、IAM ユーザーアクセスキーをローテーションする

こちらの手順に従います!

この実装方法はAWS CloudFormation テンプレートを使います。GitHub IAM アクセスキーを自動的にローテーションするのに役立ちます。
細かいところは、AWS Lambda 関数を使ってローテーションを実装します!

こんなことが実現できます。
・既存のアクセスキーが 90 日経過すると、新しい IAM アクセスキーが生成されます。
・新しいアクセスキーは、AWS Secrets Manager にシークレットとして保存されます。リソースベースのポリシーでは、指定された IAM プリンシパルのみがシークレットにアクセスして取得できます。キーをOrganizations管理アカウントに保存することを選択した場合、Linked Accountのキーは全て管理アカウントに保存されます。
・新しいアクセスキーが作成された AWS アカウントの所有者のE メールアドレスに通知されます。
・以前のアクセスキーは 100 日前に非アクティブ化され、110 日経過すると削除されます。
・一元化された電子メール通知が AWS アカウント所有者に送信されます。

認証情報自体は個別のLinked Accountに保管したいので、こちらのアーキテクチャを採用します。

https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-rotate-iam-user-access-keys-at-scale-with-aws-organizations-and-aws-secrets-manager.htmlより引用

Lambda関数により、 すべての AWS アカウント ID、アカウント名、アカウント E メールのリストを AWS Organizations に問い合わせします。 新しいキーが生成されるとSecret Managerへ保管がされる仕組みです。

もし、アクセスキーの有効期限が切れている場合は、自動的にローテーションを行います。

まとめ

IAM 認証情報を定期的にローテーションすることで、侵害された IAM アクセスキーが AWS アカウントのコンポーネントにアクセスするのを防ぐので、アクセスキー使われている方はぜひローテーションをしていただければと思います。

手動から自動化までの方法を確認してみました。ご参考になれば幸いです。