エラーの概要
GitLab の 403 エラーは、認証済みのユーザーがプロジェクトやリソースへのアクセス権限を持たないときに返されるアクセス拒否エラーです。認証自体は成功していますが、実行しようとしたアクション(プッシュ、マージリクエストの作成、設定変更など)の権限がないことを示します。GitLab での権限管理はロールベースアクセス制御(RBAC)に基づいており、プロジェクトメンバーシップ、グループ設定、ブランチ保護ルールなどの複数の層で管理されるため、原因の特定には段階的な確認が必要です。
実際のエラーメッセージ例
$ 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:保護ブランチの設定により特定ロールのプッシュが禁止されている
main や production など、重要なブランチは通常「保護ブランチ」として設定されます。この設定で「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 エラーが発生します。トークン生成時に api、read_api、write_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
# 認証情報を再入力
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 インスタンスの管理者に権限設定の内容を確認します。
免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。
この記事でエラーは解決しましたか?