Controllo dell'accesso per le organizzazioni con IAM

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Google Cloud offre Identity and Access Management (IAM), che ti permette di accedere in modo 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, quindi concedi solo l'accesso necessario alle tue 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 ruoli specifici a un utente concedendogli 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, leggi la documentazione di IAM. In particolare, consulta la sezione 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 dispongano di ruoli IAM appropriati. I ruoli IAM includono le 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 dettagli sulla risorsa della sua organizzazione.

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

Puoi concedere uno o più ruoli sulla stessa risorsa.

Utilizzo di ruoli predefiniti

La tabella seguente elenca i ruoli che puoi concedere per accedere alle proprietà di una risorsa dell'organizzazione, la descrizione del ruolo e le autorizzazioni raggruppate in quel ruolo.

Ruolo Autorizzazioni

(roles/resourcemanager.organizationAdmin)

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

Contiene tre autorizzazioni di proprietario

orgpolicy.constraints.list

orgpolicy.policies.list

orgpolicy.policy.get

resourcemanager.folders.get

resourcemanager.folders.getIamPolicy

resourcemanager.folders.list

resourcemanager.cartelle.setIamPolicy

resourcemanager.organizz.*

  • resourcemanager. per le organizzazioni.per
  • resourcemanager.organizzazioni.getIamPolicy
  • resourcemanager.organizz.setIamPolicy

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

resourcemanager.projects.setIamPolicy

(roles/resourcemanager.organizationViewer)

Fornisce l'accesso per visualizzare un'organizzazione.

resourcemanager. per le organizzazioni.per

(roles/orgpolicy.policyAdmin)

Consente di definire quali limitazioni un'organizzazione vuole applicare sulla configurazione delle risorse cloud impostando i criteri dell'organizzazione.

orgpolicy.*

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

(roles/browser)

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

resourcemanager.folders.get

resourcemanager.folders.list

resourcemanager. per le organizzazioni.per

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

Creazione di ruoli personalizzati

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

Visualizzazione dell'accesso esistente per una risorsa dell'organizzazione

Puoi visualizzare i ruoli assegnati a un utente per una risorsa dell'organizzazione recuperando il criterio IAM a livello di organizzazione. È possibile visualizzare un criterio di una risorsa dell'organizzazione utilizzando la console Google Cloud, Google Cloud CLI o il metodo getIamPolicy().

Console

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

  1. Vai alla pagina Gestisci risorse nella console Google Cloud:

    Apri la pagina Gestisci risorse

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

  3. Seleziona la casella di controllo relativa alla risorsa organizzazione.

  4. Sul riquadro informazioni a destra, 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 restituisce 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="

API

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 assegnare ruoli IAM ai membri dei team in modo che possano accedere alle risorse e alle API di un'organizzazione. Puoi concedere i ruoli a un Account Google, indirizzo email, gruppo Google, account di servizio o dominio G Suite. Per concedere i ruoli, puoi utilizzare Google Cloud 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 Google Cloud:

  1. Vai alla pagina Gestisci risorse nella console Google Cloud:

    Apri la pagina Gestisci risorse

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

  3. Seleziona la casella di controllo relativa alla risorsa organizzazione. Se non hai una risorsa Cartella, la risorsa Organizzazione non sarà visibile. Per continuare, consulta le istruzioni per concedere i 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 del team 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 Add (Aggiungi).

gcloud

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

  1. Ottieni 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 rendere anotheradmin@gcp-test.com un amministratore dell'organizzazione, devi modificare l'esempio riportato sopra nel seguente modo:

    {
        "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 il comando seguente:

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

API

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 organizzazione. Il criterio IAM è una raccolta di istruzioni che definisce chi dispone di un determinato accesso.

Lettura-Modifica-Scrittura: un pattern comune per l'aggiornamento dei metadati di una risorsa, ad esempio il criterio è la lettura dello stato attuale, l'aggiornamento locale dei dati e l'invio dei dati modificati per scrittura. Questo pattern può causare un conflitto se due o più processi indipendenti tentano di eseguire la sequenza contemporaneamente. Ad esempio, supponiamo che ci siano due proprietari per un progetto e che entrambi stiano tentando di apportare modifiche contemporaneamente al criterio. In alcuni casi, le modifiche apportate da uno dei proprietari del progetto potrebbero non riuscire. IAM risolve questo problema utilizzando una proprietà etag nei criteri IAM. Questa proprietà viene utilizzata per verificare se il criterio è stato modificato dall'ultima richiesta. Quando invii una richiesta a IAM con un valore etag, IAM confronta il valore etag nella richiesta con quello esistente associato al criterio. Scrivi il criterio solo se i valori etag corrispondono.

Quando aggiorni un criterio, prima recuperalo utilizzando getIamPolicy(), aggiornalo e poi scrivi il criterio aggiornato utilizzando setIamPolicy(). Usa 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 utilizza un SetIamPolicyRequest, che contiene un criterio da impostare e la risorsa a cui il criterio è associato. Restituisce il criterio risultante. Ti consigliamo di seguire il pattern read-modify-write quando aggiorni un criterio mediante setIamPolicy().

Ecco alcuni esempi di codice 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à dei progetti per gli utenti

Gli utenti possono vedere tutti i progetti a cui hanno accesso nella console Google Cloud e nelle query di ricerca, indipendentemente dal fatto che si trovino o meno nella risorsa organizzazione attualmente selezionata dall'utente. Puoi utilizzare il servizio Criteri dell'organizzazione per limitare l'insieme di progetti restituiti nelle query e nella console Google Cloud. Può essere utilizzato per limitare gli utenti in modo che visualizzino solo i progetti nel tuo dominio.

Il vincolo del criterio dell'organizzazione constraints/resourcemanager.accessBoundaries è un vincolo di elenco applicato alla risorsa dell'organizzazione. Il vincolo accetta un elenco di ID risorsa dell'organizzazione, che definiscono l'insieme di risorse dell'organizzazione che le rendono visibili agli utenti in una query o nella console Google Cloud.

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

Ti consigliamo di eseguire la migrazione dei progetti di dimensioni inferiori a No organization nella risorsa dell'organizzazione prima di applicare questo vincolo. Per informazioni sulla migrazione dei progetti in una risorsa dell'organizzazione, consulta Spostamento di un progetto.

Per informazioni sull'impostazione di un criterio dell'organizzazione, consulta Utilizzo dei vincoli.

Test delle autorizzazioni

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

In genere, non richiami testIamPermission() se utilizzi la console Google Cloud direttamente per gestire le autorizzazioni. testIamPermissions() è progettato per l'integrazione con il tuo software proprietario come una Graphic User Interface personalizzata. Ad esempio, la console Google Cloud utilizza internamente testIamPermissions() per determinare quale UI deve essere disponibile per l'utente che ha eseguito l'accesso.

API

Puoi utilizzare il metodo testIamPermissions() per verificare quale delle autorizzazioni indicate dispone del chiamante per la risorsa in questione. Questo metodo accetta un nome risorsa e un insieme di autorizzazioni come parametri e restituisce il sottoinsieme di autorizzazioni di cui dispone il chiamante.

Ecco alcuni esempi di codice per verificare le autorizzazioni per una risorsa dell'organizzazione:

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)