GCR に push するときの権限周りの注意点

Yu Kaneko

2022.5.10

説明すること

  • 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
ドキュメント上での push と pull に必要な権限
  • 各アプリチームで使用している GitLab Runner 用の Service Account の権限は同じで、各アプリチームで Service Account を作成している
  • GCR に使用している GCS のバケットレベルは きめ細かい で設定されている

参考 Configuring access control | Container Registry documentation

原因

  1. 各アプリチームが共通のベースイメージを使用していること
  2. 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 をしようとするため権限エラーとなる

ブログ一覧へ戻る

お気軽にお問い合わせください

SREの設計・技術支援から、
SRE運用内で使用する
ツールの導入など、
SRE全般についてご支援しています。

資料請求・お問い合わせ