Resources attached to the Road To DevOps tutorial https://blog.noobtoroot.xyz/road-to-devops/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

7.4 KiB

TP secrets

Chapitre 1

Objectif : Comprendre le fonctionnement des secrets dans Swarm.

Comprendre le fonctionnement des secrets

  • Créer un secret nommé pass1 à partir de STDIN.

  • Créer un secret nommé pass2 à partir d'un fichier.

  • Vérifier que les secrets sont bien présents.

Créer un secret nommé pass1 à partir de STDIN :

$ echo "mon-super-mot-de-passe" | docker secret create pass1 -
s4kfgdeanybxhl6xj7nrrrsyl

Créer un secret nommé pass2 à partir d'un fichier :

$ echo "mon-autre-mot-de-passe" > file
$ docker secret create pass2 file
cbi6igm8jdwrd9fa1gbb9dfrm
rm file

Vérifier que les secrets sont bien présents :

$ docker secret ls
ID                          NAME    CREATED              UPDATED
s4kfgdeanybxhl6xj7nrrrsyl   pass1   About a minute ago   About...
cbi6igm8jdwrd9fa1gbb9dfrm   pass2   16 seconds ago       16 se...
  • Créer un service :

    • nommé s1,

    • basé sur l'image debian:bullseye,

    • qui lance la commande /bin/sleep 3600 dans le conteneur,

    • qui passe les secrets pass1 et pass2 au conteneur.

  • Se connecter dans le conteneur et vérifier que les secrets sont bien présents.

Lancer le service s1 :

$ docker service create \
  --detach \
  --name s1 \
  --secret pass1 \
  --secret pass2 \
  debian:bullseye /bin/sleep 3600
gkyg5c33qc4x6nf6j11h59r44

Récupérer l'identifiant du conteneur :

$ docker ps
CONTAINER ID   IMAGE           COMMAND             ... NAMES
81ec752f3027   debian:latest   "/bin/sleep 3600"   ... s1.1.fdot5o8wk03r18y7b5tbjbrj1

Se connecter dans le conteneur :

$ docker exec -ti s1.1.fdot5o8wk03r18y7b5tbjbrj1 /bin/bash

Vérifier la présence des secrets
à l'intérieur du conteneur :

root@81ec752f3027:/# ls -l /run/secrets/
-r--r--r-- 1 root root 23 Feb  6 09:07 pass1
-r--r--r-- 1 root root 23 Feb  6 09:07 pass2

Afficher le contenu des secrets :

root@81ec752f3027:/# cat /run/secrets/pass1
mon-super-mot-de-passe
root@81ec752f3027:/# cat /run/secrets/pass2
mon-autre-mot-de-passe

TP secrets

Chapitre II

Objectif : Utiliser les secrets pour envoyer les mots de passe à nos services web et db.

TP à réaliser après le TP Swarm : nécessite docker stack deploy.

  • Créer un secret nommé mysql-secret qui contiendra le mot de passe de la base de données.

Créer le secret

$ echo 'docker' | docker secret create mysql-secret -
ippk0jji4fk6lzkl7aldygn58
$ docker secret ls
ID                          NAME           ...
rcbrlh7dudey8qomnik3xrv7j   mysql-secret   ...
  • Modifier le fichier start.sh comme suit :
#!/bin/bash

if [ -f /run/secrets/mysql-secret ] ; then
    export MYSQL_PASSWORD="$(tail -n 1 /run/secrets/mysql-secret)"
fi

rm -f /run/apache2/apache2.pid
echo "PassEnv MYSQL_USER MYSQL_PASSWORD MYSQL_DATABASE \
MYSQL_HOST" > /etc/apache2/conf-available/env.conf
a2enconf env
exec /usr/sbin/apache2ctl -D FOREGROUND

On récupère le secret dans le conteneur et on le passe à l'application via une variable d'environnement.

  • Reconstruire l'image web (avec le tag secret) en prenant en compte le nouveau fichier start.sh.

Rappel : formation/web/Dockerfile

FROM debian:bullseye

LABEL maintainer "me@sii.fr"

# Debian en mode non interactif
ENV DEBIAN_FRONTEND noninteractive

# On installe Apache et le client Mysql
# et on nettoie le cache apt pour diminuer la taille de l'image
RUN apt update \
  && apt install -y apache2 mysql-client \
  && rm -rf /var/lib/apt/lists/*

# On copie nos scripts
COPY index.sh /usr/lib/cgi-bin/index.sh
COPY docker.sql /tmp/docker.sql
COPY start.sh /start.sh

# On rend les scripts exécutables
RUN chmod +x /start.sh
RUN chmod +x /usr/lib/cgi-bin/index.sh

# On active le module Apache CGI
RUN a2enmod cgi

# On expose le port 80
EXPOSE 80

# On indique le script qui doit être lancé au démarrage du conteneur
ENTRYPOINT ["/start.sh"]
$ docker build --tag web:secret .
$ docker image ls | grep web
web   secret   01722677133b   2 minutes ago   289MB
web   1        74a456d5a9f2   3 hours ago     289MB
  • Nous allons créer un Registry privé pour stocker notre nouvelle image.

  • Créer un service registry basé sur l'image officielle registry:2 et le publier sur le port 5000.

  • Tester la disponibilité du registry.

Créer un service registry

$ docker service create \
    --name registry \
    --publish 5000:5000 \
    registry:2

Tester la disponibilité du registry

$ curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]}

  • Pousser l'image web:secret sur le registry en utilisant les tags pour préciser l'adresse du registry, ici 127.0.0.1:5000.

  • Récupérer l'image web:secret sur tous les noeuds.

Tagguer l'image

$ docker tag web:secret 127.0.0.1:5000/web:secret

Pousser l'image sur le Registry

$ docker push 127.0.0.1:5000/web:secret

Vérifier le contenu du Registry

$ curl 127.0.0.1:5000/v2/_catalog
{"repositories":["web"]}

Récupérer l'image sur le second Node

$ docker pull 127.0.0.1:5000/web:secret
  • Adapter le fichier docker-compose précédent pour utiliser le secret mysql-secret dans les services web et db.

  • Lancer la stack applicative et vérifier que l'application fonctionne correctement.

https://docs.docker.com/compose/compose-file/
https://docs.docker.com/engine/swarm/secrets/#use-secrets-in-compose
https://hub.docker.com/_/mariadb/

formation/docker-compose-secrets.yml

# Les secrets ne sont pris en charge qu'à partir de la version 3.1
# du format Compose file.
#
# Ce fichier compose ne fonctionne qu'avec la commande 'docker stack deploy',
# il ne marchera pas avec un 'docker-compose up -d'
#
# Seules les versions récentes de l'image mariadb savent gérer les secrets,
# la version 10.7.1 est OK.

version: "3.1"
services:
  web:
    image: 127.0.0.1:5000/web:secret
    depends_on:
      - db
    ports:
      - 8080:80
    environment:
      - MYSQL_HOST=db
      - MYSQL_DATABASE=docker
      - MYSQL_USER=docker
    secrets:
      - mysql-secret
  db:
    image: mariadb:10.7.1
    environment:
      - MYSQL_DATABASE=docker
      - MYSQL_USER=docker
      - MYSQL_PASSWORD_FILE=/run/secrets/mysql-secret
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-secret
    secrets:
      - mysql-secret
    volumes:
      - mariadb-data:/var/lib/mysql
secrets:
  mysql-secret:
    external: true
volumes:
  mariadb-data:

Lancer la stack applicative

$ docker stack deploy -c docker-compose-secrets.yml secrets