Controlla l'accesso al repository con tag e policy di rifiuto

Puoi utilizzare le policy di negazione di Identity and Access Management (IAM) insieme ai tag per bloccare operazioni specifiche sui link dei repository Git in una connessione Developer Connect.

Colleghi un tag a una connessione, quindi crei una policy di negazione la cui condizione corrisponde a quel tag. Ogni link al repository Git nella connessione eredita il tag, quindi la policy di rifiuto si applica a tutti i repository collegati tramite quella connessione.

Quando utilizzare i tag e le policy di negazione

Le policy di autorizzazione IAM concedono le autorizzazioni. Le policy di negazione ti consentono di impostare misure di protezione che hanno la precedenza sulle policy di autorizzazione, indipendentemente dai ruoli di un'entità. La combinazione di policy di negazione con i tag ti consente di applicare queste misure di protezione alle connessioni selezionate, anziché a ogni connessione di un progetto.

Ad esempio, puoi utilizzare questo approccio per:

  • Consenti a un agente AI o a un account di servizio di automazione di leggere i commit e le richieste di pull tramite Developer Connect, ma impedisci di aprire, modificare o commentare le richieste di pull nei repository di produzione.
  • Bloccare tutte le operazioni del repository per un gruppo di entità sulle connessioni che rimandano a repository sensibili, mantenendo al contempo l'accesso ad altre connessioni nello stesso progetto.
  • Applica un insieme coerente di limitazioni a più progetti creando il tag e la policy di negazione a livello di organizzazione.

Come vengono applicati i tag ai link dei repository Git

In Developer Connect, puoi collegare i tag alle connessioni, ma non direttamente ai link ai repository Git.

Un link al repository Git è una risorsa secondaria della sua connessione. Quando IAM valuta una policy di negazione per un'operazione su un link a un repository Git, la condizione viene valutata in base ai tag effettivi del link. I tag effettivi includono i tag collegati alla connessione principale e i tag ereditati dal progetto, dalla cartella e dall'organizzazione della connessione.

Poiché i link ai repository Git ereditano i tag dalla connessione, i controlli in questo documento si applicano per connessione. Se hai bisogno di controlli diversi per repository diversi, collega i repository tramite connessioni diverse e poi aggiungi un tag a ogni connessione separatamente.

Prima di iniziare

  • Assicurati di avere una connessione Developer Connect con almeno un repository Git collegato.
  • Assicurati di conoscere il tuo ID organizzazione e il numero di progetto del progetto che contiene la connessione.
  • Per utilizzare gli esempi di riga di comando in questo documento, installa e configura Google Cloud CLI.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per creare tag, collegarli alle connessioni e creare policy di negazione, chiedi all'amministratore di concederti i seguenti ruoli IAM nell'organizzazione:

  • Per creare e gestire chiavi e valori dei tag: Tag Administrator (roles/resourcemanager.tagAdmin)
  • Per collegare un valore del tag a una connessione: Tag User (roles/resourcemanager.tagUser) nel valore del tag e Developer Connect Admin (roles/developerconnect.admin) nella connessione
  • Per creare, aggiornare ed eliminare le policy di negazione: Deny Admin (roles/iam.denyAdmin)

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

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Autorizzazioni che puoi negare

Puoi negare le seguenti autorizzazioni sui link ai repository Git. In una policy di negazione, utilizza il formato developerconnect.googleapis.com/gitRepositoryLinks.PERMISSION.

Leggi i dati del repository

Autorizzazione Consente a un'entità
developerconnect.googleapis.com/gitRepositoryLinks.fetchCommit Ottieni un commit.
developerconnect.googleapis.com/gitRepositoryLinks.fetchCommitList Elenca i commit.
developerconnect.googleapis.com/gitRepositoryLinks.diffCommit Ottieni la differenza tra i commit.
developerconnect.googleapis.com/gitRepositoryLinks.fetchFileBlame Ottieni informazioni sulla paternità di un file.
developerconnect.googleapis.com/gitRepositoryLinks.fetchPullRequest Ricevi una richiesta di pull.
developerconnect.googleapis.com/gitRepositoryLinks.fetchPullRequestList Elenca le richieste di pull.
developerconnect.googleapis.com/gitRepositoryLinks.fetchGitRefs Elenca i branch e i tag.

Modifica i dati del repository

Autorizzazione Consente a un'entità
developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest Apri una richiesta di pull.
developerconnect.googleapis.com/gitRepositoryLinks.modifyPullRequest Modificare una richiesta di pull, ad esempio il titolo, la descrizione o lo stato.
developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestComment Aggiungere un commento a una richiesta di pull.
developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestReviewComment Aggiungere un commento di revisione a una richiesta di pull.

Token di accesso e proxy Git

Autorizzazione Consente a un'entità
developerconnect.googleapis.com/gitRepositoryLinks.fetchReadToken Ottieni un token di accesso di sola lettura per il repository.
developerconnect.googleapis.com/gitRepositoryLinks.fetchReadWriteToken Ottieni un token di accesso in lettura/scrittura per il repository.
developerconnect.googleapis.com/gitRepositoryLinks.gitProxyRead Leggere dal repository tramite il proxy Developer Connect.
developerconnect.googleapis.com/gitRepositoryLinks.gitProxyWrite Scrivere nel repository tramite il proxy Developer Connect.

Per l'elenco completo delle autorizzazioni supportate dalle policy di negazione, consulta Autorizzazioni supportate nelle policy di negazione.

Crea un tag e collegalo a una connessione

In questo esempio, crei una chiave tag denominata scm-agent-access con un valore tag denominato read-only, quindi colleghi il valore tag a una connessione.

  1. Crea la chiave tag. Il seguente comando crea la chiave di tag nella tua organizzazione, in modo che tu possa utilizzarla sulle connessioni in qualsiasi progetto:

    gcloud resource-manager tags keys create scm-agent-access \
        --parent=organizations/ORGANIZATION_ID \
        --description="Controls agent access to Developer Connect repositories"

    Sostituisci ORGANIZATION_ID con l'ID organizzazione.

    Puoi anche creare la chiave tag in un progetto impostando --parent su projects/PROJECT_ID. Una chiave tag a livello di progetto può essere collegata solo alle risorse di quel progetto.

  2. Crea il valore del tag:

    gcloud resource-manager tags values create read-only \
        --parent=ORGANIZATION_ID/scm-agent-access
  3. Collega il valore del tag alla connessione:

    gcloud resource-manager tags bindings create \
        --tag-value=ORGANIZATION_ID/scm-agent-access/read-only \
        --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \
        --location=LOCATION

    Sostituisci quanto segue:

    • PROJECT_NUMBER: il numero del progetto che contiene la connessione.
    • LOCATION: la regione della connessione, ad esempio us-central1.
    • CONNECTION_ID: l'ID della connessione.
  4. Verifica che il tag sia associato alla connessione:

    gcloud resource-manager tags bindings list \
        --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \
        --location=LOCATION

Per saperne di più sulla creazione e sul collegamento dei tag, consulta Crea e gestisci i tag.

Crea una policy di negazione

La seguente policy di negazione impedisce a un account di servizio di aprire, modificare o commentare le richieste di pull e di ottenere token di lettura/scrittura o di scrivere tramite il proxy Developer Connect in qualsiasi link al repository Git la cui connessione ha il tag scm-agent-access impostato su read-only. Il service account può comunque leggere i commit e le richieste di pull, se una policy di autorizzazione gli concede queste autorizzazioni.

  1. Crea un file denominato policy.json con i seguenti contenuti:

    {
      "displayName": "Read-only Developer Connect access for agents",
      "rules": [
        {
          "denyRule": {
            "deniedPrincipals": [
              "principal://iam.googleapis.com/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL"
            ],
            "deniedPermissions": [
              "developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest",
              "developerconnect.googleapis.com/gitRepositoryLinks.modifyPullRequest",
              "developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestComment",
              "developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestReviewComment",
              "developerconnect.googleapis.com/gitRepositoryLinks.fetchReadWriteToken",
              "developerconnect.googleapis.com/gitRepositoryLinks.gitProxyWrite"
            ],
            "denialCondition": {
              "title": "Connection is tagged scm-agent-access=read-only",
              "expression": "resource.matchTag('ORGANIZATION_ID/scm-agent-access', 'read-only')"
            }
          }
        }
      ]
    }

    Sostituisci SERVICE_ACCOUNT_EMAIL con l'indirizzo email del account di servizio che vuoi limitare. Per limitare altri tipi di entità, come utenti o gruppi, consulta Identificatori delle entità.

  2. Crea la policy di negazione e collegala alla tua organizzazione:

    gcloud iam policies create scm-agent-read-only \
        --attachment-point=cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID \
        --kind=denypolicies \
        --policy-file=policy.json

    Puoi anche collegare la policy di negazione a una cartella o a un progetto. Una policy di negazione si applica a tutte le risorse sotto il relativo punto di associazione.

Per saperne di più sulla creazione di policy di negazione, consulta Nega l'accesso alle risorse.

Verifica la policy di negazione

Le modifiche ai tag e alle policy di negazione sono coerenti nel tempo. L'applicazione di una nuova associazione di tag o di una policy di negazione può richiedere diversi minuti. Per saperne di più, consulta Impatto delle modifiche ai tag e Propagazione della modifica di accesso.

Dopo la propagazione delle modifiche, una richiesta da parte dell'entità negata per un'autorizzazione negata su un link al repository Git nella connessione con tag non va a buon fine con un errore HTTP 403 PERMISSION_DENIED. Il messaggio di errore indica l'autorizzazione e il link al repository Git e dichiara che l'accesso è stato negato da una policy di negazione IAM. Ad esempio:

Permission 'developerconnect.gitRepositoryLinks.openPullRequest' denied on resource '//developerconnect.googleapis.com/projects/my-project/locations/us-central1/connections/my-connection/gitRepositoryLinks/my-repo' due to an IAM deny policy.

Le richieste di autorizzazioni non negate dalla policy e le richieste di link ai repository Git nelle connessioni che non hanno il tag non sono interessate dalla policy di negazione.

Per verificare se la policy di negazione si applica a un'entità e a un link al repository Git, utilizza Policy Troubleshooter:

gcloud policy-intelligence troubleshoot-policy iam \
    //developerconnect.googleapis.com/projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID/gitRepositoryLinks/GIT_REPOSITORY_LINK_ID \
    --principal-email=SERVICE_ACCOUNT_EMAIL \
    --permission=developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest

Rimuovi la limitazione

Per rimuovere la limitazione da una singola connessione, elimina l'associazione dei tag dalla connessione:

gcloud resource-manager tags bindings delete \
    --tag-value=ORGANIZATION_ID/scm-agent-access/read-only \
    --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \
    --location=LOCATION

Per rimuovere la limitazione da tutte le connessioni, elimina la policy di negazione:

gcloud iam policies delete scm-agent-read-only \
    --attachment-point=cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID \
    --kind=denypolicies

Limitazioni

  • I tag sono associati per connessione. Puoi collegare tag alle connessioni, ma non ai link dei repository Git. Tutti i link ai repository Git in una connessione condividono i tag della connessione.
  • Le condizioni di negazione supportano solo i tag. La condizione in una regola di negazione può utilizzare solo funzioni dei tag, come resource.matchTag() e resource.hasTagKey(). Non puoi scrivere una condizione di negazione basata sul nome del repository o su altri attributi della risorsa. Per maggiori dettagli, consulta Condizioni di rifiuto.
  • Le chiavi tag devono avere uno spazio dei nomi. In resource.matchTag(), identifica la chiave tag in base al nome con spazio dei nomi, ad esempio ORGANIZATION_ID/scm-agent-access o PROJECT_ID/scm-agent-access, non in base al nome breve.
  • La propagazione delle modifiche richiede tempo. Le nuove associazioni di tag, i valori dei tag modificati e le policy di negazione non hanno effetto immediato e la rimozione di un tag non ripristina immediatamente l'accesso. Attendi qualche minuto per ogni modifica e testa la configurazione prima di utilizzarla.
  • I tag effettivi sono elencati nelle connessioni. Per visualizzare i tag applicati a un link del repository Git, elenca i tag effettivi della connessione principale.

Passaggi successivi