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 Cloud de Confiance by S3NS , 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 deCloud de Confiance y, al menos, un proyecto deCloud de Confiance .
  2. Instala Google Cloud CLI.

  3. Configura gcloud CLI para usar tu identidad federada.

    Para obtener más información, consulta Accede a gcloud CLI con tu identidad federada.

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

    gcloud init
  5. Crea o selecciona un proyecto de Cloud de Confiance .

    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.
    • 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 Cloud de Confiance :

      gcloud projects create PROJECT_ID

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

    • Selecciona el proyecto de Cloud de Confiance que creaste:

      gcloud config set project PROJECT_ID

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

  6. Verifica que la facturación esté habilitada para tu proyecto de Cloud de Confiance .

  7. 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
  8. Actualiza los componentes de Google Cloud CLI:
    gcloud components update --quiet
  9. 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.

El Acceso adaptado al contexto evalúa las políticas de modo de aplicación forzosa y las políticas de modo de ejecución de prueba de forma independiente en toda la jerarquía de recursos. Vincular solo una política de modo de ejecución de prueba a una cuenta de servicio no anula una política de modo de aplicación forzosa que esté vinculada al proyecto. Para eximir a una cuenta de servicio específica de una política de modo de aplicación forzosa a nivel de proyecto y evaluar una política en modo de ejecución de prueba para esa cuenta de servicio, vincula un nivel de acceso personalizado de modo de aplicación forzosa que siempre se evalúe como true junto con un nivel de acceso de modo de ejecución de prueba a la cuenta de servicio. Para obtener instrucciones, consulta Usa el modo de ejecución de prueba para una cuenta de servicio en un proyecto con una política de modo de aplicación forzosa.

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 Cloud de Confiance, 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.s3ns.iam.gserviceaccount.com \
    --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

Reemplaza lo siguiente:

  • ORGANIZATION_ID: Es el ID de organización de Cloud de Confiance.
  • 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.s3ns.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 Cloud de Confiance.

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 Cloud de Confiance.
  • 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 Cloud de Confiance.

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.

Usa el modo de ejecución de prueba para una cuenta de servicio en un proyecto con una política de modo de aplicación forzosa

Debido a que el Acceso adaptado al contexto evalúa las políticas del modo de aplicación forzosa y las políticas del modo de ejecución de prueba de forma independiente en la jerarquía de recursos, vincular solo un nivel de acceso del modo de ejecución de prueba a una cuenta de servicio no anula una política del modo de aplicación forzosa que está vinculada al proyecto.

Para eximir a una cuenta de servicio específica de una política de modo de aplicación forzosa a nivel del proyecto y evaluar un nivel de acceso en modo de ejecución de prueba para esa cuenta de servicio, crea un nivel de acceso personalizado que siempre se evalúe como true y, luego, vincula ese nivel de acceso personalizado en modo de aplicación forzosa junto con el nivel de acceso en modo de ejecución de prueba a la cuenta de servicio:

gcloud

  1. Crea un archivo always_allow.yaml con una expresión de CEL que siempre se evalúe como true:

    expression: "true"
    
  2. Crea el nivel de acceso personalizado:

    gcloud access-context-manager levels create ALWAYS_ALLOW_LEVEL_NAME \
      --title="TITLE" \
      --custom-level-spec=always_allow.yaml \
      --policy=POLICY_ID
    

    Reemplaza lo siguiente:

    • ALWAYS_ALLOW_LEVEL_NAME: Es un nombre único para el nivel de acceso personalizado que siempre permite el acceso.

    • TITLE: Es un título corto y legible por humanos para el nivel de acceso.

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

  3. Vincula el nivel de acceso personalizado en el modo de aplicación forzosa (--level) y el nivel de acceso de destino en el modo de ejecución de prueba (--dry-run-level) a la cuenta de servicio:

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

    Reemplaza lo siguiente:

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

    • SERVICE_ACCOUNT_NAME: Es el nombre de la cuenta de servicio de destino, que es diferente del correo electrónico de la cuenta de servicio.

    • 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.

    • ALWAYS_ALLOW_LEVEL_NAME: Es el nombre del nivel de acceso personalizado que siempre se evalúa como true.

    • DRY_RUN_ACCESS_LEVEL_NAME: Es el nombre del nivel de acceso que deseas evaluar en el modo de ejecución de prueba.

    Si ya vinculaste la política del modo de ejecución de prueba a nivel del proyecto o si solo quieres eximir a la cuenta de servicio de la política del modo de aplicación forzosa a nivel del proyecto, puedes omitir --dry-run-level.

API de REST

  1. Crea un nivel de acceso personalizado con la expresión CEL "expression": "true".

  2. Crea un archivo request.json que vincule el nivel de acceso personalizado en accessLevels y el nivel de acceso de ejecución de prueba de destino en dryRunAccessLevels para la cuenta de servicio:

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

    Reemplaza lo siguiente:

    • SERVICE_ACCOUNT_NAME: Es el nombre de la cuenta de servicio de destino, que es diferente del correo electrónico de la cuenta de servicio.

    • 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.

    • ALWAYS_ALLOW_LEVEL_NAME: Es el nombre del nivel de acceso personalizado que siempre se evalúa como true.

    • DRY_RUN_ACCESS_LEVEL_NAME: Es el nombre del nivel de acceso que deseas evaluar en el modo de ejecución de prueba.

    Si ya vinculaste la política del modo de ejecución de prueba a nivel de proyecto o si solo deseas eximir a la cuenta de servicio de la política del modo de aplicación forzosa a nivel de proyecto, puedes omitir dryRunAccessLevels.

  3. 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: el ID del proyecto que usas para realizar las llamadas a la API

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

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 Cloud de Confiance , haz lo siguiente:

En la consola de Cloud de Confiance , 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 Cloud de Confiance , 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?