TECHSTEP

ITインフラ関連の記事を公開してます。

GitLab Deploy token/keyを紹介する

今回はGitLab deploy token/keyについて簡単に紹介します。

docs.gitlab.com docs.gitlab.com

背景

Deploy token / Deploy keyはどちらもGitLabへのアクセスに使用するものであり、主に外部のビルドサーバー・CICDサーバーからGitLabにアクセスする際に利用します。

Deploy tokenは username token の値のペアであり、GitLabのRepository/Registryに対してHTTP認証を通じてアクセスを実現します。

Deploy keyはあらかじめSSH鍵ペアを作成し、Deploy keyの設定からGitLabに公開鍵情報を渡すことで、SSH認証を通じたアクセスを実現します。

なおこの2つはどちらも有効期限を無制限にできます。以前紹介したPersonal access token等は最長1年の期限でしたが、それ以上の長期にわたって利用したい場合はDeploy token/keyを利用するのが良いでしょう。

Scopeの違い

Deploy token/keyのスコープは以下の表のとおりです。大まかに言えば、この2つには以下のような違いがあります。

  • Deploy token: Tokenを作成したProject/Groupに紐づくRepository/Registryへのアクセス権限を持つ。
  • Deploy key: Keyを配置した (複数の) Projectに紐づくRepositoryへのアクセス権限 (書き込み可能) を持つ。ProjectはGroupをまたいでも良い。
scope Access tokenの種類 アクセス権限
read_repository Deploy token Project/Groupと紐づくRepositoryへのReadOnlyアクセス権限を付与する (HTTP)
Deploy key Keyを登録したRepositoryへのReadOnlyアクセス権限を付与する (SSH)
write_repository Deploy key Keyを登録したRepositoryへのReadWriteアクセス権限を付与する (SSH)
read_registry Deploy token Project/Groupと紐づくContainer registryへのReadOnlyアクセス権限を付与する
write_registry Deploy token Project/Groupと紐づくContainer registryへのReadWriteアクセス権限を付与する
read_package_registry Deploy token Project/Groupと紐づくPackage registryへのReadOnlyアクセス権限を付与する
write_package_registry Deploy token Project/Groupと紐づくPackage registryへのReadWriteアクセス権限を付与する

セキュリティ

Deploy token/keyはどちらも長命なリソースとなる場合があるため、システムへの攻撃を狙う攻撃者に狙われる可能性があります。そのためこれらのリソースを利用する場合はセキュリティに注意する必要があります。

GitLabドキュメントは、Deploy tokenの漏洩を防ぐため、トークンを利用するRunnerをセキュアにするよう、以下の2つの対策を案内しています。

  • Runnerを実行する環境を何度も再利用する場合(仮想マシンなど)はDockerを priviledged モードで使わない
  • 同じRunner上で複数のJobを実行する場合はshell executorを使わない

docs.gitlab.com

Deploy keyは以下の対策を案内されています。

  • Deploy keyを作成するユーザーは、専用のService accountを用いる
  • Deploy keyが残っている限り、削除したユーザーであってもRepositoryにアクセスできるため、アカウント管理と合わせて厳重に管理する
  • 漏洩のリスクを検知するため、 Audit Event機能を利用する

docs.gitlab.com

GitLab deploy token

GitLab deploy tokenは gitlab-deploy-token という特別な名前のDeploy tokenのことを指します。この名前のDeploy tokenを作成すると、GitLab CI/CD変数に自動的にトークン情報が渡され、 CI_DEPLOY_USER CI_DEPLOY_PASSWORD という名前の変数として利用できます。

例えばGitLab CI/CDからGitLab Container registryにログインするには、以下のようなコマンドで実現します。

echo "$CI_DEPLOY_PASSWORD" | docker login $CI_REGISTRY -u $CI_DEPLOY_USER --password-stdin

作成方法

Deploy token/keyはどちらもGitLab画面、またはGitLab APIから作成可能です。

GitLab画面では、どちらもProject/Groupの 設定リポジトリ から該当の項目を探し、必要な情報を入力して作成します。

※Deploy token

※Deploy key

APIの場合はそれぞれ /projects/:id/deploy_tokens /projects/:id/deploy_keys APIを操作します。

curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --header "Content-Type: application/json" \
     --data '{"name": "My deploy token", "expires_at": "2021-01-01", "username": "custom-user", "scopes": ["read_repository"]}' \
     "https://gitlab.example.com/api/v4/projects/5/deploy_tokens/"

docs.gitlab.com

curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --header "Content-Type: application/json" \
     --data '{"title": "My deploy key", "key": "ssh-rsa AAAA...", "can_push": "true"}' \
     "https://gitlab.example.com/api/v4/projects/5/deploy_keys/"

docs.gitlab.com