Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente |
serveurs:installation:db-srv:docker-api [2023/05/28 16:47] – [Utiliser TLS (HTTPS) pour sécuriser l'API (daemon Docker)] jpmilcent | serveurs:installation:db-srv:docker-api [2023/08/02 13:33] (Version actuelle) – [Utiliser TLS (HTTPS) pour sécuriser l'API (daemon Docker)] jpmilcent |
---|
====== Activer l'API Docker sur l'instance "db-srv" ====== | ====== Activer l'API Docker sur une instance ====== |
| |
| Ici c'est l'exemple de l'instance DB-SRV sur le SINP PACA (silene.eu) qui est donné. |
===== Rendre persistante l'activation ===== | ===== Rendre persistante l'activation ===== |
* Afin d'éviter que les modifications effectuées dans le fichier ///lib/systemd/system/docker.service// soient écrasées à chaque mise à jour de Docker, vous devez ajouter un fichier qui écrasera les valeurs par défaut. | * Afin d'éviter que les modifications effectuées dans le fichier ///lib/systemd/system/docker.service// soient écrasées à chaque mise à jour de Docker, vous devez ajouter un fichier qui écrasera les valeurs par défaut. |
* Au préalable, sur le serveur //db-srv//, activer l'API //Docker// sur l'IP de l'hôte du VPN : ''vi /lib/systemd/system/docker.service'' | * Au préalable, sur le serveur //db-srv//, activer l'API //Docker// sur l'IP de l'hôte du VPN : ''vi /lib/systemd/system/docker.service'' |
* Modifier la ligne ''ExectStart='' en ajoutant l'option ''<nowiki> -H tcp://10.0.1.20:2376 </nowiki>'' juste aprés ''<nowiki> -H fd:// </nowiki>'' | * Modifier la ligne ''ExectStart='' en ajoutant l'option ''<nowiki> -H tcp://10.0.1.20:2376 </nowiki>'' juste aprés ''<nowiki> -H fd:// </nowiki>'' |
* À voir si on active TLS et ajoute l'option ''<nowiki> --tlsverify </nowiki>'' | |
* Prendre en compte les changements : ''systemctl daemon-reload'' | * Prendre en compte les changements : ''systemctl daemon-reload'' |
* Redémarrer Docker : ''systemctl restart docker'' | * Redémarrer Docker : ''systemctl restart docker'' |
| |
===== Utiliser TLS (HTTPS) pour sécuriser l'API (daemon Docker) ===== | ===== Utiliser TLS (HTTPS) pour sécuriser l'API (daemon Docker) ===== |
* Télécharger [[https://gist.github.com/kekru/974e40bb1cd4b947a53cca5ba4b0bbe5|un script simplifiant la création des certificats]] : | |
* Créer un dossier bin/ pour root : ''mkdir /root/bin/'' | |
* Se placer dans le dossier en tant que root : ''cd ~/bin/'' | |
* Télécharger le script : ''wget https://raw.githubusercontent.com/kekru/linux-utils/master/cert-generate/create-certs.sh'' | |
* Donner les droits d'éxecution au script : ''chmod +x create-certs.sh'' | |
* Éditer les variables suivantes du script :<code> | |
EXPIRATIONDAYS=1825 | |
CASUBJSTRING="/C=FR/ST=Hautes-Alpes/L=Gap/O=CBNA/OU=SI/CN=web-srv.silene.eu/emailAddress=adminsys@silene.eu" | |
</code> | |
* Créer un dossier qui contiendra les certificats : ''mkdir -pv /etc/docker/ssl/'' | * Créer un dossier qui contiendra les certificats : ''mkdir -pv /etc/docker/ssl/'' |
* Sécuriser le dossier : ''chmod 600 /etc/docker/ssl/'' | * Sécuriser le dossier : ''chmod 600 /etc/docker/ssl/'' |
* Générer les différents certificats en suivant [[https://gist.github.com/kekru/974e40bb1cd4b947a53cca5ba4b0bbe5|la documentation du script]] : | * Générer les différents certificats en suivant [[https://docs.docker.com/engine/security/protect-access/#use-tls-https-to-protect-the-docker-daemon-socket|la documentation de Docker]] : |
* Créer un certificat valable 5 ans : ''./create-certs.sh -m ca -pw <mot-de-passe-du-ca> -t /etc/docker/ssl/ -e 1825'' | * Se placer dans le dossier qui hébergera les certificats : ''cd /etc/docker/ssl/'' |
* Créer le certificat du dameon Docker et sa clé avec le même mot de passe que l'étape précédente, avec le domaine du serveur web-srv.silene.eu et 1825 jours avant son expiration : ''./create-certs.sh -m server -h web-srv.silene.eu -pw <mot-de-passe-du-ca> -t /etc/docker/ssl/ -e 1825'' | * ''openssl genrsa -aes256 -out ca-key.pem 4096'' |
* Créer le certificat du client et sa clé avec le même mot de passe que l'étape précédente, avec le nom de client manager-portainer et 1825 jours avant son expiration : ''./create-certs.sh -m client -h manager-portainer -pw <mot-de-passe-du-ca> -t /etc/docker/ssl/ -e 1825 '' | * Créer le mot de passe du certificat et le stocker dans Keepass |
* Nettoyer votre historique des commandes précédente : ''history'' puis ''history -d <n°-ligne-départ>-<n°-ligne-fin>'' | * créer un certificat valable 5 ans (1825 jours) : ''openssl req -new -x509 -days 1825 -key ca-key.pem -sha256 -out ca.pem'' |
* Surcoucher le service Systemd : ''systemctl edit docker.service'' | * Répondre aux questions comme suit :<code> |
* Remplacer le contenu par :<code properties> | Country Name (2 letter code) [AU]: FR |
[Service] | State or Province Name (full name) [Some-State]:Hautes-Alpes |
ExecStart= | Locality Name (eg, city) []: Gap |
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://10.0.1.10:2376 --tls --tlsverify --tlscacert "/etc/docker/ssl/ca.pem" --tlscert "/etc/docker/ssl/server-cert.pem" --tlskey "/etc/docker/ssl/server-key.pem" | Organization Name (eg, company) [Internet Widgits Pty Ltd]: CBNA |
| Organizational Unit Name (eg, section) []: SI |
| Common Name (e.g. server FQDN or YOUR name) []: db-srv.silene.eu |
| Email Address []: adminsys@silene.eu |
| </code> |
| * ''%%openssl genrsa -out server-key.pem 4096%%'' |
| * ''%%openssl req -subj "/CN=db-srv.silene.eu" -sha256 -new -key server-key.pem -out server.csr%%'' |
| * ''%%echo subjectAltName = DNS:db-srv.silene.eu,IP:10.0.1.20,IP:127.0.0.1 > extfile.cnf%%'' |
| * ''%%echo extendedKeyUsage = serverAuth >> extfile.cnf%%'' |
| * ''%%openssl x509 -req -days 1825 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf%%'' |
| * ''%%openssl genrsa -out key.pem 4096%%'' |
| * ''%%openssl req -subj '/CN=client' -new -key key.pem -out client.csr%%'' |
| * ''%%echo extendedKeyUsage = clientAuth > extfile-client.cnf%%'' |
| * ''%%openssl x509 -req -days 1825 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf%%'' |
| * ''%%chmod -v 0400 ca-key.pem key.pem server-key.pem%%'' |
| * ''%%chmod -v 0444 ca.pem server-cert.pem cert.pem%%'' |
| * Renommer les fichiers client : |
| * ''mv key.pem client-key.pem'' |
| * ''mv cert.pem client-cert.pem'' |
| * Modifier le fichier daemon.json : ''vi /etc/docker/daemon.json'' <code javascript> |
| { |
| "tls": true, |
| "tlsverify": true, |
| "tlscacert": "/etc/docker/ssl/ca.pem", |
| "tlscert": "/etc/docker/ssl/server-cert.pem", |
| "tlskey": "/etc/docker/ssl/server-key.pem" |
| } |
</code> | </code> |
* Recharger les service : ''systemctl daemon-reload'' | * Redémarrer le service Docker : ''systemctl stop docker.service;systemctl start docker.service'' |
* Arrêter le service Docker : ''systemctl stop docker.service'' | * Tester la sécurisation : ''%%docker -H 10.0.1.20:2376 --tls --tlscert=/etc/docker/ssl/client-cert.pem --tlskey=/etc/docker/ssl/client-key.pem --tlscacert=/etc/docker/ssl/ca.pem ps -a%%'' |
* Démarrer le service Docker : ''systemctl start docker.service'' | * Créer un dossier sur admin pour récupérer en local les fichiers client : ''mkdir /home/admin/ca;cp /etc/docker/ssl/{ca.pem,client-*} /home/admin/ca/;chown admin: -R /home/admin/ca'' |
* Tester la sécurisation : ''%%docker -H 10.0.1.20:2376 --tls --tlscert=/etc/docker/ssl/client-manager-portainer-cert.pem --tlskey=/etc/docker/ssl/client-manager-portainer-key.pem --tlscacert=/etc/docker/ssl/ca.pem ps -a%%'' | * Depuis votre poste local : ''scp admin@db-paca-sinp:~/ca/* ~/Documents/Keepass/docker-ca/db-srv/'' |
* | * Supprimer sur le serveur le dossier //~/ca/// : ''rm -fR /home/admin/ca'' |
| * Via l'interface de Portainer créer un nouvel environnement : |
| * Name : db-srv |
| * Environment URL : 10.0.1.20:2376 |
| * TLS : activer |
| * TLS with server and client verification : activer |
| * TLS CA certificate : uploader le fichier //ca.pem// |
| * TLS certificate : uploader le fichier //client-cert.pem// |
| * TLS key : uploader le fichier //client-key.pem// |
| * Stocker les certificats sur le serveur hébergeant le Docker de Portainer (bkp-srv) : |
| * Créer un dossier qui hébergera les certificats : ''mkdir -p /etc/docker/certs.d/db-srv'' |
| * Modifier les droits : ''chmod 750 -R /etc/docker/certs.d/'' |
| * Créer un dossier sur admin pour récupérer sur le serveur (bkp-srv) les fichiers client : ''mkdir /home/admin/ca;chown admin: -R /home/admin/ca'' |
| * Depuis le poste local, uploader les fichiers clients : ''scp ~/Documents/Keepass/docker-ca/db-srv/* admin@bkp-paca-sinp:~/ca/'' |
| * Déplacer les fichiers clients sur le serveur bkp-srv : ''mv /home/admin/ca/* /etc/docker/certs.d/db-srv/'' |
| * Donner les bons droits aux fichiers clients : ''chown root: /etc/docker/certs.d/db-srv/*'' |
| * Supprimer le dossier //ca/// sur le serveur bkp-srv : ''rm -fR /home/admin/ca'' |
| * Modifier les droits : ''chmod 640 /etc/docker/certs.d/db-srv/*'' |