Crea y aplica niveles de acceso a recursos protegidos con IAP

En esta página, se explica cómo crear niveles de acceso con Access Context Manager y cómo aplicarlos en la documentación protegida con recursos de Identity-Aware Proxy (IAP).

Descripción general

Un nivel de acceso es un conjunto de atributos asignados a solicitudes en función de su origen. Mediante la información, como el tipo de dispositivo, la dirección IP y la identidad del usuario, puedes designar el nivel de acceso que se otorgará. Por ejemplo, puedes asignar un nivel “High_Trust” a las conexiones desde tu red corporativa, y “Trust_Trust” en dispositivos externos que ejecutan sistemas operativos aprobados.

La información del dispositivo se recopila y se hace referencia a ella en los niveles de acceso una vez que configuras la verificación de extremos. La verificación de extremos crea un inventario de todos los dispositivos corporativos y personales que acceden a tus recursos corporativos.

Se aplica un nivel de acceso cuando se agrega como una condición de administración de identidades y accesos (IAM) en tu recurso protegido con IAP. IAP te permite aplicar un modelo de control de acceso detallado a nivel de recurso en lugar de usar firewalls a nivel de red. Por ejemplo, puedes especificar que, si bien muchos recursos están disponibles para “Medium_Trust”, ciertos recursos más sensibles requieren el nivel “High_Trust”.

Para obtener más información, consulta la descripción general de Access Context Manager.

Antes de comenzar

Antes de comenzar, debes hacer lo siguiente:

  • Proteger un recurso con IAP
  • Configura la Endpoint Verification. Ten en cuenta que esto solo es necesario si quieres limitar el acceso a tus recursos en función de la información del dispositivo del usuario, como el estado de encriptación del almacenamiento.
  • Asegúrate de tener una de las siguientes funciones otorgadas en tu proyecto.

    • Administrador de Access Context Manager
    • Editor de Access Context Manager

Crear un nivel de acceso

Mediante el siguiente proceso, se crea un nivel de acceso.

Para este ejemplo, supongamos que deseas crear un nivel de acceso que permita que un grupo de auditores internos acceda a la observabilidad de Google Cloud para un proyecto. Todos los dispositivos para los auditores tienen IP asignadas en una subred que está entre 203.0.113.0203.0.113.127. También debes asegurarte de que sus dispositivos estén encriptados. Sabes que no habrá ningún dispositivo asignado a esa subred que los que usan los auditores.

Console

  1. Ve a la página de Access Context Manager en la consola de Google Cloud.

    Ir a la página de Access Context Manager

  2. Si se te solicita, selecciona tu organización.

  3. En la parte superior de la página Access Context Manager, haz clic en New.

  4. En el panel Nuevo nivel de acceso, en la sección Condiciones, haz clic en Agregar atributo y, luego, en Política de dispositivo.

  5. Haz clic en el menú desplegable Encriptación de almacenamiento y selecciona Encriptado. Ten en cuenta que esta regla solo funciona una vez que configuras Endpoint Verification en los dispositivos de tus empleados.

  6. Vuelve a hacer clic en Agregar atributo y selecciona Subredes de IP.

  7. En el cuadro Subredes IP, ingrese uno o más rangos IPv4 o IPv6 formateados como bloques CIDR.

    En este ejemplo, para limitar el acceso a los auditores, debes ingresar 203.0.113.0/25 en el cuadro Subredes de IP.

  8. Haz clic en Guardar.

gcloud

  1. Crea un archivo .yaml para un nivel de acceso que incluya uno o más rangos de IPv4 o IPv6 con formato de bloques CIDR.

    En este ejemplo, para limitar el acceso solo a los auditores, debes ingresar lo siguiente en el archivo .yaml:

    - ipSubnetworks:
        - 203.0.113.0/25
    - devicePolicy:
        allowedEncryptionStatuses
          - ENCRYPTED
    

    Para obtener una lista de los atributos de nivel de acceso y su formato YAML, consulta Atributos de nivel de acceso. Consulta este archivo YAML de nivel de acceso de ejemplo para obtener un archivo YAML integral de todos los atributos posibles.

    Ten en cuenta que la regla devicePolicy solo funciona una vez que configuras Endpoint Verification en los dispositivos de tus empleados.

  2. Guarda el archivo. En este ejemplo, el archivo se llama CONDITIONS.yaml.

  3. Crea el nivel de acceso:

    gcloud access-context-manager levels create NAME \
       --title TITLE \
       --basic-level-spec CONDITIONS.yaml \
       --policy=POLICY_NAME
    

    Aquí:

    • NAME es el nombre único para el nivel de acceso. Debe comenzar con una letra y, además, incluir solo letras, números y guiones bajos.

    • TITLE es un título legible. Debe ser único para la política.

    • POLICY_NAME es el nombre de la política de acceso de tu organización.

    Deberías ver un resultado similar a este:

    Create request issued for: NAME
    Waiting for operation [accessPolicies/POLICY_NAME/accessLevels/NAME/create/1521594488380943] to complete...done.
    Created level NAME.
    

API

  1. Crea un cuerpo de solicitud para crear un recurso AccessLevel que incluya uno o más rangos IPv4 o IPv6 con formato de bloques CIDR y una política de dispositivo que requiera almacenamiento encriptado.

    En este ejemplo, para limitar el acceso solo a los auditores, debes ingresar lo siguiente en el cuerpo de la solicitud:

    {
     "name": "NAME",
     "title": "TITLE",
     "basic": {
       "conditions": [
         {
           "ipSubnetworks": [
             "203.0.113.0/25"
           ]
         },
         {
         "devicePolicy": [
           "allowedEncryptionStatuses": [
             "ENCRYPTED"
           ]
         ]
         }
       ]
     }
    }
    

    Aquí:

    • NAME es el nombre único para el nivel de acceso. Debe comenzar con una letra y, además, incluir solo letras, números y guiones bajos.

    • TITLE es un título legible. Debe ser único para la política.

  2. Para crear el nivel de acceso, llama a accessLevels.create.

    POST https://accesscontextmanager.googleapis.com/v1/accessPolicies/POLICY_NAME/accessLevels
    

    Aquí:

    • POLICY_NAME es el nombre de la política de acceso de tu organización.

Aplica un nivel de acceso

Un recurso protegido con IAP tiene una política de IAM que vincula la función IAP al recurso.

Si agregas una vinculación condicional de IAM a la política de IAM, el acceso a tus recursos estará más restringido según los atributos de solicitud. Estos incluyen lo siguiente:

  • Niveles de acceso
  • Ruta de acceso/host de URL
  • Fecha/hora

Ten en cuenta que deben ser exactos los valores de solicitud que se comparen con request.host y request.path especificados en una vinculación condicional de IAM. Por ejemplo, si restringes el acceso a rutas de acceso que empiezan con /internal admin, es posible evitar la restricción si se accede a /internal%20admin. Consulta Usa las condiciones de ruta de acceso y nombre de host para obtener más información.

En los siguientes pasos, se muestra cómo agregar tu nivel de acceso a un recurso protegido con IAP mediante la actualización de su política de IAM.

Console

  1. Ve a la página de administrador de IAP.

    Ir a la página de administrador de IAP

  2. Selecciona la casilla de verificación junto a los recursos para los que deseas actualizar los permisos de IAM.

  3. En el panel de información a la derecha, haz clic en Agregar principal.

  4. En el cuadro Principal nueva, ingresa las principales a las que deseas asignarles un rol.

  5. En la lista desplegable Seleccionar una función, selecciona la función Usuario de aplicación web protegida con IAP.

  6. Para especificar los niveles de acceso existentes, selecciónalos en la lista desplegable Niveles de acceso. Debes seleccionar la función Usuario de aplicación web protegida con IAP y tener permisos a nivel de organización para ver los niveles de acceso existentes.

    Cuando aplicas varios niveles de acceso a un recurso, a los usuarios se les concede acceso al recurso cuando cumplen con las condiciones especificadas en al menos uno de los niveles de acceso que seleccionas (es un OR lógico de los niveles de acceso de la lista). Si deseas que los usuarios cumplan las condiciones en más de un nivel de acceso (un operador lógico AND de niveles de acceso), crea un nivel de acceso que contenga varios niveles de acceso.

  7. Si quieres agregar más roles a las principales, haz clic en Agregar otro rol.

  8. Cuando hayas agregado todas las funciones que necesitas, haz clic en Guardar.

gcloud

Actualmente, solo puedes usar gcloud CLI para configurar vinculaciones condicionales a nivel de proyecto.

Para establecer vinculaciones condicionales, edita el archivo policy.yaml de tu proyecto mediante el siguiente proceso:

  1. Abre la política de IAM de la aplicación con el siguiente comando de gcloud:

    gcloud projects get-iam-policy PROJECT_ID > policy.yaml
    
  2. Edita el archivo policy.yaml para especificar lo siguiente:

    • Los usuarios y los grupos a los que deseas aplicar la condición de IAM
    • La función iap.httpsResourceAccessor para otorgarles acceso a los recursos
    • La condición de IAM con tu nivel de acceso

    La siguiente condición otorga acceso al usuario y al grupo si se cumplen los requisitos de nivel de acceso ACCESS_LEVEL_NAME y la ruta de URL del recurso comienza con /.

    ...
    - members:
    - group:EXAMPLE_GROUP@GOOGLE.COM
    - user:EXAMPLE_USER@GOOGLE.COM
    role: roles/iap.httpsResourceAccessor
    condition:
        expression: "accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")
        title: CONDITION_TITLE
    ...
    
  3. Vincula la política a la aplicación con el comando set-iam-policy. gcloud projects set-iam-policy PROJECT_ID policy.yaml

API

A fin de editar el archivo policy.json de tu aplicación, sigue el proceso que se muestra a continuación para tu tipo de aplicación. Consulta Administra el acceso a los recursos protegidos por IAP a fin de obtener más información sobre cómo usar la API de IAM para administrar las políticas de acceso.

Antes de completar los pasos de API específicos de la app que se indican a continuación, exporta las siguientes variables:

 export PROJECT_NUM=PROJECT_NUMBER
 export IAP_BASE_URL=https://iap.googleapis.com/v1beta1/projects/${PROJECT_NUMBER}/iap_web
 # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
 export JSON_NEW_POLICY=POLICY_FILE.JSON
 

App Engine

  1. Exporta las siguientes variables de App Engine:

    # The APP_ID is usually the project ID
    export GAE_APP_ID=APP_ID
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}

  2. Obtén la política de IAM para la aplicación de App Engine con el método getIamPolicy. El bit de datos vacío al final convierte la solicitud curl en POST en lugar de GET.

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -d '' ${GAE_BASE_URL}/:getIamPolicy
    

  3. Agrega tu vinculación condicional de IAM al archivo JSON de la política de IAM. A continuación, se muestra un ejemplo de un archivo policy.json editado que vincula la función iap.httpsResourceAccessor a dos usuarios y les otorga acceso a los recursos protegidos por BeyondCorp Enterprise. Se agregó una condición de IAM para otorgarles acceso a los recursos solo si se cumple el requisito de nivel de acceso ACCESS_LEVEL_NAME y la ruta de URL del recurso comienza con /. Solo puede haber una condición por vinculación.

    Archivo policy.json de ejemplo

    {
    "policy": {
      "bindings": [
            {
              "role": "roles/iap.httpsResourceAccessor",
              "members": [
                  "group:EXAMPLE_GROUP@GOOGLE.COM",
                  "user:EXAMPLE_USER@GOOGLE.COM"
              ],
              "condition": {
                "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")",
                "title": "CONDITION_NAME"
              }
            }
        ]
      }
    }
    

  4. Configura el nuevo archivo policy.json con el método setIamPolicy.

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    ${GAE_BASE_URL}:setIamPolicy -d @${JSON_NEW_POLICY}
    

Servicios y versiones de App Engine

También puedes actualizar la política de IAM para un servicio de App Engine, todas las versiones o una versión específica de un servicio. Para hacerlo en una versión específica de un servicio, haz lo siguiente:

  1. Exporta las siguientes variantes adicionales.
    export GAE_SERVICE=SERVICE_NAME
    export GAE_VERSION=VERSION_NAME
    
  2. Actualiza la variante GAE_BASE_URL exportada.
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}/services/${GAE_SERVICE}/versions/${GAE_VERSION}
  3. Obtén y establece la política de IAM para la versión con los comandos getIamPolicy y setIamPolicy que se muestran arriba.

GKE y Compute Engine

  1. Exporta el ID del proyecto de tu servicio de backend.

    export BACKEND_SERVICE_NAME=BACKEND_SERVICE_NAME

  2. Obtén la política de IAM para la aplicación de Compute Engine con el método getIamPolicy. El bit de datos vacío al final convierte la solicitud curl en POST en lugar de GET.

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:getIamPolicy \
     -d ''
    

  3. Agrega tu vinculación condicional de IAM al archivo JSON de la política de IAM. A continuación, se muestra un ejemplo de un archivo policy.json editado que vincula la función iap.httpsResourceAccessor a dos usuarios y les otorga acceso a los recursos protegidos por BeyondCorp Enterprise. Se agregó una condición de IAM para otorgarles acceso a los recursos solo si se cumple el requisito de nivel de acceso ACCESS_LEVEL_NAME y la ruta de URL del recurso comienza con /. Solo puede haber una condición por vinculación.


    Archivo policy.json de ejemplo

    {
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.httpsResourceAccessor",
            "members": [
              "group":EXAMPLE_GROUP@GOOGLE.COM,
              "user:EXAMPLE_USER@GOOGLE.COM"
            ],
            "condition": {
              "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")",
              "title": "CONDITION_NAME"
            }
          }
        ]
      }
    }
    

  4. Configura el nuevo archivo policy.json con el método setIamPolicy.

    curl -i -H "Content-Type:application/json" \
         -H "Authorization: Bearer $(gcloud auth print-access-token)" \
         ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:setIamPolicy \
         -d @${JSON_NEW_POLICY}