Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

AWS IAM Userアクセスキーのローテーションを自動化しました

こんにちは。サービス基盤本部で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

ビジネス向けバックオフィス向け業務効率化ソリューション 『マネーフォワード クラウド』

お金の悩みを無料で相談 『マネーフォワード お金の相談』

だれでも貯まって増える お金の体質改善サービス 『マネーフォワード おかねせんせい』

くらしの経済メディア 『MONEY PLUS』