View a markdown version of this page

Auditoría y registro - Amazon EKS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Auditoría y registro

sugerencia

Explore las mejores prácticas a través de los talleres de Amazon EKS.

La recopilación y el análisis de los registros [de auditoría] son útiles por distintos motivos. Los registros pueden ayudar a analizar y atribuir la causa raíz, es decir, a atribuir un cambio a un usuario en particular. Cuando se han recopilado suficientes registros, también se pueden usar para detectar comportamientos anómalos. En EKS, los registros de auditoría se envían a Amazon Cloudwatch Logs. La política de auditoría de EKS es la siguiente:

apiVersion: audit.k8s.io/v1beta1 kind: Policy rules: # Log full request and response for changes to aws-auth ConfigMap in kube-system namespace - level: RequestResponse namespaces: ["kube-system"] verbs: ["update", "patch", "delete"] resources: - group: "" # core resources: ["configmaps"] resourceNames: ["aws-auth"] omitStages: - "RequestReceived" # Do not log watch operations performed by kube-proxy on endpoints and services - level: None users: ["system:kube-proxy"] verbs: ["watch"] resources: - group: "" # core resources: ["endpoints", "services", "services/status"] # Do not log get operations performed by kubelet on nodes and their statuses - level: None users: ["kubelet"] # legacy kubelet identity verbs: ["get"] resources: - group: "" # core resources: ["nodes", "nodes/status"] # Do not log get operations performed by the system:nodes group on nodes and their statuses - level: None userGroups: ["system:nodes"] verbs: ["get"] resources: - group: "" # core resources: ["nodes", "nodes/status"] # Do not log get and update operations performed by controller manager, scheduler, and endpoint-controller on endpoints in kube-system namespace - level: None users: - system:kube-controller-manager - system:kube-scheduler - system:serviceaccount:kube-system:endpoint-controller verbs: ["get", "update"] namespaces: ["kube-system"] resources: - group: "" # core resources: ["endpoints"] # Do not log get operations performed by apiserver on namespaces and their statuses/finalizations - level: None users: ["system:apiserver"] verbs: ["get"] resources: - group: "" # core resources: ["namespaces", "namespaces/status", "namespaces/finalize"] # Do not log get and list operations performed by controller manager on metrics.k8s.io resources - level: None users: - system:kube-controller-manager verbs: ["get", "list"] resources: - group: "metrics.k8s.io" # Do not log access to health, version, and swagger non-resource URLs - level: None nonResourceURLs: - /healthz* - /version - /swagger* # Do not log events resources - level: None resources: - group: "" # core resources: ["events"] # Log request for updates/patches to nodes and pods statuses by kubelet and node problem detector - level: Request users: ["kubelet", "system:node-problem-detector", "system:serviceaccount:kube-system:node-problem-detector"] verbs: ["update", "patch"] resources: - group: "" # core resources: ["nodes/status", "pods/status"] omitStages: - "RequestReceived" # Log request for updates/patches to nodes and pods statuses by system:nodes group - level: Request userGroups: ["system:nodes"] verbs: ["update", "patch"] resources: - group: "" # core resources: ["nodes/status", "pods/status"] omitStages: - "RequestReceived" # Log delete collection requests by namespace-controller in kube-system namespace - level: Request users: ["system:serviceaccount:kube-system:namespace-controller"] verbs: ["deletecollection"] omitStages: - "RequestReceived" # Log metadata for secrets, configmaps, and tokenreviews to protect sensitive data - level: Metadata resources: - group: "" # core resources: ["secrets", "configmaps"] - group: authentication.k8s.io resources: ["tokenreviews"] omitStages: - "RequestReceived" # Log requests for serviceaccounts/token resources - level: Request resources: - group: "" # core resources: ["serviceaccounts/token"] # Log get, list, and watch requests for various resource groups - level: Request verbs: ["get", "list", "watch"] resources: - group: "" # core - group: "admissionregistration.k8s.io" - group: "apiextensions.k8s.io" - group: "apiregistration.k8s.io" - group: "apps" - group: "authentication.k8s.io" - group: "authorization.k8s.io" - group: "autoscaling" - group: "batch" - group: "certificates.k8s.io" - group: "extensions" - group: "metrics.k8s.io" - group: "networking.k8s.io" - group: "policy" - group: "rbac.authorization.k8s.io" - group: "scheduling.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived" # Default logging level for known APIs to log request and response - level: RequestResponse resources: - group: "" # core - group: "admissionregistration.k8s.io" - group: "apiextensions.k8s.io" - group: "apiregistration.k8s.io" - group: "apps" - group: "authentication.k8s.io" - group: "authorization.k8s.io" - group: "autoscaling" - group: "batch" - group: "certificates.k8s.io" - group: "extensions" - group: "metrics.k8s.io" - group: "networking.k8s.io" - group: "policy" - group: "rbac.authorization.k8s.io" - group: "scheduling.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived" # Default logging level for all other requests to log metadata only - level: Metadata omitStages: - "RequestReceived"

Recomendaciones

Habilite los registros de auditoría

Los registros de auditoría forman parte de los registros del plano de control de Kubernetes gestionados por EKS y gestionados por EKS. Las instrucciones para enabling/disabling los registros del plano de control, que incluyen los registros del servidor de API de Kubernetes, el administrador del controlador y el planificador, junto con el registro de auditoría, se encuentran aquí, #enabling -control-plane-log-export. https://docs.aws.amazon.com/eks/latest/userguide/control-plane-logs.html

nota

Cuando habilites el registro en el plano de control, incurrirás en costos para almacenar los registros. https://aws.amazon.com/cloudwatch/pricing/ CloudWatch Esto plantea un problema más amplio sobre el costo continuo de la seguridad. En última instancia, tendrá que sopesar esos costos con el costo de una violación de seguridad, por ejemplo, una pérdida financiera, un daño a su reputación, etc. Es posible que descubra que puede proteger adecuadamente su entorno si implementa solo algunas de las recomendaciones de esta guía.

aviso

El tamaño máximo de una entrada de CloudWatch registro es de 1 MB, mientras que el tamaño máximo de solicitud a la API de Kubernetes es de 1,5 MB. Las entradas de registro de más de 1 MB se truncarán o solo incluirán los metadatos de la solicitud.

Utilice los metadatos de auditoría

Los registros de auditoría de Kubernetes incluyen dos anotaciones que indican si se autorizó o no una solicitud authorization.k8s.io/decision y el motivo de la decisión. authorization.k8s.io/reason Usa estos atributos para determinar por qué se permitió una llamada a la API en particular.

Cree alarmas para eventos sospechosos

Crea una alarma que te avise automáticamente cuando haya un aumento de 403 respuestas prohibidas y 401 no autorizadas y, a continuación hostsourceIPs, utiliza atributos como, y k8s_user.username para averiguar de dónde provienen esas solicitudes.

Analice los registros con Log Insights

Utilice CloudWatch Log Insights para supervisar los cambios en los objetos de RBAC, por ejemplo, las funciones RoleBindings ClusterRoles, y ClusterRoleBindings. A continuación se muestran algunos ejemplos de consultas:

Muestra las actualizaciones de aws-auth ConfigMap:

fields @timestamp, @message | filter @logStream like "kube-apiserver-audit" | filter verb in ["update", "patch"] | filter objectRef.resource = "configmaps" and objectRef.name = "aws-auth" and objectRef.namespace = "kube-system" | sort @timestamp desc

Muestra la creación de nuevos webhooks o los cambios en los de validación:

fields @timestamp, @message | filter @logStream like "kube-apiserver-audit" | filter verb in ["create", "update", "patch"] and responseStatus.code = 201 | filter objectRef.resource = "validatingwebhookconfigurations" | sort @timestamp desc

Enumera las operaciones de creación, actualización y eliminación de roles:

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="roles" and verb in ["create", "update", "patch", "delete"]

Enumera las operaciones de creación, actualización y eliminación para RoleBindings:

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="rolebindings" and verb in ["create", "update", "patch", "delete"]

Enumera las operaciones de creación, actualización y eliminación para ClusterRoles:

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="clusterroles" and verb in ["create", "update", "patch", "delete"]

Enumera las operaciones de creación, actualización y eliminación para ClusterRoleBindings:

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="clusterrolebindings" and verb in ["create", "update", "patch", "delete"]

Traza las operaciones de lectura no autorizadas comparándolas con los secretos:

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="secrets" and verb in ["get", "watch", "list"] and responseStatus.code="401" | stats count() by bin(1m)

Lista de solicitudes anónimas fallidas:

fields @timestamp, @message, sourceIPs.0 | sort @timestamp desc | limit 100 | filter user.username="system:anonymous" and responseStatus.code in ["401", "403"]

Audite sus CloudTrail registros

Las API de AWS llamadas por los pods que utilizan funciones de IAM para cuentas de servicio (IRSA) se registran automáticamente CloudTrail junto con el nombre de la cuenta de servicio. Si en el registro aparece el nombre de una cuenta de servicio que no estaba autorizada de forma explícita a llamar a una API, puede ser un indicio de que la política de confianza del rol de IAM no se configuró correctamente. En términos generales, Cloudtrail es una excelente manera de atribuir las llamadas a la API de AWS a principios de IAM específicos.

Utilice Insights para descubrir actividades sospechosas CloudTrail

CloudTrail insights analiza automáticamente los eventos de gestión de escritura a partir de los CloudTrail rastros y le avisa de cualquier actividad inusual. Esto puede ayudarle a identificar si hay un aumento en el volumen de llamadas en las API de escritura de su cuenta de AWS, incluso las que provienen de pods que utilizan IRSA para asumir una función de IAM. Para obtener más información, consulte Announcing CloudTrail Insights: Identify and Response to Unusual API Activity.

Recursos adicionales

A medida que aumenta el volumen de registros, es posible que no sea efectivo analizarlos y filtrarlos con Log Insights u otra herramienta de análisis de registros. Como alternativa, puede considerar la posibilidad de utilizar Sysdig Falco y ekscloudwatch. https://github.com/sysdiglabs/ekscloudwatch Falco analiza los registros de auditoría y señala las anomalías o los abusos durante un período prolongado. El proyecto ekscloudwatch reenvía los eventos del registro de auditoría a Falco para su análisis. CloudWatch Falco proporciona un conjunto de reglas de auditoría predeterminadas, además de la posibilidad de añadir las suyas propias.

Otra opción podría ser almacenar los registros de auditoría en S3 y utilizar el algoritmo SageMaker Random Cut Forest para detectar comportamientos anómalos que justifiquen una investigación más profunda.

Herramientas y recursos

Los siguientes proyectos comerciales y de código abierto se pueden utilizar para evaluar la alineación de su clúster con las mejores prácticas establecidas: