Establece límites para otorgar roles

En organizaciones grandes, puede ser útil permitir que los equipos administren de forma independiente las políticas de permisos para sus recursos. Sin embargo, permitir que una principal otorgue o revoque todos los roles de IAM puede aumentar en gran medida tu riesgo de seguridad.

Puedes establecer límites para los roles que una principal puede otorgar y revocar con las Condiciones de Identity and Access Management (IAM) y el atributo de API iam.googleapis.com/modifiedGrantsByRole. Estos límites te permiten crear administradores de IAM limitados que pueden administrar las políticas de permisos de su equipo, pero solo dentro de los límites que configuraste.

Antes de comenzar

Permisos necesarios

Para obtener los permisos que necesitas a fin de crear administradores de IAM limitados para un proyecto, organización o carpeta, pídele a tu administrador que te otorgue los siguientes roles de IAM en el recurso para el que deseas crear un administrador de IAM limitado (proyecto, organización o carpeta):

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios a fin de crear administradores de IAM limitados para un proyecto, una carpeta o una organización. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para crear administradores de IAM limitados para un proyecto, organización o carpeta:

  • A fin de crear un administrador de IAM limitado para un proyecto:
    • resourcemanager.projects.getIamPolicy
    • resourcemanager.projects.setIamPolicy
  • A fin de crear un administrador de IAM limitado para una carpeta:
    • resourcemanager.folders.getIamPolicy
    • resourcemanager.folders.setIamPolicy
  • A fin de crear un administrador de IAM limitado para una organización:
    • resourcemanager.organizations.getIamPolicy
    • resourcemanager.organizations.setIamPolicy

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Casos de uso habituales

En las siguientes secciones, se describe cómo puedes usar la función de otorgamiento limitado de roles para habilitar la administración de autoservicio de las políticas de permisos.

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 los roles de administrador de App Engine (roles/appengine.appAdmin) y visualizador de App Engine (roles/appengine.appViewer) para 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_appengine_admin_viewer_roles",
        "description": "Only allows changes to role bindings with the App Engine Admin or Viewer roles",
        "expression":
          "api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/appengine.appAdmin', 'roles/appengine.appViewer'])"
      }
    }
  ]
}

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

  • Otorgar los roles de administrador de App Engine y visualizador de App Engine para el proyecto
  • Revocar los roles de administrador de App Engine y visualizador de App Engine para el proyecto
  • Agregar, quitar o modificar las condiciones de las vinculaciones de roles a nivel de proyecto que otorgan los roles de administrador de App Engine y visualizador de App Engine
  • Realizar otras acciones permitidas por el rol Project IAM Admin que no modifican la política de permisos del proyecto. Por ejemplo, Finn puede usar el método projects.getIamPolicy para obtener la política de permisos del proyecto.

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

  • Modificar las políticas de permisos para recursos que no sean el proyecto.
  • Otorgar roles que no sean los de administrador de App Engine o visualizador de App Engine
  • Revocar roles que no sean los de administrador de App Engine o visualizador de App Engine.
  • Agregar, quitar o modificar las condiciones de las vinculaciones de roles que no otorgan los roles de administrador de App Engine o visualizador de App Engine

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 una principal 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 una principal de una vinculación existente de la función.
  • Modifica las concesiones del rol de administrador de Compute mediante la adición, eliminación o modificación de condiciones adjuntas a vinculaciones de la función.
  • Realizar otras acciones permitidas por el rol de administrador de IAM que no modifican la política de permisos del proyecto. Por ejemplo, podría usar el método projects.getIamPolicy para obtener la política de permisos 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 permisos 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 roles que no otorgan el rol de administrador de Compute

Limita la asignación de roles

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

Escribe una expresión de condición para limitar la asignación de roles

Si deseas limitar la capacidad de una principal 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 permisos de un recurso, este atributo contiene los nombres de los roles 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 la principal tiene permitido otorgar o revocar.

    La entrada para la función hasOnly() es una lista de las funciones que la principal 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 la principal tiene permitido otorgar o revocar. Por ejemplo, para permitir que la principal 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.

Operadores lógicos para instrucciones hasOnly()

No uses los operadores && o || para unir varias sentencias hasOnly() en una sola condición. Si lo haces, las solicitudes que otorgan o revocan varios roles pueden fallar, incluso si la principal puede otorgar o revocar esos roles de forma individual.

Por ejemplo, considera la siguiente condición:

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

Esta condición se evalúa como true si una solicitud otorga el rol roles/pubsub.editor o el rol roles/pubsub.publisher, pero se evalúa como false si una solicitud otorga ambos roles roles/pubsub.editor y roles/pubsub.publisher.

Limita la asignación de roles con vinculaciones de roles condicionales

Para permitir que una principal 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 rol condicional a la política de permisos de un recurso.

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

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

    • 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 una principal la función elegida en el proyecto, la carpeta o la organización que seleccionaste.

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

    Console

    1. En la consola de Google Cloud, 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 principales, busca la principal que otorgará y revocará las 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 de IAM (opcional), haz clic en Agregar condición de IAM.

    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 roles. Esta expresión limita los roles que la principal puede otorgar o revocar.

      Por ejemplo, la siguiente expresión de condición limita la principal a otorgar y revocar los roles 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 roles en la lista de roles permitidos:

      • Roles con permisos para otorgar y revocar roles de IAM (es decir, roles 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 permisos.

    gcloud

    Las políticas de permisos se establecen mediante el patrón de lectura-modificación-escritura.

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

    Ejecuta el comando get-iam-policy. Con este comando, se obtiene la política de permisos 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 una principal 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 se descargará la política de permisos.

    La política de permisos 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 de permisos.

    Para permitir que una principal 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": [
            "principal"
          ],
          "role": "role",
          "condition": {
            "title": "title",
            "description": "description",
            "expression":
              "expression"
          }
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 3
    }

    Reemplaza los siguientes valores:

    • principal: La principal que otorgará o revocará ciertos roles. Un ejemplo es user:my-user@example.com. Para ver los formatos de cada tipo de principal, 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. Un ejemplo es only_pubsub_roles.
    • description: Opcional Una descripción adicional para la condición. Un ejemplo es 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 la principal puede otorgar o revocar.

      Por ejemplo, la siguiente expresión de condición limita la principal a otorgar y revocar los roles 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 roles en la lista de roles permitidos:

      • Roles con permisos para otorgar y revocar roles de IAM (es decir, roles 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 de permisos actualizada:

    Configura la política de permisos nueva mediante la ejecución del comando 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 una principal 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 de permisos actualizada.

    Se aplica la nueva política de permisos y la principal podrá modificar las vinculaciones solo de los roles que hayas permitido.

    REST

    Las políticas de permisos se establecen mediante el patrón de lectura-modificación-escritura.

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

    El método getIamPolicy de la API de Resource Manager obtiene la política de permisos 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 IDs de carpeta y organización 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 permisos del recurso. Por ejemplo:

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

    A continuación, modifica la política de permisos.

    Agrega una vinculación de función condicional que permita a una principal 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": [
            "PRINCIPAL"
          ],
          "role": "ROLE",
          "condition": {
            "title": "TITLE",
            "description": "DESCRIPTION",
            "expression":
              "EXPRESSION"
          }
        }
      ]
    }
    • PRINCIPAL: La principal que otorgará o revocará ciertos roles. Un ejemplo es user:my-user@example.com. Para ver los formatos de cada tipo de principal, 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. Un ejemplo es only_pubsub_roles.
    • DESCRIPTION: Opcional Una descripción adicional para la condición. Un ejemplo es 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 la principal puede otorgar o revocar.

      Por ejemplo, la siguiente expresión de condición limita la principal a otorgar y revocar los roles 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 roles en la lista de roles permitidos:

      • Roles con permisos para otorgar y revocar roles de IAM (es decir, roles 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 de permisos actualizada:

    El método setIamPolicy de la API de Resource Manager establece la política de permisos en la solicitud como la política de permisos 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 IDs de carpeta y organización 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": [
              "principal"
            ],
            "role": "role",
            "condition": {
              "title": "title",
              "description": "description",
              "expression":
                "expression"
            }
          }
        ]
      }

    Método HTTP y URL:

    POST https://cloudresourcemanager.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 de permisos actualizada:

¿Qué sigue?