Cet article décrit comment déployer facilement un registry docker avec Portus.

Public visé: Administrateurs systèmes et DevOps familiers avec Docker et son écosystème.

Par Quentin Anglade, bidouilleur professionnel et expert sécurité @ Objectif Libre

Hébergez votre propre registry docker sécurisé

Avoir son propre registry docker pour y stocker des images, publiques ou privées, peut être très utile. Nous parlerons de différents registry docker open-source et de l’intégration de Clair dans Portus dans un prochain article.

Vous voulez utiliser Portus comme votre registry docker ; vous voulez cependant qu’il soit sûr et voulez donc utiliser le scanner de vulnérabilités Clair. Malheureusement, la documentation de Portus ne propose pas de déploiement simple comprenant le support HTTPS et Clair. Nous allons voir comment déployer Portus en HTTPS avec Clair.

Déployer Portus

Nous allons utiliser docker-compose pour déployer Portus facilement. La recette est simple : il vous suffit de cloner le repository de Portus pour récupérer le dossier compose, éditer le fichier .env ainsi que la configuration Nginx pour faire correspondre le champ server_name à votre ip / nom de domaine. Enfin, ajoutez le fichier compose et laissez au four 10 minutes thermostat 7.

$ git clone https://github.com/SUSE/Portus.git /tmp/portus
$ mv /tmp/portus/examples/compose ./portus
$ cd portus && $EDITOR .env nginx/nginx.conf
$ rm docker-compose.* && wget https://gist.githubusercontent.com/Patazerty/d05652294d5874eddf192c9b633751ee/raw/6bf4ac6ba14192a1fe5c337494ab213200dd076e/docker-compose.yml

Si vous n’avez pas déjà un serveur avec une IP publique et un certificat HTTPS qui l’accompagne, nous allons en générer un nous-mêmes. Pensez à remplacer 123.123.123.123 par l’IP ou le domaine de votre machine.

$ echo "subjectAltName = IP:123.123.123.123" > extfile.cnf #You can use DNS:domain.tld too
$ openssl genrsa -out secrets/rootca.key 2048 -nodes
$openssl req -x509 -new -nodes -key secrets/rootca.key \
 -subj "/C=US/ST=CA/O=Acme, Inc." \
 -sha256 -days 1024 -out secrets/rootca.crt
$ openssl genrsa -out secrets/portus.key 2048
$ openssl req -new -key secrets/portus.key -out secrets/portus.csr \
 -subj "/C=US/ST=CA/O=Acme, Inc./CN=123.123.123.123"
$ openssl x509 -req -in secrets/portus.csr -CA secrets/rootca.crt -extfile \
 extfile.cnf -CAkey secrets/rootca.key -CAcreateserial \
 -out secrets/portus.crt -days 500 -sha256

Quelques explications sur ces commandes magiques :

  • Nous avons besoin d’une autorité de certification : nous avons donc généré une clé secrète aléatoire (rootca.key) et l’avons utilisée pour créer un certificat (rootca.crt) valide pour 1024 jours.
  • Nous avons besoin d’une clé privée pour Portus, nous en avons donc généré une.
  • Enfin, nous générons une « certificate signing request » (portus.csr) et l’utilisons avec le fichier de configuration « extfile.cnf » pour créer le certificat de portus.

Cette dernière étape est nécessaire, car sans le champ subjectAltName, le client docker refuse de se connecter au registry.

Vous devez ajouter secrets/rootca.crt à la liste de certificats de confiance sur votre système pour que votre client docker et navigateur web considère votre certificat comme étant signé par une autorité de confiance (cela vous évite les avertissements de connexion non sécurisée).

Si vous avez déjà un certificat pour votre domaine, ajoutez simplement la clé et le certificat dans secrets/portus.key et secrets/portus.crt.

Un simple docker-compose up -d et Portus devrait être disponible à l’adresse de votre serveur. Utilisez votre navigateur favori pour y aller et configurez le compte administrateur en suivant les instructions. Portus vous demandera ensuite de renseigner les détails concernant le registry. Renseignez un nom arbitraire et mettez l’ip ou le domaine complet (identique au certificat HTTPS) pour l’adresse du registry. Ceci est important pour éviter des erreurs de connexions HTTPS qui ne correspondent pas au nom de domaine / IP du certificat. Puisque notre registry est configuré pour accepter uniquement des connexions HTTPS, cochez la case « Use SSL ».

Conclusion

Vous avez désormais un registry docker pleinement fonctionnel avec Portus en tant qu’interface utilisateur. Vous devriez pouvoir vous y connecter avec docker: docker login yourserver:5000 avec vos identifiants admin. Notez que vous devez attendre que le serveur Clair ait fini de synchroniser toutes les bases de données de vulnérabilités avant de scanner des images docker. Voici à quoi ressemble l’interface des vulnérabilités une fois l’image scannée: