Controllo dell'accesso per le risorse dell'organizzazione con IAM

Google Cloud offre Identity and Access Management (IAM), che ti permette di concedere un accesso più granulare a risorse Google Cloud specifiche e impedisce l'accesso indesiderato ad altre risorse. IAM 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 uno o più ruoli specifici a un utente, concedendogli determinate autorizzazioni.

In questa pagina vengono descritti i ruoli IAM disponibili a livello di risorsa dell'organizzazione e il modo in cui 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 pagina 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 dispongano di 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 della sua organizzazione.

Non concedi direttamente gli utenti, ma concedi loro i ruoli, che includono una o più autorizzazioni associate al set.

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 dello scopo del ruolo e le autorizzazioni associate al ruolo.

Ruolo Autorizzazioni

(roles/resourcemanager.organizationAdmin)

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

contatti necessari.*

  • contatti necessari.contatti.crea
  • contatti necessari.contatti.elimina
  • contactcontacts.contacts.get
  • contatti necessari.elenco.
  • contatti necessari.contatti.inviare
  • contatti necessari.contatti.aggiorna

orgpolicy.constraints.list

orgpolicy.policies.list

orgpolicy.policy.get

resourcemanager.folders.get

resourcemanager.folders.getIamPolicy

resourcemanager.folders.list

resourcemanager.folders.setIamPolicy

resourcemanager..*

  • resourcemanager.organizzazioni.get
  • resourcemanager.organizzazioni.getIamPolicy
  • resourcemanager.organizzazioni.setIamPolicy

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

resourcemanager.projects.setIamPolicy

(roles/resourcemanager.organizationViewer)

Fornisce l'accesso per visualizzare un'organizzazione.

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

il criterio dell'organizzazione*.

  • orgpolicy.constraints.list
  • orgpolicy.customConstraints.crea
  • 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

policysimulator.orgPolicyViolations.list

policysimulator.orgPolicyViolationsPreviews.*

  • policysimulator.orgPolicyViolations Previews.crea
  • policysimulator.orgPolicyViolationsPreviews.get
  • policysimulator.orgPolicyViolationspreviews.elenco

(roles/browser)

Accesso in lettura per sfogliare la 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.

resourcemanager.folders.get

resourcemanager.folders.list

resourcemanager.organizzazioni.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 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:
  • L'elenco e le autorizzazioni, come resourcemanager.projects.get/list, devono essere sempre concesse in coppia.
  • Se il tuo ruolo personalizzato include le autorizzazioni folders.list e folders.get, devono essere inclusi 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 attenzione.

Visualizzazione dell'accesso esistente per una risorsa dell'organizzazione

Puoi visualizzare i ruoli a cui viene concesso l'utente a una risorsa dell'organizzazione recuperando 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 della tua organizzazione.

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

  4. A destra, nel riquadro informazioni, in Autorizzazioni, fai clic per espandere un ruolo e visualizzare tutti i membri con quel ruolo.

gcloud

Ottieni il criterio IAM per la risorsa 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() 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 i ruoli IAM ai membri del team in modo che possano accedere alle risorse e alle API di un'organizzazione. Puoi concedere i ruoli all'indirizzo email di 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 Google Cloud, l&#gcloud CLI o il metodo setIamPolicy().

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 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 la concessione dei 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 un indirizzo email per 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. 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 organizzazione. Ad esempio, per rendere anotheradmin@gcp-test.com Amministratore organizzazione, devi modificare l'esempio mostrato sopra:

    {
        "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 ha quale accesso.

Lettura-Modifica-Scrittura: un pattern comune per aggiornare i metadati di una risorsa, ad esempio il criterio è leggere lo stato attuale, aggiornare i dati localmente e inviare i dati modificati per la scrittura. Questo pattern può causare un conflitto se due o più processi indipendenti provano contemporaneamente la sequenza. 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 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 il criterio solo se i valori etag corrispondono.

Quando aggiorni un criterio, devi prima recuperarlo utilizzando getIamPolicy(), aggiornare il criterio, quindi scrivere 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 è collegato il criterio. che restituisce la norma risultante. Consigliamo di seguire il pattern read-Modified-Write quando aggiorni un criterio utilizzando setIamPolicy().

Ecco un 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 nelle risorse dell'organizzazione attualmente selezionate. 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 la visualizzazione degli utenti solo ai progetti all'interno del tuo dominio.

Il vincolo del criterio 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 rendono le risorse 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 dell'organizzazione padre del progetto. Questo può sembrare che un progetto che non fa parte delle tue risorse 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 a quella risorsa dell'organizzazione non verranno visualizzati nelle query o nella console di Google Cloud. Qualsiasi progetto di cui non è stata ancora eseguita la migrazione in una risorsa dell'organizzazione non sarà visibile se viene applicato questo vincolo.

Ti consigliamo di eseguire la migrazione dei progetti che dipendono da No organization alla risorsa della tua organizzazione prima di applicare questo vincolo. Per informazioni sulla migrazione dei progetti in una risorsa dell'organizzazione, vedi Spostamento di un progetto.

Per informazioni sull'impostazione di un criterio dell'organizzazione, vedi 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 utilizza 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 un'interfaccia utente grafica personalizzata. Ad esempio, la console Google Cloud utilizza testIamPermissions() internamente 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 specificate è disponibile per il chiamante per la risorsa specificata. Questo metodo utilizza un nome risorsa e un insieme di autorizzazioni come parametri e restituisce il sottoinsieme di autorizzazioni di cui il chiamante dispone.

Ecco un 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)