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

Google Cloud ofrece la función de administración de identidades y accesos (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 permites el acceso necesario a tus recursos.

IAM te permite configurar políticas para controlar quién (usuarios) tiene qué acceso (funciones) a qué recursos estableciendo las políticas de IAM. Las políticas de IAM asignan funciones específicas a un usuario, lo que le otorga ciertos permisos.

En esta página, se explican los roles de IAM disponibles a nivel de los recursos de la organización, y cómo crear y administrar Políticas de IAM para los recursos de la organización con la API de Cloud Resource Manager. Para obtener una descripción detallada de IAM, consulta la Documentación de IAM. En particular, consulta Cómo otorgar, cambiar y revocar el acceso a los recursos.

Permisos y funciones

Para controlar el acceso a los recursos, Google Cloud requiere que las cuentas que realizan solicitudes a la API tengan las funciones de IAM adecuadas. Las funciones de IAM incluyen permisos que permiten a los usuarios realizar acciones específicas en los recursos de Google Cloud. Por ejemplo, el El permiso resourcemanager.organizations.get permite que un usuario obtenga detalles sobre los recursos 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 funciones predefinidas

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 cada uno y los permisos incluidos dentro de esas funciones.

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.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

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

(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 descritos en este tema, también puedes crear roles personalizados que son colecciones y permisos que puedes adaptar a tus necesidades. Cuando crees un rol personalizado para usarlo con Resource Manager, ten en cuenta 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 folders.list y folders.get permisos, también debe incluir projects.list y projects.get.
  • Ten en cuenta que el permiso setIamPolicy para la organización, la carpeta y los recursos del proyecto permiten al usuario otorgar todos los demás permisos, por lo que se deben asignar con cuidado.

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

Puedes ver qué roles se le otorgan a un usuario para un recurso de organización: obtener la política de IAM a nivel de los recursos de la organización. Puedes ver una política de un recurso de organización con la consola de Google Cloud, Google Cloud CLI, o getIamPolicy() .

Console

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

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

    Abrir la página Administrar recursos

  2. En la lista 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 ubicado a la derecha, haz clic para expandir una función, de modo que se muestre a todos los miembros que tienen esa función.

gcloud

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

gcloud alpha organizations get-iam-policy [ORGANIZATION_ID] --format json >
[FILENAME.JSON]

Con el comando, se muestra la política, que será 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="

API

En el siguiente fragmento de código, se muestra la política del 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 establecida 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 roles a una Cuenta de Google, un Grupo de Google, una cuenta de servicio o una cuenta de G Suite dominio. Puedes usar la consola de Google Cloud, gcloud CLI o el método setIamPolicy() para otorgar roles.

Console

Para configurar el control de acceso a nivel de los recursos de la organización con la consola de Google Cloud, sigue estos pasos:

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

    Abrir la página Administrar recursos

  2. En la lista desplegable Organización, selecciona el recurso de tu 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 la pestaña Permisos del Panel de información, haz clic en Agregar miembro.

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

  7. En la lista desplegable Seleccionar una función, selecciona la función que deseas otorgarle a los miembros del equipo.

  8. Haz clic en Agregar.

gcloud

Para configurar la política de IAM de un recurso de la organización con el comando gcloud, haz lo siguiente:

  1. Obtén la política de IAM del 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 [ORGANIZATION_ID]
    --format json > [FILENAME.JSON]
    
  2. El contenido del archivo JSON será 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="
    }
    
  3. Con un editor de texto, abre el archivo JSON y agrega una nueva entrada a la de vinculaciones de Google que define el administrador de la organización. Por ejemplo, para que anotheradmin@gcp-test.com sea un administrador de la organización, debes modificar el ejemplo anterior de la siguiente forma:

    {
        "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="
    }
    
  4. Ejecuta el siguiente comando para actualizar la política del recurso de la organización:

    gcloud alpha organizations set-iam-policy [ORGANIZATION_ID] 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="
}

Si adjuntas una política de IAM al recurso de la organización, puedes otorgar roles a los usuarios con el método setIamPolicy(). La política de IAM es un conjunto de declaraciones que definen quién tiene qué acceso.

Leer-Modificar-Escribir: Se trata de un patrón con el que se suelen actualizar los metadatos de un recurso, como la política. Consiste en leer el estado actual de los metadatos, actualizar los datos de forma local y, luego, enviar los datos modificados para que se escriban. Este patrón puede generar un conflicto si dos o más procesos independientes intentan ejecutar la secuencia de forma simultánea. Por ejemplo, supongamos que hay dos propietarios de un proyecto y ambos intentan realizar cambios conflictivos en la política al mismo tiempo. En algunos casos, los cambios que realiza uno de los propietarios del proyecto pueden fallar. IAM resuelve este problema mediante una propiedad ETag en las políticas de IAM. Esta propiedad se usa para verificar si la política cambió desde la última solicitud. Cuando realizas una solicitud a Cloud IAM con un valor ETag, Cloud IAM compara el valor ETag en la solicitud con el valor ETag existente asociado con la política. Solo escribe la política si los valores ETag coinciden.

Cuando actualizas una política, primero obtenla mediante getIamPolicy(), actualízala y, luego, escribe la política actualizada con setIamPolicy(). Cuando configures la política, usa el valor ETag solo si la política correspondiente en GetPolicyResponse contiene un valor ETag.

Python

El método setIamPolicy() te permite adjuntar una política a un recurso. El método setIamPolicy toma una SetIamPolicyRequest, que contiene una política que se debe establecer y el recurso al que se adjuntó la política. Muestra la política resultante. Se recomienda seguir el patrón leer-modificar-escribir cuando se actualiza una política mediante setIamPolicy().

Aquí se pueden ver algunos códigos de muestra para establecer una política 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 las búsquedas recurso de la organización seleccionado. Puedes usar el Servicio de políticas de la organización para restringir de proyectos que se muestran en las consultas y en la consola de Google Cloud. Esto se puede usar para restringir a los usuarios de modo que solo vean proyectos dentro de tu propio 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 IDs de recursos de la organización, que definen el conjunto de recursos de la organización que para que los usuarios que hagan una consulta o la consola de Google Cloud puedan ver sus recursos.

Los proyectos aparecen en No organization si el usuario no tiene el permiso resourcemanager.organizations.get en el recurso de la organización superior del proyecto. Esto puede hacer parecer un proyecto que no forma parte de tu recurso de organización no está asociado con un recurso de organización en todos. 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 consultas ni en la consola de Google Cloud. Cualquier proyecto que que aún no se migró a un recurso de la organización no será visible si se aplica esta restricción.

Recomendamos migrar los proyectos que tengan menos de No organization a tu recurso de la organización antes de aplicar esta restricción. Para obtener información sobre sobre cómo migrar proyectos a un recurso de la organización, consulta Traslada un proyecto.

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

Prueba permisos

Puedes probar los permisos de IAM en un usuario de un recurso de una organización con el método testIamPermissions(). Este método toma la URL del recurso y el conjunto de permisos que deseas probar como parámetros de entrada y muestra el subconjunto de estos permisos a los que el usuario tiene acceso.

Por lo general, no invocas testIamPermission() si usas la consola de Google 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 usa testIamPermissions() de forma interna a fin de determinar qué IU debería estar 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 pueden ver algunos códigos 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)