今回は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を使わない
Deploy keyは以下の対策を案内されています。
- Deploy keyを作成するユーザーは、専用のService accountを用いる
- Deploy keyが残っている限り、削除したユーザーであってもRepositoryにアクセスできるため、アカウント管理と合わせて厳重に管理する
- 漏洩のリスクを検知するため、 Audit Event機能を利用する
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/"
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/"