エラーの概要

GitLab の 403 エラーは、認証済みのユーザーがプロジェクトやリソースへのアクセス権限を持たないときに返されるアクセス拒否エラーです。認証自体は成功していますが、実行しようとしたアクションプッシュ、マージリクエストの作成、設定変更など)の権限がないことを示します。GitLab での権限管理はロールベースアクセス制御(RBAC)に基づいており、プロジェクトメンバーシップ、グループ設定、ブランチ保護ルールなどの複数の層で管理されるため、原因の特定には段階的な確認が必要です。

実際のエラーメッセージ例

Git コマンドライン実行時:

$ git push origin feature-branch
remote: GitLab: You are not allowed to push code to this project.
fatal: unable to access 'https://gitlab.example.com/group/project.git/': The requested URL returned error: 403

GitLab Web UI のレスポンス

{
  "message": "403 Forbidden",
  "error": "You do not have permission to perform this action"
}

パイプラインや API 呼び出し時:

$ curl -H "PRIVATE-TOKEN: <your-token>" https://gitlab.example.com/api/v4/projects/123/issues
{"message":"403 Forbidden"}

よくある原因と解決手順

原因1:プロジェクトメンバーのロール権限が不足している

GitLab では、プロジェクトへのアクセスレベルが細分化されています。Guest(ゲスト)や Reporter(レポーター)ロールでは、コードプッシュやマージリクエストの承認などの重要な操作ができません。ユーザーが必要な操作を実行しようとしても、割り当てられたロール権限がなければ 403 エラーが発生します。

修正方法:

GitLab の Web UI から、対象プロジェクトSettings → Members に移動し、ユーザーのロールを Developer 以上に変更します。変更後、ユーザーはコードプッシュできるようになります。

# Developer ロール以上に昇格後、プッシュが成功
$ git push origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (5/5), 1.20 KiB | 1.20 MiB/s, done.
Total 5 (delta 2), reused 0 (delta 0), reused pack 0
remote: To create a merge request for main, visit:
remote:   https://gitlab.example.com/group/project/-/merge_requests/new?merge_request%5Bsource_branch%5D=main

原因2:グループレベルのアクセス制限(IP アドレスやメンバーシップ設定)

グループの管理者が IP アドレス制限を設定している場合や、グループのメンバーシップ設定により一部のユーザーがアクセスできない構成になっていると、403 エラーが発生します。これはプロジェクトメンバーであっても、グループレベルで制限されている場合に起こります。

修正方法:

グループの管理者が、Group → Settings → General → Permissions で IP 制限ルールを確認し、ユーザーのアクセス元 IP を許可リストに追加するか、制限を緩和します。または、VPN 経由でのアクセスを構成します。

# グループレベルの制限を解除/修正後
Group Settings:
  IP Restriction: <ユーザーの IP を許可リストに追加>
  Member Access: Public
  
# その後のアクセスが成功
$ git clone https://gitlab.example.com/restricted-group/project.git
Cloning into 'project'...
remote: Counting objects: 100% (50/50), done.

原因3:保護ブランチの設定により特定ロールのプッシュが禁止されている

mainproduction など、重要なブランチは通常「保護ブランチ」として設定されます。この設定で「Maintainer のみがプッシュ可能」と指定されていると、Developer ロールのユーザーが直接プッシュしようとしても 403 エラーが返されます。

修正方法:

プロジェクトSettings → Protected branches で、保護ブランチのルールを確認・修正します。Developer ロールプッシュ権限を付与するか、マージリクエストフローを使用する明示的なドキュメントを整備します。

# Settings → Protected branches での修正例
Protected Branches: main
  Allow push:
    - Maintainer (デフォルト) → Developer に変更
  Require code owner approval: true
  
# または、Developer はマージリクエスト経由で変更を提案
$ git push origin feature/my-changes
$ # GitLab Web UI からマージリクエストを作成

ツール固有の注意点

Personal Access Token(PAT)の権限スコープ

API自動化ツール経由で GitLab にアクセスする場合、Personal Access Token に適切なスコープが設定されていないと 403 エラーが発生します。トークン生成時に apiread_apiwrite_repository などのスコープを明示的に選択する必要があります。

# トークンのスコープが不足している場合
$ curl -H "PRIVATE-TOKEN: <token-without-api-scope>" \
  https://gitlab.example.com/api/v4/projects
{"message":"403 Forbidden"}

# 適切なスコープを持つトークンで実行
$ curl -H "PRIVATE-TOKEN: <token-with-api-scope>" \
  https://gitlab.example.com/api/v4/projects
[{"id": 1, "name": "project1", ...}]

Deploy Token と環境固有の権限

CI/CD パイプラインで Deploy Token を使用する場合、その Deploy Token が read_repository のみの権限では、パイプライン内でのプッシュ操作は 403 エラーになります。パイプライン内で成果物をプッシュバックする必要がある場合は、より高い権限を持つトークンか、環境変数経由で認証情報を管理する必要があります。

# .gitlab-ci.yml での Deploy Token 使用例
deploy_job:
  script:
    # read_repository のみでは以下は失敗(403)
    - git push origin results/
    # write_repository スコープを持つトークンが必要

それでも解決しない場合

1. GitLab インスタンスのシステムログを確認

管理者アカウントでアクセスできる場合、Admin → Logs から詳細なエラーログを確認します。プロジェクトレベルではなく、インスタンス全体の設定に問題がないか確認できます。

# ローカル GitLab インスタンスの場合
$ sudo tail -f /var/log/gitlab/gitlab-rails/production.log | grep "403"

2. ユーザー権限履歴を確認

Admin → Users から対象ユーザーを検索し、最後に権限が変更された時刻を確認します。権限変更直後であれば、セッションリセットするため一度ログアウトログインを試みます。

# Web UI でのログアウト・ログイン、または
$ git credential reject https://gitlab.example.com
$ git clone https://gitlab.example.com/group/project.git
# 認証情報を再入力

3. SSH キーHTTPS の切り替え

HTTPS 認証で 403 が続く場合、SSH キー認証に切り替えてみます。逆に SSH で 403 の場合は、HTTPS で試してください。

# SSH での接続試行
$ git clone git@gitlab.example.com:group/project.git
# または HTTPS
$ git clone https://gitlab.example.com/group/project.git

4. 公式ドキュメントと管理者への相談

GitLab の公式パーミッション ドキュメントで各ロールの正確な権限一覧を確認し、プロジェクト管理者または GitLab インスタンスの管理者に権限設定の内容を確認します。


免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。