こんにちは。サービス基盤本部でPlatform SREとして全社共通のインフラ基盤を開発している @grezarjp というものです。私の所属しているチームが何をしているかについてはこちらの記事が詳しいです。
今回は、CI/CDのプラットフォームやTerraformなどで利用しているAWS IAM Userアクセスキーのキーローテーションを自動化して定期的なキーローテーションによるより安全なアクセスキーの運用を達成したのでご紹介したいと思います。
なお、この記事内でアクセスキーという用語を用いた場合は特に言及がない限りAWS IAM Userのアクセスキーを指すものとします。
大前提、アクセスキーは可能な限り持つべきでない
改めて言及する必要もないと思いますが、大前提として永続的なシークレットであるアクセスキーは漏洩のリスクやexpireのオペレーションなどを考えると可能な限り利用を避けるべきだと思います。
AWSのリソースに対する操作であればEC2やCodeBuildなどからAssume Roleで一時的なトークンを発行して利用したり、AWS外の環境であってもGitHub ActionsなどでOIDCでの認証が利用可能になったことから、セキュリティ的な観点からは永続的なアクセスキーを持つ必要がないこれらの方法が最初に検討されるべきです。
ただし、AWSやGitHub Actions外の環境からAWSのAPIを利用したいユースケースにおいては依然としてIAM Userのアクセスキーを利用した認証が必要になり、今回はそのようなケースにおいて利用されているアクセスキーのローテーションを自動化した事例となります。
キーローテーションに必要な作業
AWS Security Blogなどでも言及されていますが、アクセスキー自体の定期的なローテーションは漏洩時のリスク最小化などの観点からベストプラクティスとして推奨されているものです。しかしキーローテーションを自動化するとなればDeNAさんのAWS IAM Userアクセスキーローテーションの自動化という記事でも言及されているように多くのことを考える必要があります。最低でも
- アクセスキーの発行
- アクセスキーの利用先の環境でのシークレットの入れ替え
- 古いアクセスキーの削除
を行う必要があります。
実際、多くの現場ではキーローテーションやるべきだとわかっていてもその手間を考えると手が回っていないというところがほとんどではないでしょうか。
Revolverの紹介
結局、今回はアクセスキーのローテーションを自動化するためのツールを書きました。OSSとして公開しているのでどなたでも利用できます。
https://github.com/grezar/revolver
詳しい使い方はREADMEに記載していますが、YAMLでアクセスキーの発行元となるAWS IAM Userとそのアクセスキーの利用先のプラットフォームを指定することで、双方の環境でローテーションに必要な作業すなわち
- アクセスキーの発行 (AWS IAM Userでの作業)
- アクセスキーの利用先の環境でのシークレットの入れ替え (利用先のプラットフォームでの作業)
- 古いアクセスキーの削除 (AWS IAM Userでの作業)
を自動化できます。
- name: Example 1 from: provider: AWSIAMUser spec: accountId: abc123 username: xxx to: - provider: Tfe spec: organization: example-org1 workspace: example-ws1 secrets: - name: AWS_ACCESS_KEY_ID value: "{{ .AWSAccessKeyID }}" category: "env" - name: AWS_SECRET_ACCESS_KEY value: "{{ .AWSSecretAccessKey }}" category: "env" sensitive: true
インタフェースにはCLIを用意しているので社内では上記のようなYAMLを定義した上でGitHub Actionsで以下のコマンドを定期実行しています。
revolver rotate --config rotations.yaml
キーローテーションに成功した場合には以下のような出力が得られます。
なお、マネーフォワードではほぼすべてのAWS IAM Userはそれ専用のAWSアカウントに集約しており、各アカウントに用意したIAM Roleにswitch roleするような運用にしているため、ひとつのAWSアカウントの権限ですべてのIAM Userのローテーションを行えるようになっています。
ただし、これは同時に、アクセスキーをローテーション可能な権限、すなわちIAM Userのアクセスキーを発行できる権限がすべてのIAM Userの権限を持っていることと等しくなることを意味するため、非常に慎重に扱う必要があります。私達の場合は限られた人のみがアクセスできるGitHubリポジトリを用意し、そのリポジトリ内のGitHub ActionsでOIDCによる認証を用いたローテーションを行っています。
このようにして、マネーフォワードでは現在Revolverを使ってCircleCIとTerraform Cloudで利用しているAWS IAM Userアクセスキーのローテーションを行っています。CircleCIであればContextやProject Variables、Terraform CloudであればWorkspace Variablesに保存してあるアクセスキーの更新です。
今後の課題
Revolverはローテーション中にアクセスキーを削除するため、ローテーション中に何かしらの処理が走っていると途中でエラーになってしまうという問題があります。これを回避するためには
- アクセスキーの新規発行
- 利用先でのアップデート
と
- アクセスキーの削除
の処理を一定の間隔を空けて実行する必要があります。今の所マネーフォワードでは深夜に一回キーローテーションを実行する運用でこの問題を暫定的に回避しています。
また、以下のような課題も残っています。
- Revolver自体はAWS IAM Userに限らず様々なものを汎用的にシークレットのinputとして利用できるため、他のプラットフォームにも対応していきたい
- Revolverがassume roleに対応しておらず、複数アカウントのローテーションを扱う場合は不便(PRお待ちしています...)
まとめ
自分が書いたツールの紹介になってしまいましたが、アクセスキーのキーローテーションの事例としてどなたかの参考になれば幸いです。
引用
https://aws.amazon.com/jp/blogs/security/how-to-rotate-access-keys-for-iam-users/
https://engineering.dena.com/blog/2021/12/aws-iam-user-credential-auto-rotation/
マネーフォワードでは、エンジニアを募集しています。 ご応募お待ちしています。
【サイトのご案内】 ■Wantedly ■福岡開発拠点 ■京都開発拠点
【プロダクトのご紹介】 ■お金の見える化サービス 『マネーフォワード ME』 iPhone,iPad Android
■ビジネス向けバックオフィス向け業務効率化ソリューション 『マネーフォワード クラウド』