説明すること
- GCR での権限エラーの概要
- GCS のバケットレベルについて
- GCR でのイメージの保存方法について
GCR での権限エラーの概要
起きたこと
- あるアプリチームは GCR にイメージを push できるのに、その他のアプリチームは push する Service Account に
storage.object.get
権限の付与しないと push ができない
前提と設定内容
- GCR を作成するプロジェクトは、全アプリチームで共有している
- GitLab Runner でビルドをして GCR への push を行っている
- 各アプリチームは共通のベースイメージを使用している
- GitLab Runner を悪用したイメージの抜き出しなどを防ぐため、カスタムロールを使用している
・storage.buckets.list
・storage.buckets.update
・storage.objects.create
・storage.objects.list
・storage.objects.update
- 各アプリチームで使用している GitLab Runner 用の Service Account の権限は同じで、各アプリチームで Service Account を作成している
- GCR に使用している GCS のバケットレベルは
きめ細かい
で設定されている
参考 Configuring access control | Container Registry documentation
原因
- 各アプリチームが共通のベースイメージを使用していること
- GCR に使用している GCS のバケットレベルが
きめ細かい
で設定されていること
GCS のバケットレベルについて
均一
- 推奨設定
- IAM を使用して権限を管理
- プロジェクトとバケットの単位で権限の付与が可能
・プロジェクトに付与した場合は、プロジェクト内のすべてのバケット内のオブジェクトに権限が適用
・バケットに付与した場合は、バケット内のすべてのオブジェクトに権限が適用
きめ細かい
- IAM と ACL を併用して権限を管理
- バケットとオブジェクトの単位で権限の付与が可能
参考
均一なバケットレベルのアクセス | Cloud Storage | Google Cloud
アクセス制御リスト(ACL) | Cloud Storage | Google Cloud
GCR でのイメージの保存方法について
- GCR ではイメージの各レイヤをオブジェクトとして保存している
GCR で使用している GCS のオブジェクト情報
❯ gsutil ls gs://artifacts.***.appspot.com/containers/images gs://artifacts.***.appspot.com/containers/images/sha256:98b8dcda0fb41835ba02407af3cb7f7a35b4711f5ccf8cf11c51d67fbc93fa3c gs://artifacts.***.appspot.com/containers/images/sha256:a0d0a0d46f8b52473982a3c466318f479767577551a53ffc9074c9fa7035982e gs://artifacts.***.appspot.com/containers/images/sha256:c7cdd7fd0b959dc9152ecf3c6ca05700427e6f12ebce2327376c228b0708467d
- きめ細かいバケットレベルのバケットにオブジェクトを作成した場合、以下の ACL がオブジェクトに付与される (GCR で使用しているかは問わない)
・entity がproject
の ACL :事前に ACL を定義しなかった場合、デフォルトで付与
・entity がuser
の ACL:アップロードしたユーザがOWNER
となる ACL を付与(削除ができない)
各レイヤのオブジェクトの ACL
❯ gsutil acl get gs://artifacts.***.appspot.com/containers/images/sha256:98b8dcda0fb41835ba02407af3cb7f7a35b4711f5ccf8cf11c51d67fbc93fa3c [ ①{ "entity": "project-owners-10738****2048", "projectTeam": { "projectNumber": "10738****2048", "team": "owners" }, "role": "OWNER" }, ②{ "entity": "project-editors-10738****2048", "projectTeam": { "projectNumber": "10738****2048", "team": "editors" }, "role": "OWNER" }, ③{ "entity": "project-viewers-10738****2048", "projectTeam": { "projectNumber": "10738****2048", "team": "viewers" }, "role": "READER" }, ④{ "email": "kaneko@3-shake.com", "entity": "user-kaneko@3-shake.com", "role": "OWNER" } ]
参考
アクセス制御リスト(ACL)の作成と管理 | Cloud Storage | Google Cloud
GCR と GCS での見え方の違い
GCR にて2つのリポジトリを作成し、同じイメージを push した場合
GCR から見るとリポジトリが別れているので、イメージも分けて管理しているように見える
しかし、実際は同じ GCS バケットで管理をしている
- 共通のイメージを使用している場合は、最初に push した Service Account にオブジェクト(レイヤ)の
OWNER
権限が付与される
・最初に push した Service Account は繰り返し同じイメージを使用することができる - 他の Service Account にて既に push されているレイヤを使用する場合は、バケット及びオブジェクトの
get
権限がない状態で push をしようとするため権限エラーとなる