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.
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.
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, ...)