web-dev-qa-db-ja.com

DockerでGitLab RunnerにカスタムCAルート証明書を表示させる方法

私はインストールして設定しました:

  1. オンプレミスGitLab Omnibus on ServerA HTTPSで実行
  2. オンプレミスGitLab-RunnerServerBにDockerサービスとしてインストール

ServerA証明書はカスタムCAルートによって生成されます

構成

ServerBにCAルート証明書を配置しました:

/srv/gitlab-runner/config/certs/ca.crt

で説明されているようにServerBにランナーをインストールしましたコンテナでGitLab Runnerを実行-Dockerイメージのインストールと設定

docker run -d --name gitlab-runner --restart always \
           -v /srv/gitlab-runner/config:/etc/gitlab-runner \
           -v /var/run/docker.sock:/var/run/docker.sock \
           gitlab/gitlab-runner:latest

ランナーの登録-1行の登録コマンド の説明に従ってランナーを登録しました。

docker run --rm -t -i 
            -v /srv/gitlab-runner/config:/etc/gitlab-runner 
           --name gitlab-docker-runner gitlab/gitlab-runner register \
           --non-interactive \
           --executor "docker" \
           --docker-image Alpine:latest \
           --url "https://MY_PRIVATE_REPO_URL_HERE/" \
           --registration-token "MY_PRIVATE_TOKEN_HERE" \
           --description "MyDockerServer-Runner" \
           --tag-list "TAG_1,TAG_2,TAG_3" \
           --run-untagged \
           --locked="false"

このコマンドの出力は次のとおりです。

CA証明書を更新しています...
ランタイムプラットフォームArch = AMD64 os = linux pid = 5 revision = cf91d5e1 version = 11.4.2
システムモードで実行しています。

ランナーを登録しています...成功したrunner = 8UtcUXCY
ランナーは正常に登録されました。自由に開始できますが、すでに実行されている場合は、構成が自動的にリロードされるはずです!

で確認しました

$ docker exec -it gitlab-runner bash 

そして一度コンテナに

$ awk -v cmd='openssl x509 -noout -subject' '
/BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt

カスタムCAルートは正しくあります

問題

GitLab-CIからGitlab-Runnerを実行すると、パイプラインが悲惨なほど失敗して次のように表示されます。

$ git clone https:// gitlab-ci-token:$ {CI_BUILD_TOKEN} @ ServerA/foo/bar/My-Project.wiki.git


「My-Project.wiki」へのクローン...


fatal: ' https:// gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@ServerA/foo/bar/My-Project.wiki.git/ 'にアクセスできません:サーバー証明書の検証に失敗しました。 CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile:なし


エラー:ジョブが失敗しました:終了コード1

発行者(カスタムCAルート)を認識しませんが、 自己署名証明書またはカスタム証明機関 、ポイントn.1に従ってすぐに使えるはずです:

デフォルト:GitLab Runnerはシステム証明書ストアを読み取り、システムに保存されているCAに対してGitLabサーバーを検証します

次に、ポイントn.3から解決策を試し、編集しました

/srv/gitlab-runner/config/config.toml:

追加:

[[runners]]
tls-ca-file = "/srv/gitlab-runner/config/certs/ca.crt"

しかし、まだ機能しません。

Gitlab RunnerにCAルート証明書を読み取らせるにはどうすればよいですか?

10
Andrea Ligios

私はまだなぜを持っていませんが、それはすぐに動作しません、私は卵を見つけましたコロンブス

Gitlab-Runner設定:

[[runners]]
  name = "MyDockerServer-Runner"
  url = "https://MY_PRIVATE_REPO_URL_HERE/"
  token = "MY_TOKEN_HERE"
  executor = "docker"
  ...
  [runners.docker]
    image = "ubuntu:latest"

  # The trick is the following:
    volumes = ["/cache","/srv/gitlab-runner/config:/etc/gitlab-runner"]
    ...

Gitlab-ci.ymlパイプライン:

MyJob:
    image: ubuntu:latest

    script:
      - awk -v cmd='openssl x509 -noout -subject' '/BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt
      - git clone https://gitlab-ci-token:${CI_BUILD_TOKEN}@ServerA/foo/bar/My-Project.wiki.git
      - wget -O foo.png https://ServerA/foo/bar/foo.png 

    before_script:
      - apt-get update -y >/dev/null
      - apt-get install -y apt-utils dialog >/dev/null
      - apt-get install -y git >/dev/null
      - apt-get install -y wget >/dev/null

    # The trick is the following:
      - cp /etc/gitlab-runner/certs/ca.crt /usr/local/share/ca-certificates/ca.crt
      - update-ca-certificates

それでおしまい:

  • ボリュームを1回マウントします(Docker executorごと)
  • CA証明書を1回更新します(jobごと)

そしてすべてが期待どおりに動作しますgit clonewget httpsなど...

GitLabの誰かがそれを修正するか、私が間違っている場所を説明するまで(私のゲストに!)

4
Andrea Ligios

次の2つのオプションがあります。

SSL検証を無視する

これを.gitlab-ci.ymlの一番上に置きます:

variables:
  GIT_SSL_NO_VERIFY: "1"

GitLab-Runnerに適切な証明書を指定する

公式ドキュメント で概説されているように、tls-*-fileオプションを使用して証明書をセットアップできます。

[[runners]]
  ...
  tls-ca-file = "/etc/gitlab-runner/ssl/ca-bundle.crt"
  [runners.docker]
  ...

documentation が示すように、「このファイルは、ランナーがGitLabサーバーにアクセスしようとするたびに読み取られます。」

他のオプションには、必要に応じて使用する証明書を定義するtls-cert-fileが含まれます。

7
Philipp Ludwig

それが最善のアプローチであるかどうかはわかりませんが、少なくとも私にとってはうまくいきました。カスタマイズされたgitlabランナーイメージを作成し、内部にルートCAを追加できます。

├── Dockerfile
└── myca.crt
# Dockerfile
FROM gitlab/gitlab-runner:latest
COPY myca.crt /usr/local/share/ca-certificates
RUN update-ca-certificates

ビルドする:

docker build -t custom-gitlab-runner .

そして、すべてのコマンドを再実行します。この新しいイメージ名を使用することを忘れないでください。

Off-topic、しかし関連していて便利かもしれません

Docker化されたgitlab-runnerは/etc/hostsのエントリも無視するようです。したがって、カスタムドメインでGitlabを起動した場合はhttps://gitlab.local.net、gitlabランナーの起動/登録時に/etc/hostsから値を渡す必要があります。

docker run -d --name gitlab-runner --restart always \
       --add-Host="gitlab.local.net:192.168.1.100" \
       ...

docker:dind(dockerサービスのdocker)コンテナを起動してdockerイメージを構築する場合は、/srv/gitlab-runner/config/config.toml内でこれらの値を設定する必要もあります。

[[runners]]
  url = "https://gitlab.local.net/"
  executor = "docker"
  pre_clone_script = "echo '192.168.1.100 gitlab.local.net registry.local.net' >> /etc/hosts"
  ...
2
mseimys

提供された出力から、証明書は問題ないかもしれないが、CRLファイルが不足していると思います:server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

CRLファイルは、証明書が有効であっても、CA所有者によって取り消されていないことを確認するために使用されます。その後、次のことを行う必要があります。

1)CAに基づいてCRLファイルを生成します。

openssl ca -gencrl -keyfile ca.key -cert ca.crt -out crl.pem

ソース: https://blog.didierstevens.com/2013/05/08/howto-make-your-own-cert-and-revocation-list-with-openssl/

2)ランナーに使用するように指示します。

[[runners]]
  ...
  tls-ca-file = "/etc/gitlab-runner/ssl/ca-bundle.crt"
  crl-file = "/etc/gitlab-runner/ssl/ca.crl"

3)もちろん設定GIT_SSL_NO_VERIFYは機能しますが、中間者攻撃に対してより敏感になります。

0
webofmars