
kubeaudit te ayuda a auditar tus clústeres de Kubernetes contra controles de seguridad comunes.
Ahora es un requisito que los clústeres ejecuten Kubernetes >=1.19.
Las etiquetas de anulación con anotaciones
kubernetes.iono registradas serán obsoletas. Pronto será un requisito usarkubeaudit.ioen su lugar. Consulte esta discusión para obtener más contexto.
Kubeaudit está planificado para ser desaprobado para octubre de 2024.
Estamos buscando activamente mantenedores interesados en asumir la responsabilidad de este proyecto. Si le apasiona continuar con su desarrollo y mantenimiento, comuníquese con nosotros.
Para los usuarios que buscan alternativas, recomendamos la transición a Kubebench, que ofrece funcionalidad similar y se mantiene activamente.
Gracias a la comunidad por sus contribuciones y apoyo.
kubeaudit es una herramienta de línea de comandos y un paquete Go para auditar clústeres de Kubernetes en busca de diversas preocupaciones de seguridad, como:
Resumen: kubeaudit asegura que despliegues contenedores seguros!
Para usar kubeaudit como un paquete Go, consulte la documentación del paquete.
El resto de este README se centrará en cómo usar kubeaudit como una herramienta de línea de comandos.
brew install kubeaudit
Kubeaudit tiene lanzamientos oficiales que están bendecidos y son estables: Lanzamientos oficiales
La rama principal puede tener características más nuevas que las versiones estables. Si necesita una característica nueva que aún no está incluida en un lanzamiento, asegúrese de usar la última versión de Go y ejecute lo siguiente:
go get -v github.com/Shopify/kubeaudit
Comience a usar kubeaudit con el Inicio Rápido o vea todos los comandos compatibles.
Requisito previo: kubectl v1.12.0 o posterior
Con kubectl v1.12.0 que introduce la fácil integración de funciones externas, kubeaudit se puede invocar como kubectl audit mediante
make plugin y tener $GOPATH/bin disponible en su PATH.o
kubectl-audit y tenerlo disponible en su PATH.Ya no publicamos imágenes en Docker Hub (desde que Docker Hub eliminó las organizaciones Free Team). Por el momento, las imágenes antiguas aún están disponibles pero pueden dejar de estarlo en cualquier momento. Pronto comenzaremos a publicar imágenes en el registro de contenedores de Github.
Para ejecutar kubeaudit como un trabajo en su clúster, consulte Ejecutar kubeaudit en un clúster.
kubeaudit tiene tres modos:
Si se proporciona un archivo de manifiesto de Kubernetes usando la bandera -f/--manifest, kubeaudit auditará el archivo de manifiesto.
Ejemplo de comando:
kubeaudit all -f "/path/to/manifest.yml"
Ejemplo de salida:
$ kubeaudit all -f "internal/test/fixtures/all_resources/deployment-apps-v1.yml"
---------------- Results for ---------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
namespace: deployment-apps-v1
--------------------------------------------
-- [error] AppArmorAnnotationMissing
Message: AppArmor annotation missing. The annotation 'container.apparmor.security.beta.kubernetes.io/container' should be added.
Metadata:
Container: container
MissingAnnotation: container.apparmor.security.beta.kubernetes.io/container
-- [error] AutomountServiceAccountTokenTrueAndDefaultSA
Message: Default service account with token mounted. automountServiceAccountToken should be set to 'false' or a non-default service account should be used.
-- [error] CapabilityShouldDropAll
Message: Capability not set to ALL. Ideally, you should drop ALL capabilities and add the specific ones you need to the add list.
Metadata:
Container: container
Capability: AUDIT_WRITE
...
Si no se encuentran errores con una severidad mínima determinada, se devuelve lo siguiente:
All checks completed. 0 high-risk vulnerabilities found
El modo manifiesto también admite la corrección automática de todos los problemas de seguridad usando el comando autofix:
kubeaudit autofix -f "/path/to/manifest.yml"
Para escribir el manifiesto corregido en un nuevo archivo en lugar de modificar el archivo fuente, use la bandera -o/--output.
kubeaudit autofix -f "/path/to/manifest.yml" -o "/path/to/fixed"
Para corregir un manifiesto basado en reglas personalizadas especificadas en un archivo de configuración de kubeaudit, use la bandera -k/--kconfig.
kubeaudit autofix -k "/path/to/kubeaudit-config.yml" -f "/path/to/manifest.yml" -o "/path/to/fixed"
Kubeaudit puede detectar si se está ejecutando dentro de un contenedor en un clúster. Si es así, intentará auditar todos los recursos de Kubernetes en ese clúster:
kubeaudit all
Kubeaudit intentará conectarse a un clúster usando el archivo kubeconfig local ($HOME/.kube/config). Se puede especificar una ubicación diferente de kubeconfig usando la bandera --kubeconfig. Para especificar un contexto del kubeconfig, use la bandera -c/--context.
kubeaudit all --kubeconfig "/path/to/config" --context my_cluster
Para obtener más información sobre los archivos de configuración de Kubernetes, consulte https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/
Kubeaudit genera resultados con tres niveles de severidad:
Error: Un problema de seguridad o configuración de Kubernetes inválidaWarning: Una recomendación de mejor prácticaInfo: Informativo, no se requiere acción. Esto incluye resultados que han sido anuladosEl nivel de severidad mínimo se puede configurar usando la bandera --minSeverity/-m.
Por defecto, kubeaudit mostrará los resultados de forma legible para humanos. Si se pretende procesar la salida adicionalmente, se puede configurar para que genere JSON usando la bandera --format json. Para generar resultados como registros (el valor predeterminado anterior) use --format logrus. Algunos formatos de salida incluyen colores para facilitar la lectura de los resultados en una terminal. Para deshabilitar los colores (por ejemplo, si está enviando la salida a un archivo de texto), puede usar la bandera --no-color.
Puede generar un informe de kubeaudit en SARIF usando la bandera --format sarif. Para escribir los resultados SARIF en un archivo, puede redirigir la salida con >. Por ejemplo:
kubeaudit all -f path-to-my-file.yaml --format="sarif" > example.sarif
Si hay resultados de nivel de severidad error, kubeaudit saldrá con el código de salida 2. Esto se puede cambiar usando la bandera --exitcode/-e.
Para todas las formas en que se puede personalizar kubeaudit, consulte Banderas Globales.
Los auditores también se pueden ejecutar individualmente.
El archivo de configuración de kubeaudit se puede usar para dos propósitos:
Cualquier configuración que se pueda especificar usando banderas para los auditores individuales se puede representar usando el archivo de configuración.
El archivo de configuración tiene el siguiente formato:
enabledAuditors:
# Los auditores están habilitados por defecto si no se establecen explícitamente en "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:
# agregar capacidades necesarias a la lista de agregar, para que kubeaudit no reporte errores
allowAddList: ['AUDIT_WRITE', 'CHOWN']
deprecatedapis:
# Si no se especifican versiones y el auditor 'deprecatedapis' está habilitado, se generarán resultados
# WARN para los recursos definidos con una API obsoleta.
currentVersion: '1.22'
targetedVersion: '1.25'
image:
# Si no se especifica una imagen y el auditor 'image' está habilitado, se generarán resultados
# WARN para contenedores que usan una imagen sin etiqueta
image: 'myimage:mytag'
limits:
# Si no se especifican límites y el auditor 'limits' está habilitado, se generarán resultados
# WARN para contenedores que no tienen límites de cpu o memoria especificados
cpu: '750m'
memory: '500m'
Para obtener más detalles sobre cada auditor, incluyendo una descripción de la configuración específica del auditor en el archivo de configuración, consulte la Documentación de Auditores.
Nota: El archivo de configuración de kubeaudit no es lo mismo que el archivo kubeconfig especificado con la bandera --kubeconfig, que se refiere al archivo de configuración de Kubernetes (consulte Modo Local). También tenga en cuenta que solo los comandos all y autofix admiten el uso de un archivo de configuración de kubeaudit. No funcionará con otros comandos.
Nota: Si se usan banderas en combinación con el archivo de configuración, las banderas tendrán prioridad.
Los problemas de seguridad se pueden ignorar para contenedores o pods específicos agregando etiquetas de anulación. Esto significa que el auditor producirá resultados info en lugar de resultados error y el nombre del resultado de la auditoría tendrá Allowed añadido. Las etiquetas están documentadas en la documentación de cada auditor, pero el formato general para los auditores que admiten anulaciones es el siguiente:
Una etiqueta de anulación consiste en una clave y un valor.
La clave es una combinación del tipo de anulación (contenedor o pod) y un identificador de anulación que es único para cada auditor (consulte la documentación del auditor específico). La clave puede tomar una de dos formas dependiendo del tipo de anulación:
container.kubeaudit.io/[nombre del contenedor].[identificador de anulación]
kubeaudit.io/[identificador de anulación]
Si el valor se establece en una cadena no vacía, se mostrará en el resultado info como OverrideReason:
$ kubeaudit asat -f "auditors/asat/fixtures/service-account-token-true-allowed.yml"
---------------- Results for ---------------
apiVersion: v1
kind: ReplicationController
metadata:
name: replicationcontroller
namespace: service-account-token-true-allowed
--------------------------------------------
-- [info] AutomountServiceAccountTokenTrueAndDefaultSAAllowed
Message: Audit result overridden: Default service account with token mounted. automountServiceAccountToken should be set to 'false' or a non-default service account should be used.
Metadata:
OverrideReason: SomeReason
Según la especificación de Kubernetes, value debe tener 63 caracteres o menos y debe estar vacío o comenzar y terminar con un carácter alfanumérico ([a-z0-9A-Z]) con guiones (-), guiones bajos (_), puntos (.), y alfanuméricos en medio.
Se pueden agregar múltiples etiquetas de anulación (para múltiples auditores) al mismo recurso.
Consulte la documentación del auditor específica que desea anular para ver ejemplos.
Para obtener más información sobre las etiquetas, consulte https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
Si desea corregir un error, contribuir con una característica o simplemente corregir un error tipográfico, siéntase libre de hacerlo siempre que siga nuestro Código de Conducta.
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 (para ejecutar pruebas sin Kind: make test)git commit -am 'Adds awesome feature'git push forkTenga en cuenta que si no firmó el CLA antes de abrir su PR, puede volver a ejecutar la verificación agregando un comentario al PR que diga "I've signed the CLA!"!
| Comando | Descripción | Documentación |
|---|
all | Ejecuta todos los auditores disponibles, o aquellos especificados usando un archivo de configuración de kubeaudit. | documentación |
autofix | Corrige automáticamente problemas de seguridad. | documentación |
version | Imprime la versión actual de kubeaudit. |
| Comando | Descripción | Documentación |
|---|
apparmor | Encuentra contenedores que se ejecutan sin AppArmor. | documentación |
asat | Encuentra pods que usan una cuenta de servicio predeterminada montada automáticamente. | documentación |
capabilities | Encuentra contenedores que no eliminan las capacidades recomendadas o agregan nuevas. | documentación |
deprecatedapis | Encuentra cualquier recurso definido con una versión de API obsoleta. | documentación |
hostns | Encuentra contenedores que tienen HostPID, HostIPC o HostNetwork habilitados. | documentación |
image | Encuentra contenedores que no usan la versión deseada de una imagen (a través de la etiqueta) o usan una imagen sin etiqueta. | documentación |
limits | Encuentra contenedores que exceden los límites de CPU y memoria especificados o no especifican ninguno. | documentación |
mounts | Encuentra contenedores que tienen rutas de host sensibles montadas. | documentación |
netpols | Encuentra namespaces que no tienen una política de red de denegación predeterminada. | documentación |
nonroot | Encuentra contenedores que se ejecutan como root. | documentación |
privesc | Encuentra contenedores que permiten la escalada de privilegios. | documentación |
privileged | Encuentra contenedores que se ejecutan como privilegiados. | documentación |
rootfs | Encuentra contenedores que no tienen un sistema de archivos de solo lectura. | documentación |
seccomp | Encuentra contenedores que se ejecutan sin Seccomp. | documentación |
| Corta | Larga | Descripción |
|---|
| --format | El formato de salida a usar (uno de "sarif", "pretty", "logrus", "json") (por defecto es "pretty") | |
| --kubeconfig | Ruta al archivo de configuración local de Kubernetes. Solo se usa en modo local (por defecto es $HOME/.kube/config) | |
| -c | --context | El nombre del contexto de kubeconfig a usar |
| -f | --manifest | Ruta al archivo de configuración yaml para auditar. Solo se usa en modo manifiesto. Puede usar - para leer desde stdin. |
| -n | --namespace | Auditar solo los recursos en el namespace especificado. Actualmente no compatible en modo manifiesto. |
| -g | --includegenerated | Incluir recursos generados en el escaneo (como Pods generados por deployments). Si desea que kubeaudit produzca resultados para recursos generados (por ejemplo, si tiene recursos personalizados o desea detectar recursos huérfanos donde el recurso propietario ya no existe), puede usar esta bandera. |
| -m | --minseverity | Establecer el nivel de severidad más bajo a reportar (uno de "error", "warning", "info") (por defecto es "info") |
| -e | --exitcode | Código de salida a usar si hay resultados con severidad "error". Convencionalmente, 0 se usa para éxito y todos los códigos no cero para un error. (por defecto es 2) |
| --no-color | No usar colores en la salida (por defecto es false) |