開発

GitLabのアクセストークン:種類の選び方と発行手順・スコープと有効期限の設定【2026年11月】

GitLabのアクセストークン:種類の選び方と発行手順・スコープと有効期限の設定【2026年11月】

GitLabのアクセストークンは、パスワードの代わりにGit操作やREST APIの認証へ使う文字列で、個人・プロジェクト・グループの3種類の区分です。この記事では、3種類の到達範囲の違いを整理したうえで、個人アクセストークン(従来型とfine-grained)とプロジェクト・グループアクセストークンの発行手順、17種のスコープの選び方、git cloneやcurlでの渡し方を示します。後半では有効期限365日の運用とrotate APIでの更新、CI/CDで個人トークンを使わない判断までが対象です。画面名と仕様は2026年11月時点の公式ドキュメントにもとづいています。

まとめ:GitLabのアクセストークンは用途で種類を決めスコープと期限を絞る

最初に決めるのはスコープではなく種類です。人が手元でcloneやAPIを試すなら個人アクセストークン、特定のプロジェクトだけを触る自動化ならプロジェクトアクセストークン、複数プロジェクトをまたぐ自動化ならグループアクセストークンを選びます。CIのジョブ内で完結する処理は、発行不要のCI_JOB_TOKENで足りることが多いです。

スコープは読み取りだけならread_apiやread_repositoryにとどめ、apiは書き込みが要る場合に限ります。有効期限の既定は作成日から365日で、期限が来たら延長はできず、rotateで新しい値に入れ替えます。GitLab.comのFreeではプロジェクト・グループアクセストークンが使えないため、自動化用の主体にはサービスアカウントを使うのが2026年11月時点の現実的な選択です。

GitLabのアクセストークンとは:個人・プロジェクト・グループの到達範囲の違い

3種類のアクセストークンの到達範囲・作成ロール・GitLab.comのプラン条件

3種類の違いは、誰の権限で動き、どこまで届くかです。個人アクセストークンは本人の権限で、本人が参加する全グループ・全プロジェクトに届きます。プロジェクトとグループのトークンは自動で作られるボットユーザーの権限で動き、届く範囲も対象に限られます。

種類 届く範囲 作成に必要なロール GitLab.comのプラン
個人 本人が参加する全体 本人 Free以上
プロジェクト 1プロジェクト Maintainer・Owner Premium以上
グループ グループと配下 Owner Premium以上

プラン条件はProject access tokensのドキュメントとGroup access tokensのドキュメントによります。Self-ManagedとDedicatedでは、どちらもライセンスの種類を問わず利用可能です。提供形態とプランの全体像は親記事のGitLabとは(構成要素・CEとEEの違い・3つの提供形態)で整理しています。

デプロイトークン・CIジョブトークン・サービスアカウントとの使い分け

GitLab token overviewには認証用の文字列が10種類以上並んでいます。アクセストークンの代わりに選ぶ機会が多いのは次の3つで、値の先頭の接頭辞で種類を見分けられます。

種類 接頭辞 APIで使えるか 向く用途
個人・プロジェクト・グループ glpat- 使える APIとGit操作全般
デプロイトークン gldt- 原則不可 本番サーバーのclone・pull
CIジョブトークン glcbt- 一部のみ ジョブ内のAPI・clone
サービスアカウント glpat- 使える 人に紐づかない自動化

Deploy tokensのドキュメントによると、デプロイトークンは既定で有効期限が無く、公開APIには使えません。名前をgitlab-deploy-tokenにして作ると、CIジョブにCI_DEPLOY_USERとCI_DEPLOY_PASSWORDが自動で渡されます。

個人アクセストークンを発行する手順:従来型とfine-grainedの画面操作

Legacy tokenを発行する画面の操作順と一度しか表示されない値の保管

従来型の個人アクセストークンは、2026年11月時点の画面ではLegacy tokenという名前で並んでいます。Personal access tokensのドキュメントの手順は次のとおりです。

  1. 右上のアバターからEdit profileを開く
  2. 左サイドバーでAccess > Personal access tokensを選ぶ
  3. Generate tokenのドロップダウンでLegacy tokenを選ぶ
  4. Token name(必須)とToken description(任意)を入れる
  5. Expiration dateを入れ、スコープを1つ以上選ぶ
  6. Generate tokenを押し、表示された値をすぐに保存する

値が表示されるのはこの1回だけです。保存先はパスワードマネージャーかシークレット管理の仕組みにし、チャットやIssueには貼りません。名前は公式の命名指針に沿って、testのような汎用名を避け、用途と環境が分かる形にします。SSH鍵の登録を含む初期設定の流れはGitLabの使い方(プロジェクト作成からIssue・MR・CI/CDまで)で追えます。

GitLab 19.2でGAのfine-grained PATのリソース別権限設定

スコープより細かく権限を絞りたいときはfine-grainedのトークンを使います。Fine-grained personal access tokensのドキュメントによると、GitLab 18.10でベータとして入り、19.2で一般提供になりました。Free・Premium・Ultimateのすべてで、GitLab.com・Self-Managed・Dedicatedのどれでも使えます。

発行はLegacy tokenと同じ画面で、Generate tokenのドロップダウンからFine-grained tokenを選びます。違うのは権限の指定方法で、Group and project accessで届く範囲を決め、Add resource permissionsのGroup and project・User・Globalの各タブでリソースごとに作成・読み取り・更新・削除のどれを許すかを選びます。リクエストが通るのは、トークンの権限と所有者本人の権限の両方を満たすときだけです。19.2の他の変更点はGitLab 19.2で変わる開発運用にまとめています。

Self-Managedで管理者がfine-grainedを強制すると、強制日以降はLegacy tokenの作成とローテーションができなくなるため、新規発行はfine-grainedに寄せておきます。

プロジェクト・グループアクセストークンの発行とボットユーザーの仕組み

Settings > Access tokensのロール・スコープ指定と作成API

プロジェクトアクセストークンは、対象プロジェクトの左サイドバーでSettings > Access tokensを開き、Add new tokenから名前・有効期限・ロール・スコープを指定して作ります。グループアクセストークンも、グループ側の同じ名前の画面で同じ項目を入れます。ロールはボットユーザーに与える権限で、読み取りだけの自動化ならReporter、MRの作成やpushまでするならDeveloperが目安です。

プロジェクトが多いときはProject access tokens APIで作るほうが漏れません。作成のリクエストは個人アクセストークンで認証する必要があり、プロジェクトアクセストークン自身では新しいトークンを作れません。

# GITLAB_TOKEN は api スコープの個人アクセストークン(Maintainer 以上の人が発行したもの)
GITLAB=https://gitlab.example.com/api/v4
PID=123

# Developer 相当(access_level=30)で、リポジトリの読み取りと API の読み取りだけを許すトークンを作る
curl --request POST \
  --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \
  --header "Content-Type: application/json" \
  --data '{"name":"release-bot","description":"リリースノート生成用","scopes":["read_api","read_repository"],"access_level":30,"expires_at":"2027-05-31"}' \
  "${GITLAB}/projects/${PID}/access_tokens"
# 応答 JSON の "token" に値が入る。再取得はできないので、この場でシークレット管理へ保存する

access_levelは10(Guest)、15(Planner)、20(Reporter)、25(Security Manager)、30(Developer)、40(Maintainer)、50(Owner)で、省略すると40です。自分のロールより高い値は指定できません。既定の40は多くの自動化で過剰なので、明示して下げます。各ロールで許される操作の範囲はGitLabの権限(ロール):Guest〜Ownerの操作範囲と保護ブランチの設定手順で整理しています。

ボットユーザーの命名規則・シート非消費・失効30日後の削除の挙動

プロジェクトかグループのトークンを作ると、GitLabはボットユーザーを自動で作ってトークンに紐づけます。ユーザー名はproject_{project_id}_bot_{ランダム文字列}またはgroup_{group_id}_bot_{ランダム文字列}の形式で、課金対象のユーザーに数えられず、ライセンスのシートを消費しません。MRやコミットの作成者にはこのボットが表示されるため、「誰の自動化か」を履歴から追えます。

注意したいのは削除のタイミングです。最後のトークンが失効するか期限切れになってから既定で30日後に、ボットユーザーとトークンが消え、ボットの貢献はghostユーザーへ移ります。ボット名で履歴を追う監査をしているなら、期限切れのまま放置しません。

スコープ17種の選択基準:API・Git操作の用途と読み書きの権限

用途別に最小のスコープを選ぶ早見表:clone・push・API・レジストリ

Access token scopesのドキュメントには17種のスコープがありますが、日常の用途で選ぶのは8つほどです。迷ったら次の表の最小のものから始め、足りなければ足します。

やりたいこと 選ぶスコープ
cloneとpullだけ read_repository
pushもする write_repository
APIで情報を読むだけ read_api
APIでIssueやMRを作る api
コンテナイメージのpull read_registry
コンテナイメージのpush write_registry
Runnerの作成 create_runner
Runnerの管理 manage_runner

write_repositoryはGitのpushを許すスコープで、API認証には使えません。CIからタグをpushし、続けてAPIでリリースを作る処理ならwrite_repositoryとapiの両方が要ります。プロジェクト・グループのトークンでイメージをpushするには、write_registryに加えてread_registryも必要です。Runnerの登録に使うトークンはGitLab Runnerの登録手順とconfig.tomlの設定例で扱っています。

sudo・admin_modeなど個人専用スコープと従来型でMCPに接続できない制約

17種のうちadmin_mode・read_service_ping・sudo・read_userの4つは個人アクセストークン専用です。sudoは管理者として任意のユーザーになりすましてAPIを呼べるため、他人として操作する必要がある処理に限り、期限を短くして発行します。

17.9で追加されたself_rotateは、そのトークン自身のローテーションだけを許すスコープで、後述の自動更新で使います。従来型のトークンは、apiスコープを付けてもGitLab MCPサーバーに403で拒否されるため、接続にはfine-grainedのトークンかOAuthを使います。設定手順はGitLab MCPサーバーの接続設定を参照してください。

トークンを使う設定例:git clone・REST API・CI/CD変数での渡し方

Git over HTTPSでトークンを渡す方法とURL埋め込みを避ける理由

HTTPSでcloneやpushをするとき、ユーザー名には空でない任意の文字列、パスワードにはトークンを渡します。GitLabはユーザー名を検証しません。ドキュメントにはhttps://oauth2:<トークン>@gitlab.example.com/...のようにURLへ埋める例も載っていますが、token overviewのセキュリティ指針は、URLに含めると.git/configに平文で残り、プロキシやサーバーのログにも出るとして避けるよう求めています。VS Codeの公式拡張GitLab for VS Codeをトークンで認証する場合はapiスコープが必要で、その設定はVSCodeとGitLabの連携(公式拡張の導入と認証・MRレビュー・パイプライン操作)で扱っています。

# 資格情報ヘルパーに保存させる
git config --global credential.helper store   # 平文ファイル保存。共有マシンでは使わない
git clone https://gitlab.example.com/example-group/app.git
# Username: oauth2          ← 任意の文字列でよい
# Password: glpat-xxxxxxxx  ← アクセストークン

# 既存のリポジトリで URL にトークンを埋めていた場合は、URL から外す
git remote set-url origin https://gitlab.example.com/example-group/app.git

PRIVATE-TOKENヘッダーのcurl例とトークン自身を確認するAPI

REST APIではPRIVATE-TOKENヘッダーにトークンを入れます。token overviewの指針も、トークンはURLのクエリではなくヘッダーで渡すよう求めています(ヘッダーでトークンを渡す一般的な書き方はBearer Tokenの書き方とJWTとの違いを参照)。発行直後は、Personal access tokens APIのselfエンドポイントで、スコープと期限が意図どおりかを確かめます。

export GITLAB_TOKEN=glpat-xxxxxxxx   # 実運用ではシークレット管理から読み込む

# 1) このトークン自身の情報(scopes・expires_at・active)を確認する
curl --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \
  "https://gitlab.example.com/api/v4/personal_access_tokens/self"

# 2) 参加しているプロジェクトを 20 件ずつ取得する(read_api で足りる)
curl --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \
  "https://gitlab.example.com/api/v4/projects?membership=true&per_page=20"

1)の応答でscopesとexpires_atが想定どおりかを見ます。19.5以降は応答にgranular_scopesも含まれます。発行したトークンでAPIを呼ぶときのページネーションやレート制限への対処はGitLab APIの使い方:トークン認証とcurl例・ページネーションとレート制限の実装で扱っています。

CI/CDでは個人トークンより先にCI_JOB_TOKENとプロジェクトトークンを選ぶ

CIのジョブから同じプロジェクトや別プロジェクトを触るとき、最初に検討するのはCI_JOB_TOKENです。CI/CD job tokenのドキュメントによると、このトークンはジョブの実行中だけ有効で、パイプラインを起動したユーザーと同じロールで動きます。発行も期限管理も要りません。

# .gitlab-ci.yml
fetch-shared-config:
  stage: build
  script:
    # 別プロジェクトのリポジトリを clone(相手側の job token allowlist に本プロジェクトの追加が必要)
    - git clone "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.example.com/example-group/shared-config.git"
    # API は JOB-TOKEN ヘッダーで呼ぶ(使えるエンドポイントは限られる)
    - 'curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages"'

ジョブトークンで届かない操作(GraphQLなど)だけ、プロジェクトかグループのトークンをCI/CD変数に入れ、Protected・Masked・Hiddenを設定して渡します。変数の設定方法はGitLab CI/CDのrules・needs・変数の設定例にあります。

有効期限とローテーション運用:365日上限・通知・self_rotateでの自動更新

有効期限365日の上限と7日・30日・60日前の期限切れ通知の仕組み

3種類とも、有効期限の上限は既定で作成日から365日です。日付を入れずに作ると365日後が自動で入ります。期限切れは指定日の0時(UTC)、日本時間では当日の9時です。朝のバッチが9時をまたいで止まらないよう、期限は業務日の前日以前にそろえます。

GitLab 17.6以降は管理者がインスタンスの上限を変えられ、機能フラグbuffered_token_expiration_limit(既定は無効)で400日まで延ばせます。期限切れの通知は毎日1時(UTC)に判定され、7日前に加えて17.6以降は30日前と60日前にもメールが届きます。プロジェクト・グループのトークンの通知先はMaintainerかOwnerです。

self_rotateとrotate APIによる期限前のトークン更新スクリプト

期限が来たトークンは延長できません。同じ権限とスコープで新しい値を出し直すのがrotateで、画面ではトークン一覧の縦三点リーダーからRotateを選びます。旧トークンはその場で無効になり、取り消しはできません。

自動化する場合の落とし穴はexpires_atの既定値です。APIのrotateでexpires_atを省くと、期限が必要な設定では新しいトークンの期限が1週間後になります。毎月回すつもりのスクリプトが、翌週に止まる原因です。

#!/usr/bin/env bash
# 自分自身をローテーションする(トークンに api か self_rotate スコープが必要)
set -euo pipefail
NEW_EXPIRY=$(date -u -d "+90 days" +%Y-%m-%d)   # 省略すると 1 週間後になるので必ず指定する

RESP=$(curl --fail --silent --request POST \
  --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \
  --data "expires_at=${NEW_EXPIRY}" \
  "https://gitlab.example.com/api/v4/personal_access_tokens/self/rotate")

NEW_TOKEN=$(echo "${RESP}" | jq -r '.token')
# ここで NEW_TOKEN をシークレット管理へ書き戻す。書き戻しに失敗すると旧トークンも使えず止まる
echo "rotated: expires_at=$(echo "${RESP}" | jq -r '.expires_at')"

プロジェクトアクセストークンならPOST /projects/:id/access_tokens/self/rotateで同じことができます。GitLabは新旧のトークンを「トークンファミリー」として記録しており、すでに失効したトークンでrotateを試みると、同じファミリーの有効なトークンもまとめて失効します。旧トークンを持ち出した第三者が使った場合の被害を止める仕組みです。漏えいが疑われるときは、rotateではなく画面のRevokeかDELETE /personal_access_tokens/selfで即時に失効させます。

アクセストークンの種類を決める判断:個人トークンを使わない場面と採用条件

個人アクセストークンを共有の自動化に使ってはいけない場面と失敗パターン

個人アクセストークンを使ってよいのは、本人が手元で使う場合と、本人が保守する短命なスクリプトの場合だけです。チームで共有するCI、夜間バッチ、外部サービスとの連携には使いません。

典型的な失敗は2つあります。1つ目は退職や異動で、担当者のアカウントを無効にした瞬間に、そのトークンで動いていたCIや連携が一斉に止まります。2つ目は権限の過大さです。1つのリポジトリ向けに発行したapiスコープの個人トークンが漏れると、本人が触れる他のプロジェクトまで書き換えられます。GitHubでも同じ問題があり、GitHub PATの作成方法とfine-grainedの違いで扱っている考え方はGitLabにもそのまま当てはまります。

どうしても個人トークンを使うなら、fine-grainedで対象のプロジェクトと操作を絞り、期限を90日以内にします。この2点を満たせないなら、プロジェクトかグループのトークンに切り替える判断が妥当です。

GitLab.com Freeのプロジェクトトークン代替:サービスアカウント

GitLab.comのFreeでは、プロジェクト・グループアクセストークンが使えません。代わりになるのがサービスアカウントです。Service accountsのドキュメントによると、Freeでの提供は18.10で機能フラグ付きで入り、18.11で一般提供になりました。人ではない主体を表すユーザーで、シートを消費しません。

GitLab.comではトップレベルグループのOwnerがSettings > Service accountsから作り、そのアカウントの個人アクセストークンで認証します。Freeでの上限は、トップレベルグループごとに100件(配下で作ったものを含む)です。退職でCIが止まる問題と、届く範囲が人の権限に引きずられる問題を、プランを上げずに避けられます。Premium以上で1プロジェクトに閉じた自動化ならプロジェクトアクセストークン、それ以外ならサービスアカウント、と決めておけば迷いません。

トークンの棚卸しや、CIの認証を個人トークンから切り替える作業を既存のパイプラインごと見直したい場合は、一創のDevOps・CI/CD導入支援で、現在のトークンの用途と届く範囲を洗い出したうえで置き換えの手順を作成できます。承認ルールなどMR側の設定とあわせて整える場合はGitLabのマージリクエストの承認ルール設定も参考になります。

よくある質問

GitLabのアクセストークンについて、発行と運用の段階でよく出る質問をまとめました。

発行したGitLabのアクセストークンの値はあとから確認できますか?

確認できません。値が表示されるのは作成直後の1回だけで、一覧画面にもAPIにも値は出ません。控え忘れた場合は、Revokeして新しく発行するか、rotateで新しい値を出します。一覧で確認できるのは名前・スコープ・期限・最終使用日時です。

有効期限なしのアクセストークンは作れますか?

通常の個人・プロジェクト・グループのトークンでは作れず、上限は既定で365日です。例外はサービスアカウントのトークンで、有効期限を必須としない設定になっている場合に限り、期限なしで作られます。期限なしのトークンは漏えいしたときに止まらないため、作れる環境でも期限を入れることを勧めます。

git cloneのときユーザー名には何を入れればよいですか?

空でなければ何でもかまいません。GitLabはユーザー名を検証せず、パスワード欄のトークンで認証します。oauth2や自分のユーザー名を入れる例が多いです。CIジョブトークンを使う場合だけは、ユーザー名にgitlab-ci-tokenを入れる決まりになっています。

期限が切れたアクセストークンを延長できますか?

延長はできず、期限切れのトークンを生かす手段もありません。期限前ならrotateで同じ権限とスコープの新しいトークンへ入れ替えられるので、30日前・60日前の通知を受けた時点でrotateし、使っている設定の値を更新します。

glpat-で始まる文字列は何のトークンですか?

個人アクセストークンの接頭辞で、プロジェクト・グループのアクセストークンと代理トークン(Impersonation token)も同じglpat-で始まります。パイプライントリガートークンはglptt-です。リポジトリやログで見つけた場合は漏えいとして扱い、すぐに失効させます。

関連記事

お気に入りに入れた記事の一覧

一創の公式 SNS

X では毎朝の新着記事と IT ニュースの速報を、YouTube・TikTok・Instagram・LinkedIn・Facebook では記事の解説動画を配信しています。

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.11.11 テックブログ Microsoft 2026年11月の月例更新:Outlookの悪用済みCVE-2026-124194と修正版の確認方法
  2. 2026.01.21 コラム 税務調査の録音は禁止?判例・裁決と国税局マニュアルで見る、断られたときの対応
  3. 2026.11.11 テックブログ JANISの不正アクセス:最大11,652名の医療機関情報と情報窃取プログラムの検知設定
  4. 2026.11.11 テックブログ SMBC日興証券の不正アクセス:持株会会員最大5.6万人の範囲と受託システムの分離設計
  5. 2025.10.24 テックブログ AWS障害の確認方法と直近の障害一覧|2026年の中東・us-east-1障害と原因・対策

RELATED POSTS 関連記事

目次