Cloud Storageの公開アクセスの防止を適用する組織ポリシーを検証してみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
概要
Cloud Storageの組織ポリシーは以下表の通り2024年7月時点で7つあります。
今回は、Cloud Storage関連の組織ポリシーの中でもよく設定されることが多い公開アクセスの防止を適用するというポリシーを実際に適用してみて、挙動を確認してみました。
| ポリシー名 | 説明 | 制約 | 
|---|---|---|
| 公開アクセスの防止を適用する | Cloud Storage データが一般に公開されないようにする。allUsers と allAuthenticatedUsers にアクセス権を付与する ACL と IAM 権限を無効にしてブロックする | constraints/storage.publicAccessPrevention | 
| 詳細な監査ロギングモード | リクエストとレスポンスの両方を Cloud Audit Logs に含めるかどうか。SEC Rule 17a-4(f)、CFTC Rule 1.31(c)-(d)、FINRA Rule 4511(c) などのコンプライアンスが目標の場合は、この組織ポリシーをバケットロックと連携して使用することを強く推奨 | constraints/gcp.detailedAuditLoggingMode | 
| Cloud Storage - 認証タイプを制限する | Cloud Storage で組織のストレージ リソースへのアクセスが制限される認証タイプを定義する。サポートされる値は、USER_ACCOUNT_HMAC_SIGNED_REQUESTS と SERVICE_ACCOUNT_HMAC_SIGNED_REQUESTS | constraints/storage.restrictAuthTypes | 
| 保持ポリシー期間(秒) | Cloud Storage バケットに設定できる保持ポリシーの期間を定義する。許可期間のリストは、保持ポリシーを秒単位で表す、0 より大きい正の整数値として指定 | constraints/storage.retentionPolicySeconds | 
| 暗号化されていない HTTP アクセスを制限する | すべてのストレージ リソースへの HTTP(暗号化されていない)アクセスを明示的に拒否する | constraints/storage.secureHttpTransport | 
| 均一なバケットレベルのアクセスの適用 | バケットで、均一なバケットレベルのアクセスを使用することを必須とする | constraints/storage.uniformBucketLevelAccess | 
前提
今回の検証は以下の前提で行なっています。
- 組織ポリシーを操作できるロールを所持していること(組織の管理者など)
- 組織が作成されていること
- プロジェクトに対して組織ポリシーを設定する(親のポリシーをオーバーライドする)
公開アクセスの防止適用ポリシーを検証してみる
公開アクセスの防止適用ポリシーとは
| ポリシー名 | 説明 | 制約 | 
|---|---|---|
| 公開アクセスの防止を適用する | Cloud Storage データが一般に公開されないようにする。allUsers と allAuthenticatedUsers にアクセス権を付与する ACL と IAM 権限を無効にしてブロックする | constraints/storage.publicAccessPrevention | 
Cloud Storage の公開アクセスとは、 インターネット上の誰でも、Cloud Storage バケット内のオブジェクトにアクセスできる状態を指します。これは、例えば画像や動画などの静的コンテンツをウェブサイトやモバイルアプリで公開する場合などに便利な反面、意図せず機密情報が公開されてしまうリスクもあります。
公開アクセスを可能にしてしまうと、例えばバケットに保存した基幹システムなどの機密情報を意図せず公開してしまう危険性があり情報漏洩につながる可能性があります。ただし、Cloud Storageを用いて静的サイトをホスティングする場合には公開アクセスが必要なので一概に危険で不要な機能、というわけではありません。
当該組織ポリシーでは、一律公開アクセスを禁止にすることも、特定のタグを付与されたバケットは除外するということも可能です。
それでは実際に組織ポリシーを設定してみます。
まずは一律禁止にしてみる
IAMと管理>組織のポリシーを押下します。

画面下部のあたりのフィルタ欄にpublicAccessPreventionと入力します。入力するとconstraints/storage.publicAccessPreventionが表示されるのでクリックします。

Enforce Public Access Preventionをクリックします。

ポリシーの詳細が表示されるのでポリシーを管理をクリックします。

ポリシーのソースで親のポリシーをオーバーライドするをチェックします。オーバーライドすることでプロジェクトレベルで組織ポリシーを設定することができます。
新しいルールで、適用下のオンのラジオボタンをクリックしてポリシーを設定ボタンを押下します。

ステータスが適用済みとなっていれば無事適用成功です。

実際に確認してみる
Cloud Storageのコンソールからバケット作成をしてみてください。
リージョンなどを設定した後のオブジェクトへのアクセスを制御する方法を選択するの項目で、公開アクセスの防止欄でこのバケットに対する公開アクセス禁止を適用するがグレーアウトしてチェックされているのが確認できます。

何をしても、このチェックを外すことはできません(こ、これが組織の力・・・笑)
参考までに、組織ポリシー未適用の場合の同じ画面を下に示しますので比較してみてください。

一目瞭然ですね。組織ポリシー未適用の場合チェックを外すことができます(=公開できてしまう)。
バケット作成時に誤ってチェックを外してしまう可能性も当然あり得るので、公開するワークロードがない場合はこの組織ポリシーの適用を考えても良いと思います。
特定のバケットを除外して適用する
とはいえ、静的サイトをホスティングしているバケットがすでにあるということも当然あり得ます。
そんな時には特定のバケットを除いて適用するということもできます。
方法としてはタグを用いることになります。タグを使用すると、リソースに特定のタグが付加されているかどうかに基づいて、条件付きでポリシーの許可や拒否を行うことができます。
それでは実際にタグを設定してバケットを作成して、ポリシーに除外条件を設定します。
タグを作成する
IAMと管理メニューのタグを押下してタグキーに適当な値を入力します。
入力後はタグの値の下の値を追加を押下します。

タグの値も適当な値を入力したらタグキーを作成を押下します。
作成されたタグをクリックすると、タグの詳細を見ることができます。

タグキー IDとタグ値IDをこの後使うので控えておきます。
組織ポリシーに指定タグを除外する条件を追加する
タグを作成したら、先ほどの組織ポリシー一覧画面でconstraints/storage.publicAccessPreventionを検索してポリシー管理画面に遷移します。
画面下部のルールの追加を押下します。

オフのラジオボタンを選択して、条件を追加を押下します。

条件の編集が表示されるので演算子のところを値IDがあるを選択し、先ほどのタグのキーIDと値IDを貼り付けます。

設定できたら保存ボタンを押下して、ルールの編集の完了も押下します。そしてポリシーを設定を押下すると指定タグが付与されたバケットは組織ポリシー適用が除外されるようになります。

設定を見るとルール1とルール2が存在します。ルール2に関してはこの記事で最初に設定した、オフにする設定で、ルール1がタグを除外する設定となります。
確認してみる
確認する前に、まず対象のバケットに組織ポリシー適用から除外するため、先ほど作成したタグが付与されている必要があります。Cloud Storageバケットへのタグの設定は以下のコマンドで実施します。
gcloud resource-manager tags bindings create --tag-value="タグ値のパス" --parent=//storage.googleapis.com/projects/_/buckets/バケット名 --location=asia-northeast1
--tag-valueはタグ値の詳細ページのタグ値のパスを入力してください。バケットへのタグ設定については詳しくはこちらのリファレンスをご確認ください。
※2024/8/7追記 手順に記載漏れがございました。大変失礼しました。ご指摘いただきありがとうございました。
タグの値をバケットに設定後、バケットを公開状態(バケットの公開アクセスの防止を非適用)に更新する必要があります。
 gcloud storage buckets update gs://バケット名 --no-public-access-prevention
上記コマンドを発行することでバケットの公開アクセスの防止が非適用となります。
組織ポリシーを設定しただけではこの設定はされることがないので自身で実行する必要があります。
タグの設定、公開アクセスの防止を非適用にするをバケットに実施できたのでCloud Storageのコンソールから確認してみます。
今回はあらかじめ、2つのバケットを用意していました。1つはタグを設定したもの、もう1つはタグを設定していないもの。
まずはタグを設定していないバケットを公開してみます。
権限タブから権限の追加を押下して、プリンシパルの追加でallUsersと入力します。

そうすると以下のメッセージが出力され、allUsersを追加することはできません。
このバケットには組織ポリシーによって公開アクセスの防止が適用されているため、プリンシパル allUsers と allAuthenticatedUsers を追加することはできません。
これは組織ポリシーで設定しているので当然です。続いて、今度はタグを設定したバケットで同じようにallUsersを追加してみます。

警告メッセージも何も表示されず、allUsersの追加やロールの設定ができました。また、このまま公開することもできます(検証する際はよく検討の上実施してください)
上記により、組織ポリシーのタグを用いることで適用対象外にできるということが確認できました。
簡潔にまとめると以下になります。
| 組織ポリシーの対象 | 公開設定 | |
|---|---|---|
| タグありバケット | 対象外(除外される) | 公開にできる | 
| タグなしバケット | 対象 | 公開にできない | 
期待通りの動作を確認できてよかったです。
おわりに
組織ポリシーはリファレンスが少々難解で、とっつきづらい側面もあるかも知れません。が、理解して設定すれば運用上とても安全になる仕組みでもあったりするので必要なものはどんどん取り入れていきたいと考えます。また別の組織ポリシーも試してみたいと思っているので、その時は記事にしてみます。それではまた。











