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

Identity and Access Management (IAM) ti consente di fornire un accesso granulare a determinate risorse Cloud de Confiance by S3NS , impedendo al contempo l'accesso indesiderato ad altre risorse. Applicando il principio del privilegio minimo, concedi solo le autorizzazioni necessarie per i tuoi workload.

IAM controlla chi (utenti) ha quale accesso (ruoli) a quali risorse tramite policy di autorizzazione, che associano ruoli specifici agli utenti. Per gestire l'accesso nella gerarchia delle risorse, puoi configurare i ruoli IAM e le policy di autorizzazione a livello di organizzazione utilizzando l'API Cloud Resource Manager. Puoi anche definire policy di negazione per impedire alle entità di utilizzare autorizzazioni specifiche. Per saperne di più, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Autorizzazioni e ruoli

Per controllare l'accesso alle risorse, Cloud de Confiance by S3NS richiede che gli account che effettuano richieste API dispongano dei ruoli IAM appropriati. I ruoli IAM includono autorizzazioni che consentono agli utenti di eseguire azioni specifiche sulle risorseCloud de Confiance . Ad esempio, l'autorizzazione resourcemanager.organizations.get consente a un utente di ottenere dettagli sulla risorsa della propria organizzazione.

Non concedi direttamente le autorizzazioni agli utenti, ma assegni loro dei ruoli, che raggruppano una o più autorizzazioni.

Puoi concedere uno o più ruoli sulla stessa risorsa.

Utilizza i ruoli predefiniti

La tabella seguente elenca i ruoli che puoi concedere per accedere alle proprietà di una risorsa organizzazione, la descrizione di ciò che fa il ruolo e le autorizzazioni raggruppate all'interno di quel ruolo.

Ruolo Autorizzazioni

(roles/resourcemanager.organizationAdmin)

Accesso per gestire le policy IAM e visualizzare le policy 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

iam.policybindings.*

  • iam.policybindings.get
  • iam.policybindings.list

orgpolicy.constraints.list

orgpolicy.policies.list

orgpolicy.policy.get

resourcemanager.capabilities.*

  • resourcemanager.capabilities.get
  • resourcemanager.capabilities.update

resourcemanager.folders.createPolicyBinding

resourcemanager.folders.deletePolicyBinding

resourcemanager.folders.get

resourcemanager.folders.getIamPolicy

resourcemanager.folders.list

resourcemanager.folders.searchPolicyBindings

resourcemanager.folders.setIamPolicy

resourcemanager.folders.updatePolicyBinding

resourcemanager.organizations.*

  • resourcemanager.organizations.createPolicyBinding
  • resourcemanager.organizations.deletePolicyBinding
  • resourcemanager.organizations.get
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.searchPolicyBindings
  • resourcemanager.organizations.setIamPolicy
  • resourcemanager.organizations.updatePolicyBinding

resourcemanager.projects.createPolicyBinding

resourcemanager.projects.deletePolicyBinding

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

resourcemanager.projects.searchPolicyBindings

resourcemanager.projects.setIamPolicy

resourcemanager.projects.updatePolicyBinding

(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 limitazioni che un'organizzazione vuole applicare alla configurazione delle risorse cloud impostando le policy dell'organizzazione.

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

  • Organizzazione

cloudasset.assets.analyzeOrgPolicy

cloudasset.assets.exportResource

cloudasset.assets.listResource

cloudasset.assets.searchAllResources

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

recommender.orgPolicyInsights.*

  • recommender.orgPolicyInsights.get
  • recommender.orgPolicyInsights.list
  • recommender.orgPolicyInsights.update

recommender.orgPolicyRecommendations.*

  • recommender.orgPolicyRecommendations.get
  • recommender.orgPolicyRecommendations.list
  • recommender.orgPolicyRecommendations.update

(roles/browser)

Accesso in lettura per l'esplorazione della gerarchia di un progetto, inclusi cartella, organizzazione e policy 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 anche creare 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 elenco e recupero, ad esempio resourcemanager.projects.get/list, devono essere sempre concesse in coppia.
  • Quando 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 di organizzazione, cartella e progetto consente all'utente di concedere tutte le altre autorizzazioni, pertanto deve essere assegnata con attenzione.

Visualizza l'accesso esistente per una risorsa dell'organizzazione

Puoi visualizzare i ruoli concessi a un utente per una risorsa dell'organizzazione recuperando la policy di autorizzazione della risorsa. Puoi visualizzare la policy di autorizzazione per una risorsa dell'organizzazione utilizzando la console Cloud de Confiance , Google Cloud CLI o il metodo getIamPolicy().

Console

Per visualizzare i ruoli concessi a livello di risorsa dell'organizzazione utilizzando la console Cloud de Confiance :

  1. Vai alla pagina Gestisci risorse nella console Cloud de Confiance :

    Apri la pagina Gestisci risorse

  2. Nel menu a discesa Organizzazione, seleziona la risorsa Organizzazione.

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

  4. Nel riquadro informazioni, in Autorizzazioni, fai clic su Espandi un ruolo e visualizza tutti i membri che lo hanno.

gcloud

Recupera la policy di autorizzazione per la risorsa dell'organizzazione utilizzando il comando get-iam-policy:

gcloud organizations get-iam-policy \
ORGANIZATION_ID --format json > \
FILENAME.JSON

Il comando restituisce la policy di autorizzazione, simile alla 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 la policy di autorizzazione per la risorsa 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.s3ns-system.iam.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
}

Python

Il metodo getIamPolicy() consente di ottenere una policy di autorizzazione impostata 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)

Concedi l'accesso a una risorsa dell'organizzazione

Gli Organization Administrator 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 indirizzo email di un account utente, a un gruppo Google, a un account di servizio o a un dominio G Suite. Puoi utilizzare la console Cloud de Confiance , 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 Cloud de Confiance :

  1. Vai alla pagina Gestisci risorse nella console Cloud de Confiance :

    Apri la pagina Gestisci risorse

  2. Nel menu a discesa Organizzazione, seleziona la risorsa Organizzazione.

  3. Seleziona la casella di controllo per la risorsa organizzazione. Se non hai una risorsa cartella, la risorsa organizzazione non è 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, nella scheda Autorizzazioni, fai clic su Aggiungi membro.

  6. Nel campo Nuovi membri, inserisci i membri del team che vuoi aggiungere. Puoi specificare l'indirizzo email di un account utente, un gruppo Google, un service account o un dominio G Suite.

  7. Nel menu a discesa Seleziona un ruolo, seleziona il ruolo che vuoi concedere ai membri del team.

  8. Fai clic su Aggiungi.

gcloud

Per impostare la policy di autorizzazione di una risorsa dell'organizzazione utilizzando il comando gcloud:

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

    gcloud organizations get-iam-policy \
    ORGANIZATION_ID \
    --format json > FILENAME.JSON
    
  2. I contenuti del file JSON sono 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="
}
  1. Apri il file JSON in un editor di testo. Quindi, aggiungi una nuova voce all'array bindings per definire un Amministratore organizzazione. Ad esempio, per rendere anotheradmin@gcp-test.com un Amministratore organizzazione, modifica l'esempio precedente 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="
}
  1. Aggiorna la policy di autorizzazione della risorsa dell'organizzazione eseguendo questo comando:
gcloud 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.s3ns-system.iam.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.s3ns-system.iam.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKJUiQ="
}

Il metodo setIamPolicy() consente di concedere ruoli agli utenti collegando una policy di autorizzazione alla risorsa dell'organizzazione. La policy di autorizzazione è una raccolta di associazioni che definiscono

Lettura-modifica-scrittura: un pattern comune per l'aggiornamento dei metadati di una risorsa, come la policy di autorizzazione, 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 la sequenza contemporaneamente. Ad esempio, se due Project Owner tentano di apportare contemporaneamente modifiche in conflitto alla policy di autorizzazione, le modifiche di un proprietario potrebbero non riuscire. IAM risolve questo problema utilizzando una proprietà etag nelle policy di autorizzazione. Questa proprietà verifica se la policy di autorizzazione è cambiata dall'ultima richiesta. Quando effettui una richiesta con un valore etag, il sistema confronta il valore etag nella richiesta con il valore etag esistente associato alla policy. Scrive la policy di autorizzazione solo se i valori etag corrispondono.

Quando aggiorni una policy di autorizzazione, recuperala utilizzando getIamPolicy(), aggiornala e poi scrivila utilizzando setIamPolicy(). Quando imposti la policy di autorizzazione, utilizza il valore etag solo se la policy di autorizzazione corrispondente in GetPolicyResponse contiene un valore etag.

Python

Il metodo setIamPolicy() consente di collegare una policy di autorizzazione a una risorsa. Il metodo setIamPolicy accetta un SetIamPolicyRequest, che contiene una policy di autorizzazione da impostare e la risorsa a cui è associata la policy di autorizzazione. Restituisce la policy di autorizzazione risultante. Ti consigliamo di seguire il pattern read-modify-write quando aggiorni una policy di autorizzazione utilizzando setIamPolicy().

Ecco un codice campione per impostare una policy di autorizzazione per una risorsa 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)

Limita la visibilità dei progetti per gli utenti

Gli utenti possono visualizzare tutti i progetti a cui hanno accesso nella console Cloud de Confiance e nelle query di ricerca, indipendentemente dal fatto che si trovino o meno nella risorsa organizzazione selezionata dall'utente. Puoi utilizzare il servizio policy dell'organizzazione per limitare l'insieme di progetti restituiti nelle query e nella console Cloud de Confiance . In questo modo, puoi limitare gli utenti in modo che visualizzino i progetti solo all'interno del tuo dominio.

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

I progetti vengono visualizzati in No organization se l'utente non dispone dell'autorizzazione resourcemanager.organizations.get sulla risorsa dell'organizzazione padre del progetto. In questo modo, un progetto che non fa parte della risorsa Organizzazione potrebbe sembrare non associato a nessuna risorsa Organizzazione. Se utilizzi il vincolo resourcemanager.accessBoundaries per non consentire una risorsa organizzazione, i progetti che appartengono a quella risorsa organizzazione non vengono visualizzati nelle query o nella console Cloud de Confiance . I progetti di cui non è ancora stata eseguita la migrazione a una risorsa dell'organizzazione non sono visibili se applichi questo vincolo.

Ti consigliamo di eseguire la migrazione dei progetti che si trovano in No organization alla tua risorsa organizzazione prima di applicare questo vincolo. Per informazioni sullo spostamento dei progetti in una risorsa organizzazione, consulta Spostamento di un progetto.

Per informazioni sull'impostazione di una policy dell'organizzazione, consulta Utilizzo dei vincoli.

Concedi l'accesso condizionale

Alcuni ruoli IAM, come Organization Policy Administrator (roles/orgpolicy.policyAdmin), possono essere concessi solo su una risorsa dell'organizzazione. A causa dell'ereditarietà delle policy, tutte le risorse dell'organizzazione normalmente ereditano questo ruolo.

Per un maggiore controllo sulle risorse a cui viene concesso il ruolo, puoi utilizzare le condizioni IAM. L'utilizzo dei tag con le condizioni ti consente di concedere l'accesso alle risorse solo se hanno il tag specificato. Ad esempio, la seguente policy di autorizzazione concede il ruolo Amministratore policy dell'organizzazione solo alle risorse con il tag environment: dev e non lo concede ad altre risorse:

{
  "bindings": [
    {
      "members": [
        "{dynamic print variables.examples.principal_group_api}"
      ],
      "role": "roles/orgpolicy.policyAdmin",
      "condition": {
          "title": "Dev_environment_only",
          "description": "Only granted in the development environment",
          "expression":
            "resource.matchTag('123456789012/env', 'dev')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

Test delle autorizzazioni

Puoi testare le autorizzazioni IAM di un utente per una risorsa organizzazione con il metodo testIamPermissions(). Questo metodo prende l'URL della risorsa e l'insieme di autorizzazioni da testare. Restituisce il sottoinsieme di queste autorizzazioni a cui l'utente può accedere.

In genere non richiami testIamPermissions() se utilizzi la consoleCloud de Confiance direttamente per gestire le autorizzazioni. testIamPermissions() è destinato all'integrazione con il tuo software proprietario, ad esempio una Graphic User Interface personalizzata. Ad esempio, la console Cloud de Confiance utilizza testIamPermissions() internamente per determinare quale UI è disponibile per l'utente che ha eseguito l'accesso.

API

Puoi utilizzare il metodo testIamPermissions() per verificare quali delle autorizzazioni specificate sono disponibili per il chiamante per la risorsa specificata. Questo metodo prende un nome della risorsa e un insieme di autorizzazioni come parametri e restituisce il sottoinsieme di autorizzazioni di cui dispone il chiamante.

Di seguito è riportato 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)