Как заставить GitLab Runner в Docker видеть пользовательский сертификат CA Root - PullRequest
0 голосов
/ 05 ноября 2018

Я установил и настроил:

  1. локально GitLab Omnibus на СерверA , работающий по HTTPS
  2. локальная GitLab-Runner , установленная в качестве Docker Service в ServerB

Сертификат ServerA генерируется пользовательским корнем CA

Конфигурация

Я поместил корневой сертификат CA на сервере B:

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

Установил Runner на 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

Зарегистрируйте участника, как описано в Регистрация участников - Команда регистрации в одну строку :

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 версия = 11.4.2
Запуск в системном режиме.

Регистрация бегуна ... преуспевающий бегун = 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-Runner из GitLab-CI конвейер с треском проваливается, сообщая мне, что:

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


Клонирование в «My-Project.wiki» ...


фатально: невозможно получить доступ 'https://gitlab -ci-token: xxxxxxxxxxxxxxxxxxxx@ServerA/foo/bar/My-Project.wiki.git/': проверка сертификата сервера не удалось. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: нет


ОШИБКА: задание не выполнено: код выхода 1

Он не распознает эмитента (мой пользовательский корень ЦС), но согласно Самозаверяющим сертификатам или пользовательским центрам сертификации , пункт №1, он должен превышать из коробки:

По умолчанию: GitLab Runner считывает хранилище системных сертификатов и проверяет сервер GitLab на соответствие ЦС, хранящимся в системе .

Затем я попробовал решение из пункта n.3, редактируя

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

и добавление:

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

Но все равно не работает.

Как я могу заставить Gitlab Runner читать корневой сертификат CA?

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

Не уверен, что это лучший подход, но, по крайней мере, он работал для меня. Вы можете создать настроенный образ бегуна 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 .

И повторите все ваши команды, просто не забудьте использовать это новое имя изображения.

Не по теме , но связанные и могут быть полезны

Dockerized gitlab-runner, похоже, также игнорирует записи в вашем /etc/hosts, поэтому, если вы запустили Gitlab в пользовательском домене, например, https://gitlab.local.net, вам нужно передать значения из /etc/hosts при запуске / регистрации gitlab runner:

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

Если вы хотите запустить контейнер docker:dind (docker in docker service) для создания образов 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"
  ...
0 голосов
/ 13 ноября 2018

Исходя из предоставленного вами вывода, я думаю, что сертификат может быть в порядке, но вам не хватает файла CRL: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

Файл CRL используется для проверки того, что даже если сертификат действителен, он не был отозван владельцем ЦС. Вы должны затем:

1) Создайте файл CRL на основе вашего CA:

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 голосов
/ 20 ноября 2018

Хотя у меня еще нет , почему не работает "из коробки", Я нашел Яйцо Колумба :

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

Вот и все:

  • Монтирование тома один раз (за Исполнитель Docker )
  • Обновите сертификаты CA один раз (за задание )

И все будет работать как положено : git clone, wget https и т. Д. *

Отличный обходной путь, пока кто-то в GitLab не исправит это или не объяснит мне, где я неправ (будь моим гостем!)

0 голосов
/ 07 ноября 2018

У вас есть два варианта:

Игнорировать проверку 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]
  ...

Как указано в документации , "этот файл будет читаться каждый раз, когда бегун пытается получить доступ к серверу GitLab."

Другие опции включают tls-cert-file для определения сертификата, который будет использоваться при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...