イミュータブルコンテナタグ
- プラン: Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed
- ステータス: ベータ
イミュータブルタグを使用すると、プロジェクトでコンテナタグが更新または削除されるのを防ぐことができます。
デフォルトでは、少なくともデベロッパーロールを持つユーザーは、すべてのプロジェクトコンテナリポジトリでイメージタグをプッシュおよび削除できます。タグの不変性ルールを使用すると、次のことができます:
- 重要なイメージタグの変更を防ぎ、悪意のある変更や偶発的な変更のリスクを軽減します。
- プロジェクトごとに最大5つの保護ルールを作成します。
- プロジェクト内のすべてのコンテナリポジトリに保護ルールを適用します。
タグは、少なくとも1つの不変性保護ルールがタグの名前と一致する場合にイミュータブルになります。複数のルールが一致する場合、最も制限の厳しいルールが適用されます。
イミュータブルタグのルール:
- 作成のみ可能で、更新はできません
- クリーンアップポリシーでは削除できません。
保護タグとの比較
保護タグとイミュータブルタグはいずれもイメージの整合性を維持しますが、目的が異なります。
保護タグは、ロールに基づいて特定のタグを作成、更新、または削除できるユーザーを制限します。タグの不変性により、タグが作成されると、誰も更新または削除できなくなります。
以下の図は、イメージのプッシュのコンテキストで保護ルールがどのように評価されるかを示しています:
%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TD
accTitle: Evaluation of protected and immutable tag rules
accDescr: Flow chart showing the evaluation process for protected and immutable tag rules during an image push.
A[User attempts to push a tag] --> B{Protected tag check:<br/>Does user have required role<br/>to push this tag pattern?}
B -- Yes --> C{Does the tag already exist?}
B -- No --> D[Push denied:<br/>Protected tag - insufficient permissions]
C -- Yes --> E{Immutable tag check:<br/>Does tag match an<br/>immutable rule pattern?}
C -- No --> F[Tag is created successfully]
E -- Yes --> G[Push denied:<br/>Tag is immutable]
E -- No --> H[Tag is overwritten successfully]
シナリオ例
これらのルールを持つプロジェクトの場合:
- 保護タグのルール:
v.*パターンには、少なくともメンテナーロールが必要です。 - イミュータブルタグのルール:
v\d+\.\d+\.\d+パターンは、セマンティックバージョンタグを保護します。
| ユーザーロール | アクション | 保護タグのチェック | イミュータブルタグのチェック | 結果 |
|---|---|---|---|---|
| デベロッパー | 新しいタグプッシュv1.0.0 | 拒否 | 評価されません | プッシュは拒否されました。必要なロールがありません。 |
| メンテナー | 新しいタグプッシュv1.0.0 | 許可 | 評価されません | タグが作成されました。 |
| メンテナー | 既存のタグプッシュを上書きしますv1.0.0 | 許可 | 拒否 | プッシュは拒否されました。タグはイミュータブルです。 |
| メンテナー | 新しいタグプッシュv-beta | 許可 | 評価されません | タグが作成されました。 |
前提要件
イミュータブルコンテナタグを使用するには、コンテナレジストリが利用可能であることを確認してください:
- GitLab.comでは、コンテナレジストリはデフォルトで有効になっています。
- GitLabセルフマネージドでは、メタデータデータベースを有効にします。
イミュータブルルールを作成する
前提要件:
- オーナーロールを持っている必要があります。
イミュータブルルールを作成するには:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > パッケージとレジストリを選択します。
- コンテナレジストリを展開します。
- Protected container tags(保護されたコンテナタグ)で、保護ルールを追加するを選択します。
- 保護タイプで、変更不可を選択します。
- 一致するタグに対して変更不可のルールを適用するに、RE2構文を使用して正規表現パターンを入力します。パターンは100文字を超えてはなりません。詳しくは、正規表現パターンの例をご覧ください。
- ルールを追加するを選択します。
イミュータブルルールが作成され、一致するタグが保護されます。
正規表現パターンの例
コンテナタグを保護するために使用できるパターンの例:
| パターン | 説明 |
|---|---|
.* | すべてのタグを保護します。 |
^v.* | 「v」で始まるタグを保護します(v1.0.0やv2.1.0-rc1など)。 |
\d+\.\d+\.\d+ | セマンティックバージョンタグを保護します(1.0.0や2.1.0など)。 |
^latest$ | latestタグを保護します。 |
.*-stable$ | 「-stable」で終わるタグを保護します(1.0-stableやmain-stableなど)。 |
stable|release | 「stable」または「リリース」を含むタグを保護します(1.0-stableなど)。 |
イミュータブルルールの削除
前提要件:
- オーナーロールを持っている必要があります。
イミュータブルルールを削除するには:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > パッケージとレジストリを選択します。
- コンテナレジストリを展開します。
- Protected container tags(保護されたコンテナタグ)で、削除するイミュータブルルールの横にある削除( )を選択します。
- 確認プロンプトが表示されたら、削除を選択します。
イミュータブルルールが削除され、一致するタグは保護されなくなります。
伝播遅延
ルール変更は、サービス間で伝播するためにJSON Webトークンに依存します。その結果、保護ルールおよびユーザーアクセスロールへの変更は、現在のJSON Webトークンの有効期限が切れて初めて有効になる場合があります。遅延は、設定されたトークンの有効期間に相当します:
- デフォルト: 5分
- GitLab.com: 15分
ほとんどのコンテナレジストリクライアント(Docker、GitLab UI、APIなど)は、操作ごとに新しいトークンをリクエストしますが、カスタムクライアントはトークンをその完全な有効期間保持する場合があります。
イメージマニフェストの削除
GitLab UIとAPIは、イメージマニフェストの直接削除をサポートしていません。コンテナレジストリAPIコールを直接使用すると、マニフェストを削除すると、関連付けられているすべてのタグに影響します。
タグの保護を確実にするために、マニフェストの直接削除リクエストは、対応するプロジェクトにイミュータブルタグのルールがない場合にのみ許可されます。
この制限は、ルールパターンがコンテナイメージタグと一致するかどうかに関係なく適用されます。