Crear y aplicar niveles de acceso a recursos protegidos mediante IAP

En esta página se explica cómo crear niveles de acceso con Administrador de contextos de acceso y aplicarlos a recursos protegidos con Identity-Aware Proxy (IAP).

Información general

Un nivel de acceso es un conjunto de atributos asignados a las solicitudes en función de su origen. Con información como el tipo de dispositivo, la dirección IP y la identidad del usuario, puedes designar el nivel de acceso que quieres conceder. Por ejemplo, puedes asignar el nivel "High_Trust" a las conexiones de tu red corporativa y el nivel "Medium_Trust" a los dispositivos externos que ejecuten sistemas operativos aprobados.

Los niveles de acceso recogen y consultan la información de los dispositivos una vez que se ha configurado la verificación de puntos finales. Verificación de endpoints crea un inventario de todos los dispositivos personales y de empresa que acceden a los recursos de tu empresa.

Para aplicar un nivel de acceso, debes añadirlo como una condición de gestión de identidades y accesos (IAM) a tu recurso protegido mediante IAP. IAP te permite aplicar un modelo de control de acceso pormenorizado a nivel de recurso en lugar de usar firewalls a nivel de red. Por ejemplo, puede especificar que, aunque muchos recursos estén disponibles para "Medium_Trust", determinados recursos más sensibles requieran el nivel "High_Trust".

Para obtener más información, consulta la introducción a Administrador de contextos de acceso.

Antes de empezar

Antes de empezar, debes hacer lo siguiente:

  • Protege un recurso con IAP.
  • Configura 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 del cifrado del almacenamiento.
  • Asegúrate de que se te haya concedido uno de los siguientes roles en tu proyecto.

    • Administrador de contextos de acceso
    • Editor del administrador de contextos de acceso

Crear un nivel de acceso

En el siguiente proceso se crea un nivel de acceso.

En este ejemplo, supongamos que quieres crear un nivel de acceso que permita a un grupo de auditores internos acceder a Observabilidad de Google Cloud para un proyecto. Todos los dispositivos de los auditores tienen asignadas IPs en una subred que va de 203.0.113.0 a 203.0.113.127. También debes asegurarte de que sus dispositivos estén cifrados. Sabes que no habrá ningún dispositivo asignado a esa subred que no sea el que usan los auditores.

Consola

  1. Ve a la página Administrador de contextos de acceso en la Google Cloud consola.

    Ir a la página Administrador de contextos de acceso

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

  3. En la parte superior de la página Gestor de contexto de acceso, haga clic en Nuevo.

  4. En el panel Nuevo nivel de acceso, en la sección Condiciones, haz clic en Añadir atributo y, a continuación, en Política de dispositivos.

  5. Haz clic en el desplegable Cifrado de almacenamiento y selecciona Cifrado. Ten en cuenta que esta regla solo funciona una vez que hayas configurado la verificación de endpoints en los dispositivos de tus empleados.

  6. Vuelve a hacer clic en Añadir atributo y selecciona Subredes de IP.

  7. En el cuadro Subredes de IPs, introduce uno o varios intervalos IPv4 o IPv6 con formato de bloques CIDR.

    En este ejemplo, para limitar el acceso solo a los auditores, introducirías 203.0.113.0/25 en el cuadro Subredes IP.

  8. Haz clic en Guardar.

gcloud

  1. Crea un archivo YAML para un nivel de acceso que incluya uno o varios intervalos de IPv4 o IPv6 con formato de bloques CIDR.

    En este ejemplo, para limitar el acceso solo a los auditores, introduce lo siguiente en el archivo YAML:

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

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

    Ten en cuenta que la regla devicePolicy solo funciona una vez que hayas configurado la verificación de puntos de conexión 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

    Donde:

    • NAME es el nombre único del nivel de acceso. Debe empezar por una letra y solo puede incluir letras, números y guiones bajos.

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

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

    El resultado que verás debe parecerse al siguiente:

    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 varios intervalos de IPv4 o IPv6 con el formato de bloques CIDR y una política de dispositivos que requiera almacenamiento cifrado.

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

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

    Donde:

    • NAME es el nombre único del nivel de acceso. Debe empezar por una letra y solo puede incluir letras, números y guiones bajos.

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

  2. Crea el nivel de acceso llamando a accessLevels.create.

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

    Donde:

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

Aplicar un nivel de acceso

Un recurso protegido mediante IAP tiene una política de gestión de identidades y accesos que vincula el rol de IAP al recurso.

Si añades un enlace condicional de gestión de identidades y accesos a la política de gestión de identidades y accesos, el acceso a tus recursos se restringirá aún más en función de los atributos de las solicitudes. Estos atributos de solicitud incluyen lo siguiente:

  • Niveles de acceso
  • Host y ruta de URL
  • Fecha y hora

Ten en cuenta que los valores de solicitud que se comparan con request.host y request.path especificados en una vinculación condicional de IAM deben ser exactos. Por ejemplo, si restringes el acceso a las rutas que empiezan por /internal admin, se puede eludir la restricción si se va a /internal%20admin. Consulta más información en el artículo sobre cómo usar las condiciones de nombre de host y ruta.

Cuando apliques niveles de acceso a un recurso de IAP, asegúrate de que los niveles de acceso estén a nivel de organización, en lugar de a nivel de proyecto o carpeta. En los siguientes pasos se muestra cómo añadir tu nivel de acceso a un recurso protegido por IAP actualizando su política de IAM.

Consola

  1. Ve a la página de IAP.

    Ir a la página de IAP

  2. Seleccione la casilla situada junto a los recursos para los que quiera actualizar los permisos de gestión de identidades y accesos.

  3. En el panel de información de la derecha, haz clic en Añadir principal.

  4. En el cuadro Nuevo principal, introduce los principales a los que quieras asignar un rol.

  5. En la lista desplegable Selecciona un rol, elige el rol Usuario de aplicaciones web protegidas mediante IAP.

  6. Para especificar los niveles de acceso que ya existen, selecciónalos en la lista desplegable Niveles de acceso. Debes seleccionar el rol Usuario de aplicación web protegida por IAP y tener permisos a nivel de organización para ver los niveles de acceso.

    Cuando aplicas varios niveles de acceso a un recurso, los usuarios obtienen acceso al recurso cuando cumplen las condiciones especificadas en al menos uno de los niveles de acceso que selecciones (es decir, funciona como un operador lógico OR de los niveles de acceso de la lista). Si quieres que los usuarios tengan que cumplir las condiciones de más de un nivel de acceso (como si combinaras niveles de acceso con un operador lógico "Y"), crea un nivel de acceso que los incluya todos.

  7. Si quieres añadir más roles a las entidades, haz clic en Añadir otro rol.

  8. Cuando termines de añadir roles, haz clic en Guardar.

gcloud

Por ahora, solo puedes usar la CLI de gcloud para definir enlaces condicionales a nivel de proyecto.

Para definir enlaces condicionales, edita el archivo policy.yaml de tu proyecto:

  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 grupos a los que quieres aplicar la condición de gestión de identidades y accesos.
    • El rol iap.httpsResourceAccessor para darles acceso a los recursos.
    • La condición de gestión de identidades y accesos con tu nivel de acceso.

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

    ...
    - 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 mediante el comando set-iam-policy. none gcloud projects set-iam-policy PROJECT_ID policy.yaml

API

Para editar el archivo policy.json de tu aplicación, sigue el proceso correspondiente a tu tipo de aplicación. Consulta Gestionar el acceso a recursos protegidos por IAP para obtener más información sobre cómo usar la API IAM para gestionar políticas de acceso.

Antes de completar los pasos de la API específica de la aplicació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 gestión de identidades y accesos de 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. Añade tu enlace 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 el rol iap.httpsResourceAccessor a dos usuarios, lo que les da acceso a los recursos protegidos de Chrome Enterprise Premium. Se ha añadido una condición de gestión de identidades y accesos para concederles acceso a los recursos solo si se cumple el requisito de nivel de acceso ACCESS_LEVEL_NAME y la ruta de la URL del recurso empieza por /. Solo puede haber una condición por enlace.

    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. Define tu 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 gestión de identidades y accesos de un servicio de App Engine, de todas sus versiones o de una versión específica. Para hacerlo en una versión específica de un servicio, sigue estos pasos:

  1. Exporta las siguientes variables adicionales.
    export GAE_SERVICE=SERVICE_NAME
    export GAE_VERSION=VERSION_NAME
  2. Actualiza la variable 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 define la política de gestión de identidades y accesos de la versión con los comandos getIamPolicy y setIamPolicy.

GKE y Compute Engine

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

    export BACKEND_SERVICE_NAME=BACKEND_SERVICE_NAME

  2. Obtén la política de gestión de identidades y accesos de la aplicación de Compute Engine mediante 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. Añade tu enlace 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 el rol iap.httpsResourceAccessor a dos usuarios, lo que les da acceso a los recursos protegidos de Chrome Enterprise Premium. Se ha añadido una condición de IAM para concederles acceso a los recursos solo si se cumple el requisito de nivel de acceso ACCESS_LEVEL_NAME y la ruta de la URL del recurso empieza por /. Solo puede haber una condición por enlace.


    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. Define tu 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}