Establece límites en el otorgamiento de funciones

En organizaciones grandes, puede ser útil permitir que los equipos administren de forma independiente las políticas de Identity and Access Management (IAM) para sus recursos. Sin embargo, permitir que un miembro otorgue o revoque todas las funciones de IAM puede aumentar en gran medida tu riesgo de seguridad.

Puedes establecer límites en las funciones que un miembro puede otorgar y revocar con las condiciones de IAM y el atributo de la API iam.googleapis.com/modifiedGrantsByRole. Estos límites te permiten crear administradores de IAM limitados que pueden administrar las políticas de IAM de su equipo, pero solo dentro de los límites que configuraste.

Antes de comenzar

Permisos necesarios

Para establecer límites en las funciones que un miembro puede otorgar o revocar, necesitas una función que incluya los siguientes permisos:

  • resourcemanager.resource-type.getIamPolicy
  • resourcemanager.resource-type.setIamPolicy

Reemplaza resource-type por uno de los siguientes valores:

  • Si deseas crear un administrador de IAM limitado para una organización, usa organizations.
  • Si deseas crear un administrador de IAM limitado para una carpeta, usa folders.
  • Si deseas crear un administrador de IAM limitado para un proyecto, usa projects.

Para obtener estos permisos y seguir el principio de privilegio mínimo, pídele a tu administrador que te otorgue la función de administrador de seguridad (roles/iam.securityAdmin).

Como alternativa, el administrador puede otorgarte una función diferente con los permisos necesarios, como una función personalizada o una función predefinida con más permisos.

Casos prácticos habituales

En las secciones siguientes, se describe cómo puedes usar el otorgamiento de funciones limitadas para habilitar la administración de políticas de autoservicio.

Crea administradores de IAM limitados

Considera una situación en la que deseas permitir que un usuario, Finn (finn@example.com), actúe como un administrador de IAM limitado para tu proyecto. Deseas que Finn pueda otorgar y revocar solo las funciones de administrador de cuentas de facturación (roles/billing.admin) y usuario de cuenta de facturación (roles/billing.user) de tu proyecto.

Para otorgar esta capacidad limitada, debes otorgar de forma condicional la función de administrador de IAM de proyecto (roles/resourcemanager.projectIamAdmin). La función de administrador de IAM de proyecto permite que Finn otorgue y revoque funciones de IAM, y la condición limita qué funciones Finn puede otorgar y revocar:

{
  "version": 3,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "members": [
        "user:owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "finn@example.com"
      ],
      "role": "roles/resourcemanager.projectIamAdmin",
      "condition": {
        "title": "only_billing_roles",
        "description": "Only allows changes to role bindings for billing accounts",
        "expression":
          "api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/billing.admin', 'roles/billing.user'])"
      }
    }
  ]
}

Esta vinculación de función condicional le permite a Finn hacer lo siguiente:

  • Otorga las funciones de Administrador de cuenta de facturación y Usuario de cuenta de facturación del proyecto.
  • Revoca las funciones de Administrador de cuenta de facturación y Usuario de cuenta de facturación del proyecto.
  • Agrega, quita o modifica las condiciones para las vinculaciones de funciones a nivel de proyecto que otorgan las funciones de Administrador de cuenta de facturación y Usuario de cuenta de facturación.
  • Realiza otras acciones permitidas por la función de administrador de IAM de proyecto que no modifica la política de IAM del proyecto. Por ejemplo, Finn puede usar el método projects.getIamPolicy para obtener la política del proyecto.

Esta vinculación de funciones condicionales no permite que Finn haga lo siguiente:

  • Modifica las políticas de IAM para recursos que no sean el proyecto.
  • Otorga funciones distintas de las funciones de Administrador de cuenta de facturación o Usuario de cuenta de facturación.
  • Revoca funciones distintas de las funciones de Administrador de cuenta de facturación o Usuario de cuenta de facturación.
  • Agrega, quita o modifica las condiciones de las vinculaciones de funciones que no otorgan funciones de Administrador de cuenta de facturación o Usuario de cuenta de facturación.

Permite que los usuarios administren administradores de IAM limitados

Imagina una situación en la que quieres que la usuaria, Lila, sea una administradora de IAM limitada para su equipo. Quieres que Lila pueda otorgar y revocar solo la función de administrador de Compute (roles/compute.admin) en su proyecto. Sin embargo, deseas permitir que Lila seleccione a otros usuarios para que actúen como administradores de IAM limitados. En otras palabras, deseas permitir que Lila permita a otros usuarios otorgar y revocar solo la función de Administrador de Compute.

Quizás pienses que la solución es otorgarle a Lila la función de administrador de IAM de proyecto (roles/resourcemanager.projectIamAdmin) y, luego, darle la capacidad de otorgar o revocar esa función a otras personas. Sin embargo, si otorgas a Lila la función de administrador de IAM de proyecto, podría quitar la condición de su propia función y otorgarle la capacidad de otorgar o revocar cualquier función de IAM.

Para evitar esta elevación de privilegios, crea un grupo de Google, iam-compute-admins@example.com, para los administradores de IAM limitados del proyecto. Luego, debes agregar a Lila al grupo y convertirla en una administradora de grupo.

Después de crear el grupo, debes otorgar de forma condicional al grupo la función de administrador de IAM de proyecto (roles/resourcemanager.projectIamAdmin). La función de administrador de IAM de proyecto permite a los miembros del grupo otorgar y revocar funciones de IAM, y la condición limita las funciones que pueden otorgar y revocar:

{
  "version": 3,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "members": [
        "user:owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "iam-compute-admins@example.com"
      ],
      "role": "roles/resourcemanager.projectIamAdmin",
      "condition": {
        "title": "only_compute_admin_role",
        "description": "Only allows changes to role bindings for the Compute Admin role",
        "expression":
          "api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/compute.admin'])"
      }
    }
  ]
}

Como miembro del grupo iam-compute-admins@example.com, Lila puede hacer lo siguiente:

  • Otorga la función de administrador de Compute del proyecto mediante la adición de una vinculación nueva de la función o la incorporación de un miembro a una vinculación existente de la función.
  • Para revocar la función de administrador de Compute, quita una vinculación existente de la función o quita un miembro de una vinculación existente de la función.
  • Modifica las concesiones de la función de administrador de Compute mediante la adición, eliminación o modificación de condiciones adjuntas a vinculaciones de la función.
  • Realiza otras acciones permitidas por la función de administrador de IAM de proyecto que no modifica la política de IAM del proyecto. Por ejemplo, podría usar el método projects.getIamPolicy para obtener la política del proyecto.

Como administrador del grupo iam-compute-admins@example.com, Lila puede permitir que otros usuarios otorguen o revoquen la función de administrador de Compute agregándolos al grupo iam-compute-admins@example.com.

Lila no puede hacer lo siguiente:

  • Darse a sí misma la capacidad de otorgar o revocar otras funciones
  • Modificar las políticas de IAM para recursos que no sean el proyecto.
  • Otorgar funciones distintas de la función de administrador de Compute
  • Revocar funciones distintas de la función de administrador de Compute
  • Agregar, quitar o modificar las condiciones de las vinculaciones de funciones que no otorgan la función de administrador de Compute

Limita el otorgamiento de funciones

En las siguientes secciones, se explica cómo permitir que los miembros otorguen o revoquen solo ciertas funciones.

Escribe una expresión de condición para limitar el otorgamiento de funciones

Si deseas limitar la capacidad de un miembro para otorgar funciones, escribe una expresión de condición que especifique las funciones que un miembro puede otorgar o revocar.

Usa el siguiente formato para tu expresión de condición:

api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(roles)

Esta expresión hace lo siguiente:

  • Obtiene el atributo API iam.googleapis.com/modifiedGrantsByRole con la función api.getAttribute().

    Para una solicitud a fin de establecer la política de IAM de un recurso, este atributo contiene los nombres de las funciones de las vinculaciones que la solicitud modifica. Para otros tipos de solicitudes, el atributo no se define. En estos casos, la función muestra el valor predeterminado ([]).

  • Usa elhasOnly() Common Expression Language (CEL) para definir y aplicar las funciones que el miembro tiene permitido otorgar o revocar.

    La entrada para la función hasOnly() es una lista de las funciones que el miembro puede otorgar o revocar. Si las funciones del atributo iam.googleapis.com/modifiedGrantsByRole se incluyen en esta lista, la función muestra true. Si no son iguales, la función muestra false.

    Si el atributo iam.googleapis.com/modifiedGrantsByRole contiene el valor predeterminado ([]), la función muestra true, porque [] no contiene ninguna función que no esté incluida en la lista.

Para personalizar esta expresión, reemplaza roles por una lista de las funciones que el miembro tiene permitido otorgar o revocar. Por ejemplo, para permitir que el miembro otorgue o revoque solo el Editor de Pub/Sub (roles/pubsub.editor) y publicador de Pub/Sub (roles/pubsub.publisher) usa el valor ['roles/pubsub.editor', 'roles/pubsub.publisher'].

Puedes incluir hasta 10 valores en la lista de funciones permitidas. Todos estos valores deben ser constantes de string.

Limita el otorgamiento de funciones con vinculaciones de funciones condicionales

Para permitir que un miembro otorgue o revoque solo ciertas funciones, usa la expresión de condición de la sección anterior para crear una vinculación de funciones condicionales. Luego, agrega la vinculación de funciones condicionales a la política de IAM de un recurso.

  1. Selecciona un recurso que represente el alcance para el que quieres que un miembro otorgue y revoque funciones:

    • Si quieres permitir que un miembro otorgue y revoque ciertas funciones para todos los recursos dentro de una organización, selecciona una organización.
    • Si quieres permitir que un miembro otorgue y revoque ciertas funciones para todos los recursos dentro de una carpeta, selecciona una carpeta.
    • Si deseas permitir que un miembro otorgue y revoque ciertas funciones para todos los recursos dentro de un proyecto, selecciona un proyecto.
  2. Selecciona una función que permita que un miembro configure la política de IAM para el tipo de recurso seleccionado (proyecto, carpeta u organización). Para seguir el principio del mínimo privilegio, elige una de las siguientes funciones predefinidas:

    • Proyectos: Administrador de IAM de proyecto (roles/resourcemanager.projectIamAdmin)
    • Carpetas: Administrador de IAM de carpeta (roles/resourcemanager.folderIamAdmin)
    • Organizaciones: Administrador de la organización (roles/resourcemanager.organizationAdmin).

    Como alternativa, elige una función personalizada que incluya los permisos resourcemanager.resource-type.setIamPolicy y resourcemanager.resource-type.getIamPolicy, donde resource-type es project, folder o organization.

  3. Otorga de forma condicional a un miembro la función elegida en el proyecto, la carpeta o la organización que seleccionaste.

    Se aplica la nueva política, y tu miembro puede modificar las vinculaciones solo para las funciones que hayas permitido.

    Console

    1. En Cloud Console, ve a la página IAM.

      Ve a la página IAM

    2. Asegúrate de que el nombre de tu proyecto, organización o carpeta aparezca en el selector de recursos en la parte superior de la página. El selector de recursos te indica en qué proyecto, carpeta u organización estás trabajando.

      Si no ves el nombre de tu recurso, haz clic en el selector de recursos y, luego, selecciona tu recurso.

    3. En la lista de miembros, busca el miembro que otorgará y revocará funciones y haz clic en el botón .

    4. En el panel Editar permisos, selecciona la función que elegiste antes. Luego, en Condición, haz clic en Agregar condición.

    5. En el panel Editar condición, ingresa un título y una descripción opcional para la condición.

    6. Haz clic en la pestaña Editor de condición y, luego, ingresa la expresión que escribiste en Escribe una expresión de condición para limitar la concesión de funciones. Esta expresión limita las funciones que el miembro puede otorgar o revocar.

      Por ejemplo, la siguiente expresión de condición limita al miembro a otorgar y revocar las funciones de editor de Pub/Sub (roles/pubsub.editor) y publicador de Pub/Sub (roles/pubsub.publisher):

      api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])
      

      Advertencia: No incluyas los siguientes tipos de funciones en la lista de funciones permitidas:

      • Funciones con permisos para otorgar y revocar funciones de IAM (es decir, funciones con nombres de permisos que terminan en setIamPolicy).
      • Funciones personalizadas que el administrador de IAM limitado puede modificar. Por ejemplo, si el administrador de IAM limitado también tiene la función de administrador de funciones (roles/iam.roleAdmin) en un proyecto, no le permita otorgar o revocar funciones personalizadas a nivel de proyecto.

      Los administradores de IAM limitados que pueden otorgar y revocar estos tipos de funciones pueden otorgarse el permiso para otorgar y revocar todas las funciones de IAM. Consulta Escribe una expresión de condición para limitar el otorgamiento de funciones a fin de obtener más información.

    7. Haz clic en Guardar para aplicar la condición.

    8. Después de cerrar el panel Editar condición, haz clic en Guardar en el panel Editar permisos para actualizar tu política de IAM.

    gcloud

    Las políticas de IAM se establecen mediante el patrón read-modify-write.

    Primero, lee la política de IAM para el recurso:

    Ejecuta el comando get-iam-policy. Con este comando, se obtiene la política de IAM actual del recurso.

    Comando:

    gcloud resource-type get-iam-policy resource-id --format=json > path
    

    Reemplaza los siguientes valores:

    • resource-type: El tipo de recurso para el que deseas permitir que un miembro otorgue o revoque funciones. Usa una de las siguientes opciones: projects, resource-manager folders o organizations.
    • resource-id: Tu ID de la organización, carpeta y proyecto de Google Cloud.
    • path: La ruta de acceso del archivo a la que puedes descargar la política de IAM.

    La política de IAM se guarda en formato JSON, por ejemplo:

    {
      "bindings": [
        {
          "members": [
            "user:project-owner@example.com"
          ],
          "role": "roles/owner"
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 1
    }
    

    A continuación, modifica la política.

    Para permitir que un miembro solo modifique las vinculaciones de ciertas funciones, agrega la vinculación de funciones condicionales destacada:

    {
      "bindings": [
        {
          "members": [
            "user:owner@example.com"
          ],
          "role": "roles/owner"
        },
        {
          "members": [
            "member"
          ],
          "role": "role",
          "condition": {
            "title": "title",
            "description": "description",
            "expression":
              "expression"
          }
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 3
    }

    Reemplaza los siguientes valores:

    • member: el miembro que otorgará o revocará ciertas funciones. Por ejemplo, user:my-user@example.com. Para ver los formatos de cada tipo de miembro, consulta la referencia de Binding.
    • role: la función que elegiste en los pasos anteriores. Esta función debe incluir el permiso setIamPolicy para el tipo de recurso que elegiste.
    • title: Una string que describe de forma breve la condición. Por ejemplo, only_pubsub_roles.
    • description: Opcional Una descripción adicional para la condición. Por ejemplo, Only allows granting/revoking the Pub/Sub editor and publisher roles.
    • expression: la expresión que escribiste en Escribe una expresión de condición para limitar el otorgamiento de funciones. Esta expresión limita las funciones que el miembro puede otorgar o revocar.

      Por ejemplo, la siguiente expresión de condición limita al miembro a otorgar y revocar las funciones de editor de Pub/Sub (roles/pubsub.editor) y publicador de Pub/Sub (roles/pubsub.publisher):

      api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])
      

      Advertencia: No incluyas los siguientes tipos de funciones en la lista de funciones permitidas:

      • Funciones con permisos para otorgar y revocar funciones de IAM (es decir, funciones con nombres de permisos que terminan en setIamPolicy).
      • Funciones personalizadas que el administrador de IAM limitado puede modificar. Por ejemplo, si el administrador de IAM limitado también tiene la función de administrador de funciones (roles/iam.roleAdmin) en un proyecto, no le permita otorgar o revocar funciones personalizadas a nivel de proyecto.

      Los administradores de IAM limitados que pueden otorgar y revocar estos tipos de funciones pueden otorgarse el permiso para otorgar y revocar todas las funciones de IAM. Consulta Escribe una expresión de condición para limitar el otorgamiento de funciones a fin de obtener más información.

    Por último, escribe la política actualizada:

    Configura la política nueva mediante la ejecución del comando de set-iam-policy para el recurso:

    gcloud resource-type set-iam-policy resource-id path
    

    Reemplaza los siguientes valores:

    • resource-type: El tipo de recurso para el que deseas permitir que un miembro otorgue o revoque funciones. Usa una de las siguientes opciones: projects, resource-manager folders o organizations.
    • resource-id: Tu ID de la organización, carpeta y proyecto de Google Cloud.
    • path: Una ruta de acceso al archivo que contiene la política actualizada.

    Se aplica la nueva política, y el miembro podrá modificar las vinculaciones solo de las funciones que hayas permitido.

    REST

    Las políticas de IAM se establecen mediante el patrón read-modify-write.

    Primero, lee la política de IAM para el recurso:

    El método getIamPolicy de la API de Resource Manager obtiene la política de IAM de un proyecto, una carpeta o una organización.

    Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • API_VERSION: La versión de la API que se usará. Para los proyectos y las organizaciones, usa v1. Para las carpetas, usa v2.
    • RESOURCE_TYPE: El tipo de recurso cuya política deseas administrar. Usa el valor projects, folders o organizations.
    • RESOURCE_ID: El proyecto ID de la carpeta, la organización o el proyecto de Google Cloud. Los ID de proyecto son strings alfanuméricas, como my-project. Los ID de las carpetas y las organizaciones son numéricos, como 123456789012.
    • POLICY_VERSION: Es la versión de la política que se mostrará. Las solicitudes deben especificar la versión de política más reciente, que es la versión de política 3. Consulta Especifica una versión de política cuando obtienes una política para obtener más detalles.

    Método HTTP y URL:

    POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

    Cuerpo JSON de la solicitud:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    Para enviar tu solicitud, expande una de estas opciones:

    La respuesta contiene la política de IAM del proyecto. Por ejemplo:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/owner",
          "members": [
            "user:owner@example.com"
          ]
        }
      ]
    }
    

    A continuación, modifica la política.

    Agrega una vinculación de función condicional que permita a un miembro otorgar y revocar solo ciertas funciones. Asegúrate de cambiar el campo version al valor 3:

    {
      "version": 3,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "members": [
            "user:owner@example.com"
          ],
          "role": "roles/owner"
        },
        {
          "members": [
            "MEMBER"
          ],
          "role": "ROLE",
          "condition": {
            "title": "TITLE",
            "description": "DESCRIPTION",
            "expression":
              "EXPRESSION"
          }
        }
      ]
    }
    • MEMBER: el miembro que otorgará o revocará ciertas funciones. Por ejemplo, user:my-user@example.com. Para ver los formatos de cada tipo de miembro, consulta la referencia de Binding.
    • ROLE: la función que elegiste en los pasos anteriores. Esta función debe incluir el permiso setIamPolicy para el tipo de recurso que elegiste.
    • TITLE: Una string que describe de forma breve la condición. Por ejemplo, only_pubsub_roles.
    • DESCRIPTION: Opcional Una descripción adicional para la condición. Por ejemplo, Only allows granting/revoking the Pub/Sub editor and publisher roles.
    • EXPRESSION: la expresión que escribiste en Escribe una expresión de condición para limitar el otorgamiento de funciones. Esta expresión limita las funciones que el miembro puede otorgar o revocar.

      Por ejemplo, la siguiente expresión de condición limita al miembro a otorgar y revocar las funciones de editor de Pub/Sub (roles/pubsub.editor) y publicador de Pub/Sub (roles/pubsub.publisher):

      api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])
      

      Advertencia: No incluyas los siguientes tipos de funciones en la lista de funciones permitidas:

      • Funciones con permisos para otorgar y revocar funciones de IAM (es decir, funciones con nombres de permisos que terminan en setIamPolicy).
      • Funciones personalizadas que el administrador de IAM limitado puede modificar. Por ejemplo, si el administrador de IAM limitado también tiene la función de administrador de funciones (roles/iam.roleAdmin) en un proyecto, no le permita otorgar o revocar funciones personalizadas a nivel de proyecto.

      Los administradores de IAM limitados que pueden otorgar y revocar estos tipos de funciones pueden otorgarse el permiso para otorgar y revocar todas las funciones de IAM. Consulta Escribe una expresión de condición para limitar el otorgamiento de funciones a fin de obtener más información.

    Por último, escribe la política actualizada:

    El método setIamPolicy de la API de Resource Manager establece la política en la solicitud como la política de IAM nueva para el proyecto, la carpeta o la organización.

    Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • API_VERSION: La versión de la API que se usará. Para los proyectos y las organizaciones, usa v1. Para las carpetas, usa v2.
    • RESOURCE_TYPE: El tipo de recurso cuya política deseas administrar. Usa el valor projects, folders o organizations.
    • RESOURCE_ID: El proyecto ID de la carpeta, la organización o el proyecto de Google Cloud. Los ID de proyecto son strings alfanuméricas, como my-project. Los ID de las carpetas y las organizaciones son numéricos, como 123456789012.
    • POLICY: Una representación JSON de la política que deseas establecer. Para obtener más información sobre el formato de una política, consulta Referencia de políticas.

      Por ejemplo, para establecer la política que se muestra en el paso anterior, reemplaza POLICY por lo siguiente:

      {
        "version": 3,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "members": [
              "user:owner@example.com"
            ],
            "role": "roles/owner"
          },
          {
            "members": [
              "member"
            ],
            "role": "role",
            "condition": {
              "title": "title",
              "description": "description",
              "expression":
                "expression"
            }
          }
        ]
      }
      

    Método HTTP y URL:

    POST https://iam.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy

    Cuerpo JSON de la solicitud:

    {
      "policy": POLICY
    }
    

    Para enviar tu solicitud, expande una de estas opciones:

    La respuesta contiene la política actualizada.

¿Qué sigue?