Profils AppArmor dans Docker / LXC

11

J'ai un conteneur Docker (LXC) qui exécute MySQL. Étant donné que l'idée derrière Docker est généralement «un processus en cours d'exécution par conteneur», si je définis des profils AppArmor ciblant le binaire MySQL, seront-ils appliqués? Existe-t-il un moyen pour moi de tester cela?

Naftuli Kay
la source
pourquoi vous souhaitez utiliser apparmor à l'intérieur du conteneur?
c4f4t0r
3
Dans le cas où un exploit zero-day ou autre est exécuté sur la base de données pour l'empêcher d'accéder à autre chose. Je fais confiance à Linux cgroups, mais pas tant que ça . Il vaut mieux être prudent que désolé, je préférerais que MySQL soit verrouillé plutôt qu'un jour zéro MySQL pour trouver un moyen de sortir d'un groupe de contrôle.
Naftuli Kay

Réponses:

8

Tout d'abord, les groupes de contrôle ne sont pas utilisés pour isoler une application des autres sur un système. Ils sont utilisés pour gérer l'utilisation des ressources et l'accès aux appareils. Ce sont les différents espaces de noms (PID, UTS, mount, user ...) qui fournissent une certaine isolation (limitée).

De plus, un processus lancé à l'intérieur d'un conteneur Docker ne sera probablement pas en mesure de gérer le profil AppArmor sous lequel il s'exécute. L'approche actuellement adoptée consiste à configurer un profil AppArmor spécifique avant de lancer le conteneur.

Il semble que le pilote d'exécution libcontainer dans Docker prend en charge la définition de profils AppArmor pour les conteneurs , mais je ne trouve aucun exemple ou référence dans le document.

Apparemment, AppArmor est également pris en charge avec LXC dans Ubuntu .

Vous devez écrire un profil AppArmor pour votre application et vous assurer que LXC / libcontainer / Docker / ... le charge avant de démarrer les processus à l'intérieur du conteneur.

Les profils utilisés de cette façon doivent être appliqués, et pour le tester, vous devez essayer un accès illégal et vous assurer qu'il échoue.

Il n'y a aucun lien entre le binaire et le profil réellement appliqué dans ce cas. Vous devez explicitement dire à Docker / LXC d'utiliser ce profil pour votre conteneur. L'écriture d'un profil pour le binaire MySQL ne l'imposera que sur l'hôte, pas dans le conteneur.

Siosm
la source
Cela a été mon expérience (limitée) jusqu'à présent. J'ai eu des problèmes pour générer un profil à partir d'un conteneur Docker, mais si un profil a été généré à l' extérieur du conteneur puis copié, cela devrait fonctionner ™, à condition bien sûr de démarrer AppArmor dans le conteneur avant d'exécuter l'exécutable.
Naftuli Kay
@Siosm: LCX! = Libcontainer. La question concernait le pilote LXC.
0xC0000022L
@ 0xC0000022L: Le modèle d'application du profil AppArmor est le même pour tout outil utilisé pour confiner les processus dans des conteneurs.
Siosm
3

La réponse est très probable: non.

Le sujet du guide Ubuntu Server LXC traite à peu près votre question exacte et fait la déclaration suivante:

Les programmes dans un conteneur ne peuvent pas être confinés davantage - par exemple, MySQL s'exécute sous le profil de conteneur (protégeant l'hôte) mais ne pourra pas entrer dans le profil MySQL (pour protéger le conteneur).

Une meilleure option pour éviter les exploits ayant des effets indésirables consiste à confiner l'utilisateur exécutant le conteneur et à utiliser des conteneurs LXC de l'espace utilisateur qui exploitent la fonctionnalité du noyau. Cependant, dockeractuellement - à ma connaissance - ne prend pas en charge userns.

Dans un tel cas, MySQL s'exécuterait - du point de vue des hôtes - en tant qu'utilisateur non privilégié, tandis qu'à l'intérieur du conteneur, il pourrait être exécuté en tant que root. Vous pouvez ensuite utiliser iptablespour lier MySQL à un port externe de l'hôte, si nécessaire.

0xC0000022L
la source