Control de acceso para los recursos de la organización con la IAM

Google Cloud ofrece Identity and Access Management (IAM), que te permite brindar acceso más detallado a recursos específicos de Google Cloud y evita el acceso no deseado a otros recursos. IAM te permite adoptar el principio de seguridad de menor privilegio, de manera que solo otorgas el acceso necesario a tus recursos.

IAM te permite configurar políticas para controlar quién (usuarios) tiene qué acceso (roles) a qué recursos estableciendo políticas de permiso. Las políticas de permiso otorgan roles específicos a un usuario para darle ciertos permisos.

En esta página, se explican los roles de IAM disponibles en el recurso de organización y cómo crear y administrar políticas de permisos para los recursos de organización con la API de Cloud Resource Manager. Para obtener más información, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Permisos y roles

Para controlar el acceso a los recursos, Google Cloud requiere que las cuentas que realizan solicitudes a la API tengan los roles de IAM adecuados. Las funciones de IAM incluyen permisos que permiten a los usuarios realizar acciones específicas en los recursos deGoogle Cloud . Por ejemplo, el permiso resourcemanager.organizations.get permite que un usuario obtenga detalles sobre el recurso de su organización.

No se otorgan permisos a los usuarios directamente, sino funciones, que incluyen uno o más permisos.

Puedes otorgar una o más funciones en el mismo recurso.

Usa roles predefinidos

En la siguiente tabla, se enumeran los roles que puedes otorgar para acceder a las propiedades de un recurso de organización, la descripción de lo que hace el rol y los permisos agrupados en él.

Rol Permisos

(roles/resourcemanager.organizationAdmin)

Tiene acceso para administrar las políticas de IAM y ver las políticas de la organización de carpetas, proyectos y organizaciones.

Recursos de nivel más bajo en los que puedes otorgar esta función:

  • Proyecto

essentialcontacts.*

  • essentialcontacts.contacts.create
  • essentialcontacts.contacts.delete
  • essentialcontacts.contacts.get
  • essentialcontacts.contacts.list
  • essentialcontacts.contacts.send
  • essentialcontacts.contacts.update

iam.policybindings.*

  • iam.policybindings.get
  • iam.policybindings.list

orgpolicy.constraints.list

orgpolicy.policies.list

orgpolicy.policy.get

resourcemanager.capabilities.*

  • resourcemanager.capabilities.get
  • resourcemanager.capabilities.update

resourcemanager.folders.createPolicyBinding

resourcemanager.folders.deletePolicyBinding

resourcemanager.folders.get

resourcemanager.folders.getIamPolicy

resourcemanager.folders.list

resourcemanager.folders.searchPolicyBindings

resourcemanager.folders.setIamPolicy

resourcemanager.folders.updatePolicyBinding

resourcemanager.organizations.*

  • resourcemanager.organizations.createPolicyBinding
  • resourcemanager.organizations.deletePolicyBinding
  • resourcemanager.organizations.get
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.searchPolicyBindings
  • resourcemanager.organizations.setIamPolicy
  • resourcemanager.organizations.updatePolicyBinding

resourcemanager.projects.createPolicyBinding

resourcemanager.projects.deletePolicyBinding

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

resourcemanager.projects.searchPolicyBindings

resourcemanager.projects.setIamPolicy

resourcemanager.projects.updatePolicyBinding

(roles/resourcemanager.organizationViewer)

Proporciona acceso para ver una organización.

Recursos de nivel más bajo en los que puedes otorgar esta función:

  • Organización

resourcemanager.organizations.get

(roles/orgpolicy.policyAdmin)

Proporciona acceso para definir qué restricciones quiere poner una organización en los ajustes de los recursos de la nube mediante la configuración de políticas de la organización.

Recursos de nivel más bajo en los que puedes otorgar esta función:

  • Organización

cloudasset.assets.analyzeOrgPolicy

cloudasset.assets.exportResource

cloudasset.assets.listResource

cloudasset.assets.searchAllResources

orgpolicy.*

  • orgpolicy.constraints.list
  • orgpolicy.customConstraints.create
  • orgpolicy.customConstraints.delete
  • orgpolicy.customConstraints.get
  • orgpolicy.customConstraints.list
  • orgpolicy.customConstraints.update
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set

policysimulator.orgPolicyViolations.list

policysimulator.orgPolicyViolationsPreviews.*

  • policysimulator.orgPolicyViolationsPreviews.create
  • policysimulator.orgPolicyViolationsPreviews.get
  • policysimulator.orgPolicyViolationsPreviews.list

recommender.orgPolicyInsights.*

  • recommender.orgPolicyInsights.get
  • recommender.orgPolicyInsights.list
  • recommender.orgPolicyInsights.update

recommender.orgPolicyRecommendations.*

  • recommender.orgPolicyRecommendations.get
  • recommender.orgPolicyRecommendations.list
  • recommender.orgPolicyRecommendations.update

(roles/browser)

Acceso de lectura para navegar en la jerarquía de un proyecto, incluida la carpeta, la organización y la política de permisos. esta función no incluye el permiso para ver los recursos del proyecto

Recursos de nivel más bajo en los que puedes otorgar este rol:

  • Proyecto

resourcemanager.folders.get

resourcemanager.folders.list

resourcemanager.organizations.get

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

Crea funciones personalizadas

Además de los roles predefinidos que se describen en este tema, también puedes crear roles personalizados, que son colecciones de permisos que puedes adaptar a tus necesidades. Cuando se crea un rol personalizado para usar con Resource Manager, se debe prestar atención a los siguientes puntos:
  • Los permisos list y get, como resourcemanager.projects.get/list, siempre se deben otorgar como un par.
  • Cuando tu rol personalizado incluye los permisos folders.list y folders.get, también debe incluir projects.list y projects.get.
  • Ten en cuenta que el permiso setIamPolicy para los recursos de organización, carpeta y proyecto permite al usuario otorgar todos los demás permisos, por lo que debe asignarse con cuidado.

Visualiza el acceso existente para un recurso de la organización

Puedes ver los roles que se le otorgan a un usuario para un recurso de organización obteniendo la política de permisos de ese recurso. Puedes ver la política de permisos de un recurso de organización con la consola de Google Cloud , Google Cloud CLI o el método getIamPolicy().

Console

Para ver los roles otorgados a nivel del recurso de organización con la consola de Google Cloud , sigue estos pasos:

  1. Ve a la página Administrar recursos en la Google Cloud consola:

    Abrir la página Administrar recursos

  2. En el menú desplegable Organización, selecciona tu recurso de organización.

  3. Selecciona la casilla de verificación del recurso de la organización.

  4. En Permisos, dentro del Panel de información, haz clic para expandir una función y mostrar a todos los miembros que tienen esa función.

gcloud

Obtén la política de permisos del recurso de la organización con el comando get-iam-policy:

gcloud alpha organizations get-iam-policy <var>ORGANIZATION_ID</var> --format json >
<var>FILENAME.JSON</var>

El comando genera la política de permisos, que es similar a la siguiente:

bindings:
- members:
- user:testuser1@gcp-test.com
role: roles/editor
- members:
- user:admin@gcp-test.com
role:roles/resourcemanager.organizationAdmin
- members:
- user:testuser2@gcp-test.com
role: roles/resourcemanager.projectCreator
etag": "BwU1aRxWk30="

API

En el siguiente fragmento de código, se muestra la política de permisos para el recurso de la organización https://cloudresourcemanager.googleapis.com/v3/organizations/12345.

Solicitud:

POST
https://cloudresourcemanager.googleapis.com/v3/organizations/12345:getIamPolicy

Respuesta:

{
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
        "user:email1@gmail.com"
    ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
}

Python

El método getIamPolicy() te permite obtener una política de permisos que se estableció con anterioridad.

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()
print json.dumps(policy, indent=2)

Otorga acceso a un recurso de la organización

Los administradores de la organización pueden otorgar roles de IAM a los miembros del equipo para que puedan acceder a los recursos y a las APIs de una organización. Puedes otorgar funciones al correo electrónico de una cuenta de usuario, a un Grupo de Google, a una cuenta de servicio o a un dominio de G Suite. Puedes usar la consola de Google Cloud , gcloud CLI o el método setIamPolicy() para otorgar roles.

Console

Para establecer el control de acceso a nivel del recurso de organización con la consola de Google Cloud , haz lo siguiente:

  1. Ve a la página Administrar recursos en la Google Cloud consola:

    Abrir la página Administrar recursos

  2. En el menú desplegable Organización, selecciona tu recurso de organización.

  3. Selecciona la casilla de verificación del recurso de la organización. Si no tienes un recurso de carpeta, el recurso de la organización no será visible. Si quieres continuar, consulta las instrucciones para otorgar funciones que están en la página de Cloud IAM.

  4. Si el Panel de información a la derecha está oculto, haz clic en Mostrar panel de información en la esquina superior derecha.

  5. En el Panel de información, en la pestaña Permisos, haz clic en Agregar miembro.

  6. En el campo Miembros nuevos, ingresa los miembros del equipo que deseas agregar. Puedes especificar el correo electrónico de una cuenta de usuario, un Grupo de Google, una cuenta de servicio o un dominio de G Suite.

  7. En el menú desplegable Seleccionar un rol, selecciona el rol que deseas otorgar a los miembros del equipo.

  8. Haz clic en Agregar.

gcloud

Para establecer la política de permisos de un recurso de organización con el comando gcloud, sigue estos pasos:

  1. Obtén la política de permiso para el recurso de la organización con el comando get-iam-policy y envía la política a un archivo JSON:

    gcloud alpha organizations get-iam-policy <var>ORGANIZATION_ID</var>
    --format json > <var>FILENAME.JSON</var>
    
  2. El contenido del archivo JSON se verá similar al siguiente ejemplo:

{
    "bindings": [
    {
        "members": [
            "user:testuser1@gcp-test.com"
        ],
        "role": "roles/editor"
    },
    {
        "members": [
            "user:admin@gcp-test.com",
        ],
        "role": "roles/resourcemanager.organizationAdmin"
    },
    {
        "members": [
            "user:testuser2@gcp-test.com"
        ],
        "role": "roles/resourcemanager.projectCreator"
    },
    ],
    "etag": "BwU1aRxWk30="
}
  1. Abre el archivo JSON en un editor de texto. Luego, agrega una entrada nueva al array bindings para definir un administrador de la organización. Por ejemplo, para que anotheradmin@gcp-test.com sea un administrador de la organización, cambia el ejemplo anterior de la siguiente manera:
{
    "bindings": [
    {
        "members": [
            "user:testuser1@gcp-test.com"
        ],
        "role": "roles/editor"
    },
    {
        "members": [
            "user:admin@gcp-test.com",
            "user:anotheradmin@gcp-test.com"
        ],
        "role": "roles/resourcemanager.organizationAdmin"
    },
    {
        "members": [
            "user:testuser20@gcp-test.com"
        ],
        "role": "roles/resourcemanager.projectCreator"
    },
    ],
    "etag": "BwU1aRxWk30="
}
  1. Actualiza la política de permisos del recurso de la organización ejecutando el siguiente comando:
gcloud alpha organizations set-iam-policy <var>ORGANIZATION_ID</var> policy.json

API

Solicitud:

POST https://cloudresourcemanager.googleapis.com/v3/organizations/12345:setIamPolicy
{
    "policy": {
    "version": "0",
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
        "user:email2@gmail.com",
        "user:email3@gmail.com",
        "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
    }
}

Respuesta:

{
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKJUiQ="
}

El método setIamPolicy() te permite otorgar roles a los usuarios adjuntando una política de permisos al recurso de la organización. La política de permisos es una colección de vinculaciones que definen .

Leer-Modificar-Escribir: Un patrón común para actualizar los metadatos de un recurso, como la política de permisos, implica leer su estado actual, actualizar los datos de forma local y, luego, enviar los datos modificados para su escritura. Este patrón puede generar un conflicto si dos o más procesos independientes intentan ejecutar la secuencia de forma simultánea. Por ejemplo, si dos propietarios del proyecto intentan realizar cambios conflictivos en la política de permisos simultáneamente, es posible que fallen los cambios de uno de los propietarios. IAM resuelve este problema con una propiedad etag en las políticas de permiso. Esta propiedad verifica si la política de permiso cambió desde la última solicitud. Cuando realizas una solicitud con un valor de etag, el sistema compara el valor de etag en la solicitud con el valor de etag existente asociado a la política. Solo escribe la política de permisos si los valores de etag coinciden.

Cuando actualices una política de permisos, primero obtén la política de permisos con getIamPolicy(), actualízala y, luego, escribe la política de permisos actualizada con setIamPolicy(). Cuando configures la política de permisos, usa el valor etag solo si la política de permisos correspondiente en GetPolicyResponse contiene un valor etag.

Python

El método setIamPolicy() te permite adjuntar una política de permisos a un recurso. El método setIamPolicy toma un SetIamPolicyRequest, que contiene una política de permisos que se debe establecer y el recurso al que se adjunta la política de permisos. Muestra la política de permisos resultante. Te recomendamos que sigas el patrón lectura-modificación-escritura cuando actualices una política de permisos con setIamPolicy().

Aquí se puede ver un código de muestra para establecer una política de permiso para un recurso de organización:

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()

admin_binding = next(
    (binding
        for binding in policy['bindings']
        if binding['role'] == 'roles/resourcemanager.organizationAdmin'),
        None)

# Add an empty Organization Administrator binding if not present.
if not admin_binding:
    admin_binding = {
        'role': 'roles/resourcemanager.organizationAdmin',
        'members': []
    }
policy['bindings'].append(admin_binding)

# Add the new Admin (if necessary).
new_admin = 'user:' + flags.adminEmail
if new_admin not in admin_binding['members']:
    admin_binding['members'].append(new_admin)
policy = crm.organizations().setIamPolicy(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'policy': policy
    }).execute()

print json.dumps(policy, indent=2)

Restringe la visibilidad del proyecto para los usuarios

Los usuarios pueden ver todos los proyectos a los que tienen acceso en la consola de Google Cloud y en las búsquedas, independientemente de si se encuentran o no en el recurso de organización seleccionado por el usuario. Puedes usar el Servicio de políticas de la organización para restringir el conjunto de proyectos que se muestran en las consultas y en la consola de Google Cloud . Esto te permite restringir a los usuarios para que solo vean los proyectos dentro de tu dominio.

La restricción de la política de la organización constraints/resourcemanager.accessBoundaries es una restricción de lista que se aplica en el recurso de tu organización. La restricción acepta una lista de IDs de recursos de organización, que definen el conjunto de recursos de organización que hacen que sus recursos sean visibles para los usuarios en una búsqueda o en la consola de Google Cloud .

Los proyectos aparecen en No organization si el usuario no tiene el permiso resourcemanager.organizations.get en el recurso de organización principal del proyecto. Esto puede hacer que un proyecto que no forma parte de tu recurso de organización parezca no estar asociado con ningún recurso de organización. Si usas la restricción resourcemanager.accessBoundaries para inhabilitar un recurso de organización, los proyectos que pertenecen a ese recurso de organización no aparecerán en las búsquedas ni en la consola de Google Cloud . Los proyectos que aún no se migraron a un recurso de organización no serán visibles si aplicas esta restricción.

Te recomendamos que migres los proyectos que se encuentran en No organization a tu recurso de organización antes de aplicar esta restricción. Para obtener información sobre cómo trasladar proyectos a un recurso de organización, consulta Traslada un proyecto.

Para obtener información sobre cómo configurar una política de la organización, consulta Usa restricciones.

Otorgar acceso condicional

Ciertos roles de IAM, como el de administrador de políticas de la organización (roles/orgpolicy.policyAdmin), solo se pueden otorgar en un recurso de organización. Debido a la herencia de políticas, todos los recursos de la organización suelen heredar este rol.

Para tener más control sobre los recursos en los que se otorga el rol, puedes usar condiciones de IAM. El uso de etiquetas con condiciones te permite otorgar acceso a los recursos solo si tienen la etiqueta especificada. Por ejemplo, la siguiente política de permisos otorga el rol de administrador de políticas de la organización solo en los recursos que tienen la etiqueta environment: dev y no lo otorga en ningún otro recurso:

{
  "bindings": [
    {
      "members": [
        "{dynamic print variables.examples.principal_group_api}"
      ],
      "role": "roles/orgpolicy.policyAdmin",
      "condition": {
          "title": "Dev_environment_only",
          "description": "Only granted in the development environment",
          "expression":
            "resource.matchTag('123456789012/env', 'dev')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

Prueba los permisos

Puedes probar los permisos de IAM en un usuario para un recurso de organización con el método testIamPermissions(). Este método toma la URL del recurso y el conjunto de permisos que se probarán. Devuelve el subconjunto de estos permisos a los que el usuario puede acceder.

Por lo general, no invocas testIamPermissions() si usas la consola deGoogle Cloud directamente para administrar los permisos. testIamPermissions() está diseñado para la integración en tu software de propietario, como una interfaz gráfica de usuario personalizada. Por ejemplo, la consola de Google Cloud usatestIamPermissions()de forma interna para determinar qué IU está disponible para el usuario que accedió.

API

Puedes usar el método testIamPermissions() a fin de verificar cuál de los permisos otorgados tiene el emisor para un recurso dado. Este método toma el nombre de un recurso y un conjunto de permisos como parámetros y muestra el subconjunto de permisos que tiene el emisor.

Aquí se puede ver un código de muestra para probar los permisos de un recurso de organización:

Request:

POST https://cloudresourcemanager.googleapis.com/v3/organizations/12345:testIamPermissions

{
    "permissions":  [
        "resourcemanager.organizations.get",
        "resourcemanager.organizations.setIamPolicy"
    ]
}

Response:

{
    "permissions": [
        "resourcemanager.organizations.get"
    ]
}

Python

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))

response = crm.organizations().testIamPermissions(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'permissions': [
            'resourcemanager.organizations.setIamPolicy',
            'resourcemanager.projects.patch'
        ]
    }).execute()

print json.dumps(response, indent=2)