私はインストールして設定しました:
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ルート証明書を読み取らせるにはどうすればよいですか?
私はまだなぜを持っていませんが、それはすぐに動作しません、私は卵を見つけましたコロンブス:
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
それでおしまい:
そしてすべてが期待どおりに動作します:git clone
、wget https
など...
GitLabの誰かがそれを修正するか、私が間違っている場所を説明するまで(私のゲストに!)
次の2つのオプションがあります。
これを.gitlab-ci.yml
の一番上に置きます:
variables:
GIT_SSL_NO_VERIFY: "1"
公式ドキュメント で概説されているように、tls-*-fileオプションを使用して証明書をセットアップできます。
[[runners]]
...
tls-ca-file = "/etc/gitlab-runner/ssl/ca-bundle.crt"
[runners.docker]
...
documentation が示すように、「このファイルは、ランナーがGitLabサーバーにアクセスしようとするたびに読み取られます。」
他のオプションには、必要に応じて使用する証明書を定義するtls-cert-file
が含まれます。
それが最善のアプローチであるかどうかはわかりませんが、少なくとも私にとってはうまくいきました。カスタマイズされた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 .
そして、すべてのコマンドを再実行します。この新しいイメージ名を使用することを忘れないでください。
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"
...
提供された出力から、証明書は問題ないかもしれないが、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
は機能しますが、中間者攻撃に対してより敏感になります。