Registro de auditoría

Esta página explica cómo usar el registro de auditoría en los clústeres de Google Kubernetes Engine.

Descripción general

Todos los clústeres con la tecnología de Kubernetes cuentan con el registro de auditoría de Kubernetes, que conserva un registro cronológico de las llamadas que se realizaron al servidor de API de Kubernetes. Las entradas de registro de auditoría de Kubernetes son útiles a fin de investigar solicitudes sospechosas a la API, recopilar estadísticas o crear alertas de supervisión para llamadas no deseadas a la API.

Los clústeres de GKE integran el registro de auditoría de Kubernetes en los Registros de auditoría de Cloud y Stackdriver Logging. Puedes ver las entradas de registro de auditoría de Kubernetes en el proyecto de Google Cloud Platform.

Además de las entradas escritas mediante Kubernetes, los registros de auditoría del proyecto cuentan con entradas escritas mediante Kubernetes Engine.

Audit Logging GA está disponible en GKE 1.11.4 y en versiones posteriores.

Antes de comenzar

Sigue estos pasos a fin de prepararte para esta tarea:

  • Asegúrate de habilitar la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Asegúrate de instalar el SDK de Cloud.
  • Establece tu ID del proyecto predeterminado:
    gcloud config set project [PROJECT_ID]
  • Si trabajas con clústeres zonales, establece tu zona de procesamiento predeterminada con el siguiente comando:
    gcloud config set compute/zone [COMPUTE_ZONE]
  • Si trabajas con clústeres regionales, establece tu región de procesamiento predeterminada con el siguiente comando:
    gcloud config set compute/region [COMPUTE_REGION]
  • Actualiza gcloud a la versión más reciente con el siguiente comando:
    gcloud components update

Es necesario tener un clúster de Kubernetes Engine en el proyecto. Puedes usar un clúster existente o crear uno nuevo para realizar los ejercicios de este tema. Si eliges un clúster existente, asegúrate de que haya tenido alguna actividad reciente. Por ejemplo, si no has creado una implementación recientemente, ahora puedes crear una si ingresas este comando:

kubectl run log-exercise --image nginx

Obtén más información sobre el registro de auditoría de Kubernetes.

Registros de auditoría en el proyecto

Tu proyecto de GCP tiene los registros de auditoría siguientes:

  • Registro de actividad de administrador
  • Registro de acceso a los datos

Según la configuración predeterminada, el registro de actividad de administrador está habilitado y no tiene costo adicional.

Según la configuración predeterminada, el registro de acceso a los datos está inhabilitado y habilitarlo puede causar una facturación adicional. Para obtener más información sobre cómo habilitar el registro de acceso a los datos y los costos asociados, consulta Configura registros de acceso a los datos.

Kubernetes Engine no admite el registro de la lTransparencia de acceso.

Se pueden escribir entradas en los registros del proyecto con varios servicios de Google Cloud Platform. En el servicio de Kubernetes, también se escriben entradas en los registros de auditoría del proyecto. Para los clústeres de Kubernetes Engine, las entradas de registro escritas con los servicios siguientes son las más relevantes:

Servicio Nombre comercial
k8s.io Kubernetes
container.googleapis.com Kubernetes Engine

Mira el registro de actividad del administrador del proyecto

Console

  1. En GCP Console, ve a la página Registros en el menú de Registro.

    Ir a la página Registros

  2. Cerca de la parte superior de la página, ubica el menú desplegable para seleccionar un tipo de recurso. En el menú desplegable, selecciona Clúster de Kubernetes.

  3. Como alternativa, especifica la Ubicación o elige Todas las ubicaciones. Si seleccionas una ubicación, puedes seleccionar un clúster específico en esa ubicación.

  4. El menú a la derecha es para seleccionar un registro. En el menú desplegable, selecciona la actividad y haz clic en Aceptar.

  5. La pantalla muestra todos los niveles de registro según la configuración predeterminada. Para especificar un nivel de registro, como Advertencia, selecciónalo en el menú desplegable que representa los niveles de registro.

  6. Es posible que la pantalla solo muestre las entradas de registro de la última hora. Si no ves ninguna entrada de registro de la última hora, haz clic en Cargar registros anteriores.

  7. En el cuadro de Filtrar por etiqueta o búsqueda de texto, arriba de los menús desplegables mencionados anteriormente, haz clic en la flecha hacia abajo para abrir el menú desplegable. En el menú, selecciona Convertir a filtro avanzado.

  8. El cuadro de texto muestra un filtro similar al siguiente:

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Factivity"
    
  9. Haz clic en la flecha al comienzo de la línea para abrir una de las entradas de registro. El campo logName de la entrada tiene el valor projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity.

gcloud

Enumera las primeras dos entradas de registro en el registro de actividad de administrador del proyecto:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"' \
    --limit 2 \
    --freshness 300d

en las que [PROJECT_ID] es tu ID del proyecto.

Los resultados muestran dos entradas de registro. Observa que, para cada entrada de registro, el campo logName tiene el valor projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity.

insertId: 18yao5jem14og
labels:
  cluster_version: 1.8.8-gke.0
logName: projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity
...

Interfaces de filtro básico y avanzado

En GCP Console, la página Registros tiene dos interfaces de filtrado: básico y avanzado. Para obtener información sobre las dos interfaces de filtrado, consulta Interfaces de filtro del visor de registros.

Mira los servicios con los que escribe el registro de actividad de administrador

Console

  1. En GCP Console, ve a la página Registros en el menú de Registro.

    Ir a la página Registros

  2. Si la página Registros aún no está en modo avanzado, cambia a este modo. En el cuadro de filtros, haz clic en la flecha hacia abajo ubicada a la derecha y selecciona Convertir a filtro avanzado.

  3. En el cuadro de filtros, borra cualquier texto existente y luego ingresa este filtro:

    logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
    protoPayload.serviceName="k8s.io"
    

    en el que [PROJECT_ID] es tu ID del proyecto.

    Haz clic en Enviar filtro.

    La pantalla enumera todas las entradas de tu registro de actividad de administrador que fueron escritas por el servicio k8s.io. Es decir, las entradas escritas con el plano de control de Kubernetes.

  4. Ahora busca entradas de registro que fueron escritas por servicios distintos de k8s.io. En el cuadro de filtros, cambia serviceName="k8s.io" por serviceName!="k8s.io". Haz clic en Enviar filtro.

    La pantalla enumera las entradas de tu registro de actividad de administrador que no fueron escritas por el servicio k8s.io.

  5. Abre una de las entradas de registro y expande el campo protoPayload. Mira el valor de serviceName para ver qué servicio escribió la entrada de registro.

  6. Ahora busca las entradas de registro que fueron escritas por el servicio container.googleapis.com . Es decir, las entradas escritas con el plano de control de Kubernetes Engine. En el cuadro de filtros, cambia serviceName!="k8s.io" por serviceName="container.googleapis.com". Haz clic en Enviar filtro.

gcloud

Enumera las dos primeras entradas del registro de actividad de administrador de tu proyecto que fueron escritas por el servicio k8s.io. Es decir, las entradas escritas con el plano de control de Kubernetes:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName="k8s.io"' \
    --limit 2 \
    --freshness 300d

en las que [PROJECT_ID] es tu ID del proyecto.

En el resultado, puedes ver que protoPayload:serviceName tiene el valor k8s.io:

protoPayload:
  ...
  serviceName: k8s.io

Ahora busca entradas de registro que fueron escritas por servicios distintos de k8s.io.

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName!="k8s.io"' \
    --limit 2 \
    --freshness 300d

El resultado enumera las entradas de tu registro de actividad de administrador que no fueron escritas por el servicio k8s.io.

logName: projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity
...
protoPayload:
  ...
  serviceName: compute.googleapis.com
...

En una de las entradas de registro, mira el valor de protoPayload.serviceName para ver qué servicio la escribió.

Ahora busca las entradas de registro que fueron escritas por el servicio container.googleapis.com. Es decir, las entradas escritas con el plano de control de Kubernetes Engine:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName="container.googleapis.com"' \
    --limit 2 \
    --freshness 300d

en las que [PROJECT_ID] es tu ID del proyecto.

Filtra el registro de actividad de administrador por tipo de recurso

Cada entrada de registro en el registro de actividad de administrador se aplica a un tipo determinado de recurso. Los siguientes tipos de recursos son los más relevantes para los clústeres de Kubernetes:

Tipo de recurso Nombre comercial
k8s_cluster Clúster de Kubernetes
gke_cluster Operaciones del clúster de GKE

Las entradas de registro escritas por el servidor de API de Kubernetes se aplican al tipo de recurso k8s_cluster. En estas entradas de registro, se describen operaciones en los recursos de Kubernetes del clúster, por ejemplo, pods, implementaciones y secretos.

Las entradas de registro escritas por el servidor de API de Kubernetes Engine se aplican al recurso gke_cluster. En estas entradas de registro, se describen operaciones como la creación y eliminación de clústeres.

Console

  1. En GCP Console, ve a la página Registros en el menú de Registro.

    Ir a la página Registros

  2. Si la página Registros aún no está en modo básico, cambia a este modo. En el cuadro de filtros, haz clic en la flecha hacia abajo ubicada a la derecha y selecciona Quitar filtros y volver al modo básico.

  3. En el menú desplegable para seleccionar un tipo de recurso, selecciona Clúster de Kubernetes. Este es el nombre comercial del tipo de recurso k8s_cluster.

  4. En el menú desplegable para seleccionar un registro, selecciona la actividad y haz clic en Aceptar.

    La pantalla enumera todas las entradas de tu registro de actividad de administrador que corresponden al tipo de recurso k8s_cluster.

  5. Abre una de las entradas de registro y expande el campo resource. Verifica que el campo type tenga el valor k8s_cluster.

  6. Ahora, en el menú desplegable, selecciona Operaciones del clúster de GKE. Este es el nombre comercial del tipo de recurso gke_cluster. En el menú desplegable para seleccionar un registro, selecciona la actividad y haz clic en Aceptar.

    La pantalla enumera todas las entradas de tu registro de actividad de administrador que corresponden al tipo de recurso gke_cluster.

gcloud

Enumera las dos primeras entradas en el registro de actividad de administrador de tu proyecto que se aplican al tipo de recurso k8s_cluster:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND resource.type="k8s_cluster"' \
    --limit 2 \
    --freshness 300d

en las que [PROJECT_ID] es tu ID del proyecto.

En el resultado, puedes ver que el campo resource:type tiene el valor k8s_cluster:

resource:
  ...
  type: k8s_cluster

A continuación, enumera las dos primeras entradas en el registro de actividad de administrador de tu proyecto que se aplican al tipo de recurso gke_cluster de la siguiente manera:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND resource.type="gke_cluster"' \
    --limit 2 \
    --freshness 300d

En el resultado, puedes ver que el campo resource:type tiene el valor gke_cluster:

resource:
  ...
  type: gke_cluster

Ejemplos de filtros para el registro de actividad de administrador

Estos son algunos ejemplos de los filtros que puedes probar en GCP Console. En cada caso, reemplaza [PROJECT_ID] por el ID de tu proyecto.

Busca cambios en el Control de acceso según la función, excepto los cambios automatizados del sistema.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1"
NOT protoPayload.authenticationInfo.principalEmail:"system"
logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1.roles"
NOT protoPayload.authenticationInfo.principalEmail:"system"
logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1.rolebindings"
NOT protoPayload.authenticationInfo.principalEmail:"system"

Puedes usar consultas similares para buscar cambios en clusterroles y clusterrolebindings.

Busca solicitudes de firma de certificados.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.resourceName:"certificates.k8s.io/v1beta1/certificatesigningrequests"

Busca solicitudes web no autenticadas.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"system:anonymous"

Busca llamadas de identidad de bootstrap de Kubelet.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"kubelet"

Busca solicitudes autenticadas de nodo.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"system:node"

Busca llamadas fuera de un rango de IP.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.requestMetadata.callerIp!="127.0.0.1"
protoPayload.requestMetadata.callerIp!="::1"
NOT protoPayload.requestMetadata.callerIp:"[IP Prefix]"

Busca entradas en tu registro de actividad de administrador que se apliquen al tipo de recurso k8s_cluster y que describan la creación de una implementación.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"deployments.create"

Busca entradas en tu registro de actividad de administrador que se apliquen al tipo de recurso k8s_cluster y que tengan un valor principalEmail de system:anonymous. Estas entradas probablemente representan intentos fallidos de autenticación.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail="system:anonymous"

Busca entradas en tu registro de actividad de administrador que se apliquen al tipo de recurso gke_cluster y que describa la creación del clúster:

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
protoPayload.methodName="google.container.v1.ClusterManager.CreateCluster"

Busca entradas en tu registro de actividad de administrador que se apliquen al tipo de recurso gke_cluster y que tengan un valor severity de ERROR:

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
severity="ERROR"

Busca entradas en tu registro de actividad de administrador que se apliquen al tipo de recurso k8s_cluster y que describan una solicitud de escritura para un secreto:

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.secrets"
NOT protoPayload.methodName:"get"
NOT protoPayload.methodName:"list"
NOT protoPayload.methodName:"watch"

Busca entradas en tu registro de actividad de administrador que se apliquen al tipo de recurso k8s_cluster y que describan una solicitud de pod de un usuario en particular:

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.pods"
protoPayload.authenticationInfo.principalEmail="dev@example.com"

Para obtener más información sobre cómo crear filtros, consulta Filtros de registros avanzados.

Estructura de una entrada de registro

Cada entrada de registro es un objeto del tipo LogEntry. Para obtener más información, ve a Información sobre los registros de auditoría.

Habilita los registros de acceso a los datos

Obtén la política de administración de identidades y accesos (IAM) para tu proyecto:

gcloud projects get-iam-policy [PROJECT_ID] > my-policy.yaml

en las que [PROJECT_ID] es tu ID del proyecto.

Abre my-policy.yaml para ver tu política de IAM. Tu política probablemente contiene un objeto bindings similar al siguiente:

bindings:
- members:
  - serviceAccount:xxx.gserviceaccount.com
  - serviceAccount:yyy.gserviceaccount.com
  role: roles/container.clusterAdmin
- members:
  ...

En my-policy.yaml, crea un objeto auditConfigs, o agrégalo a tu objeto auditConfigs existente, para que ADMIN_READ, DATA_WRITE Y DATA_READ aparezcan enumerados en auditLogConfigs.

auditConfigs:
- auditLogConfigs:
  - logType: ADMIN_READ
  - logType: DATA_WRITE
  - logType: DATA_READ
  service: allServices

No cambies el valor de etag.

Guarda tu archivo actualizado como my-policy-2.yaml.

Establece la política de IAM para tu proyecto:

gcloud projects set-iam-policy [PROJECT_ID] my-policy-2.yaml

en la que [PROJECT_ID] es tu ID del proyecto.

Mira el registro de acceso a los datos del proyecto

Console

  1. En GCP Console, ve a la página Registros en el menú de Registro.

    Ir a la página Registros

  2. Si la página Registros aún no está en modo básico, cambia a este modo. En el cuadro de filtros, haz clic en la flecha hacia abajo ubicada a la derecha y selecciona Quitar filtros y volver al modo básico.

  3. Cerca de la parte superior de la página, ubica el menú desplegable para seleccionar un tipo de recurso. En el menú desplegable, selecciona Clúster de Kubernetes.

  4. En el menú para seleccionar un registro, selecciona data_access y haz clic en Aceptar.

  5. En el cuadro de Filtrar por etiqueta o búsqueda de texto, a la derecha, haz clic en la flecha hacia abajo para abrir el menú desplegable. En el menú, selecciona Convertir a filtro avanzado.

  6. El cuadro de texto muestra un filtro similar al siguiente:

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access"
  7. Abre una de las entradas de registro y observa que el campo logName de la entrada tiene el valor projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access.

gcloud

Enumera las dos primeras entradas de registro en el registro de acceso a los datos del proyecto:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access"' \
    --limit 2 \
    --freshness 30d

en las que [PROJECT_ID] es tu ID del proyecto.

Los resultados muestran dos entradas de registro. Observa que, para cada entrada de registro, el campo logName tiene el valor projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access.

insertId:  "x0vy9eej0j54"
labels: {…}
logName:  "projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access"
...

Exporta y almacena entradas de registro

Las entradas de registro se alojan en Stackdriver Logging durante un tiempo limitado conocido como período de retención. Después de eso, las entradas se borran.

Si deseas conservar tus entradas de registro por más tiempo, puedes exportarlas a un servicio de Google como Cloud Storage, BigQuery o Cloud Pub/Sub.

Configura métricas y alertas

Puedes usar Stackdriver Monitoring para configurar métricas a partir de las entradas de registro. También puedes usar métricas basadas en registros para configurar gráficos y alertas.

Política de auditorías

La política de auditoría de Kubernetes determina qué entradas de registro exporta el servidor de API de Kubernetes. La política de auditoría de Kubernetes Engine determina qué entradas van al registro de actividad de administrador y cuáles van al registro de acceso a los datos.

Para obtener más información sobre las políticas de auditoría en Kubernetes Engine, consulta la Política de auditoría de Kubernetes Engine.

Qué sigue

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Kubernetes Engine