実行中のジョブのセキュリティ

GitLab Runnerを使用する際には、ジョブを実行する際の潜在的なセキュリティの影響に注意する必要があります。

Shell executorの使い方

一般的に、shell executor を使ってテストを実行するのは安全ではありません。 ジョブはユーザー権限(GitLab Runner の権限)で実行され、このサーバーで実行されている他のプロジェクトのコードを盗む可能性があります。 信頼されたビルドを実行するためだけに使ってください。

Docker executorの使い方

** このようなセットアップをよりセキュアにするには、sudoを無効にするか、 、 機能を停止したDockerコンテナで、ユーザー(非root)としてジョブを実行することをお勧めします。SETUID SETGID

一方、ホストシステムへのフルアクセス、ボリュームのマウントとアンマウントの権限、ネストしたコンテナの実行を可能にする特権モードがあります。 特権モードでコンテナを実行することはお勧めしません。

cap_add/cap_drop の設定により、非特権モードでより詳細な権限を設定することができます。

if-not-present プルポリシーによる非公開Dockerイメージの利用

高度な設定: プライベートコンテナレジストリの使用で説明したプライベートDockerイメージのサポートを使用する場合は、pull_policy の値としてalways を使用する必要があります。特に、DockerまたはKubernetesのexecutorで公開共有Runnerをホストしている場合は、always プルポリシーを使用する必要があります。

プルポリシーがif-not-presentに設定されている例を考えてみましょう:

  1. ユーザAはregistry.example.com/image/nameに非公開画像を持っています。
  2. ユーザーAは共有ランナーでビルドを開始します。ビルドはレジストリ認証情報を受け取り、レジストリで作成者が認証された後にイメージを取り出します。
  3. イメージは共有Runnerのホストに保存されます。
  4. ユーザーBはregistry.example.com/image/nameの非公開画像にアクセスできません。
  5. ユーザーBは、ユーザーAと同じ共有Runner上でこのイメージを使用するビルドを開始します:Runnerはローカルバージョンのイメージを見つけ、認証情報が見つからないためにイメージがプルできなかった場合でも、それを使用します。

したがって、異なるユーザーや異なるプロジェクト(非公開と公開のアクセスレベルが混在している)で使用できるRunnerをホストする場合は、プルポリシーの値としてif-not-present

  • never - 事前にダウンロードした画像のみを使用するようユーザーを制限したい場合。
  • always - どのレジストリからでも画像をダウンロードできるようにしたい場合。

if-not-present プルポリシーは、信頼できるビルドとユーザーが使用する特定のrunnerにのみ使用してください。

詳しくはプルポリシーのドキュメントをお読みください。

Dockerがインストールされているシステム

注意:これは0.5.0以下のインストール、または新しいバージョンにアップグレードされたインストールに適用されます。

DockerがインストールされたLinuxシステムにパッケージをインストールすると、gitlab-runnerDockerデーモンにアクセスする権限を持つユーザが作成されます。これにより、shell executorで実行されるジョブは完全な権限でdockerにアクセスできるようになり、サーバへのrootアクセスが可能になる可能性があります。

SSH executorの使い方

SSH executor がMITM 攻撃(man-in-the-middle)を受けやすくなっています。これはStrictHostKeyChecking オプションが欠落しているためです。 これは将来のリリースで修正される予定です。

Parallels executor の使用法

Parallels executor は完全なシステム仮想化を使用し、隔離仮想化で実行するように設定された VM マシンと隔離モードで実行するように設定された VM マシンを使用するため、可能な限り安全なオプションです。 すべての周辺機器と共有フォルダへのアクセスをブロックします。

クローンランナー

RunnerはGitLab Serverを識別するためにトークンを使います。 Runnerをクローンした場合、クローンされたRunnerはそのトークンに対して同じジョブを受け取る可能性があります。 これはRunnerのジョブを “盗む “可能性のある攻撃のベクトルです。