LoginSignup
3
0

Google Cloud (GCP) 権限昇格 JIT-Access

Last updated at Posted at 2023-12-21

こんにちは。

本記事は株式会社インティメート・マージャーのAdvent Calendar 2023の21日目の記事になります。

はじめに

Google Cloud(旧GCP)などのクラウドサービスを利用する上で「権限」というのは欠かせない要素の一つです。

もしこの権限を適切に設定していないと、悪意のある人物やプログラムにクラウド上のリソースを好き勝手使われて多額の請求を突きつけられてしまう可能性があります。

また、IPAの「情報セキュリティ10大脅威2023」の組織編の第9位にあるような「不注意による情報漏えい等の被害」の原因にも繋がることもあります。

これらのことから、組織でクラウドサービスを利用する上で権限を適切に設定することは最重要事項になってきます。

最小特権の原則(Principle of Least Privilege)

この権限を設定する上で守るべき原則というものがあり最小特権の原則といいます。一言で説明すると「脆弱性や情報漏洩を避けるために、余計な権限を与えるな」というものです。

また、これに似た言葉にNeed-to-knowの原則というものがあります。
この原則は「必要とする人にのみ権限を与えるべき」というものです。

ジャストインタイム・アクセス(Just In Time Access)

こうれらの原則を守るべくジャストインタイム・アクセス(JIT-Access)という概念があります。

Amazon Web Services(AWS)では以前からAssumeRoleSwitchRoleというJIT-Accessにあたる機能がありました。

しかし、最近までGoogle Cloudでは公式からそのような機能は提供されておらず、自前で実装するか以下のようなサードパーティ製のツールを利用するしかありませんでした。

Google Cloud公式JIT-Access

ところがちょうど1年ほど前にようやく公式からJIT-Accessを実現するためのコードがOSSで公開されました!

こちらのOSSは新サービスではないので自身のGoogle Cloudプロジェクト上のサーバレスなプラットフォーム(Cloud RunGoogle App Engine)で立ち上げる必要があります。

仕組みとしてはバージョン1.5.0の時点で以下のようになっており、とあるロールに関する適格アクセス権(権限昇格のための権限)を得ているユーザがJIT-Accessアプリケーションにリクエストすることで期限付きの権限を取得するというものです。

アプリケーション自体は、基本的にCloud Asset Inventoryからユーザの情報を取得し、適格アクセス権を持っていることを確認してからResource Manager経由で該当のロールを付与するというシンプルなものです。

必要な設定等

Cloud Runなどで動かす場合は、サービスアカウントを利用することが一般的であり上記の図からも分かる通り以下の2つの権限を先に付与しておく必要があります。

  • Cloud Asset Inventory関連: roles/cloudasset.viewer
  • Resouce Manager関連: roles/iam.securityAdmin

上記サービスアカウントは非常に強い権限を持つので「余計なキーは発行しない」などの対策をして管理には十分気をつけましょう。

Cloud Pub/Subに関してはドキュメントに記載の設定を行うことでPublishが可能になり、この設定を行う上で以下の権限が必要になります。

  • Cloud Pub/Sub関連: roles/pubsub.publisher

Cloud Loggingに関しては標準出力に出力しているだけなので特に権限設定は必要ありません。

また、公式ドキュメント内で出てくるIAM条件の

has({}.jitAccessConstraint)

という記載に関してはGoogle独自のCEL言語で書かれており一見よく分からないのですが、ドキュメントを読んでみたところ「empty mapに"jitAccessConstraint"というfieldが存在するか否か」という意味で常にFalseを返すための式でした。

また、以下のコードで適格アクセス権であることを判別しており、これを指定しないと(1)でのロール選択時に表示されません(余計なスペースは無視してくれています)。

/** Condition that marks a role binding as eligible for JIT access */
private static final Pattern JIT_CONDITION_PATTERN = Pattern
.compile("^\\s*has\\(\\s*\\{\\s*\\}.jitaccessconstraint\\s*\\)\\s*$");

上記のロールを選択して権限昇格することで、下記のように適格アクセス権とは別で期限付きの権限が付与されます。

image.png
image.png

まとめ

本記事ではGoogle Cloud上で権限管理を行う上で必須とも言える原則を守るためのツールを紹介しました。

また、初めて使う上で少し気になる部分を書き起こしてみました。
少しでも利用を検討されている方の参考になれば嬉しいです。

あとがき

ここまで読んでいただいてありがとうございました!

明日はついに弊社社長による生成AIを利用した競馬予想に関するお話です!
ぜひお楽しみに!!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0