各種セキュリティガイドライン等ではクラウドに限らず、最小権限での運用を推奨しています。
しかし実際に運用に十分な適切な権限を設計するのは思いの外、難しいものです。
弊社ではクラウド基盤としてGoogle Cloudを利用しているため、Google Cloudで最小権限での運用をするための取り組みについて紹介したいと思います。
基本的な方針
本番環境では開発者には、利用しているサービスの閲覧権限のみ付与しています。
障害対応等で必要な場合にのみ、編集権限を一時的に付与する運用をしています。
この運用の際に、問題になるのは下記のようなものが考えられます。
- 深夜の障害対応等で権限が付与できるメンバーに連絡が取れず、必要な権限が付与されず、対応が遅れてしまう
- 一時的に権限を付与する想定なのに、権限を外すのを忘れたために、長期間過剰な権限が付与されたままになっていた
Google Cloudではこのようなケースに対応するための機能として、IAM Conditionsがあります。
IAM Conditions
Google CloudのIAMでは、条件付きのアクセス制御を設定することができます。
ドキュメントの通り、条件にはリソース名やリソースタイム、リソースに紐づけられたタグ等、柔軟に条件を設定することができます。設定した条件に一致する場合にのみ、その権限でのアクセスが許可されます。
条件の一つとして、アクセス時間が設定できます。
request.time < timestamp("2021-01-01T00:00:00Z")
この条件により、設定した日時までの間、付与した権限でのアクセスを許可することが可能になります。 設定した日時を超えた場合にはその権限でのアクセスは拒否されます。 弊社ではこの条件を利用して、一時的な権限付与を実現しています。
実際の運用
弊社での実際の運用は下記のような流れになります。
- 権限付与のためのRepositoryをGitHubに用意
- 開発者は一時的な権限付与をPRの形式で作成
- PRがApproveされ、マージ
- マージされたタイミングで、Cloud BuildでIAMに条件付きアクセスとともに権限を付与
PRにはテンプレートを用意しており、下記を記載してもらうようにしています。
- アクセス期限
- 目的
PRベースの申請のため、自然に過去の申請履歴がGitHub上に残るようになります。またPR時に目的を記載してもらうようにしているため、監査時に目的外利用をしていないかをチェックすることができます。
権限を付与している期間が限定的なため、監査もその期間のログをチェックするだけで済み、監査の負担も大幅に減らすことができます。
注意点
一時的な権限は期限が過ぎたとしても、自動的に削除されない
IAMに条件付きアクセス権限を付与した際に、アクセス期限が過ぎたとしても、自動的には削除されません。
そのため、付与していくたびに利用されなくなった不要なアクセス権限が残り続けることになります。
そのため、弊社では定期的に実行されるCloud Build Triggerを用意して、不要なアクセス権限を都度削除するようにしています。
利用するgcloud コマンドに注意
弊社では、Cloud Buildからgcloud コマンドを利用して、IAMに一時的な権限を付与しています。 gcloud コマンドにはIAMを設定できる方法が複数存在します。
gcloud projects set-iam-policy ...(引数、オプションは省略)
gcloud projects add-iam-policy-binding ...(引数、オプションは省略)
set-iam-policy
はすべてを上書きするコマンドのため、安易に利用すると、既存の権限全てが上書きされてしまいます。上書きの対象には自動的に付与される各種サービスアカウントも含まれるため、もし上書きした場合には復旧するのはかなり手間がかかります。
add-iam-policy-binding
は追記する形式で権限を付与するために、set-iam-policy
よりは安全に利用できます。
利用するコマンドはそれぞれの動作を確認の上、適切なものを選択することが重要になります。
まとめ
Google Cloudを最小権限で運用するための取り組みについて紹介しました。
通常は閲覧権限のみを付与しておき、必要に応じて、より強い権限を期限付きで付与する運用により最小権限での運用を実現しています。
またGitHubのPRを申請に用いることで、自動的に申請履歴や目的を残すことができます。このことにより監査時の負荷も減らすことができます。
最小権限を実現するための運用は他にも様々な方法があるとは思います。今回の方法が参考になれば幸いです。