Configura le policy dell'organizzazione

Le policy dell'organizzazione offrono un controllo centralizzato e programmatico sulle risorse della tua organizzazione. In qualità di amministratore delle policy dell'organizzazione, puoi configurare le policy nell'intera organizzazione per ottenere i seguenti vantaggi:

  • Centralizza il controllo per configurare le limitazioni sull'utilizzo delle risorse della tua organizzazione.
  • Definisci e stabilisci sistemi di protezione per i tuoi team di sviluppo per rimanere entro i limiti di conformità.
  • Aiuta i Project Owner e i loro team a muoversi rapidamente senza violare la conformità.

Google Distributed Cloud (GDC) con air gap non fornisce una UI della console o una CLI dedicata per creare e gestire le policy dell'organizzazione. Devi utilizzare l'API Kubernetes o l'interfaccia a riga di comando kubectl.

Differenze rispetto a Identity and Access Management

Identity and Access Management (IAM) e le policy dell'organizzazione svolgono funzioni di accesso e governance complementari:

  • IAM si concentra sulla concessione delle autorizzazioni. Definisce chi (membri come utenti, gruppi o service account) può eseguire quali azioni (ruoli) su quali risorse (ambito delle risorse). Le autorizzazioni concesse tramite i ruoli IAM sono additive e non hanno regole di negazione.
  • Le policy dell'organizzazione si concentrano sulla definizione di misure di protezione. Consentono agli amministratori di configurare limitazioni programmatiche sulle risorse nell'intera organizzazione, ad esempio disattivando servizi specifici o limitando le modifiche alle risorse in base agli attributi del soggetto utilizzando controllo dell'accesso basato sugli attributi (ABAC). Le policy dell'organizzazione hanno la precedenza per bloccare le operazioni anche se un membro ha un ruolo IAM.

Prima di iniziare

Prima di configurare le policy dell'organizzazione, devi richiedere le autorizzazioni necessarie e preparare l'ambiente.

Richiedi ruoli IAM

Contatta l'amministratore dell'organizzazione IAM per richiedere i seguenti ruoli IAM in base alle attività che devi eseguire:

  • Amministratore delle policy dei servizi limitati (gdchrestrictedservice-policy-admin): crea, aggiorna ed elimina le policy dei servizi limitati.
  • Restrict By Attributes Policy Admin (gdchrestrictbyattributes-policy-admin): crea, aggiorna ed elimina le policy di controllo dell'accesso basato sugli attributi.

prepara l'ambiente

Configurazione di un criterio

In GDC puoi configurare due tipi di policy dell'organizzazione:

  • Policy dei servizi con limitazioni (GDCHRestrictedService): limita i servizi che puoi utilizzare o modificare in un cluster.
  • Policy di controllo dell'accesso basato su attributi (GDCHRestrictByAttributes): limita in modo condizionale l'accesso alle risorse di un cluster in base agli attributi del soggetto mappati dal tuo provider di identità.

Configura una policy dei servizi limitati

Il tipo di policy GDCHRestrictedService consente di limitare i servizi che puoi utilizzare o modificare in un cluster bloccando API specifiche, ad esempio limitando un servizio a determinati progetti o bloccando l'accesso a un nuovo servizio durante i test. Crea questa policy nello stesso cluster delle risorse del servizio. Puoi creare più istanze di policy in un cluster per servizi o progetti diversi.

GDCHRestrictedService supporta le operazioni CREATE, UPDATE e DELETE. Per limitare le operazioni di lettura di GET e LIST, utilizza le associazioni dei ruoli IAM per concedere e revocare l'accesso.

Configura una policy dei servizi limitati:

  1. Definisci il manifest della policy:

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: GDCHRestrictedService
    metadata:
      name: POLICY_NAME
    spec:
      match:
        kinds:
          - apiGroups:
              - "API_GROUP"
            kinds:
              - "KIND"
      parameters:
        disabledOperations:
          - DISABLED_OPERATION
    

    Sostituisci quanto segue:

    • POLICY_NAME: il nome della policy dell'organizzazione.

    • API_GROUP: il gruppo API del servizio da limitare, come elencato nella tabella dei servizi supportati di seguito.

    • KIND: il tipo di risorsa da limitare, come elencato nella tabella dei servizi supportati di seguito.

    • DISABLED_OPERATION: i gruppi di operazioni bloccati da questa policy. I valori consentiti sono CREATE, UPDATE e DELETE. Il valore predefinito per il campo disabledOperations è *. Per disattivare completamente un servizio, elenca CREATE, UPDATE e DELETE (e specifica tutti i relativi tipi).

    Per impostazione predefinita, la policy viene applicata a tutti i namespace del cluster. Per applicare la policy a spazi dei nomi o progetti specifici, consulta Definisci l'ambito di una policy dell'organizzazione all'interno di un cluster.

    La policy GDCHRestrictedService supporta il seguente sottoinsieme di servizi su GDC:

    Servizio Gruppo API kinds
    Marketplace marketplace.gdc.goog MarketplaceService
    Vertex AI Workbench aiplatform.gdc.goog Notebook
    Servizio di database - Postgres postgresql.dbadmin.gdc.goog
    • DBCluster
    • BackupPlan
    • Import
    • Restore
    Transfer Appliance system.gpc.gke.io TransferApplianceRequest
    Backup backup.gdc.goog BackupRepositoryManager
    Dataproc Container for Spark (servizio Marketplace) sparkoperator.k8s.io SparkApplication

    Se un servizio elenca più tipi nella tabella (ad esempio il servizio di database), puoi specificare solo i singoli tipi che vuoi limitare. Ad esempio, puoi bloccare le operazioni Restore, ma continuare a consentire le operazioni DBCluster.

    L'esempio seguente limita gli aggiornamenti ai servizi di Marketplace:

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: GDCHRestrictedService
    metadata:
      name: no-update-to-marketplace-service
    spec:
      match:
        kinds:
        - apiGroups:
          - "marketplace.gdc.goog"
          kinds:
          - MarketplaceService
      parameters:
        disabledOperations:
          - "UPDATE"
    
  2. Applica la policy utilizzando l'interfaccia a riga di comando kubectl:

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f POLICY_NAME.yaml
    

    Sostituisci quanto segue:

    • CLUSTER_KUBECONFIG: il file kubeconfig del cluster in cui vuoi applicare la policy
    • POLICY_NAME: il nome del file della policy dell'organizzazione

Configura una policy di controllo dell'accesso basato sugli attributi

Il tipo di policy GDCHRestrictByAttributes consente di creare policy ABAC per limitare l'accesso alle risorse in base agli attributi del soggetto. Ad esempio, puoi utilizzare questo tipo di policy per limitare le operazioni di scrittura o modifica sui bucket di archiviazione in modo che solo gli utenti o i service account con attributi di identità specifici (come citizenship=USA o citizenship=UK) possano eseguirle.

Crea questa policy nello stesso cluster delle risorse. Puoi creare più istanze di policy in un cluster per risorse o progetti diversi.

Configura una policy di controllo dell'accesso basato sugli attributi:

  1. Crea un file JSON di patch per mappare gli attributi di identità personalizzati per la risorsa IdentityProviderConfig:

    cat <<EOF > attributeMapping-patch.json
    {
      "CUSTOM_ATTRIBUTE": "assertion[\"CUSTOM_ATTRIBUTE\"]"
    }
    EOF
    

    Sostituisci CUSTOM_ATTRIBUTE con il nome dell'attributo di identità da mappare, ad esempio citizenship.

  2. Applica una patch alla risorsa IdentityProviderConfig nello spazio dei nomi platform:

    kubectl --kubeconfig CLUSTER_KUBECONFIG patch \
        IdentityProviderConfig IDENTITY_PROVIDER_CONFIG_NAME \
        -n platform --type=json \
        -p '[{"op":"add","path":"/spec/oidc/attributeMapping", "value": '"$(cat attributeMapping-patch.json)"'}]'
    

    Sostituisci quanto segue:

    • CLUSTER_KUBECONFIG: il file kubeconfig del cluster in cui si trova il provider di identità
    • IDENTITY_PROVIDER_CONFIG_NAME: il nome della risorsa IdentityProviderConfig
  3. Definisci il manifest della policy:

    apiVersion: constraints.global.gatekeeper.sh/v1beta1
    kind: GDCHRestrictByAttributes
    metadata:
      name: POLICY_NAME
    spec:
      match:
        kinds:
          - apiGroups:
              - "API_GROUP"
            kinds:
              - "KIND"
      parameters:
        attributes:
          - CUSTOM_ATTRIBUTE
        attributeValues:
          - ALLOWED_ATTRIBUTE_VALUE
    

    Sostituisci quanto segue:

    • POLICY_NAME: il nome della policy dell'organizzazione.

    • API_GROUP: il gruppo API delle risorse da limitare, ad esempio object.gdc.goog.

    • KIND: il tipo di risorsa da limitare, ad esempio Bucket.

    • CUSTOM_ATTRIBUTE: l'attributo oggetto personalizzato mappato dal provider di identità, ad esempio citizenship.

    • ALLOWED_ATTRIBUTE_VALUE: il valore consentito per l'attributo personalizzato, ad esempio USA. Le richieste provenienti da soggetti il cui attributo non corrisponde a uno dei valori consentiti vengono rifiutate.

    Per impostazione predefinita, la policy viene applicata a tutti i namespace del cluster. Per applicare la policy a spazi dei nomi o progetti specifici, consulta Definisci l'ambito di una policy dell'organizzazione all'interno di un cluster.

    L'esempio seguente limita la modifica delle risorse Bucket nello spazio dei nomi project-foo ai soggetti con l'attributo citizenship=USA o citizenship=UK:

    apiVersion: constraints.global.gatekeeper.sh/v1beta1
    kind: GDCHRestrictByAttributes
    metadata:
      name: restrict-by-citizenship
    spec:
      match:
        scope: Namespaced
        kinds:
          - apiGroups:
              - "object.gdc.goog"
            kinds:
              - Bucket
        namespaces:
          - project-foo
      parameters:
        attributes:
          - "citizenship"
        attributeValues:
          - "USA"
          - "UK"
    
  4. Applica la policy utilizzando l'interfaccia a riga di comando kubectl:

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f POLICY_NAME.yaml
    

    Sostituisci quanto segue:

    • CLUSTER_KUBECONFIG: il file kubeconfig del cluster in cui vuoi applicare la policy
    • POLICY_NAME: il nome del file della policy dell'organizzazione

Definisci l'ambito di una policy dell'organizzazione all'interno di un cluster

Quando definisci una policy dell'organizzazione, decidi se deve influire su tutti gli spazi dei nomi, solo su spazi dei nomi specifici o su tutti gli spazi dei nomi tranne un elenco specifico. Per farlo, utilizza una combinazione dei parametri .spec.match.excludedNamespaces, .spec.match.namespaceSelector, .spec.match.namespaces e .spec.match.scope della definizione della policy.

Per saperne di più su questi parametri, consulta la pagina Sezione relativa alla corrispondenza delle policy dell'organizzazione. Ad esempio, per consentire la creazione di database solo negli spazi dei nomi con l'etichetta owner: dba-team, crea la seguente policy:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: GDCHRestrictedService
metadata:
  name: db-restricted-to-dbas
spec:
  match:
    scope: Namespaced
    namespaceSelector:
      matchExpressions:
      # We are restricting the use of the service in namespaces that
      # don't have the owner: dba-team label
      - key: owner
        operator: NotIn
        values:
        - dba-team
    kinds:
    - apiGroups:
      - "postgresql.dbadmin.gdc.goog"
      kinds:
      - DBCluster
      - BackupPlan
      - Import
      - Restore
  parameters:
    disabledOperations:
      - "UPDATE"
      - "CREATE"
      - "DELETE"

Esegui il rollback di una policy esistente

Per interrompere l'applicazione di una policy esistente, eliminala utilizzando l'interfaccia a riga di comando kubectl. Utilizza un file kubeconfig che ti consenta di accedere al cluster in cui è definita la policy e al ruolo IAM corrispondente al tipo di policy (ad esempio gdchrestrictedservice-policy-admin o gdchrestrictbyattributes-policy-admin).

Elimina una policy dell'organizzazione:

kubectl --kubeconfig CLUSTER_KUBECONFIG delete \
    POLICY_TYPE/POLICY_NAME

Sostituisci quanto segue:

  • CLUSTER_KUBECONFIG: il file kubeconfig del cluster in cui si trova la policy dell'organizzazione

  • POLICY_TYPE: il tipo di policy dell'organizzazione da eliminare, ad esempio GDCHRestrictedService o GDCHRestrictByAttributes

  • POLICY_NAME: il nome della policy dell'organizzazione da eliminare

Testa una policy in modalità di controllo

Puoi testare una policy senza applicarla. Testa una policy per assicurarti che non interrompa i sistemi esistenti prima di implementarla o per ottenere una stima della diffusione di un comportamento. Per aggiungere un test, aggiungi un enforcementAction alla definizione della policy. Esistono tre valori possibili per questo parametro:

  • deny: la policy viene applicata. Questa è l'impostazione predefinita.
  • dryrun: l'azione è consentita, ma puoi vedere che esiste una violazione delle policy sia nei log di controllo sia nello stato secondo le norme. Esamina la violazione con kubectl --kubeconfig CLUSTER_KUBECONFIG get POLICY_TYPE/POLICY_NAME.
  • warn: equivale a dryrun, ad eccezione del fatto che il test mostra anche un avviso in risposta alla richiesta che ha attivato una violazione delle policy.

Ad esempio, per testare una policy che disattiva Marketplace, crea la seguente policy:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: GDCHRestrictedService
metadata:
  name: disable-marketplace-service-project-alice
spec:
  enforcementAction: warn
  match:
    kinds:
      - apiGroups: ["marketplace.gdc.goog"]
        kinds: ["MarketplaceService"]