GitLab UIからの署名されたコミット
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed、GitLab Dedicated
この機能の利用は機能フラグによって制御されます。詳細については、履歴を参照してください。この機能はテストには利用できますが、本番環境での使用には適していません。
GitLab UIを使用してコミットを作成する場合、コミットはユーザーが直接プッシュするわけではありません。代わりに、ユーザーの署名入りでコミットが作成されます。
これらのコミットに署名するために、GitLabはインスタンス用に設定されたグローバルキーを使用します。GitLabはユーザーのプライベートキーにアクセスできないため、作成されたコミットは、ユーザーのアカウントに関連付けられたキーを使用して署名できません。
たとえばユーザーAが、ユーザーBが作成した提案を適用すると、コミットには次のものが含まれます:
Author: User A <a@example.com>
Committer: GitLab <noreply@gitlab.com>
Co-authored-by: User B <b@example.com>前提条件
GitLab UIのコミット署名を使用する前に、設定する必要があります。
グループまたはプロジェクトのWebベースコミット署名をオンにする
- 提供形態: GitLab.com
グループ内のすべてのプロジェクト、または個々のプロジェクトに対して、Webベースコミット署名をオンにできます。
Webベースコミット署名がオンになっている場合、GitLab UI(Webエディタ、Web IDE、およびマージリクエスト)を介して行われたすべてのコミットは、インスタンスの設定済み署名キーで自動的に署名されます。
グループの場合
前提条件:
- グループのオーナーロールが必要です。
グループ内のすべてのプロジェクトに対してWebベースコミット署名をオンにするには、次の手順を実行します:
- 上部のバーで、検索または移動先を選択して、グループを見つけます。
- 設定 > リポジトリを選択します。
- 一般を展開します。
- Webベースコミットに署名チェックボックスを選択します。
グループ内のプロジェクトは、この設定を継承します。
プロジェクトの場合
前提条件:
- プロジェクトのメンテナーまたはオーナーロールが必要です。
プロジェクトは、すでにWebベースコミット署名がオンになっているグループに属してはなりません。グループ設定がオンの場合、プロジェクトのチェックボックスは使用できません。
プロジェクトのWebベースコミット署名をオンにするには、次の手順を実行します:
- 上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > リポジトリを選択します。
- 一般を展開します。
- Webベースコミットに署名チェックボックスを選択します。
コミットのコミッターフィールド
Gitでは、コミットには作成者とコミッターの両方があります。Webコミットの場合、Committerフィールドは設定可能です。このフィールドを更新するには、GitLab UIコミットの署名設定を参照してください。
GitLabは、Committerフィールドがコミットを作成したユーザーに設定されていることに依存する、複数のセキュリティ機能を提供します。例:
- プッシュルール: (
Reject unverified usersまたはCommit author's email)。 - マージリクエスト承認の防止。
コミットがインスタンスによって署名されている場合、GitLabはこれらの機能のためにAuthorフィールドに依存します。
REST APIを使用して作成されたコミット
REST APIを使用して作成されたコミットも、Webベースのコミットと見なされます。REST APIエンドポイントを使用すると、コミットのauthor_nameおよびauthor_emailフィールドを設定できるため、他のユーザーの代わりにコミットを作成できます。
コミット署名が有効になっている場合、APIリクエストを送信するユーザーとは異なるauthor_nameおよびauthor_emailを持つREST APIを使用して作成されたコミットは拒否されます。
トラブルシューティング
リベース後にWebコミットが署名解除される
ブランチ内の以前に署名されたコミットは、次の場合に署名解除されます:
- コミット署名は、GitLab UIから作成されたコミットに対して構成されています。
- マージリクエストは、GitLab UIからリベースされます。
これは、以前のコミットが変更され、ターゲットブランチの一番上に追加されるために発生します。GitLabはこれらのコミットに署名できません。
この問題を回避するには、ブランチをローカルでリベースし、変更をGitLabにプッシュして戻します。