Controllo dell'accesso alle risorse dell'organizzazione con IAM

Google Cloud offre Identity and Access Management (IAM), che consente di concedere un accesso più granulare a risorse Google Cloud specifiche e impedisce l'accesso indesiderato ad altre risorse. IAM ti consente di adottare il principio di sicurezza del privilegio minimo, in modo da concedere 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 concedendo loro determinate autorizzazioni.

Questa pagina illustra i ruoli IAM disponibili a livello di risorsa dell'organizzazione e come creare e gestire i criteri IAM per le risorse dell'organizzazione utilizzando l'API Cloud Resource Manager. Per una descrizione dettagliata di IAM, leggi la documentazione IAM. In particolare, consulta la sezione Concessione, modifica e revoca dell'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 dettagli sulla risorsa dell'organizzazione.

Non concedi direttamente le autorizzazioni agli utenti, ma concedi loro ruoli che hanno una o più autorizzazioni raggruppate 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 della funzione del ruolo e le autorizzazioni incluse in questo ruolo.

Ruolo Autorizzazioni

(roles/resourcemanager.organizationAdmin)

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

Risorse di livello più basso in cui puoi concedere questo ruolo:

  • Progetto

essentialcontacts.*

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

orgpolicy.constraints.list

orgpolicy.policies.list

orgpolicy.policy.get

resourcemanager.folders.get

resourcemanager.folders.getIamPolicy

resourcemanager.folders.list

resourcemanager.folders.setIamPolicy

resourcemanager.organizations.*

  • resourcemanager.organizations.get
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.setIamPolicy

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

resourcemanager.projects.setIamPolicy

(roles/resourcemanager.organizationViewer)

Fornisce l'accesso per visualizzare un'organizzazione.

Risorse di livello più basso in cui puoi concedere questo ruolo:

  • Organizzazione

resourcemanager.organizations.get

(roles/orgpolicy.policyAdmin)

Fornisce l'accesso per definire le restrizioni che un'organizzazione vuole applicare alla configurazione delle risorse cloud impostando i criteri dell'organizzazione.

Risorse di livello più basso in cui puoi concedere questo ruolo:

  • Organizzazione

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)

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

Risorse di livello più basso in cui puoi concedere questo ruolo:

  • 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 creare anche ruoli personalizzati, ovvero raccolte di autorizzazioni che puoi personalizzare in base alle tue esigenze. Quando crei un ruolo personalizzato da utilizzare con Resource Manager, tieni presente quanto segue:
  • Le autorizzazioni di tipo Elenca e ottieni, ad esempio resourcemanager.projects.get/list, devono essere sempre concesse in coppia.
  • Se il 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, della cartella e del progetto consente all'utente di concedere tutte le altre autorizzazioni, pertanto deve essere assegnata con cautela.

Visualizzazione dell'accesso esistente per una risorsa dell'organizzazione

Puoi visualizzare i ruoli a cui vengono concessi i ruoli di un utente per una risorsa dell'organizzazione richiedendo il criterio IAM a livello di risorsa dell'organizzazione. Puoi 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 risorsa dell'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 Organizzazione.

  3. Seleziona la casella di controllo per la risorsa organizzazione.

  4. Nel riquadro Informazioni a destra, in Autorizzazioni, fai clic per espandere un ruolo e visualizzare tutti i membri a cui è assegnato.

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

Lo snippet di codice seguente 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() 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)

Concessione dell'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 dell'organizzazione. Puoi concedere i ruoli a un indirizzo email di un Account Google, a un gruppo Google, a un account di servizio o a un dominio G Suite. Puoi utilizzare la console Google Cloud, gcloud CLI o il metodo setIamPolicy() per concedere i ruoli.

Console

Per impostare controllo dell'accesso a livello di risorsa dell'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 Organizzazione.

  3. Seleziona la casella di controllo per la risorsa organizzazione. Se non disponi di 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 designare 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 ai seguenti:

    {
        "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 organizzazione. Ad esempio, per rendere anotheradmin@gcp-test.com un Amministratore organizzazione, devi modificare l'esempio mostrato 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
    

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 dell'organizzazione. Il criterio IAM è una raccolta di istruzioni che definiscono chi ha un determinato accesso.

Lettura, modifica e scrittura: uno schema comune per l'aggiornamento dei metadati di una risorsa. Ad esempio, il criterio prevede la lettura dello stato attuale, l'aggiornamento dei dati localmente e l'invio dei dati modificati per la scrittura. Questo pattern può causare un conflitto se due o più processi indipendenti tentano di eseguire la sequenza contemporaneamente. Ad esempio, supponiamo che esistano due proprietari di un progetto e che entrambi stiano tentando di apportare modifiche in conflitto al criterio contemporaneamente. 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 effettui una richiesta a IAM con un valore etag, IAM confronta il valore etag nella richiesta con il valore etag esistente associato al criterio. Scrive la norma solo se i valori etag corrispondono.

Quando aggiorni un criterio, ottieni prima il criterio utilizzando getIamPolicy(), poi aggiorna il criterio, quindi scrivi il criterio aggiornato utilizzando 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 utilizza un SetIamPolicyRequest, che contiene un criterio da impostare e la risorsa a cui è associato il criterio. Restituisce il criterio risultante. Ti consigliamo di seguire il pattern lettura-modifica-scrittura quando aggiorni un criterio utilizzando setIamPolicy().

Ecco alcuni codice campione 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 visualizzare 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 dell'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 consentire agli utenti di visualizzare solo i progetti all'interno del tuo dominio.

Il vincolo del criterio dell'organizzazione constraints/resourcemanager.accessBoundaries è un vincolo dell'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 rendono visibili le risorse 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 dell'organizzazione padre del progetto. In questo modo può sembrare che un progetto che non fa parte della risorsa dell'organizzazione non sia associato a una risorsa dell'organizzazione. Se utilizzi il vincolo resourcemanager.accessBoundaries per non consentire una risorsa dell'organizzazione, i progetti che appartengono a quella risorsa dell'organizzazione non verranno visualizzati nelle query o nella console Google Cloud. Qualsiasi progetto di cui non è ancora stata eseguita la migrazione a una risorsa dell'organizzazione non sarà visibile se questo vincolo viene applicato.

Prima di applicare questo vincolo, ti consigliamo di eseguire la migrazione alla risorsa dell'organizzazione di progetti con dimensioni inferiori a No organization. Per informazioni sulla migrazione dei progetti in una risorsa dell'organizzazione, vedi Spostare 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 direttamente la console Google Cloud per gestire le autorizzazioni. testIamPermissions() è pensato per l'integrazione con il tuo software proprietario, ad esempio un'interfaccia utente grafica 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 assegnate al chiamante per la risorsa specificata. Questo metodo prende come parametri un nome risorsa e un insieme di autorizzazioni e restituisce il sottoinsieme di autorizzazioni di cui dispone il chiamante.

Ecco alcuni codice campione per testare 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)