Introduction à la sécurité des conteneurs Docker
La protection des conteneurs Docker est une priorité essentielle pour les développeurs. Bane, un outil de génération de profils AppArmor, permet de définir des limites de sécurité précises en utilisant des fichiers de configuration au format TOML. Cet article explique comment personnaliser les stratégies de sécurité pour renforcer vos applications conteneurisées.
Présentation de Bane
Bane est conçu spécifiquement pour les conteneurs Docker et génère des profils AppArmor à partir de configurations TOML. Il offre un contrôle granulaire sur l'accès au système de fichiers, les permissions réseau, les exécutables autorisés et les capacités système, réduisant ainsi les risques de sécurité.
Principes de base du format TOML
Le langage TOML (Tom's Obvious, Minimal Language) est utilisé par Bane pour sa simplicité et sa lisibilité. Un fichier de configuration type se compose de plusieurs sections clés pour définir les règles de sécurité.
Guide de configuration pas à pas
Paramètres initiaux
Chaque fichier de configuration commence par un idantifiant unique pour le profil. Par exemple :
# Nom du profil, Bane ajoutera automatiquement le préfixe `docker-`
# Le profil final sera donc `docker-mon-profil`
NomProfil = "mon-profil"
Le nom spécifié est préfixé avec "docker-" lors de la génération du profil AppArmor.
Gestion des droits du système de fichiers
La section [SystemeFichiers] permet de contrôler l'accès aux répertoires et fichiers.
Chemins en lecture seule
[SystemeFichiers]
# Chemins accessibles en lecture seule
CheminsLectureSeule = [
"/usr/bin/**",
"/etc/nginx/**",
"/var/log/**",
"/lib/modules/**",
"/sys/class/**",
"/proc/self/**"
]
Les chemins listés avec \*\* autorisent la lecture récursive mais interdisent l'écriture.
Journalisation des tentatives d'écriture
# Chemins où les écritures sont journalisées sans blocage
CheminsJournalisationEcriture = [
"/tmp/**"
]
Toute opération d'écriture dans ces chemins est consignée dans les journaux système.
Chemins accessibles en écriture
# Chemins autorisés en écriture
CheminsEcriture = [
"/var/cache/nginx/**",
"/run/nginx.pid"
]
Seuls les chemins spécifiés permettent l'écriture par le conteneur.
Contrôle des exécutables
Les sections ExecAutorise et ExecInterdit définissent quels programmes peuvent être exécutés.
# Exécutables autorisés
ExecAutorise = [
"/usr/local/bin/nginx",
"/sbin/nginx"
]
# Exécutables interdits
ExecInterdit = [
"/usr/bin/bash",
"/usr/bin/top",
"/usr/bin/curl"
]
Cette configuration n'autorise que l'exécution de Nginx et bloque les shells et outils potentiellement dangereux.
Configuraton des capacités système
Les capacités Linux (Capabilities) permettent un contrôle fin des privilèges. La section [Capacites] spécifie les autorisations.
[Capacites]
Autorise = [
"chown",
"dac_override",
"setuid",
"setgid",
"net_bind_service",
"sys_chroot"
]
Les capacités listées sont essentielles au fonctionnement de services comme Nginx, par exemple pour lier des ports réseau ou modifier les propriétaires de fichiers.
Règles réseau
La section [Reseau] régule l'accès réseau du conteneur.
[Reseau]
# Désactiver les sockets raw si non nécessaires
SocketsRaw = false
SocketsPacket = false
ProtocolesAutorises = [
"tcp",
"udp"
]
Les paramètres contrôlent l'utilisation de sockets réseau et limitent les protocoles autorisés à TCP et UDP.
Fonctionnement interne de Bane
Développé en Go, Bane analyse les fichiers TOML et les applique à un modèle de configuration AppArmor. Le modèle, défini dans apparmor/template.go, utilise des boucles et conditions pour générer des règles adaptées. Par exemple, pour les protocoles réseau :
{{if .Reseau.ProtocolesAutorises}}
{{range $proto := .Reseau.ProtocolesAutorises}}
network inet {{$proto}},
{{end}}
{{else}}
network,
{{end}}
Ce code modèle traduit les spécifications du fichier TOML en règles AppArmor concrètes.
Génération et application des profils
Pour utiliser Bane, clonez le dépôt et adaptez un fichier TOML selon vos besoins. Ensuite, exécutez Bane pour produire le profil AppArmor, qui peut être directement appliqué à vos conteneurs Docker pour une sécurité renforcée.