パーソルキャリアの戸田です。
弊社ではデータの管理について厳密なポリシーが定められており、特にインターネットに公開されるデータについてはシビアなチェックがされます。 今回はGoogle Cloud のストレージサービスの1つであるCloud Storage のインターネット公開について対策を考えていきます。
Cloud Storage の公開アクセス
は静的ウェブサイトをホストするシーン等において非常に便利ですが、一方バケット内のデータはインターネット上から誰でもアクセス可能です。
そのため、公開されているバケットに意図せず機密データをアップロードすることで情報漏洩に繋がるリスクがあり、利用には最新の注意が必要です。
Google Cloud では「組織ポリシー」を利用することでCloud Storage の公開アクセスを制限することができるので、これにより「原則、公開アクセスを利用しない」で「例外として公開アクセスを利用する」環境となるようガードレールを整備していきます。
しかし弊社では既に公開アクセス
を利用したCloud Storage があるため、既存のCloud Storage は組織ポリシーを適用せずこれから作成されるものについては組織ポリシーの制御対象としたいです。
今回はこれらの要件を満たせるか検証してみます。
前提
組織ポリシーの制約constraints/storage.publicAccessPrevention
を利用することで組織全体にCloud Storage への公開アクセスを制限することができます。
組織ポリシーを設定したタイミングで、Organization 下の全てのCloud Storage の公開アクセスを非公開に変更します。また、新規の公開アクセスバケットの作成が制限されます。
しかし既存環境で公開アクセスを利用したバケットがサービスに組み込まれており、組織ポリシーを設定することで業務影響を与えてしまうこともあります。 そのため、下記の図のように特定のCloud Storage バケットのみ組織ポリシーの適用外にできるようにしたいです。
組織ポリシーには「タグを使用した組織のポリシーの設定」というものがあり、指定したタグが付与されたリソースを組織ポリシーの対象外にできると案内されていました。 今回はこの機能を用いて指定のタグを付与したCloud Storage バケットが組織ポリシーの対象外となるか検証します。
検証シナリオ
この検証では以下の順序で組織ポリシーを設定していきます。 便宜上、検証で利用する2つのCloud Storage バケットがデフォルトで公開アクセス可能とし、公開アクセスを維持するCloud Storage バケットを「バケットA」、組織ポリシーにより非公開バケットにしたい既存の公開アクセス可能なバケットを「バケットB」とします。
設定順序
- 事前準備
- Organization レベルで組織ポリシー用のタグを作成
- Project レベルでバケットA にタグを付与
- Organization レベルで組織ポリシーを設定
- デフォルトで適用
- 指定のタグが付与されたリソースは適用外
- 組織ポリシーの設定反映確認
- バケットA の挙動
- バケットB の挙動
期待する結果
- バケットA が公開アクセスを維持すること
- バケットB が組織ポシシーにより非公開になること
- 新規で公開アクセスの設定ができないこと
先に結論
- Organization レベルで組織ポリシーの
constraints/storage.publicAccessPrevention
を設定した場合、バケット単位でタグを使用した組織のポリシーの制御はできなかった - バケット単位でタグを使用した組織のポリシーの制御をしたい場合、Projects レベルで組織ポリシーの設定する必要がある
- Project 単位でタグを使用するとProject 配下のResource は組織ポリシーの適用対象外になる(らしい)
なんとも不思議な結果になりました。
検証
事前準備
検証に必要な環境の準備を行います。
1. Organization レベルで組織ポリシー用のタグを作成
Organization でタグを作成
タグのKey/Value は任意のもので大丈夫です。
組織ポリシーの設定でタグキー ID
とタグの値
を利用するので控えておきます。
2. Project レベルでバケットA にタグを付与
バケットA にサンプルファイルを追加
バケットA に先ほど作成したタグを付与
もちろんこの時点では公開アクセスが機能しているのでインターネットアクセス可能です。
バケットAと同様にバケットB を用意します。 こちらはタグを付けません。
もちろんこちらもアクセス可能。
ちなみにバケットの公開アクセスの防止が有効化されている場合、組織ポリシーの設定を受け付けないので、以下のコマンドで設定を更新しておく。
$ gcloud storage buckets update gs://BUCKET_NAME \ --no-public-access-prevention
3. Organization レベルで組織ポリシーを設定
組織ポリシーでは2つのルールを設定していきます。
1つ目のルールは指定のタグキーが付与されている場合に組織ポリシーを適用させないようにするものです。
前述で作成したタグキー ID
とタグの値
を指定し、適用
をオフ
にします。
2つ目のルールは適用です。
1つ目のルールの条件に当てはまらない場合は組織ポリシーを適用します。
設定は適用
をオン
にするだけです。
組織ポリシーの設定反映確認
以下の結果になることを期待し、組織ポリシーの設定反映を確認していきます。
- バケットA が公開アクセスを維持すること
- バケットB が組織ポシシーにより非公開になること
- 新規で公開アクセスの設定ができないこと
バケットA の挙動
タグによる制御が効かず、組織ポリシーが適用されてしまいました。
バケットA を見るとOrganization レベルで組織ポリシーを適用した直後で、公開アクセス
が非公開
となりました。
また、バケットA で新たに公開アクセスの設定をすることはできず、新規のバケット作成時にも制限がかかりました。
バケットB の挙動
バケットA と同様の挙動で、組織ポリシーが適用されバケットB は非公開
になりました。
こちらは想定通りの挙動です。
検証結果
Organization 配下の全てのProjects においてタグの有無に関わらず、組織ポリシーが適用されました。 タグによる部分的な組織ポリシーの適用制御はできませんでした。残念。
どういうことだったのか
サポートいただいているベンダーのテックサポートとGoogle Cloud のエンジニアの方に相談したところ、以下の回答がありました。
質問: ストレージバケットへの公開アクセス制御(storage.publicAccessPrevention)を、タグを用いて個別に制御できますか?
回答: タグによる
storage.publicAccessPrevention
の適用制御は、組織レベルでstorage.publicAccessPrevention
ポリシーが設定されていない場合に限り可能です。詳細: storage.publicAccessPreventionは、組織レベルで設定されると、その組織の下位にある全てのプロジェクトとバケットに継承され、一括で適用されます。そのため、組織レベルで設定済みの場合は、タグによる個別制御はできません。
組織レベルで設定されていない場合のみ、タグを用いた条件付きルールを作成し、タグに基づいてstorage.publicAccessPreventionを適用するバケットを個別に指定できます。
つまり下記のようにProjects レベルで個別に組織ポリシーを設定し、Project 配下のResources に対してタグを付与すれば組織ポリシーは制御可能ということでした。
おまけ
最近、有志の外部記事で「タグの設定をProject 単位にすれば制御可能」という情報を見かけました。 バケット単位での制御は出来ないものの、こちらの方がいくらか実用的かもしれませんね。
まとめ
Organization を管理する身としてはガードレールの整備として、既存プロダクトに影響のない形で組織ポリシーを継承していきたかったですが、中々うまくいきませんね。
もし「この方法ならいける!」というアイディアをお持ちの方おられましたらコメントいただけますと嬉しいです。
戸田 尚希 Naoki Toda
ITアーキテクチャ統括部 アーキテクチャ管理部 サービス共通基盤グループ リードエンジニア
2023/05 にパーソルキャリアに入社。クラウド大好き、アルパカがトレードマークです🦙
※2024年12月現在の情報です。