Configura el acceso adaptado al contexto para las cuentas de servicio

En esta guía, se describe cómo puedes configurar el acceso adaptado al contexto para proteger el acceso de las cuentas de servicio a las APIs de Google Cloud , según los niveles de acceso que definas.

Limitaciones

Se aplican las siguientes limitaciones a las políticas de acceso adaptado al contexto para las cuentas de servicio:

  • Los atributos basados en la red o en la dirección IP no se pueden usar para las vinculaciones de cuentas de servicio si la cuenta de servicio se usará para las ejecuciones de flujos de trabajo y Cloud Scheduler.

  • Las políticas de acceso adaptado al contexto no pueden bloquear las conexiones a clústeres privados de GKE con kubectl ni a Cloud SQL con el proxy de autenticación.

  • Si un nivel de acceso vinculado a una cuenta de servicio contiene atributos no admitidos, como atributos Device, se deniega el acceso a la API.

  • No se admiten los niveles de acceso con alcance para las cuentas de servicio.

Si usas Cloud Build y Cloud Run, te recomendamos que utilices las siguientes funciones integradas de la VPC:

Antes de comenzar

  1. Asegúrate de tener una Google Cloud organización y, al menos, un Google Cloud proyecto.
  2. Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  3. Instala Google Cloud CLI.

  4. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  5. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  6. Crea o selecciona un Google Cloud proyecto.

    Roles necesarios para seleccionar o crear un proyecto

    • Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
    • Crear un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos (roles/resourcemanager.projectCreator), que contiene el permiso resourcemanager.projects.create. Obtén más información para otorgar roles.
    • Crea un proyecto de Google Cloud :

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por un nombre para el proyecto Google Cloud que estás creando.

    • Selecciona el proyecto Google Cloud que creaste:

      gcloud config set project PROJECT_ID

      Reemplaza PROJECT_ID por el nombre de tu proyecto de Google Cloud .

  7. Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .

  8. Instala Google Cloud CLI.

  9. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  10. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  11. Crea o selecciona un Google Cloud proyecto.

    Roles necesarios para seleccionar o crear un proyecto

    • Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
    • Crear un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos (roles/resourcemanager.projectCreator), que contiene el permiso resourcemanager.projects.create. Obtén más información para otorgar roles.
    • Crea un proyecto de Google Cloud :

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por un nombre para el proyecto Google Cloud que estás creando.

    • Selecciona el proyecto Google Cloud que creaste:

      gcloud config set project PROJECT_ID

      Reemplaza PROJECT_ID por el nombre de tu proyecto de Google Cloud .

  12. Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .

  13. Actualiza los componentes de Google Cloud CLI:
    gcloud components update --quiet
  14. Crea una cuenta de servicio en tu proyecto si aún no tienes una. Esta cuenta de servicio es el destino de la política de acceso.

Roles obligatorios

En esta sección, se describen los roles de Identity and Access Management (IAM) que se requieren para usar el acceso adaptado al contexto.

Roles a nivel del proyecto

Para obtener el permiso que necesitas a nivel del proyecto, pídele a tu administrador que te otorgue el rol de IAM de Administrador de cuenta de servicio (roles/iam.serviceAccountAdmin) en la cuenta de usuario o la cuenta de servicio. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene el permiso the required permissions, que se requiere a nivel del proyecto.

También puedes obtener este permiso con roles personalizados o con otros roles predefinidos.

Roles a nivel de organización

Para obtener el permiso que necesitas a nivel de la organización, pídele a tu administrador que te otorgue los siguientes roles de IAM en la cuenta de usuario o la cuenta de servicio:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene el permiso the required permissions, que se requiere a nivel de la organización.

También puedes obtener este permiso con roles personalizados o con otros roles predefinidos.

Vincula políticas de acceso a diferentes niveles de recursos

Puedes vincular políticas de acceso con el mismo modo de aplicación a recursos que se encuentran en diferentes niveles de la jerarquía de recursos. Cuando un recurso intenta acceder, el Acceso adaptado al contexto usa la política vinculada a ese recurso antes de intentar usar una política vinculada a un recurso de nivel superior.

Por ejemplo, puedes vincular una política de acceso en modo de aplicación directamente a una cuenta de servicio y una política diferente en modo de aplicación al proyecto que contiene la cuenta de servicio. Cuando la cuenta de servicio intenta acceder a los recursos, el Acceso adaptado al contexto evalúa la política vinculada a la cuenta de servicio. Para otras cuentas de servicio del proyecto que no tienen políticas de acceso vinculadas, el acceso adaptado al contexto evalúa la política de modo de aplicación vinculada al proyecto. Lo mismo sucede si el modo de aplicación se establece en ejecución de prueba tanto para la política a nivel del proyecto como para la política a nivel de la cuenta de servicio.

Puedes usar varias políticas de acceso para implementar políticas de acceso de forma incremental y selectiva. Por ejemplo, puedes hacer lo siguiente:

  1. Vincula una política de acceso en modo de ejecución de prueba a nivel del proyecto y asegúrate de que funcione como esperas. Para ello, verifica si hay eventos de acceso denegado en los registros de auditoría de Cloud.
  2. Vincula la política de acceso en modo de aplicación solo a cuentas de servicio específicas.
  3. Vincula la política de acceso en modo de aplicación a nivel del proyecto y, luego, vincula una política de acceso menos restrictiva y en modo de aplicación a cuentas de servicio específicas según sea necesario.

Atributos de nivel de acceso para cuentas de servicio

En esta sección, se enumeran los niveles de acceso compatibles con las cuentas de servicio.

Se admiten los siguientes atributos para las cuentas de servicio:

  • Subredes de IP, que se basan en la dirección IP pública
  • Redes de VPC, que se basan en la dirección IP privada
  • La ubicación geográfica, que se basa en la dirección IP pública

    Cuando la cuenta de servicio realiza cualquier solicitud a las APIs de Google Cloud, el acceso adaptado al contexto evalúa la solicitud y compara la dirección IP de la solicitud con las direcciones IP especificadas en la política de acceso adaptado al contexto. Si las direcciones IP coinciden, se permite la llamada a la API. Si la dirección IP no coincide, se deniega la llamada a la API.

  • Es un nivel de acceso personalizado con una expresión de Common Expression Language (CEL). La expresión debe evaluarse como true para permitir el acceso y como false para denegarlo.

    La siguiente expresión CEL es útil para restringir el acceso por cuentas de servicio.

    La expresión se evalúa como true si la solicitud se originó en uno o más números de proyecto especificados:

        expression: "originatesFromProjects(origin, [PROJECT_NUMBER, ...])"
        

    originatesFromProjects verifica si la solicitud proviene de una red asociada al proyecto especificado y si proviene de una dirección IP privada.

  • Hora del día, que se basa en la hora y la fecha de la solicitud en una zona horaria especificada.

    Para obtener más información, consulta Cómo configurar condiciones de acceso por hora y día.

Crea un nivel de acceso

En esta sección, se describe cómo crear un nivel de acceso dentro de tu organización. Los niveles de acceso definen las condiciones en las que se permite el acceso.

  1. Sigue las instrucciones para crear un nivel de acceso básico o crear un nivel de acceso personalizado.

  2. Ten en cuenta el nombre completo de la política de acceso, que tiene el siguiente formato: accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME.

Crea una vinculación de acceso

Vincula el nivel de acceso a la cuenta de servicio seleccionada. De esta manera, se aplican las condiciones definidas en el nivel de acceso. Puedes vincular el nivel de acceso a una sola cuenta de servicio o a todas las cuentas de servicio de un proyecto.

Vincula el nivel de acceso a una cuenta de servicio específica

En esta sección, se describe cómo vincular el nivel de acceso a una cuenta de servicio específica.

gcloud

Vincula el nivel de acceso a una cuenta de servicio con gcloud CLI.

gcloud access-context-manager cloud-bindings create \
    --organization=ORGANIZATION_ID \
    --service-account=SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
    --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

Reemplaza lo siguiente:

  • ORGANIZATION_ID: El ID de tu organización Google Cloud
  • SERVICE_ACCOUNT_NAME: Es el nombre, no el correo electrónico, de la cuenta de servicio de destino.
  • SERVICE_ACCOUNT_PROJECT_ID: Es el ID del proyecto que contiene la cuenta de servicio de destino.
  • POLICY_ID: El ID de la política de acceso
  • ACCESS_LEVEL_NAME: Es el nombre del nivel de acceso que creaste.

    Para usar el acceso adaptado al contexto sin aplicar el nivel de acceso ni rechazar el acceso, puedes vincular el nivel de acceso en el modo de prueba.

API de REST

Para vincular el nivel de acceso a una cuenta de servicio específica con la API de REST, ejecuta el siguiente comando:

  1. Crea un archivo request.json con el siguiente contenido:

    {
      "principal": {
        "serviceAccount": "SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    Reemplaza lo siguiente:

    • SERVICE_ACCOUNT_NAME: Es el nombre, no el correo electrónico, de la cuenta de servicio de destino.

    • SERVICE_ACCOUNT_PROJECT_ID: Es el ID del proyecto que contiene la cuenta de servicio de destino.

    • POLICY_ID: El ID de la política de acceso

    • ACCESS_LEVEL_NAME: El nombre del nivel de acceso que creaste

  2. Ejecuta el comando siguiente:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
      "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    Reemplaza lo siguiente:

    • PROJECT_ID: ID del proyecto que usas para realizar las llamadas a la API

    • ORGANIZATION_ID: Es el ID de tu organización Google Cloud.

Vincula el nivel de acceso a todas las cuentas de servicio de un proyecto

En esta sección, se describe cómo vincular el nivel de acceso a todas las cuentas de servicio de un proyecto.

gcloud

Para vincular el nivel de acceso a todas las cuentas de servicio de un proyecto con gcloud CLI, ejecuta el siguiente comando:

gcloud access-context-manager cloud-bindings create \
  --organization=ORGANIZATION_ID \
  --service-account-project-number=PROJECT_NUMBER \
  --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

Reemplaza lo siguiente:

  • ORGANIZATION_ID: El ID de tu organización Google Cloud
  • PROJECT_NUMBER: Es el número del proyecto que contiene todas las cuentas de servicio a las que deseas vincular el acceso.
  • POLICY_ID: El ID de la política de acceso
  • ACCESS_LEVEL_NAME: Es el nombre del nivel de acceso que creaste.

API de REST

Para vincular el nivel de acceso a todas las cuentas de servicio de un proyecto con la API de REST, haz lo siguiente:

  1. Crea un archivo request.json con el siguiente contenido:

    {
      "principal": {
        "serviceAccountProjectNumber": "PROJECT_NUMBER"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    Reemplaza lo siguiente:

    • PROJECT_NUMBER: Es el número del proyecto que contiene todas las cuentas de servicio a las que deseas vincular el acceso.
    • POLICY_ID: El ID de la política de acceso
    • ACCESS_LEVEL_NAME: Es el nombre del nivel de acceso que creaste.
  2. Ejecuta el comando siguiente:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto que usas para realizar las llamadas a la API.
    • ORGANIZATION_ID: El ID de tu organización Google Cloud

Para usar el Acceso adaptado al contexto sin aplicar el nivel de acceso ni denegar el acceso, puedes vincular la política de acceso en el modo de prueba.

La respuesta de la API para la operación de creación de vinculación incluye el nombre de la vinculación, que contiene el ID único de vinculación.

Cómo usar el modo de ejecución de prueba

Puedes vincular la política de acceso en modo de ejecución de prueba. Cuando usas el modo de ejecución de prueba, tus cuentas de servicio pueden seguir accediendo a los recursos sin que se aplique la política. Sin embargo, si tus cuentas de servicio intentan acceder de forma que se incumplan las políticas de acceso, los incumplimientos se registrarán en los Registros de auditoría de Cloud.

Vincula políticas de acceso en modo de ejecución de prueba

gcloud

Para vincular políticas de acceso en el modo de ejecución de prueba, reemplaza el parámetro --level por --dry-run-level, con el siguiente formato:

--dry-run-level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

API de REST

Para vincular políticas de acceso en el modo de ejecución de prueba, crea el archivo request.json con el siguiente contenido:

{
"principal": {
  "serviceAccountProjectNumber": "TARGET_PROJECT_NUMBER"
},
"dryRunAccessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
}

Reemplaza lo siguiente:

  • TARGET_PROJECT_NUMBER: Es el número del proyecto de destino.
  • POLICY_ID: El ID de la política de acceso
  • ACCESS_LEVEL_NAME: El nombre del nivel de acceso

Revisa los registros de auditoría de Cloud

En esta sección, se describe cómo puedes verificar los Registros de auditoría de Cloud para ver si se denegó el acceso en modo de prueba de validación a tu cuenta de servicio. Para obtener más información sobre cómo buscar entradas del modo de ejecución de prueba en los Registros de auditoría de Cloud, consulta Visualiza los registros del modo de ejecución de prueba.

Console

Para ver los rechazos de acceso a la cuenta de servicio del modo de ejecución de prueba de Registros de auditoría de Cloud con la consola de Google Cloud , haz lo siguiente:

En la consola de Google Cloud , ve a la página Explorador de registros del :

Ir al Explorador de registros

Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo es Logging.

  1. En la consola de Google Cloud , selecciona tu proyecto u organización.

  2. En el campo Consulta de registro, ingresa la siguiente consulta:

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    protoPayload.metadata.dryRunEvaluationResult:DENIED
    SEARCH("`SERVICE_ACCOUNT_NAME`")
    
  3. En el selector de rango de tiempo, elige un tiempo relativo predefinido, como Últimos 30 minutos, Última hora o Últimas 24 horas, o bien especifica un rango personalizado.

gcloud

Para ver los rechazos de acceso a la cuenta de servicio en el modo de ejecución de prueba de los Registros de auditoría de Cloud con la gcloud CLI, haz lo siguiente:

gcloud logging read \
'protoPayload.serviceName="contextawareaccess.googleapis.com" AND
 protoPayload.metadata.dryRunEvaluationResult:DENIED AND
 SEARCH("`SERVICE_ACCOUNT_NAME`")' \
  --organization=ORGANIZATION_ID

Reemplaza lo siguiente:

  • ORGANIZATION_ID: El ID de la organización
  • SERVICE_ACCOUNT_NAME: el nombre de la cuenta de servicio

El comando gcloud logging read admite la marca --freshness para ver la información de registro en períodos relativos. Por ejemplo, si agregas --freshness=3h al comando, puedes ver las entradas de registro del modo de prueba en los últimos 3 horas.

Soluciona problemas

En esta sección, se describe cómo solucionar problemas relacionados con el acceso adaptado al contexto para cuentas de servicio.

Solución de problemas generales

  1. Revisa los Registros de auditoría de Cloud.

    Usa la siguiente consulta de registro y revisa las entradas de registro para obtener más información.

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    
  2. Revisa el nombre del recurso del nivel de acceso que informa el acceso adaptado al contexto cuando registra eventos de aplicación.

  3. Asegúrate de que el nivel de acceso sea un recurso a nivel de la organización.

  4. Asegúrate de que el nivel de acceso en tus políticas de acceso se base en atributos que se admitan para las cuentas de servicio.

  5. Verifica que la política de acceso esté vinculada a la cuenta de servicio prevista.

  6. Asegúrate de que tu identidad de usuario no esté restringida por una política de acceso. Esto puede ocurrir cuando la identidad de un usuario es miembro de un grupo de Google que tiene una política de acceso vinculada. Esa política podría restringir el acceso del usuario y, a su vez, impedir el flujo de llamadas a la cuenta de servicio.

  7. Comunícate con tu administrador de seguridad.

Acceso denegado

Se denegó el acceso por los siguientes motivos:

  • Vinculaste la política de acceso en modo de aplicación, en lugar de en modo de ejecución de prueba.

    En lugar de aplicar la política, puedes usar el modo de ejecución de prueba para permitir que las cuentas de servicio accedan a los recursos y registren eventos de aplicación de la política sin denegar el acceso a los recursos. Además, puedes seguir las instrucciones generales para solucionar problemas.

  • Se debe actualizar el nivel de acceso para incluir más fuentes. Por ejemplo, se está usando una dirección IP que no se incluyó en el nivel de acceso cuando se creó.

¿Qué sigue?