🗂

社内のIAMリソースを最適化してみた

2022/10/20に公開

初めまして、ポートのSREを担当している @yukionodera です。

突然ですが、AWSにおけるIAMリソースの管理、つい後回しにしていませんか?
自由度が高い反面、その複雑さから苦手意識を持っている方も多いと思います。
弊社でも、同じような理由でアプリ開発やインフラ構築が優先されてしまい、IAMリソースの管理が後回しになっていました。

しかし、IAMは数あるAWSリソースの中でも非常に重要度が高いリソースです。
また、煩雑なIAMリソースの管理は、アクセスキーの漏洩や外部からの不正アクセスの原因となり、下記のようなクリティカルな事象を引き起こしかねません。

  • 本番環境のサービス停止
  • 顧客データの漏洩
  • AWSサービスの濫用

今回は、IAMリソースの管理を簡潔にし、セキュリティリスクを低減するために、弊社で実施したことを解説していきます。

解説の前に

まずは前提として、弊社の状況と問題点からお伝えします。

弊社は現在、環境毎やプロジェクト毎に複数のアカウントを保有しています。
各アカウントには、それぞれIAMユーザーやグループ、ポリシーが存在し、権限が必要な社員にのみ、IAMユーザーを発行している状況です。
また、クロスアカウントアクセスには、Admin権限を付与したロールを使用していました。
そのため、下記のような問題がありました。

  • 最小権限の付与ができていない
  • 各アカウントのIAMリソースが一元管理できていない
  • アクセスキーのローテーションが定期的に実行できていない

アクセスキーのローテーションに関しては、管理者側で強制的に実行することができるものではありませんが、既存のローテーションの仕組みが少し複雑なこともあり、実行していない社員が多いのかなと思い、問題点として挙げました。

次のセクションでは、上記のような問題を解消するために実施したことをまとめていきます。

やったこと

弊社で実施したことは以下の2つです。

  • aws-vault の導入
  • アカウント管理の一元化

一つずつ説明していきます。

aws-vault の導入

まず手始めに、aws-vault を全体で導入しました。
公式ドキュメントはこちらです。

aws-vault は、AWS認証情報をよりセキュアに管理するためのOSSです。
これを利用することにより、平文管理となっていたアクセスキーを暗号化することが可能となりました。
また、アクセスキーのローテーションもコマンドひとつで完了します。

これにより、弊社では下記のようなメリットが享受できたと思います。

  • PC紛失時のセキュリティリスク軽減
  • アクセスキーのローテーション実行負荷の軽減

これでアクセスキーのローテーション実行率が上がるかどうかはわかりませんが、敷居はかなり低くなったので、管理者側からも催促しやすくなったところはよかったなと思っています。

蛇足ですが、弊社では aws-vault に加えて 1password-cli を併用しており、aws-cli 実行時のMFAログインの負担を軽減できるのでおすすめです。

アカウント管理の一元化

次に、アカウント管理の一元化です。
具体的には、下記のステップでIAMユーザーをルートアカウントに一元化しました。

  1. 全員分のIAM ユーザーをルートアカウントに作成
  2. 各アカウントで役割に応じたロールの作成
  3. ルートアカウントでのAssumeRole権限の付与

順を追って説明していきます。

まず、全社員分のIAMユーザーをルートアカウントに発行しました。
アカウント間で複数存在していたIAMユーザーやメンバーアカウントにしか存在しなかったIAMユーザーも含めて、全員分のIAMユーザーを作成しています。

次に、メンバーアカウントにて、developer, admin などの役割に応じてロールを作成しました。
これは、ルートアカウントのIAMユーザーからAssumeRoleでクロスアカウントアクセスを実現するためのロールになります。

最後に、ルートアカウントで作成したIAMユーザーに対して、所属Projectや役割によって適切なAssumeRole権限を付与しました。
弊社では、IAM グループに権限を付与し、グループ単位で権限管理をできるようにしました。

この構成にすることで、下記のメリットを実現しています。

  • 重複アカウントの排除
  • 開発者が管理すべきIAM ユーザーとクロスアカウントアクセス管理の一元化
  • メンバーアカウント側で役割単位での権限管理

まとめ

以上の工程により、当初想定していた下記の問題点に対してある程度対策できたのではないかと考えています。

  • 最小権限の付与ができていない
    • 権限付与の方法をロールベースに変更することで簡潔化
  • 各アカウントのIAMリソースが一元管理できていない
    • AssumeRoleを利用してルートアカウントで一元化
  • アクセスキーのローテーションが定期的に実行できていない
    • aws-vault によるプロセスの簡略化

今後は AWS SSO なども導入してユーザー管理を最適化することで、更なるセキュリティリスクと運用コストの軽減を進めていきたいと考えています。

参考

Discussion