web-dev-qa-db-fra.com

Comment faire en sorte que GitLab Runner dans Docker obtienne un certificat personnalisé CA Root

J'ai installé et configuré: 

  1. un GitLab Omnibus sur site ServerA s'exécutant sur HTTPS
  2. un GitLab-Runner sur site installé en tant que service Docker dans ServerB

Le certificat ServerA est généré par une racine d'autorité de certification personnalisée.

La configuration

J'ai mis le certificat racine de l'autorité de certification sur ServerB:

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

Installation du Runner sur ServerB comme décrit dans Exécuter GitLab Runner dans un conteneur - Installation et configuration de l'image 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

Enregistré le coureur comme décrit dans Enregistrement des coureurs - Commande d'enregistrement sur une ligne :

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"

Cette commande a donné la sortie suivante:

Mise à jour des certificats CA ...
Plate-forme d'exécution Arch = AMD64 os = linux pid = 5 révision = cf91d5e1 version = 11.4.2
En cours d'exécution en mode système.

Enregistrement du coureur ... coureur réussi = 8UtcUXCY
Le coureur s'est inscrit avec succès. N'hésitez pas à le démarrer, mais s'il fonctionne déjà, la configuration devrait être automatiquement rechargée!

J'ai vérifié avec

$ docker exec -it gitlab-runner bash 

et une fois dans le conteneur avec

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

et la racine de l'autorité de certification personnalisée y est correctement.

Le problème

Lors de l'exécution de Gitlab-Runner à partir de GitLab-CI, le pipeline échoue lamentablement en me disant que:

clone $ git https: // jeton gitlab-ci: $ {CI_BUILD_TOKEN} @ serveurA/foo/bar/mon-projet.wiki.git


Clonage dans 'My-Project.wiki' ...


fatal: impossible d'accéder ' https: // jeton gitlab-ci: xxxxxxxxxxxxxxxxxxx@ServerA/foo/bar/My-Project.wiki.git/ ': / vérification du certificat de serveur échouée. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: aucun


ERREUR: le travail a échoué: code de sortie 1

Il ne reconnaît pas l'émetteur (ma racine d'autorité de certification personnalisée), mais, selon les certificats auto-signés ou les autorités de certification personnalisées , point n.1, il devrait être livré immédiatement:

Valeur par défaut: GitLab Runner lit le magasin de certificats du système et vérifie le serveur GitLab par rapport aux autorités de certification stockées dans le système.

J'ai ensuite essayé la solution à partir du point n.3, édition 

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

et en ajoutant: 

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

Mais ça ne marche toujours pas.

Comment faire en sorte que Gitlab Runner lise le certificat CA Root?

5
Andrea Ligios

Bien que je n'aie toujours pas pourquoi cela ne fonctionne pas immédiatement, j'ai trouvé l'œuf de Columbus

Gitlab-Runner configuration:

[[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 pipeline:

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

C'est tout: 

  • Montez le volume une fois (par exécuteur Docker )
  • Mettre à jour les certificats de l'autorité de certification une fois (par job

Et tout fonctionnera comme prévu : git clone, wget https, etc ...

Une excellente solution de contournement, jusqu'à ce que quelqu'un chez GitLab répare le problème ou m'explique où je me trompe (soyez mon invité!)

3
Andrea Ligios

Pas sûr que ce soit la meilleure approche, mais au moins cela a fonctionné pour moi. Vous pouvez créer une image de coureur gitlab personnalisée et ajouter votre autorité de certification racine dans:

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

Construit le:

docker build -t custom-gitlab-runner .

Et relancez toutes vos commandes. N'oubliez pas d'utiliser ce nouveau nom d'image.

Hors sujet , mais lié et pourrait être utile

Dockerized gitlab-runner semble également ignorer les entrées de votre /etc/hosts. Par conséquent, si vous avez lancé Gitlab sur un domaine personnalisé, par exemple. https://gitlab.local.net, vous devez passer les valeurs de /etc/hosts lors du lancement/de l’enregistrement de gitlab runner:

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

Si vous souhaitez lancer le conteneurdocker:dind(docker dans le service Docker) pour créer des images de menu fixe, vous devez également définir ces valeurs dans /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"
  ...
1
mseimys

Vous avez deux options:

Ignorer la vérification SSL

Placez ceci en haut de votre .gitlab-ci.yml:

variables:
  GIT_SSL_NO_VERIFY: "1"

Pointez GitLab-Runner sur le bon certificat

Comme indiqué dans la documentation officielle , vous pouvez utiliser les options tls - * - file pour configurer votre certificat, par exemple:

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

Comme l'indique documentation , "ce fichier sera lu à chaque fois que le coureur tente d'accéder au serveur GitLab".

tls-cert-file permet également de définir le certificat à utiliser si nécessaire.

1
Philipp Ludwig

D'après le résultat que vous avez fourni, je pense que le certificat pourrait être correct, mais que le fichier CRL manque: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

Le fichier CRL est utilisé pour vérifier que même si le certificat est valide, il n'a pas été révoqué par le propriétaire de l'autorité de certification. Vous devez alors: 

1) Générez un fichier CRL basé sur votre autorité de certification:

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

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

2) Demandez au coureur de l'utiliser: 

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

3) Bien sûr, le paramétrage de GIT_SSL_NO_VERIFY fonctionnera mais vous serez plus sensible aux attaques de type "man-in-the-middle"

0
webofmars