Utilizza criteri dell'organizzazione personalizzati

I criteri dell'organizzazione di Google Cloud offrono un sistema centralizzato e programmatico un controllo completo sulle risorse dell'organizzazione. Come amministratore dei criteri dell'organizzazione, puoi definire un criterio dell'organizzazione, un insieme di restrizioni denominate vincoli che si applicano le risorse Google Cloud e i discendenti di queste risorse nel Gerarchia delle risorse di Google Cloud. Puoi applicare i criteri dell'organizzazione all'indirizzo a livello di organizzazione, cartella o progetto.

I criteri dell'organizzazione forniscono vincoli predefiniti per vari servizi Google Cloud. Tuttavia, se vuoi un controllo più granulare e personalizzabile sui campi specifici limitati nelle norme dell'organizzazione, puoi anche creare norme dell'organizzazione personalizzate.

Vantaggi

Puoi utilizzare criteri dell'organizzazione personalizzati che fanno riferimento a IAM per controllare in che modo i criteri di autorizzazione possono essere modificati. In particolare, puoi controllare:

  • A chi è possibile concedere ruoli
  • A chi è possibile revocare i ruoli
  • Quali ruoli possono essere concessi
  • Quali ruoli possono essere revocati

Ad esempio, puoi impedire che i ruoli che contengono la parola admin concesso alle entità i cui indirizzi email terminano con @gmail.com.

Ereditarietà dei criteri

Per impostazione predefinita, i criteri dell'organizzazione vengono ereditati dai discendenti delle risorse su cui applichi il criterio. Ad esempio, se applichi un criterio su una cartella, Google Cloud applica i criteri a tutti i progetti . Per scoprire di più su questo comportamento e su come modificarlo, consulta Regole di valutazione della gerarchia.

Prezzi

Il servizio Criteri dell'organizzazione, inclusi i criteri predefiniti e personalizzati, è offerto senza costi aggiuntivi.

Limitazioni

Criteri dell'organizzazione personalizzati in modalità dry run che fanno riferimento Gli attributi IAM hanno alcune limitazioni. ovvero gli audit log violazioni che riguardano il metodo setiamPolicy potrebbero mancare i seguenti elementi campi:

  • resourceName
  • serviceName
  • methodName

Prima di iniziare

  • Assicurati di conoscere la tua organizzazione ID.
  • Se vuoi testare i criteri dell'organizzazione personalizzati che fanno riferimento risorse IAM, creare un nuovo progetto. Test i criteri dell'organizzazione di un progetto esistente potrebbero interrompere la sicurezza per i flussi di lavoro.

    1. In the Google Cloud console, go to the project selector page.

      Go to project selector

    2. Select or create a Google Cloud project.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per gestire i criteri dell'organizzazione, chiedi all'amministratore di concederti seguenti ruoli IAM:

Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.

Questi ruoli predefiniti le autorizzazioni necessarie per gestire i criteri dell'organizzazione. Per vedere le autorizzazioni esatte obbligatorie, espandi la sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

Per gestire i criteri dell'organizzazione sono necessarie le seguenti autorizzazioni:

  • orgpolicy.constraints.list
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set
  • resourcemanager.projects.setIamPolicy

Potresti anche riuscire a ottenere queste autorizzazioni con ruoli personalizzati e altri ruoli predefiniti.

Crea un vincolo personalizzato

Un vincolo personalizzato viene definito in un file YAML dalle risorse, dai metodi le condizioni e le azioni supportate dal servizio per applicare il criterio dell'organizzazione. Le condizioni per i vincoli personalizzati definiti utilizzando CEL (Common Expression Language). Per ulteriori informazioni su come creare condizioni nei vincoli personalizzati utilizzando CEL, consulta la sezione Creazione e gestione di vincoli personalizzati.

Per creare un file YAML per un vincolo personalizzato:

name: organizations/ORG_ID/customConstraints/CONSTRAINT_NAME
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  METHOD_TYPE
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION

Sostituisci quanto segue:

  • ORG_ID: l'ID organizzazione, ad esempio 123456789.

  • CONSTRAINT_NAME: il nome che vuoi per la tua nuova personalizzazione di blocco. Un vincolo personalizzato deve iniziare con custom. e può solo includere lettere maiuscole, lettere minuscole o numeri, ad esempio custom.denyProjectIAMAdmin. La lunghezza massima di questo campo è di 70 caratteri, senza contare il prefisso, ad esempioorganizations/123456789/customConstraints/custom.

  • METHOD_TYPE: il tipo di azione a cui vuoi applicare vincolo a cui applicare. Se vuoi che il vincolo venga applicato quando qualcuno tenta di concedere un ruolo a un'entità, utilizza i seguenti valori:

    - CREATE
    - UPDATE
    

    Se vuoi che il vincolo venga applicato quando qualcuno tenta di revocare utilizza il seguente valore:

    - REMOVE_GRANT
    
  • CONDITION: una condizione CEL scritta rispetto a una rappresentazione di una risorsa di servizio supportata. Questo campo ha un valore la lunghezza massima di 1000 caratteri. Vedi i contenuti supportati attributi per ulteriori informazioni sugli attributi disponibili per la scrittura delle condizioni. Ad esempio: resource.bindings.exists(binding, RoleNameMatches(role, ['roles/resourcemanager.projectIamAdmin'])).

  • ACTION: l'azione da eseguire se condition è sono soddisfatte determinate condizioni. Può essere ALLOW o DENY.

  • DISPLAY_NAME: un nome semplice per di blocco. Questo campo ha una lunghezza massima di 200 caratteri.

  • DESCRIPTION: facoltativo. Una descrizione semplice per il vincolo venga visualizzato come messaggio di errore quando il criterio viene violato. Questo campo ha una lunghezza massima di 2000 caratteri.

Per saperne di più su come creare un vincolo personalizzato, consulta Definizione di vincoli personalizzati.

Configurare un vincolo personalizzato

Dopo aver creato un nuovo vincolo personalizzato utilizzando Google Cloud CLI, devi configurarlo per disponibile per i criteri dell'organizzazione nella tua organizzazione. Per configurare un vincolo personalizzato, utilizza il comando gcloud org-policies set-custom-constraint:
gcloud org-policies set-custom-constraint CONSTRAINT_PATH
Sostituisci CONSTRAINT_PATH con il percorso completo del tuo personalizzato. Ad esempio: /home/user/customconstraint.yaml. Al termine, troverai i vincoli personalizzati come criteri dell'organizzazione disponibili nel tuo elenco di criteri dell'organizzazione di Google Cloud. Per verificare che la limitazione personalizzata esista, utilizza il comando gcloud org-policies list-custom-constraints:
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
Sostituisci ORGANIZATION_ID con l'ID della risorsa dell'organizzazione. Per ulteriori informazioni, consulta Visualizzare i criteri dell'organizzazione.

Applica un criterio dell'organizzazione personalizzato

Puoi applicare un vincolo booleano creando un criterio dell'organizzazione che vi faccia riferimento. e applicando il criterio dell'organizzazione a una risorsa Google Cloud.

Console

Per applicare un vincolo booleano:

  1. Nella console Google Cloud, vai alla pagina Criteri dell'organizzazione.

    Vai a Criteri dell'organizzazione

  2. Seleziona il selettore di progetti nella parte superiore della pagina.
  3. Dal selettore di progetti, scegli il progetto per il quale vuoi impostare criterio dell'organizzazione.
  4. Seleziona il vincolo dall'elenco nella pagina Criteri dell'organizzazione. Dovrebbe essere visualizzata la pagina Dettagli criterio per il vincolo in questione.
  5. Per configurare il criterio dell'organizzazione per questa risorsa, fai clic su Gestisci criterio.
  6. Nella pagina Modifica criterio, seleziona Sostituisci criterio della risorsa padre.
  7. Fai clic su Aggiungi una regola.
  8. In Applicazione, scegli se applicare questo criterio dell'organizzazione deve essere attivato o disattivato.
  9. Se vuoi, per applicare le condizioni del criterio dell'organizzazione a un tag, fai clic su Aggiungi condizione. Tieni presente che se aggiungi una regola condizionale a un'organizzazione devi aggiungere almeno una regola incondizionata. In caso contrario, la norma non potrà essere salvata. Per maggiori dettagli, consulta Impostazione di un criterio dell'organizzazione con tag.
  10. Se si tratta di un vincolo personalizzato, puoi fare clic su Testa modifiche per simulare l'effetto di questo criterio dell'organizzazione. Per ulteriori informazioni, consulta Testare le modifiche ai criteri dell'organizzazione con Policy Simulator.
  11. Per completare e applicare il criterio dell'organizzazione, fai clic su Imposta criterio. Le norme potrebbero essere necessari fino a 15 minuti.

gcloud

Per creare un criterio dell'organizzazione che applichi un vincolo booleano, crea un file YAML del criterio che faccia riferimento al vincolo:

      name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
    

Sostituisci quanto segue:

  • PROJECT_ID: il progetto su cui vuoi applicare in modo forzato i tuoi di blocco.
  • CONSTRAINT_NAME: il nome definito per il vincolo personalizzato. Per ad esempio custom.denyProjectIAMAdmin.

Per applicare il criterio dell'organizzazione contenente il vincolo, esegui questo comando:

    gcloud org-policies set-policy POLICY_PATH
    

Sostituisci POLICY_PATH con il percorso completo del criterio dell'organizzazione YAML. L'applicazione del criterio richiederà fino a 15 minuti.

Testa il criterio dell'organizzazione personalizzato

Se vuoi, puoi testare il criterio dell'organizzazione impostandolo e poi di eseguire un'azione che il criterio dovrebbe impedire.

Questa sezione descrive come testare il seguente vincolo del criterio dell'organizzazione:

name: organizations/ORG_ID/customConstraints/custom.denyProjectIAMAdmin
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    RoleNameMatches(binding.role, ['roles/resourcemanager.projectIamAdmin']) &&
    binding.members.exists(member,
      MemberSubjectMatches(member, ['user:EMAIL_ADDRESS'])
    )
  )"
actionType: DENY
displayName: Do not allow EMAIL_ADDRESS to be granted the Project IAM Admin role.

Se vuoi testare questo vincolo personalizzato:

  • Copia il vincolo in un file YAML e sostituisci i seguenti valori:

    • ORG_ID: l'ID numerico del tuo dell'organizzazione Google Cloud.
    • MEMBER_EMAIL_ADDRESS: l'indirizzo email del principale che vuoi utilizzare per testare il vincolo personalizzato. Mentre il vincolo è attivo, a questa entità non sarà possibile concedere il ruolo Amministratore IAM progetto (roles/resourcemanager.projectIamAdmin) nel progetto per cui viene applicato il vincolo.
  • Configura il vincolo personalizzato applicarla per il progetto che hai creato per testare il vincolo del criterio dell'organizzazione personalizzato.

  • Prova a concedere il ruolo Amministratore IAM progetto (roles/resourcemanager.projectIamAdmin) all'entità di cui l'indirizzo email incluso nel vincolo personalizzato. Prima di eseguire il comando, sostituisci i seguenti valori:

    • PROJECT_ID: l'ID di Google Cloud progetto in cui hai applicato il vincolo
    • EMAIL_ADDRESS: l'indirizzo email dell'entità specificato al momento della creazione del vincolo del criterio dell'organizzazione.
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL_ADDRESS --role=roles/resourcemanager.projectIamAdmin

L'output è il seguente:

Operation denied by custom org policies: ["customConstraints/custom.denyProjectIAMAdmin": "EMAIL_ADDRESS can't be granted the Project IAM Admin role."]

Attributi supportati da Identity and Access Management

IAM supporta l'attributo resources.bindings. Questo attributo che viene restituito per tutti i metodi che modificano il criterio di autorizzazione di una risorsa. Tutte queste risposte terminano con setIamPolicy.

L'attributo resource.bindings ha la seguente struttura, in cui BINDINGS è un array di associazioni di ruoli che sono state modificate durante una modifica a un criterio di autorizzazione:

{
  "bindings": {
    BINDINGS
  }
}

Ogni associazione in resource.bindings ha la seguente struttura, in cui ROLE è il nome del ruolo nell'associazione del ruolo e MEMBERS è un elenco di identificatori per le entità che sono stati aggiunti o rimossi dall'associazione dei ruoli:

{
  "role": "ROLE"
  "members": {
    MEMBERS
  }
}

Per conoscere i formati che possono avere gli identificatori principali, consulta Identificatori principali.

Puoi valutare l'attributo resource.bindings e i suoi campi solo utilizzando il metodo funzioni supportate. Altri operatori e come ==, !=, in, contains, startsWith e endsWith: non sono supportati.

Funzioni supportate

Puoi utilizzare le seguenti funzioni CEL per valutare i campi role e members delle risorse binding. Quando utilizzi queste funzioni, puoi anche utilizzare operatori logici && (and) e || (or) per scrivere condizioni multiparte.

Funzione Descrizione
RoleNameMatches(
  role,
  roleNames: list
)
  bool

Restituisce true se il ruolo role corrisponde completamente ad almeno uno dei ruoli elencati in roleNames.

Parametri
role: il ruolo da valutare.
roleNames: un elenco di nomi di ruolo con cui trovare una corrispondenza.
Esempio

Restituisce true se il valore role nel valore binding è roles/storage.admin o roles/compute.admin:

RoleNameMatches(binding.role, ['roles/storage.admin', 'roles/compute.admin'])
RoleNameStartsWith(
  role,
  rolePrefixes: list
)
  bool

Restituisce true se il ruolo role inizia con almeno una delle stringhe elencate in rolePrefixes.

Parametri
role: il ruolo da valutare.
rolePrefixes: un elenco di stringhe che corrispondono all'inizio di il ruolo.
Esempio

Restituisce true se il role nel il valore binding specificato inizia con roles/storage:

RoleNameStartsWith(binding.role, ['roles/storage'])
RoleNameEndsWith(
  role,
  roleSuffixes: list
)
  bool

Restituisce true se il ruolo role termina con almeno una delle stringhe elencate in roleSuffixes.

Parametri
role: il ruolo da valutare.
roleSuffixes: un elenco di stringhe che corrispondono alla fine del a cui assegnare il ruolo.
Esempio

Restituisce true se il role nel binding specificato termina con .admin:

RoleNameEndsWith(binding.role, ['.admin'])
RoleNameContains(
  role,
  roleSubstrings: list
)
  bool

Restituisce true se il ruolo role contiene almeno una delle stringhe elencate in roleSubstrings.

Parametri
role: il ruolo da valutare.
roleSubstrings: un elenco di stringhe per la corrispondenza con qualsiasi parte di a cui assegnare il ruolo.
Esempio

Restituisce true se il role nel il valore binding specificato contiene la stringa admin:

RoleNameContains(binding.role, ['admin'])
MemberSubjectMatches(
  member,
  memberNames: list
)
  bool

Restituisce true se il membro member è completamente corrisponde ad almeno uno dei membri elencati in memberNames.

Se l'identificatore di member è un indirizzo email, questo funzione valuta solo quell'indirizzo email, non valuta qualsiasi alias per quell'indirizzo email.

Parametri
member: il membro da valutare.
memberNames: un elenco di nomi di membri con cui stabilire una corrispondenza.
Esempio

Restituisce true se il membro member è rosario@example.com:

MemberSubjectMatches(member, ['user:rosario@example.com'])
MemberSubjectEndsWith(
  member,
  memberSuffixes: list
)
  bool

Restituisce true se l'elemento member termina con almeno una delle stringhe elencate in memberSuffixes.

Se l'identificatore di member è un indirizzo email, questo funzione valuta solo quell'indirizzo email, non valuta qualsiasi alias per quell'indirizzo email.

Parametri
member: il membro da valutare.
memberSuffixes: un elenco di stringhe da abbinare alla fine il nome del membro.
Esempio

Restituisce true se il membro member termina con @example.com:

MemberSubjectEndsWith(member, ['@example.com'])

Esempi di criteri dell'organizzazione personalizzati per i casi d'uso comuni

La tabella seguente fornisce la sintassi di alcuni criteri dell'organizzazione personalizzati che potresti trovare utili.

Nei seguenti esempi vengono utilizzate le macro CEL all e exists. Per ulteriori informazioni informazioni su queste macro, consulta Macro.

Descrizione Sintassi del vincolo
Bloccare la possibilità di concedere un ruolo specifico.
name: organizations/ORG_ID/customConstraints/custom.denyRole
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
"resource.bindings.exists(
    binding,
    RoleNameMatches(binding.role, ['ROLE'])
  )"
actionType: DENY
displayName: Do not allow the ROLE role to be granted
Consenti solo la concessione di ruoli specifici.
name: organizations/ORG_ID/customConstraints/custom.specificRolesOnly
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    RoleNameMatches(binding.role, ['ROLE_1', 'ROLE_2'])
  )"
actionType: ALLOW
displayName: Only allow the ROLE_1 role and ROLE_2 role to be granted
Impedisci che i ruoli che iniziano con roles/storage. concesso.
name: organizations/ORG_ID/customConstraints/custom.dontgrantStorageRoles
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    RoleNameStartsWith(binding.role, ['roles/storage.'])
  )"
actionType: DENY
displayName: Prevent roles that start with "roles/storage." from being granted
Impedisci l'esecuzione di qualsiasi ruolo il cui nome contiene admin revocata.
name: organizations/ORG_ID/customConstraints/custom.dontRevokeAdminRoles
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - REMOVE_GRANT
condition:
  "resource.bindings.exists(
    binding,
    RoleNameContains(binding.role, ['admin'])
  )"
actionType: DENY
displayName: Prevent roles with "admin" in their names from being revoked
Consenti di assegnare ruoli solo a entità specifiche.
name: organizations/ORG_ID/customConstraints/custom.allowSpecificPrincipals
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    binding.members.all(member,
      MemberSubjectMatches(member, ['user:USER','serviceAccount:SERVICE_ACCOUNT'])
    )
  )"
actionType: ALLOW
displayName: Only allow roles to be granted to USER and SERVICE_ACCOUNT
Impedisci che i ruoli vengano revocati da entità specifiche.
name: organizations/ORG_ID/customConstraints/custom.denyRemovalOfSpecificPrincipals
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - REMOVE_GRANT
condition:
  "resource.bindings.exists(
    binding,
    binding.members.exists(member,
      MemberSubjectMatches(member, ['user:USER_1','user:USER_2'])
    )
  )"
actionType: DENY
displayName: Do not allow roles to be revoked from USER_1 or USER_2
Impedisci le entità con indirizzi email che terminano con @gmail.com dalla concessione dei ruoli.
name: organizations/ORG_ID/customConstraints/custom.dontGrantToGmail
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    binding.members.exists(member,
      MemberSubjectEndsWith(member, ['@gmail.com'])
    )
  )"
actionType: DENY
displayName: Do not allow members whose email addresses end with "@gmail.com" to be granted roles
Consenti solo la concessione di ruoli specifici e solo a entità specifiche.
name: organizations/ORG_ID/customConstraints/custom.allowSpecificRolesAndPrincipals
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    RoleNameMatches(binding.role, ['ROLE_1', 'ROLE_2'])  &&
    binding.members.all(member,
      MemberSubjectMatches(member, ['serviceAccount:SERVICE_ACCOUNT', 'group:GROUP'])
    )
  )"
actionType: ALLOW
displayName: Only allow ROLE_1 and ROLE_2 to be granted to SERVICE_ACCOUNT and GROUP
Impedisci che vengano concessi ruoli Cloud Storage a allUsers e allAuthenticatedUsers.
name: organizations/ORG_ID/customConstraints/custom.denyStorageRolesForPrincipalAllUsers
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    RoleNameStartsWith(binding.role, ['roles/storage.']) &&
    binding.members.exists(member,
      MemberSubjectMatches(member, ['allUsers', 'allAuthenticatedUsers'])
    )
  )"
actionType: DENY
displayName: Do not allow storage roles to be granted to allUsers or allAuthenticatedUsers

Passaggi successivi