La sécurité dans Kubernetes

La sécurité dans Kubernetes

Les agences gouvernementales NSA et CISA viennent de publier leur guide de renforcement de la sécurité de Kubernetes. Ce dernier contient 32 pages de recommandations sur la sécurisation des paramètres et des bonnes pratiques à adopter.

NSA, CISA release Kubernetes Hardening Guidance
The National Security Agency (NSA) and the Cybersecurity and Infrastructure Security Agency (CISA) released a Cybersecurity Technical Report, “Kubernetes Hardening Guidance,” today. This report

Résumé des recommandations:

1 - Vos conteneurs n'exécuteront pas d'application en root

Vos manifestes définissant vos images doivent définir un utilisateur et un groupe standards pour l’exécution de vos applications.

FROM ubuntu:latest

#MAJ et installation de make
RUN apt update && apt install -y make

#Copie des sources dans un dossier appelé "code" et construisez l'application avec make.
COPY . /code
RUN make /code

#Créez un nouvel utilisateur (user1) et un nouveau groupe (group1), puis passez dans le contexte de cet utilisateur.
RUN useradd user1 && groupadd group1
USER user1:group1

#Définir le point d'entrée par défaut pour le conteneur
CMD /code/app
Création et utilisation d'un compte standard pour l’exécution applicative

2 - Le système de fichiers de vos containers en Read-Only

En fonction de la compatibilité avec votre couche applicative empaquetée, le système de fichiers (hors données) devrait être immuable.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec:
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
      name: web
    spec:
      containers:
      - command: ["sleep"]
        args: ["999"]
        image: ubuntu:latest
        name: web
        securityContext:
          readOnlyRootFilesystem: true
        volumeMounts:
          - mountPath: /writeable/location/here
            name: volName
      volumes:
      - emptyDir: {}
        name: volName	

3 - Analysez les images récupérées

Vérifiez l’absence de vulnérabilité au sein de vos images grâce à des outils d'introspection.

4 - Utilisez les Pod Security Policies

L'utilisation des PSP vous permet notamment d'isoler les conteneurs de votre machine hôte, d’empêcher l'exécution de conteneurs en mode privilégier ou encore d’empêcher les élévations root. https://kubernetes.io/docs/concepts/policy/pod-security-policy/

5 - N'exposez pas les services de vos nœuds Master

Le Control-Plane est le cerveau de Kubernetes, protégez ses composants vitaux (etcd, kube-api,...) par l'utilisation de règles RBAC et de Pare-Feu. etcd devrait uniquement être accessible par kube-api, ne créez pas un accès direct pour procéder à sa sauvegarde. Toute personne ayant accès à etcd à un accès total sur toutes les ressources du Cluster (pods, secrets, Tokens ,....)

6 - Utilisez des communications chiffrées

Que ce soit pour des communications intra-Cluster ou externe, définissez un chiffrement TLS sur chaque flux. Les services MESH sont une aide pour la sécurisation des communications.

7 - Utilisez les Network Policies

L'utilisation des Network Policies vous permet de restreindre les communications entre vos ressources. Tout ce qui n'est pas explicitement autorisé doit être refusé.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: example-access-nginx
  namespace: prod #this can any namespace or be left out if no namespace is used
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  -from:
    -podSelector:
      matchLabels:
        access: “true”

8 - Utilisez des Secrets

N'utilisez pas d'informations sensibles dans vos fichiers de définitions de ressources. Créez un Secret Kubernetes. Les Secrets sont simplement encodés en Base-64, mais vous pouvez utiliser un fournisseur KMS pour chiffrer leurs contenus.

9 - Désactivez l'authentification anonyme

Depuis la version 1.6 de Kubernetes, l'authentification anonyme est activée par défaut. Désactivez là avec le paramètre --anonymous-auth=false dans la configuration de votre API Server.

10 - Protégez vos .kubeconfig

Appliquez une sécurité renforcée sur vos fichiers de configuration vous permettant de prendre le contrôle de vos Clusters Kubernetes. Ils contiennent des informations sensibles (identifiants, O-Auth Tokens, ...)

11 - Activez le mode Audit et journalisez

Tracez les activités sur vos environnements en activant le mode Audit. Journaliser ces informations vers un SIEM ou simple syslog externe au cluster.

12 - Maintenez à jour vos solutions

Appliquez dès que possible les correctifs de sécurités, que ce soit sur Kubernetes, mais également sur les couches inférieures (Hyperviseurs, Introspecteurs, Pare-Feu, Équilibreurs, ...)