Verificar las conexiones de Google al plano de control de GKE


.

En esta página se describe cómo verificar las conexiones que realiza el personal de Google al plano de control de tu clúster de Google Kubernetes Engine (GKE) correlacionando los registros de GKE con los registros de Transparencia de acceso.

En los registros de Transparencia de acceso se registran las acciones que lleva a cabo el personal de Google cuando accede a tu contenido. Esta guía está dirigida a administradores de seguridad que quieran verificar el contenido de los registros de Transparencia de acceso y las aprobaciones de Acceso aprobado asociadas correlacionándolos con otras fuentes de registro de GKE. Esta verificación es totalmente opcional y no es necesaria para proteger tu plano de control.

Asegúrate de que conoces los siguientes conceptos:

En esta página se describe una parte de un conjunto de funciones opcionales del plano de control de GKE que te permiten realizar tareas como verificar el estado de seguridad del plano de control o configurar el cifrado y la firma de credenciales en el plano de control mediante claves que tú gestionas. Para obtener más información, consulta el artículo Acerca de la autoridad del plano de control de GKE.

De forma predeterminada, Google Cloud aplica varias medidas de seguridad al plano de control gestionado. En esta página se describen las funciones opcionales que le ofrecen más visibilidad o control sobre el plano de control de GKE.

Información sobre el acceso de Google a las instancias del plano de control del clúster

Durante las sesiones de solución de problemas o por otros motivos empresariales justificados, es posible que el personal de Google, como los ingenieros de fiabilidad de sitios y los empleados del servicio de atención al cliente de Cloud, necesiten acceso de administrador a las instancias de Compute Engine que alojan tu plano de control. En función de tu paquete de asistencia del equipo de Atención al Cliente y de tu configuración, Transparencia de acceso proporciona registros de auditoría detallados de este acceso de administrador. Aprobación de acceso te permite exigir una aprobación explícita antes de que cualquier miembro del personal de Google pueda acceder a tus recursos. Para obtener más información sobre el acceso de administrador y las herramientas que puede usar para autorizar el acceso y registrar los cambios, consulte Acceso de administrador para empleados de Google.

Registros de acceso al plano de control

Cuando habilitas la autoridad del plano de control de GKE, GKE genera registros de acceso al plano de control que puedes usar de forma opcional para contrastar los registros de auditoría generados por Transparencia de acceso y por Aprobación de acceso. GKE añade registros de acceso al plano de control al bucket _Default de Logging para registrar las conexiones de red entrantes y los eventos SSH específicos en las instancias del plano de control. Debes habilitar la autoridad del plano de control de GKE en tu proyecto para generar registros de acceso al plano de control de tus clústeres.

GKE genera los siguientes registros de acceso para el plano de control:

El volumen de los registros de conexión del plano de control depende de factores como el número de nodos del clúster, el número de instancias del plano de control (los clústeres regionales tienen más instancias del plano de control que los zonales) y la frecuencia con la que tus cargas de trabajo llaman al servidor de la API de Kubernetes. El volumen de los registros de SSH es pequeño y depende del número de reinicios de nodos.

Para verificar las conexiones con tu plano de control, busca los registros de acceso al plano de control de tu clúster y compáralos con los registros de auditoría de Transparencia de acceso y Aprobación de acceso. De esta forma, puedes confirmar que todas las conexiones SSH a tus instancias del plano de control se han realizado como resultado del acceso administrativo autorizado por el personal de Google. Cuando habilitas la autoridad del plano de control de GKE en tu clúster, todo el acceso SSH del personal de Google a tu plano de control es no interactivo, lo que significa que cada conexión SSH ejecuta un único comando que tú autorizas.

Precios

Se aplican las siguientes consideraciones sobre los precios:

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.
  • Habilita la API Cloud Logging.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  • Habilita Transparencia de acceso en tu organización. Para obtener instrucciones, consulta el artículo sobre cómo habilitar Transparencia de acceso.

  • Si quieres, habilita Aprobación de acceso en tu proyecto y selecciona el servicio de GKE. Para obtener instrucciones, consulta Revisar y aprobar solicitudes de acceso con la clave de firma gestionada por Google.

  • Asegúrate de que tu entorno cumple los requisitos para usar las funciones de autoridad del plano de control de GKE. Para habilitar estas funciones, ponte en contacto con tu Google Cloud equipo de Ventas.

Requisitos

Los registros de acceso al plano de control requieren la versión 1.31.1-gke.1846000 de GKE o una posterior.

Roles y permisos necesarios

Para obtener los permisos que necesitas para habilitar la generación de registros y para acceder a los registros y procesarlos, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Habilitar los registros de acceso al plano de control del clúster de GKE

Puedes habilitar la generación de registros de acceso al plano de control en los clústeres de los modos Autopilot y Estándar habilitando el componente de registro correspondiente. Para obtener más información sobre los tipos de registros del plano de control, consulta Ver registros de GKE.

Los nombres de los componentes de registro admitidos para los registros de acceso del plano de control son los siguientes:

  • Registros SSH del plano de control: KCP_SSHD
  • Registros de conexión del plano de control: KCP_CONNECTION

Habilitar los registros de acceso del plano de control en un clúster nuevo

En el siguiente ejemplo se crea un clúster en modo Autopilot con ambos tipos de registros de acceso al plano de control habilitados. Para habilitar solo un tipo de registro de acceso al plano de control, omite el nombre del componente correspondiente en el comando.

gcloud container clusters create-auto CLUSTER_NAME \
    --location=LOCATION \
    --logging=SYSTEM,KCP_SSHD,KCP_CONNECTION

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del nuevo clúster.
  • LOCATION: la ubicación en la que se creará el clúster.

Para especificar los componentes de registro al crear un clúster con la API de GKE, en el método projects.locations.clusters.create, define los valores correspondientes en el objeto LoggingConfig del recurso Cluster.

Habilitar los registros de acceso al plano de control en un clúster

Para actualizar la configuración de registro de un clúster y habilitar los registros de acceso al plano de control, debes hacer lo siguiente:

  1. Busca los componentes de registro que usa tu clúster.
  2. Identifica los valores correspondientes que se deben especificar en la marca --logging de la CLI de gcloud para mantener habilitados esos componentes de registro.
  3. Actualiza la configuración de registro del clúster para habilitar los registros de acceso al plano de control junto con la configuración de registro que ya tengas.

Los valores que especifiques para la marca --logging en el comando gcloud container clusters update son diferentes de los que ves cuando describes tu clúster.

  1. Comprueba la configuración de registro del clúster:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --flatten=loggingConfig \
        --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'
    

    El resultado debería ser similar al siguiente:

    SYSTEM_COMPONENTS,WORKLOADS,APISERVER,SCHEDULER,CONTROLLER_MANAGER
    
  2. Identifica los valores de la CLI de gcloud para la marca --logging que correspondan a la configuración del componente de registro de la salida del paso anterior. Para ver una lista de los valores de gcloud CLI que corresponden a componentes de registro específicos, consulta la tabla Registros disponibles.

  3. Actualiza la configuración de registro con los registros de acceso al plano de control:

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --logging=SYSTEM,EXISTING_LOGS,KCP_ACCESS_LOGS
    

    Haz los cambios siguientes:

    • EXISTING_LOGS: una lista separada por comas de los componentes de registro que ya usa tu clúster. Asegúrate de especificar los valores de gcloud CLI que correspondan a estos componentes de registro, tomados de la tabla Registros disponibles.
    • KCP_ACCESS_LOGS: lista separada por comas de los tipos de registro de acceso del plano de control que se habilitarán en el clúster, de la siguiente manera:

      • Para los registros SSH del plano de control, especifica KCP_SSHD.
      • Para los registros de conexión del plano de control, especifica KCP_CONNECTION.

Para especificar los componentes de registro al actualizar un clúster mediante la API de GKE, en el método projects.locations.clusters.update, defina los valores de los componentes de registro y nuevos en el objeto LoggingConfig del recurso ClusterUpdate.

Ejemplo de actualización de un clúster para habilitar los registros de acceso al plano de control

Imagina un clúster para el que el comando gcloud container clusters describe tiene la siguiente configuración de registro:

SYSTEM_COMPONENTS,WORKLOADS,APISERVER,SCHEDULER,CONTROLLER_MANAGER

El siguiente comando de actualización del clúster habilita ambos tipos de registros de acceso al plano de control y conserva la configuración de registro del clúster de ejemplo:

gcloud container clusters update example-cluster \
    --location=us-central1 \
    --logging=SYSTEM,WORKLOAD,API_SERVER,SCHEDULER,CONTROLLER_MANAGER,KCP_SSHD,KCP_CONNECTION

Contrastar los registros de acceso del plano de control con los registros de Transparencia de acceso

Para verificar el acceso al plano de control de un clúster, obtén los registros de conexión del plano de control, los registros SSH del plano de control y los registros de transparencia de acceso de ese clúster:

  1. En la Google Cloud consola, abre la página Explorador de registros.

    Ir a Explorador de registros

  2. Para obtener todos los registros de un clúster específico, incluidos los registros de acceso al plano de control y los registros de Transparencia de acceso, ejecuta la siguiente consulta:

    (logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-connection"
    resource.labels.cluster_name="CLUSTER_NAME"
    jsonPayload.connection.dest_port="22")
    OR
    (logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-sshd"
    resource.labels.cluster_name="CLUSTER_NAME")
    OR
    (logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Faccess_transparency"
    json_payload.accesses.methodName="GoogleInternal.SSH.Master"
    json_payload.accesses.resourceName="//container.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/clusters/CLUSTER_NAME")
    

La salida debe mostrar todos los tipos de registros siguientes de tu clúster:

  • Registro de Transparencia de acceso
  • Registro de conexión del plano de control
  • Registros de SSH de cada sesión de SSH

Realizar comprobaciones de verificación

La comprobación de verificación principal consiste en comprobar si se muestran todos los tipos de registro de las conexiones SSH al ejecutar la consulta de registro de la sección anterior. Cada registro de Transparencia de acceso debe tener un registro de conexión del plano de control correspondiente y uno o varios registros SSH. Estos registros corresponden a las acciones que realizan los usuarios en tus instancias del plano de control, por lo que el volumen de registros debería ser pequeño.

También puedes realizar las siguientes comprobaciones adicionales del contenido del registro:

  1. En cada registro de SSH del plano de control, comprueba si existe un registro de Transparencia de acceso en un periodo de 15 minutos anterior a la marca de tiempo del registro de SSH. Este periodo tiene en cuenta el cierre final de la sesión SSH, que se produce varios minutos después de que Transparencia de acceso registrara la conexión inicial.
  2. En cada registro de conexión del plano de control, comprueba si existe un registro de Transparencia de acceso en un periodo de 5 minutos anterior a la marca de tiempo del registro de conexión del plano de control.
  3. Si usas Aprobación de acceso en tu clúster, comprueba si cada registro de Transparencia de acceso tiene un campo accessApprovals correspondiente. Compara este campo con las solicitudes de aprobación de acceso de tu clúster.

    Para obtener solicitudes de aprobación de acceso de tu proyecto, consulta Ver solicitudes de aprobación del historial de acceso. La aprobación de acceso puede estar sujeta a exclusiones.

  4. De forma opcional, valida la firma del registro de Aprobación de acceso firmado asociado al registro de Transparencia de acceso.

Detalles del registro de acceso del plano de control

En esta sección se proporcionan detalles y ejemplos de los registros de acceso al plano de control que genera GKE cuando el personal de Google se conecta a tus instancias del plano de control.

Registros de conexión del plano de control

GKE añade un registro de conexión del plano de control por cada nueva conexión de red entrante a una instancia del plano de control. Estos registros incluyen detalles específicos, como los siguientes:

  • Direcciones IP y puertos de origen y destino
  • Dirección y protocolo de la conexión

El siguiente ejemplo es un registro de conexión del plano de control:

{
  insertId: "z1eq8wonio335a5h",
  jsonPayload: {
    instance: {
      vm_name: "gke-dee49f0d6fa34ce3a2ac-f513-d195-vm",
      zone: "us-central1-c"
    },
    cluster: {
      cluster_id: "CLUSTER_ID",
      cluster_urn: "//container.googleapis.com/projects/PROJECT_NUMBER/locations/us-central1-c/clusters/CLUSTER_NAME"
    },
    connection: {
      state: "NEW",
      src_ip: "192.0.2.100",
      src_port: 32774,
      dest_ip: "203.0.113.12",
      dest_port: 22,
      direction: "INGRESS"
      protocol: "TCP"
    },
  }
  logName: "projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-connection",
  receiveTimestamp: "2024-04-11T04:08:01.883070399Z",
  resource: {
    labels: {
      cluster_name: "CLUSTER_NAME",
      location: "us-central1-c",
      project_id: "PROJECT_ID"
    }
    type: "gke_cluster",
  }
  severity: "NOTICE",
  timestamp: "2024-04-11T04:07:59.019330Z"
}

Los siguientes campos de la entrada de registro son relevantes para verificar las acciones de Google:

  • cluster.cluster_urn: identificador de recurso completo del clúster. Este identificador tiene el formato //container.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/clusters/CLUSTER_NAME, con las siguientes variables:

    • PROJECT_NUMBER: número de proyecto numérico del proyecto de clústeres.
    • LOCATION: la Google Cloud ubicación de tu clúster.
    • CLUSTER_NAME: el nombre de tu clúster.
  • connection: detalles sobre el intento de conexión. Este campo contiene la siguiente información:

    • state: el estado de la conexión. En las conexiones nuevas, el valor es NEW.
    • src_ip: la dirección IP de la fuente de la conexión.
    • src_port: número de puerto de la fuente de conexión.
    • dest_ip: la dirección IP interna de tu VM del plano de control.
    • dest_port: número de puerto de destino.
    • direction: la dirección de la conexión. El valor es siempre INGRESS.
    • protocol: el protocolo IP, como TCP.

Registros SSH del plano de control

GKE añade registros SSH del plano de control para eventos relacionados con conexiones SSH a instancias del plano de control. GKE registra los siguientes eventos:

  • Se ha aceptado la clave SSH de un usuario
  • El estado de la sesión ha cambiado de 0 a 1, lo que indica que el usuario ha iniciado sesión correctamente.
  • Sesión SSH abierta
  • Sesión SSH cerrada
  • El estado de la sesión ha cambiado de 1 a 0, lo que indica que el usuario ha cerrado sesión.
  • No se ha podido iniciar la sesión SSH

Por ejemplo, el siguiente registro SSH del plano de control corresponde a una sesión SSH que se está abriendo:

{
  insertId: "8llczemdulwbbwpa",
  jsonPayload: {
    instance: {
      vm_name: "gke-06cb920c609941c0a5ce-6840-40e9-vm",
      zone: "us-central1-c"
    },
    cluster: {
      cluster_id: "891e6d12889747748c1ac16ffcc6cb7c0a96450b36864eb680917c119fd801d0",
      cluster_urn: "//container.googleapis.com/projects/PROJECT_NUMBER/locations/us-central1/clusters/CLUSTER_NAME",
    },
    message: "pam_unix(sshd:session): session opened for user REDACTED by (uid=0)",
  },
  logName: "projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-ssh",
  receiveTimestamp: "2024-04-09T13:21:55.231436462Z"
  resource: {
    type: "gke_cluster",
    labels: {
      cluster_name: "CLUSTER_NAME",
      location: "us-central1",
      project_id: "PROJECT_ID"
    }
  },
  severity: "NOTICE",
  timestamp: "2024-04-09T13:21:50.742246Z"
}

Los siguientes campos de la entrada de registro son relevantes para verificar las acciones de Google:

  • cluster.cluster_urn: identificador de recurso completo del clúster. Este identificador tiene el formato //container.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/clusters/CLUSTER_NAME, con las siguientes variables:

    • PROJECT_NUMBER: número de proyecto de tu proyecto de clúster.
    • LOCATION: la Google Cloud ubicación de tu clúster.
    • CLUSTER_NAME: el nombre de tu clúster.
  • message: detalles sobre la conexión SSH.

Inhabilitar los registros de acceso al plano de control

  1. Para ver los tipos de registro específicos que usa tu clúster, ejecuta el siguiente comando:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --flatten=loggingConfig \
        --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'
    

    El resultado debería ser similar al siguiente:

    SYSTEM_COMPONENTS,WORKLOADS,API_SERVER,SCHEDULER,CONTROLLER_MANAGER,KCP_SSHD,KCP_CONNECTION
    
  2. Para inhabilitar los registros de acceso al plano de control de un clúster, ejecuta el siguiente comando:

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --logging=SYSTEM,WORKLOAD,API_SERVER,SCHEDULER,CONTROLLER_MANAGER
    

En la marca --logging, especifica los componentes de registro de la salida del comando anterior. Este comando de ejemplo inhabilita los registros de acceso del plano de control, pero mantiene habilitados los registros de otros componentes del plano de control.

Para inhabilitar los componentes de registro mediante la API de GKE, define los valores correspondientes en el objeto LoggingConfig del recurso ClusterUpdate en el método projects.locations.clusters.update.

Siguientes pasos