GNU/Linux >> Tutoriels Linux >  >> Linux

Sécurisez vos conteneurs avec SELinux

Lorsque les choses ne fonctionnent pas correctement dans votre environnement Linux, la chose la plus simple à faire est de désactiver Security-Enhanced Linux (SELinux). Les choses commencent soudainement à fonctionner et vous l'oubliez, mais c'est un piège courant qui signifie que vous avez perdu un outil de sécurité très puissant.

Les menaces augmentent parallèlement à l'essor des conteneurs, des microservices et de l'architecture distribuée. Cela est dû à un vieux problème bien connu :la vélocité. L'avantage des conteneurs est qu'ils vous permettent de vous déplacer rapidement, d'en faire plus et de changer rapidement. Cela signifie que l'adoption des conteneurs a explosé, mais la vitesse qu'elle offre signifie également que vous rencontrerez plus de problèmes et de vulnérabilités. Cela se produit naturellement lorsque vous faites plus de choses de plus en plus vite.

Comment atténuer les menaces

Conteneurs Linux

  • Que sont les conteneurs Linux ?
  • Une introduction à la terminologie des conteneurs
  • Télécharger :Introduction aux conteneurs
  • Opérateurs Kubernetes :automatisation de la plate-forme d'orchestration de conteneurs
  • eBook :Modèles Kubernetes pour la conception d'applications cloud natives
  • Qu'est-ce que Kubernetes ?

Comme l'a dit Sun Tzu :"Le guerrier sage évite la bataille." Cette citation résonne vraiment lorsqu'il s'agit de la défense de base des conteneurs. Pour éviter les problèmes (batailles), assurez-vous que votre hôte de conteneur est sécurisé et que vous pouvez utiliser SELinux comme première ligne de défense.

SELinux est un projet open source publié en 2000 et intégré au noyau Linux en 2003. Selon l'explicateur de Red Hat, "SELinux est une architecture de sécurité pour les systèmes Linux qui permet aux administrateurs d'avoir plus de contrôle sur qui peut accéder au système. C'était à l'origine développé par la National Security Agency (NSA) des États-Unis sous la forme d'une série de correctifs pour le noyau Linux utilisant des modules de sécurité Linux (LSM)."

Commencer

Lorsque vous pensez aux conteneurs, la première chose qui vous vient probablement à l'esprit est Docker. Docker a lancé une révolution de l'adoption des conteneurs après son apparition en 2013. C'est l'une des principales raisons pour lesquelles les conteneurs ont explosé en popularité, mais comme mentionné ci-dessus, le niveau élevé d'adoption a accru la vulnérabilité des utilisateurs aux risques de sécurité.

Avant de pouvoir sécuriser vos conteneurs Docker avec SELinux, vous devez configurer certaines choses.

Prérequis :

  • CentOS 8/RHEL 8 installé et configuré
  • Docker CE installé et configuré
  • Deux comptes créés :root et non root (mcalizo dans les exemples ci-dessous)

Si vous devez configurer Docker sur votre serveur RHEL 8/CentOS 8, vous pouvez suivre ces instructions. Si vous utilisez RHEL 8, vous devez supprimer les packages Podman et runc préinstallés avant de commencer.

Tout d'abord, assurez-vous que SELinux est activé :

[mcalizo@Rhel82 ~]$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31
[mcalizo@Rhel82 ~]$

Ensuite, vérifiez la version de votre système d'exploitation et que Docker est en cours d'exécution. Connectez-vous en tant que root et exécutez :

[root@rhel82 ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux release 8.2 (Ootpa)
[root@rhel82 ~]#

[root@rhel82 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-10-28 19:10:14 EDT; 15s ago
     Docs: https://docs.docker.com
 Main PID: 30768 (dockerd)
    Tasks: 8
   Memory: 39.0M
   CGroup: /system.slice/docker.service
           └─30768 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.889602941-04:00" level=error msg=">
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903413613-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903427451-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903538271-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.132060506-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.308943088-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319438549-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319570298-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.333419209-04:00" level=info msg="A>
Oct 28 19:10:14 rhel82.home.labs.com systemd[1]: Started Docker Application Container Engine

Vérifiez votre version de Docker :

[root@rhel82 ~]# docker --version
Docker version 19.03.13, build 4484c46d9d

Hack votre hébergeur

Une des meilleures façons de comprendre un problème est de le vivre. Je vais donc vous montrer à quel point il est facile d'injecter du code malveillant dans un hôte Docker si votre sécurité n'est pas correctement configurée.

Pour pouvoir faire quelque chose de mal sur l'hôte Docker, l'utilisateur malveillant non root (mcalizo dans ce tutoriel) doit faire partie du groupe qui peut instancier des conteneurs Docker.

Tout d'abord, confirmez quel groupe le mcalizo l'utilisateur appartient à :

[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo

La sortie montre que mcalizo n'appartient qu'à son propre groupe. Cela signifie mcalizo ne peut pas instancier les conteneurs Docker et obtiendra cette erreur s'il essaie :

[mcalizo@Rhel82 ~]$ docker run -it --rm centos:latest /bin/sh
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

Pour autoriser mcalizo pour instancier le conteneur, ajoutez l'utilisateur au docker groupe :

[root@Rhel82 ~]# usermod -G docker -a mcalizo
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo docker

Ensuite, déployez un fedora:latest conteneur et connectez-vous au conteneur instancié pour l'explorer :

[mcalizo@Rhel82 ~]$ docker run -it --rm fedora:latest /bin/sh
Unable to find image 'fedora:latest' locally
latest: Pulling from library/fedora
ee7e89337106: Pull complete
Digest: sha256:b9ec86d36fca7b1d3de39cd7c258e8d90c377d312c21a7748071ce49069b8db4
Status: Downloaded newer image for fedora:latest
sh-5.0# cat /etc/redhat-release
Fedora release 33 (Thirty Three)

Lorsque vous êtes connecté au conteneur nouvellement créé, vous pouvez voir que vous êtes automatiquement connecté en tant que root :

sh-5.0# whoami
root
sh-5.0#

En tant que root utilisateur, vous pouvez faire n'importe quoi dans ce conteneur, ce qui signifie que vous pouvez exploiter l'hôte du conteneur et faire beaucoup de dégâts. Comme vous pouvez instancier un conteneur, vous pouvez faire des choses sur l'hôte même si vous ne faites pas partie du compte sudoers de l'hôte.

Quittez le conteneur que vous venez de créer et créez un nouveau conteneur pour démontrer l'exploit :

[mcalizo@Rhel82 ~]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@131043f2e306 /]#

L'option -v monte le / de l'hôte Docker répertoire vers le conteneur sous le /exploit répertoire :

[root@131043f2e306 /]#ls exploit/
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Parce qu'il est monté, vous pouvez faire n'importe quoi sur l'hôte Docker. Par exemple, vous pouvez supprimer des fichiers, modifier des configurations spécifiques pour endommager le système, ou même installer une application cheval de Troie ou d'autres logiciels malveillants pour voler des informations importantes.

Pourquoi cela arrive-t-il ?

Vous vous demandez peut-être pourquoi cela est possible puisque SELinux est en mode d'application. Creusez plus profondément dans SELinux pour voir où les choses se sont mal passées.

Vérifiez que SELinux a un contexte Docker :

[mcalizo@Rhel82 ~]$ ps -eZ | grep docker
system_u:system_r:container_runtime_t:s0 30768 ? 00:00:04 dockerd
[mcalizo@Rhel82 ~]$

Comme prévu, c'est le cas. Cela signifie que SELinux gère le démon Docker. Inspectez le démon Docker pour voir si SELinux est activé par défaut :

[mcalizo@Rhel82 ~]$ docker info | grep Security -A3
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.18.0-193.el8.x86_64

SELinux n'est pas activé par défaut. C'est le problème! Pour résoudre ce problème, activez SELinux pour contrôler et gérer Docker en mettant à jour ou en créant le fichier /etc/docker/daemon.json comme indiqué ici (vous devez disposer d'un accès root pour effectuer cette opération) :

[root@Rhel82 ~]# cat /etc/docker/daemon.json 
{
  "selinux-enabled": true
}
[root@Rhel82 ~]#
[root@Rhel82 ~]# systemctl restart docker

Après avoir créé ou mis à jour le fichier et redémarré Docker, vous devriez voir que la prise en charge de SELinux est activée dans le démon Docker :

[root@Rhel82 ~]# systemctl restart docker
[mcalizo@Rhel82 root]$ docker info | grep Security -A3
 Security Options:
  seccomp
   Profile: default
  selinux
[mcalizo@Rhel82 root]$

Bien qu'il soit toujours possible d'installer un système de fichiers spécifique dans votre hôte Docker sur votre conteneur Docker, la mise à jour ou l'accès au fichier n'est plus autorisé :

[mcalizo@Rhel82 root]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@ecb5836da1f6 /]# touch /exploit/etc/shadow.sh
touch: cannot touch '/exploit/etc/shadow.sh': Permission denied
[root@ecb5836da1f6 /]#

En savoir plus

Votre première ligne de défense dans le monde des conteneurs dépend de la force avec laquelle vous configurez le système d'exploitation de vos hôtes de conteneurs. Il existe de nombreuses façons d'implémenter la sécurité Linux, y compris les options disponibles sur le marché pour augmenter votre niveau de sécurité.

SELinux est une couche de sécurité supplémentaire intégrée par défaut aux distributions Linux. Pour en tirer parti et protéger votre système contre les compromis, assurez-vous que SELinux reste activé.

Si vous souhaitez en savoir plus, consultez :

  • Comment installer Docker CE sur CentOS 8/RH
  • Aide-mémoire sur la sécurité Docker
  • documentation dockerd
  • Utiliser la documentation des volumes
  • Qu'est-ce que SELinux ?

Linux
  1. Enregistrez votre session terminale avec Asciinema

  2. Analysez votre sécurité Linux avec Lynis

  3. Comment sécuriser vos services de messagerie Linux avec SSL/TLS

  4. Les distributions Linux ont-elles encore de l'importance avec les conteneurs ?

  5. Sécurisez votre serveur Linux avec Fail2Ban [Guide du débutant]

Protégez votre confidentialité en ligne avec ces distributions Linux

Sécurisez votre réseau Linux avec firewall-cmd

Comment sécuriser les serveurs Linux avec SE Linux

Comment sécuriser SSH avec Fail2Ban

Gérez vos serveurs avec Cockpit Linux

Comment sécuriser votre site Web avec Let's Encrypt sur Ubuntu 20.04