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.
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
--parentsuprojects/PROJECT_ID. Una chiave tag a livello di progetto può essere collegata solo alle risorse di quel progetto.Crea il valore del tag:
gcloud resource-manager tags values create read-only \ --parent=ORGANIZATION_ID/scm-agent-access
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.
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.
Crea un file denominato
policy.jsoncon 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à.
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()eresource.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 esempioORGANIZATION_ID/scm-agent-accessoPROJECT_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
- Scopri di più sulle policy di negazione.
- Scopri di più su tag e accesso condizionale.
- Scopri di più su ruoli e autorizzazioni di Developer Connect.