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 |
---|---|
Amministratore organizzazione( Accesso per gestire i criteri IAM e visualizzare i criteri dell'organizzazione per organizzazioni, cartelle e progetti. |
contatti necessari.*
orgpolicy.constraints.list orgpolicy.policies.list orgpolicy.policy.get resourcemanager.folders.get resourcemanager. resourcemanager.folders.list resourcemanager.
resourcemanager.
resourcemanager.projects.get resourcemanager. resourcemanager.projects.list resourcemanager. |
Visualizzatore organizzazione( Fornisce l'accesso per visualizzare un'organizzazione. |
resourcemanager. |
Amministratore criteri organizzazione( 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*.
policysimulator.
policysimulator.
|
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. resourcemanager.projects.get resourcemanager. 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
efolders.get
, devono essere inclusi ancheprojects.list
eprojects.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:
Vai alla pagina Gestisci risorse nella console Google Cloud:
Nell'elenco a discesa Organizzazione, seleziona la risorsa della tua organizzazione.
Seleziona la casella di controllo relativa alla risorsa organizzazione.
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:
Vai alla pagina Gestisci risorse nella console Google Cloud:
Nell'elenco a discesa Organizzazione, seleziona la risorsa della tua organizzazione.
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.
Se il Riquadro informazioni a destra è nascosto, fai clic su Mostra riquadro informazioni nell'angolo in alto a destra.
Nel riquadro Informazioni, fai clic su Aggiungi membro nella scheda Autorizzazioni.
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.
Nell'elenco a discesa Seleziona un ruolo, seleziona il ruolo che vuoi concedere ai membri del team.
Fai clic su Aggiungi.
gcloud
Per impostare il criterio IAM di una risorsa dell'organizzazione utilizzando il comando gcloud
:
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]
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=" }
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=" }
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)