Control de acceso para organizaciones que usan 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. Las políticas de IAM asignan funciones específicas a un usuario, lo que le otorga ciertos permisos.

En esta página, se explican las funciones de IAM que están disponibles a nivel de la organización y cómo crear y administrar políticas de IAM para organizaciones que usan la API de Resource Manager. Para obtener una descripción detallada de IAM, lee la documentación de IAM. En particular, consulta Cómo otorgar, cambiar y revocar el acceso a los recursos.

Permisos y funciones

Con IAM, cada método de Google Cloud requiere que la cuenta que realiza la solicitud a la API tenga los permisos apropiados para acceder al recurso. Los permisos se usan para permitir a los usuarios realizar acciones específicas en los recursos de Cloud. Por ejemplo, el permiso resourcemanager.organizations.list permite que un usuario enumere las organizaciones que le pertenecen.

En la siguiente tabla, se enumeran los permisos que debe tener el emisor para llamar a un método de organización:

Método Permisos necesarios
cloudresourcemanager.organizations.get() resourcemanager.organizations.get.
cloudresourcemanager.organizations.search() Muestra todas las organizaciones en las que el usuario tiene el permiso resourcemanager.organizations.get.
cloudresourcemanager.organizations.getIamPolicy() resourcemanager.organizations.getIamPolicy
cloudresourcemanager.organizations.setIamPolicy() resourcemanager.organizations.setIamPolicy
cloudresourcemanager.organizations.testIamPermissions() No requiere ningún permiso.

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 las funciones que puedes otorgar para acceder a las propiedades de una organización, y se incluyen la descripción de lo que hace cada una y los permisos incluidos dentro de esas funciones.

Función Descripción Permisos
roles/
resourcemanager.organizationAdmin
Proporciona acceso para administrar todos los recursos que pertenecen a la organización. Según la configuración predeterminada, esta función no incluye privilegios de facturación ni de administración de las funciones de la organización.
  • orgpolicy.policy.get
  • resourcemanager.folders.get
  • resourcemanager.folders.getIamPolicy
  • resourcemanager.folders.list
  • resourcemanager.folders.setIamPolicy
  • resourcemanager.organizations.get
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.setIamPolicy
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list
  • resourcemanager.projects.setIamPolicy
roles/
resourcemanager.organizationViewer
Proporciona acceso para ver el nombre de la organización. Si se le proporciona esta función a un usuario, este podrá ver la organización en Google Cloud Console sin tener acceso para ver todos los recursos de la organización.
  • resourcemanager.organizations.get
roles/
orgpolicy.policyAdmin
Proporciona acceso para definir qué restricciones quiere establecer una organización en la configuración de los recursos de la nube mediante la configuración de políticas de la organización.
  • orgpolicy.*
roles/
browser
Proporciona acceso para explorar los recursos en una organización.
  • resourcemanager.folders.get
  • resourcemanager.folders.list
  • resourcemanager.organizations.get
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list

Crea funciones personalizadas

Además de las funciones predefinidas que se describen en esta documentación, también puedes crear funciones personalizadas, que son colecciones de permisos que puedes adaptar a tus necesidades. Cuando se crea una función personalizada 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 función personalizada 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 organizaciones, carpetas y proyectos permite al usuario otorgar todos los demás permisos, por lo que debe asignarse con cuidado.

Ve el acceso existente para una organización

Puedes ver las funciones que se le otorgan a un usuario para una organización mediante la obtención de la política de IAM a nivel de organización. Puedes ver una política de una organización mediante Cloud Console, la herramienta de línea de comandos de gcloud o el método getIamPolicy().

Console

Para ver las funciones otorgadas a nivel de organización con Cloud Console, sigue estos pasos:

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

    Abrir la página Administrar recursos

  2. En la lista desplegable Organización, selecciona tu 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 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/v1/organizations/12345.

Solicitud:

POST
https://cloudresourcemanager.googleapis.com/v1/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', 'v1', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()
print json.dumps(policy, indent=2)

...

Otorga acceso a una organización

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

Console

Para configurar el control de acceso a nivel de organización con Cloud Console, haz lo siguiente:

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

    Abrir la página Administrar recursos

  2. En la lista desplegable Organización, selecciona 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 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 una organización con el comando de gcloud, sigue estos pasos:

  1. Obtén la política de IAM 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 entrada nueva al arreglo de vinculaciones 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. Para actualizar la política de la organización, ejecuta el siguiente comando:

    gcloud alpha organizations set-iam-policy [ORGANIZATION_ID] policy.json
    

API

Solicitud:

POST https://cloudresourcemanager.googleapis.com/v1/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 funciones a los usuarios si adjuntas una política de IAM a la organización. 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 IAM con un valor de Etag, IAM compara el valor de Etag en la solicitud con el valor de 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 en una organización:

...

crm = discovery.build(
    'cloudresourcemanager', 'v1', 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 Admin 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)

...

Prueba permisos

Puedes probar los permisos de IAM en un usuario para 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 se invoca testIamPermission() si se usa Cloud Console directamente para administrar los permisos. testIamPermissions() está diseñado para la integración con tu software de propietario, como una interfaz gráfica de usuario personalizada. Por ejemplo, Cloud Console usa testIamPermissions() de forma interna a fin de determinar qué IU debe 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 una organización:

Request:

POST https://cloudresourcemanager.googleapis.com/v1/organization/12345:testIamPermissions

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

Response:

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

Python

...

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

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

print json.dumps(response, indent=2)

...