
kubeaudit helps you audit your Kubernetes clusters against common security controls
Il est désormais nécessaire que les clusters utilisent Kubernetes >= 1.19.
Les labels de substitution avec des annotations
kubernetes.ionon enregistrées seront dépréciés. Il deviendra bientôt obligatoire d'utiliserkubeaudit.ioà la place. Référez-vous à cette discussion pour plus de contexte.
Kubeaudit est prévu pour être déprécié d'ici octobre 2024.
Nous recherchons activement des mainteneurs intéressés pour reprendre la direction de ce projet. Si vous êtes passionné par la poursuite de son développement et de sa maintenance, veuillez nous contacter.
Pour les utilisateurs à la recherche d'alternatives, nous recommandons de passer à Kubebench, qui offre des fonctionnalités similaires et est activement maintenu.
Merci à la communauté pour ses contributions et son soutien.
kubeaudit est un outil en ligne de commande et un package Go permettant d'auditer les clusters Kubernetes pour diverses préoccupations de sécurité, telles que :
tl;dr. kubeaudit garantit que vous déployez des conteneurs sécurisés !
Pour utiliser kubeaudit en tant que package Go, consultez la documentation du package.
Le reste de ce README se concentre sur l'utilisation de kubeaudit en tant qu'outil en ligne de commande.
brew install kubeaudit
Kubeaudit propose des versions officielles validées et stables : Versions officielles
La branche principale (main) peut contenir des fonctionnalités plus récentes que les versions stables. Si vous avez besoin d'une fonctionnalité plus récente non encore incluse dans une version, assurez-vous d'utiliser la dernière version de Go et exécutez la commande suivante :
go get -v github.com/Shopify/kubeaudit
Commencez à utiliser kubeaudit avec le Démarrage rapide ou consultez toutes les commandes prises en charge.
Prérequis : kubectl v1.12.0 ou ultérieur
Avec kubectl v1.12.0 introduisant une pluggabilité facile des fonctions externes, kubeaudit peut être invoqué via kubectl audit en
make plugin et en ayant $GOPATH/bin disponible dans votre PATH.ou
kubectl-audit et en le rendant disponible dans votre PATH.Nous ne publions plus d'images sur Docker Hub (depuis que Docker Hub a abandonné les organisations Free Team). Pour l'instant, les anciennes images sont toujours disponibles mais pourraient cesser de l'être à tout moment. Nous commencerons bientôt à publier des images dans le registre de conteneurs Github.
Pour exécuter kubeaudit en tant que tâche dans votre cluster, consultez Exécuter kubeaudit dans un cluster.
kubeaudit a trois modes :
Si un fichier manifeste Kubernetes est fourni à l'aide du drapeau -f/--manifest, kubeaudit auditera ce fichier manifeste.
Exemple de commande :
kubeaudit all -f "/path/to/manifest.yml"
Exemple de sortie :
$ kubeaudit all -f "internal/test/fixtures/all_resources/deployment-apps-v1.yml"
---------------- Résultats pour ---------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
namespace: deployment-apps-v1
--------------------------------------------
-- [error] AppArmorAnnotationMissing
Message: Annotation AppArmor manquante. L'annotation 'container.apparmor.security.beta.kubernetes.io/container' doit être ajoutée.
Metadata:
Container: container
MissingAnnotation: container.apparmor.security.beta.kubernetes.io/container
-- [error] AutomountServiceAccountTokenTrueAndDefaultSA
Message: Compte de service par défaut avec token monté. automountServiceAccountToken doit être défini sur 'false' ou un compte de service non par défaut doit être utilisé.
-- [error] CapabilityShouldDropAll
Message: Capacité non définie sur ALL. Idéalement, vous devriez supprimer toutes les capacités et ajouter celles dont vous avez besoin dans la liste d'ajout.
Metadata:
Container: container
Capability: AUDIT_WRITE
...
Si aucune erreur d'une sévérité minimale donnée n'est trouvée, le message suivant est renvoyé :
Toutes les vérifications terminées. 0 vulnérabilités à haut risque trouvées
Le mode manifeste prend également en charge la correction automatique de tous les problèmes de sécurité à l'aide de la commande autofix :
kubeaudit autofix -f "/path/to/manifest.yml"
Pour écrire le manifeste corrigé dans un nouveau fichier au lieu de modifier le fichier source, utilisez le drapeau -o/--output.
kubeaudit autofix -f "/path/to/manifest.yml" -o "/path/to/fixed"
Pour corriger un manifeste en fonction de règles personnalisées spécifiées dans un fichier de configuration kubeaudit, utilisez le drapeau -k/--kconfig.
kubeaudit autofix -k "/path/to/kubeaudit-config.yml" -f "/path/to/manifest.yml" -o "/path/to/fixed"
Kubeaudit peut détecter s'il s'exécute dans un conteneur au sein d'un cluster. Si c'est le cas, il essaiera d'auditer toutes les ressources Kubernetes de ce cluster :
kubeaudit all
Kubeaudit essaiera de se connecter à un cluster en utilisant le fichier kubeconfig local ($HOME/.kube/config). Un autre emplacement du kubeconfig peut être spécifié à l'aide du drapeau --kubeconfig. Pour spécifier un contexte du kubeconfig, utilisez le drapeau -c/--context.
kubeaudit all --kubeconfig "/path/to/config" --context my_cluster
Pour plus d'informations sur les fichiers de configuration Kubernetes, consultez https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/
Kubeaudit produit des résultats avec trois niveaux de sévérité :
Error : Un problème de sécurité ou une configuration Kubernetes invalideWarning : Une recommandation de bonne pratiqueInfo : Informationnel, aucune action requise. Cela inclut les résultats qui sont annulésLe niveau de sévérité minimal peut être défini à l'aide du drapeau --minSeverity/-m.
Par défaut, kubeaudit affiche les résultats de manière lisible. Si la sortie doit être traitée ultérieurement, elle peut être définie pour produire du JSON avec le drapeau --format json. Pour afficher les résultats sous forme de logs (l'ancien comportement par défaut), utilisez --format logrus. Certains formats de sortie incluent des couleurs pour faciliter la lecture dans un terminal. Pour désactiver les couleurs (par exemple, si vous envoyez la sortie vers un fichier texte), utilisez le drapeau --no-color.
Vous pouvez générer un rapport kubeaudit au format SARIF à l'aide du drapeau --format sarif. Pour écrire les résultats SARIF dans un fichier, vous pouvez rediriger la sortie avec >. Par exemple :
kubeaudit all -f path-to-my-file.yaml --format="sarif" > example.sarif
Si des résultats de niveau error sont présents, kubeaudit se termine avec le code de sortie 2. Cela peut être modifié à l'aide du drapeau --exitcode/-e.
Pour toutes les façons de personnaliser kubeaudit, consultez Drapeaux globaux.
Les auditeurs peuvent également être exécutés individuellement.
Le fichier de configuration kubeaudit peut être utilisé pour deux choses :
Toute configuration pouvant être spécifiée à l'aide de drapeaux pour les auditeurs individuels peut être représentée via ce fichier de configuration.
Le fichier de configuration a le format suivant :
enabledAuditors:
# Les auditeurs sont activés par défaut s'ils ne sont pas explicitement définis sur "false"
apparmor: false
asat: false
capabilities: true
deprecatedapis: true
hostns: true
image: true
limits: true
mounts: true
netpols: true
nonroot: true
privesc: true
privileged: true
rootfs: true
seccomp: true
auditors:
capabilities:
# Ajouter les capacités nécessaires à la liste d'ajout, afin que kubeaudit ne signale pas d'erreurs
allowAddList: ['AUDIT_WRITE', 'CHOWN']
deprecatedapis:
# Si aucune version n'est spécifiée et que l'auditeur 'deprecatedapis' est activé, des résultats WARN
# seront générés pour les ressources définies avec une API dépréciée.
currentVersion: '1.22'
targetedVersion: '1.25'
image:
# Si aucune image n'est spécifiée et que l'auditeur 'image' est activé, des résultats WARN
# seront générés pour les conteneurs qui utilisent une image sans tag
image: 'myimage:mytag'
limits:
# Si aucune limite n'est spécifiée et que l'auditeur 'limits' est activé, des résultats WARN
# seront générés pour les conteneurs qui n'ont pas de limites CPU ou mémoire spécifiées
cpu: '750m'
memory: '500m'
Pour plus de détails sur chaque auditeur, y compris une description de la configuration spécifique à l'auditeur dans le fichier de configuration, consultez la Documentation des auditeurs.
Remarque : Le fichier de configuration kubeaudit n'est pas le même que le fichier kubeconfig spécifié avec le drapeau --kubeconfig, qui fait référence au fichier de configuration Kubernetes (voir Mode Local). Notez également que seules les commandes all et autofix prennent en charge l'utilisation d'un fichier de configuration kubeaudit. Il ne fonctionnera pas avec les autres commandes.
Remarque : Si des drapeaux sont utilisés en combinaison avec le fichier de configuration, les drapeaux prévalent.
Les problèmes de sécurité peuvent être ignorés pour des conteneurs ou pods spécifiques en ajoutant des labels d'annulation. Cela signifie que l'auditeur produira des résultats info au lieu de résultats error et que le nom du résultat d'audit sera suivi de Allowed. Les labels sont documentés dans la documentation de chaque auditeur, mais le format général pour les auditeurs prenant en charge les annulations est le suivant :
Un label d'annulation se compose d'une clé et d'une valeur.
La clé est une combinaison du type d'annulation (conteneur ou pod) et d'un identifiant d'annulation propre à chaque auditeur (voir la documentation pour l'auditeur spécifique). La clé peut prendre l'une des deux formes suivantes selon le type d'annulation :
container.kubeaudit.io/[nom du conteneur].[identifiant d'annulation]
kubeaudit.io/[identifiant d'annulation]
Si la valeur est définie sur une chaîne non vide, elle sera affichée dans le résultat info en tant que OverrideReason :
$ kubeaudit asat -f "auditors/asat/fixtures/service-account-token-true-allowed.yml"
---------------- Résultats pour ---------------
apiVersion: v1
kind: ReplicationController
metadata:
name: replicationcontroller
namespace: service-account-token-true-allowed
--------------------------------------------
-- [info] AutomountServiceAccountTokenTrueAndDefaultSAAllowed
Message: Résultat d'audit annulé : Compte de service par défaut avec token monté. automountServiceAccountToken doit être défini sur 'false' ou un compte de service non par défaut doit être utilisé.
Metadata:
OverrideReason: SomeReason
Conformément à la spécification Kubernetes, la valeur doit comporter 63 caractères ou moins et doit être vide ou commencer et se terminer par un caractère alphanumérique ([a-z0-9A-Z]) avec des tirets (-), des underscores (_), des points (.), et des caractères alphanumériques entre eux.
Plusieurs labels d'annulation (pour plusieurs auditeurs) peuvent être ajoutés à la même ressource.
Consultez la documentation spécifique de l'auditeur pour l'auditeur que vous souhaitez annuler pour des exemples.
Pour en savoir plus sur les labels, consultez https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
Si vous souhaitez corriger un bug, contribuer une fonctionnalité ou simplement corriger une faute de frappe, n'hésitez pas à le faire tant que vous suivez notre Code de conduite.
go get github.com/Shopify/kubeauditcd $GOPATH/src/github.com/Shopify/kubeauditgit remote add fork https://github.com/you-are-awesome/kubeauditgit checkout -b awesome-new-featureUSE_KIND=true make test (pour exécuter les tests sans Kind : make test)git commit -am 'Ajoute une fonctionnalité géniale'git push forkNotez que si vous n'avez pas signé le CLA avant d'ouvrir votre PR, vous pouvez relancer la vérification en ajoutant un commentaire à la PR disant "J'ai signé le CLA!"!
| Commande | Description | Documentation |
|---|
all | Exécute tous les auditeurs disponibles, ou ceux spécifiés via un config. | docs |
autofix | Corrige automatiquement les problèmes de sécurité. | docs |
version | Affiche la version actuelle de kubeaudit. |
| Commande | Description | Documentation |
|---|
apparmor | Trouve les conteneurs fonctionnant sans AppArmor. | docs |
asat | Trouve les pods utilisant un compte de service par défaut monté automatiquement. | docs |
capabilities | Trouve les conteneurs qui ne suppriment pas les capacités recommandées ou qui en ajoutent de nouvelles. | docs |
deprecatedapis | Trouve toute ressource définie avec une version d'API dépréciée. | docs |
hostns | Trouve les conteneurs qui ont HostPID, HostIPC ou HostNetwork activés. | docs |
image | Trouve les conteneurs qui n'utilisent pas la version souhaitée d'une image (via le tag) ou utilisent une image sans tag. | docs |
limits | Trouve les conteneurs qui dépassent les limites CPU et mémoire spécifiées ou qui n'en spécifient pas. | docs |
mounts | Trouve les conteneurs qui ont des chemins hôtes sensibles montés. | docs |
netpols | Trouve les espaces de noms qui n'ont pas de politique réseau de refus par défaut. | docs |
nonroot | Trouve les conteneurs s'exécutant en tant que root. | docs |
privesc | Trouve les conteneurs qui permettent l'escalade de privilèges. | docs |
privileged | Trouve les conteneurs s'exécutant en mode privilégié. | docs |
rootfs | Trouve les conteneurs qui n'ont pas de système de fichiers racine en lecture seule. | docs |
seccomp | Trouve les conteneurs s'exécutant sans Seccomp. | docs |
| Court | Long | Description |
|---|
| --format | Le format de sortie à utiliser (un parmi "sarif", "pretty", "logrus", "json") (par défaut "pretty") | |
| --kubeconfig | Chemin vers le fichier de configuration Kubernetes local. Utilisé uniquement en mode local (par défaut $HOME/.kube/config) | |
| -c | --context | Le nom du contexte kubeconfig à utiliser |
| -f | --manifest | Chemin vers la configuration yaml à auditer. Utilisé uniquement en mode manifeste. Vous pouvez utiliser - pour lire depuis l'entrée standard. |
| -n | --namespace | Auditer uniquement les ressources dans l'espace de noms spécifié. Non pris en charge actuellement en mode manifeste. |
| -g | --includegenerated | Inclure les ressources générées dans l'analyse (telles que les Pods générés par les déploiements). Si vous souhaitez que kubeaudit produise des résultats pour les ressources générées (par exemple si vous avez des ressources personnalisées ou souhaitez détecter des ressources orphelines dont la ressource propriétaire n'existe plus), vous pouvez utiliser ce drapeau. |
| -m | --minseverity | Définir le niveau de sévérité le plus bas à rapporter (un parmi "error", "warning", "info") (par défaut "info") |
| -e | --exitcode | Code de sortie à utiliser s'il y a des résultats de sévérité "error". Classiquement, 0 est utilisé pour le succès et tous les codes non nuls pour une erreur. (par défaut 2) |
| --no-color | Ne pas utiliser de couleurs dans la sortie (par défaut false) |