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 ayudar a proteger el acceso de las cuentas de servicio a las APIs de Google Cloud , según los niveles de acceso que definas.

Limitaciones

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

  • No puedes usar atributos basados en la red o en la dirección IP para las vinculaciones de cuentas de servicio si la cuenta de servicio se usa 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 Google Kubernetes Engine (GKE) con kubectl ni a Cloud SQL con el proxy de autenticación.

  • Si un nivel de acceso que vinculas a una cuenta de servicio contiene atributos no admitidos, como los atributos Device, el Acceso adaptado al contexto deniega el acceso a la API.

  • Los niveles de acceso con alcance no son compatibles con las cuentas de servicio.

Si usas Cloud Build y Cloud Run, te recomendamos que uses las siguientes funciones integradas de la nube privada virtual (VPC):

Antes de comenzar

  1. Asegúrate de tener una organización deGoogle Cloud y, al menos, un proyecto deGoogle Cloud .
  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 proyecto de Google Cloud .

    Roles necesarios para seleccionar o crear un proyecto

    • Seleccionar 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.
    • Crea 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 de Google Cloud que estás creando.

    • Selecciona el proyecto de 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. Habilita las APIs de IAM, Access Context Manager y Resource Manager, si aún no están habilitadas:

    Roles necesarios para habilitar las APIs

    Para habilitar las APIs, necesitas el permiso serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtenerlo a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.

    gcloud services enable accesscontextmanager.googleapis.com cloudresourcemanager.googleapis.com iam.googleapis.com
  9. Instala Google Cloud CLI.

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

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

    gcloud init
  12. Crea o selecciona un proyecto de Google Cloud .

    Roles necesarios para seleccionar o crear un proyecto

    • Seleccionar 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.
    • Crea 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 de Google Cloud que estás creando.

    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID

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

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

  14. Habilita las APIs de IAM, Access Context Manager y Resource Manager, si aún no están habilitadas:

    Roles necesarios para habilitar las APIs

    Para habilitar las APIs, necesitas el permiso serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtenerlo a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.

    gcloud services enable accesscontextmanager.googleapis.com cloudresourcemanager.googleapis.com iam.googleapis.com
  15. Actualiza los componentes de Google Cloud CLI:
    gcloud components update --quiet
  16. 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 adaptado al contexto.

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 de 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 cuentas de servicio (roles/iam.serviceAccountAdmin) en la cuenta de usuario o 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 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 para a nivel de la organización.

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

Vincula las políticas de acceso adaptado al contexto a diferentes niveles de recursos

Puedes vincular políticas de acceso adaptado al contexto con el mismo modo de aplicación forzosa 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 modo de aplicación forzosa directamente a una cuenta de servicio y una política de modo de aplicación forzosa diferente 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 vinculadas, el Acceso adaptado al contexto evalúa la política de modo de aplicación forzosa que está vinculada al proyecto. Lo mismo ocurre si el modo de aplicación forzosa se establece en ejecución de prueba para la política a nivel de proyecto y la política a nivel de cuenta de servicio.

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

  1. Vincula una política 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 en modo de aplicación forzosa solo a cuentas de servicio específicas.
  3. Vincula la política en modo de aplicación forzosa a nivel del proyecto y, si es necesario, vincula una política menos restrictiva en modo de aplicación forzosa a cuentas de servicio específicas.

Atributos de nivel de acceso para cuentas de servicio

En esta sección, se enumeran los atributos de nivel de acceso que se admiten para 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 una 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, el Acceso adaptado al contexto permite la llamada a la API. Si las direcciones IP no coinciden, el Acceso adaptado al contexto rechaza la llamada a la API.

  • 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 de CEL es útil para restringir el acceso de las 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, ['projects/PROJECT_NUMBER'])"
        

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

  • La 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 Configura las condiciones de acceso de 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. Toma nota del nombre completo del nivel 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: Es el ID de organización de Google Cloud.
  • SERVICE_ACCOUNT_NAME: Es el ID de la cuenta de servicio de destino (la parte de la dirección de correo electrónico antes del símbolo @).
  • SERVICE_ACCOUNT_PROJECT_ID: Es el ID del proyecto que contiene la cuenta de servicio de destino.
  • POLICY_ID: Es el ID de la política de acceso de Access Context Manager.
  • 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 inhabilitar el acceso, puedes vincular el nivel de acceso en el modo de ejecución 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 ID de la cuenta de servicio de destino (la parte de la dirección de correo electrónico antes del símbolo @).

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

    • POLICY_ID: Es el ID de la política de acceso de Access Context Manager.

    • 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: Es el ID de organización de 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 la 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: Es el ID de organización de 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: Es el ID de la política de acceso de Access Context Manager.
  • 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: Es el ID de la política de acceso de Access Context Manager.
    • 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: Es el ID de organización de Google Cloud.

Para usar el Acceso adaptado al contexto sin aplicar el nivel de acceso y denegar el acceso, puedes vincular el nivel de acceso en el modo de ejecución 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 de vinculación único.

Usa el modo de ejecución de prueba

Puedes vincular el nivel de acceso en el 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 apliquen medidas por incumplimiento. Sin embargo, si tus cuentas de servicio intentan acceder de una manera que incumple el nivel de acceso, el Acceso adaptado al contexto registra el incumplimiento en los Registros de auditoría de Cloud.

Vincula el nivel de acceso en el modo de ejecución de prueba

gcloud

Para vincular el nivel 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 el nivel 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: Es el ID de la política de acceso de Access Context Manager.
  • ACCESS_LEVEL_NAME: Es el nombre del nivel de acceso.

Verifica 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 las denegaciones de acceso en el modo de prueba de validación de 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 en el modo de ejecución de prueba de los 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 período, elige un tiempo relativo predefinido, como Últimos 30 minutos, Última hora o Últimas 24 horas, o especifica un período 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 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: Es el ID de la organización.
  • SERVICE_ACCOUNT_NAME: Es el ID de la cuenta de servicio (la parte de la dirección de correo electrónico antes del símbolo @).

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 ejecución de prueba de las últimas 3 horas.

¿Qué sigue?