Controllo dell'accesso per le organizzazioni con IAM

Google Cloud offre Identity and Access Management (IAM), che consente di concedere un accesso più granulare a risorse specifiche di Google Cloud e impedisce l'accesso indesiderato ad altre risorse. IAM consente di adottare il principio di sicurezza del privilegio minimo, per cui concedi solo l'accesso necessario alle risorse.

IAM ti consente di controllare chi (utenti) dispone di un certo tipo di accesso (ruoli) a determinate risorse attraverso l'impostazione dei criteri IAM. I criteri IAM concedono uno o più ruoli specifici a un utente concedendo a quest'ultimo determinate autorizzazioni.

Questa pagina spiega i ruoli IAM disponibili a livello di organizzazione e come creare e gestire i criteri IAM per le risorse dell'organizzazione utilizzando l'API Resource Manager. Per una descrizione dettagliata di IAM, consulta la documentazione IAM. In particolare, consulta Concedere, modificare e revocare l'accesso.

Autorizzazioni e ruoli

Per controllare l'accesso alle risorse, Google Cloud richiede che gli account che effettuano richieste API abbiano ruoli IAM appropriati. I ruoli IAM includono autorizzazioni che consentono agli utenti di eseguire azioni specifiche sulle risorse Google Cloud. Ad esempio, l'autorizzazione resourcemanager.organizations.get consente a un utente di ottenere i dettagli sulla risorsa dell'organizzazione.

Non concedi direttamente agli utenti le autorizzazioni, ma concedi loro i ruoli, che contengono una o più autorizzazioni al loro interno.

Puoi concedere uno o più ruoli sulla stessa risorsa.

Utilizzo dei ruoli predefiniti

La tabella seguente elenca i ruoli che puoi concedere per accedere alle proprietà di una risorsa dell'organizzazione, la descrizione delle funzioni e le autorizzazioni associate al ruolo.

Ruolo Nome ruolo Descrizione Autorizzazioni
roles/resourcemanager.organizationAdmin Amministratore organizzazione

Accesso per gestire i criteri IAM e visualizzare i criteri dell'organizzazione per organizzazioni, cartelle e progetti.

  • orgpolicy.constraints.list
  • orgpolicy.policies.list
  • orgpolicy.policy.get
  • resourcemanager.folders.get
  • resourcemanager.folders.getIamPolicy
  • resourcemanager.folders.list
  • resourcemanager.folders.setIamPolicy
  • resourcemanager.organizations.*
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list
  • resourcemanager.projects.setIamPolicy
roles/resourcemanager.organizationViewer Visualizzatore organizzazione

Fornisce l'accesso per visualizzare un'organizzazione.

  • resourcemanager.organizations.get
roles/orgpolicy.policyAdmin Amministratore criteri organizzazione

Permette di definire le restrizioni che un'organizzazione vuole applicare alla configurazione delle risorse cloud impostando i criteri dell'organizzazione.

  • orgpolicy.*
roles/browser Browser

Accesso in lettura per sfogliare la gerarchia di un progetto, inclusi cartelle, organizzazione e criterio di autorizzazione. Il ruolo non include l'autorizzazione per la visualizzazione delle risorse di un progetto.

  • resourcemanager.folders.get
  • resourcemanager.folders.list
  • resourcemanager.organizations.get
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list

Creazione di ruoli personalizzati

Oltre ai ruoli predefiniti descritti in questo argomento, puoi anche creare ruoli personalizzati ovvero raccolte di autorizzazioni personalizzate in base alle tue esigenze. Quando crei un ruolo personalizzato da utilizzare con Resource Manager, tieni presente quanto segue:
  • Elenca e ottieni le autorizzazioni, come resourcemanager.projects.get/list, devono sempre essere concesse in coppia.
  • Se il tuo ruolo personalizzato include le autorizzazioni folders.list e folders.get, deve includere anche projects.list e projects.get.
  • Tieni presente che l'autorizzazione setIamPolicy per le risorse dell'organizzazione, delle cartelle e del progetto consente all'utente di concedere tutte le altre autorizzazioni, quindi deve essere assegnata con cautela.

Visualizzazione dell'accesso esistente per una risorsa dell'organizzazione

Per visualizzare i ruoli concessi a un utente per una risorsa dell'organizzazione, recupera il criterio IAM a livello di organizzazione. Puoi visualizzare un criterio di una risorsa dell'organizzazione utilizzando Google Cloud Console, l'interfaccia a riga di comando di Google Cloud o il metodo getIamPolicy().

console

Per visualizzare i ruoli concessi a livello di organizzazione utilizzando la console:

  1. Vai alla pagina Gestisci risorse nella console:

    Apri la pagina Gestisci risorse

  2. Nell'elenco a discesa Organizzazione, seleziona la risorsa della tua organizzazione.

  3. Seleziona la casella di controllo corrispondente alla risorsa dell'organizzazione.

  4. Sul lato destro del riquadro Informazioni, in Autorizzazioni, fai clic per espandere un ruolo e visualizzare tutti i membri che hanno quel ruolo.

gcloud

Recupera il criterio IAM per la risorsa dell'organizzazione utilizzando il comando get-iam-policy:

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

Il comando genera il criterio, che sarà simile al seguente:

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="

Server

Il seguente snippet di codice restituisce il criterio per la risorsa dell'organizzazione https://cloudresourcemanager.googleapis.com/v3/organizations/12345.

Richiesta:

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

Risposta:

{
    "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

Il metodo getIamPolicy() ti consente di ottenere un criterio impostato in precedenza.

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)

Concedere l'accesso a una risorsa dell'organizzazione

Gli amministratori dell'organizzazione possono concedere ruoli IAM ai membri del team, in modo che possano accedere alle risorse e alle API di un'organizzazione. Puoi concedere ruoli a un Account Google, a un gruppo Google, a un account di servizio o a un dominio G Suite. Per concedere i ruoli, puoi utilizzare la console, l'interfaccia a riga di comando gcloud o il metodo setIamPolicy().

console

Per impostare il controllo dell'accesso a livello di organizzazione utilizzando la console:

  1. Vai alla pagina Gestisci risorse nella console:

    Apri la pagina Gestisci risorse

  2. Nell'elenco a discesa Organizzazione, seleziona la risorsa della tua organizzazione.

  3. Seleziona la casella di controllo corrispondente alla risorsa dell'organizzazione. Se non hai una risorsa Cartella, la risorsa organizzazione non sarà visibile. Per continuare, consulta le istruzioni per la concessione di ruoli tramite la pagina IAM.

  4. Se il Riquadro informazioni a destra è nascosto, fai clic su Mostra riquadro informazioni nell'angolo in alto a destra.

  5. Nel riquadro Informazioni, fai clic su Aggiungi membro nella scheda Autorizzazioni.

  6. Nel campo Nuovi membri, inserisci i membri che vuoi aggiungere. Puoi indicare l'indirizzo email di un Account Google, un gruppo Google, un account di servizio o un dominio G Suite.

  7. Nell'elenco a discesa Seleziona un ruolo, seleziona il ruolo che vuoi concedere ai membri del team.

  8. Fai clic su Aggiungi.

gcloud

Per impostare il criterio IAM di una risorsa dell'organizzazione utilizzando il comando gcloud:

  1. Recupera il criterio IAM per la risorsa dell'organizzazione utilizzando il comando get-iam-policy e genera il criterio in un file JSON:

    gcloud alpha organizations get-iam-policy [ORGANIZATION_ID]
    --format json > [FILENAME.JSON]
    
  2. I contenuti del file JSON saranno simili al seguente:

    {
        "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. Utilizzando un editor di testo, apri il file JSON e aggiungi una nuova voce all'array di associazioni che definisce l'amministratore dell'organizzazione. Ad esempio, per impostare anotheradmin@gcp-test.com come amministratore dell'organizzazione, devi modificare l'esempio illustrato sopra come segue:

    {
        "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. Aggiorna il criterio della risorsa dell'organizzazione eseguendo questo comando:

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

Server

Richiesta:

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="
    }
}

Risposta:

{
    "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="
}

Il metodo setIamPolicy() consente di concedere ruoli agli utenti collegando un criterio IAM alla risorsa dell'organizzazione. Il criterio IAM è una raccolta di istruzioni che definisce chi dispone di un determinato accesso.

Read-Modify-Write: un pattern comune per l'aggiornamento dei metadati di una risorsa, ad esempio il criterio, prevede la lettura dello stato corrente, l'aggiornamento locale dei dati e l'invio dei dati modificati per la scrittura. Questo pattern può causare un conflitto se due o più processi indipendenti tentano di seguire la sequenza contemporaneamente. Ad esempio, supponiamo che ci siano due proprietari per un progetto ed entrambi stiano tentando di apportare modifiche in conflitto al criterio contemporaneamente. Le modifiche apportate da uno dei proprietari del progetto potrebbero non riuscire in alcuni casi. IAM risolve questo problema utilizzando una proprietà etag nei criteri IAM. Questa proprietà viene utilizzata per verificare se il criterio è cambiato rispetto all'ultima richiesta. Quando invii una richiesta a IAM con un valore etag, IAM confronta il valore etag nella richiesta con il valore etag esistente associato al criterio. Il criterio viene scritto solo se i valori etag corrispondono.

Quando aggiorni un criterio, devi prima recuperarlo con getIamPolicy(), quindi aggiornarlo e poi scrivere il criterio aggiornato con setIamPolicy(). Utilizza il valore etag quando imposti il criterio solo se il criterio corrispondente in GetPolicyResponse contiene un valore etag.

Python

Il metodo setIamPolicy() consente di collegare un criterio a una risorsa. Il metodo setIamPolicy prevede un elemento SetIamPolicyRequest, che contiene un criterio da impostare e la risorsa a cui il criterio viene associato. Restituisce il criterio risultante. Ti consigliamo di seguire il pattern read-Modify-write quando aggiorni un criterio mediante setIamPolicy().

Ecco un codice di esempio per impostare un criterio per una risorsa dell'organizzazione:

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)

Limitazione della visibilità del progetto per gli utenti

Gli utenti possono vedere tutti i progetti a cui hanno accesso nella console e nelle query di ricerca, indipendentemente dal fatto che si trovino o meno nella risorsa dell'organizzazione attualmente selezionata. Puoi utilizzare Service Policy Service per limitare l'insieme di progetti restituiti nelle query e nella console. Questa funzionalità può essere utilizzata per limitare gli utenti alla visualizzazione dei progetti solo all'interno del tuo dominio.

Il vincolo dell'organizzazione constraints/resourcemanager.accessBoundaries è un vincolo di elenco applicato alla risorsa della tua organizzazione. Il vincolo accetta un elenco di ID risorse dell'organizzazione, che definiscono l'insieme di risorse dell'organizzazione che lo rendono visibile agli utenti in una query o nella console.

I progetti vengono visualizzati in No organization se l'utente non dispone dell'autorizzazione resourcemanager.organizations.get per la risorsa dell'organizzazione principale del progetto. Questo può far sembrare che un progetto che non fa parte della risorsa della tua organizzazione non sia associato a alcuna risorsa dell'organizzazione. Se utilizzi il vincolo resourcemanager.accessBoundaries per non consentire una risorsa dell'organizzazione, i progetti che appartengono a tale risorsa dell'organizzazione non verranno visualizzati affatto nelle query o nella console. I progetti di cui non è stata ancora eseguita la migrazione a una risorsa dell'organizzazione non saranno visibili se questo vincolo viene applicato.

Prima di applicare questo vincolo, consigliamo di eseguire la migrazione dei progetti presenti in No organization alla risorsa dell'organizzazione. Per informazioni sulla migrazione di progetti in una risorsa dell'organizzazione, vedi Spostamento di un progetto.

Per informazioni sull'impostazione di un criterio dell'organizzazione, vedi Utilizzare i vincoli.

Test delle autorizzazioni

Puoi testare le autorizzazioni IAM per un utente per una risorsa dell'organizzazione con il metodo testIamPermissions(). Questo metodo prevede l'URL della risorsa e l'insieme di autorizzazioni che vuoi testare come parametri di input. Inoltre, restituisce il sottoinsieme di queste autorizzazioni a cui l'utente ha accesso.

In genere non richiami testIamPermission() se utilizzi la console direttamente per gestire le autorizzazioni. L'app testIamPermissions() è pensata per l'integrazione con il tuo software proprietario, come un'interfaccia utente grafica personalizzata. Ad esempio, la console utilizza internamente testIamPermissions() per determinare quale interfaccia utente deve essere disponibile per l'utente che ha eseguito l'accesso.

Server

Puoi utilizzare il metodo testIamPermissions() per verificare quale delle autorizzazioni specificate è disponibile per il chiamante per la risorsa in questione. Questo metodo accetta un nome risorsa e una serie di autorizzazioni come parametri e restituisce il sottoinsieme di autorizzazioni di cui il chiamante è in possesso.

Ecco un codice di esempio per verificare le autorizzazioni per una risorsa dell'organizzazione:

Request:

POST https://cloudresourcemanager.googleapis.com/v3/organization/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)