Vous pouvez utiliser des stratégies de refus IAM (Identity and Access Management) ainsi que des tags pour bloquer des opérations spécifiques sur les liens de dépôt Git dans une connexion Developer Connect.
Vous associez un tag à une connexion, puis vous créez une stratégie de refus dont la condition correspond à ce tag. Chaque lien de dépôt Git de la connexion hérite du tag. Par conséquent, la stratégie de refus s'applique à tous les dépôts associés via cette connexion.
Quand utiliser des tags et des stratégies de refus ?
Les stratégies d'autorisation IAM accordent des autorisations. Les stratégies de refus vous permettent de définir des garde-fous qui prévalent sur les stratégies d'autorisation, quels que soient les rôles d'un compte principal. En combinant des stratégies de refus avec des tags, vous pouvez appliquer ces garde-fous aux connexions sélectionnées, plutôt qu'à toutes les connexions d'un projet.
Par exemple, vous pouvez utiliser cette approche pour effectuer les opérations suivantes :
- Autorisez un agent IA ou un compte de service d'automatisation à lire les commits et les demandes d'extraction via Developer Connect, mais empêchez-le d'ouvrir, de modifier ou de commenter les demandes d'extraction dans les dépôts de production.
- Bloquer toutes les opérations de dépôt pour un groupe de comptes principaux sur les connexions qui renvoient à des dépôts sensibles, tout en conservant leur accès aux autres connexions du même projet.
- Appliquez un ensemble cohérent de restrictions à de nombreux projets en créant le tag et la stratégie de refus au niveau de l'organisation.
Application des tags aux liens de dépôt Git
Dans Developer Connect, vous pouvez associer des tags à des connexions, mais pas directement à des liens de dépôt Git.
Un lien de dépôt Git est une ressource enfant de sa connexion. Quand IAM évalue une stratégie de refus pour une opération sur un lien de dépôt Git, la condition est évaluée par rapport aux tags effectifs du lien. Les tags effectifs incluent les tags associés à la connexion parente et les tags hérités du projet, du dossier et de l'organisation de la connexion.
Étant donné que les liens de dépôt Git héritent des tags de leur connexion, les contrôles de ce document s'appliquent par connexion. Si vous avez besoin de contrôles différents pour différents dépôts, associez ces dépôts via des connexions distinctes, puis ajoutez un tag à chaque connexion séparément.
Avant de commencer
- Assurez-vous de disposer d'une connexion Developer Connect avec au moins un dépôt Git associé.
- Assurez-vous de connaître votre ID d'organisation et le numéro de projet du projet contenant la connexion.
- Pour utiliser les exemples de ligne de commande de ce document, installez et configurez la Google Cloud CLI.
Rôles requis
Pour obtenir les autorisations nécessaires pour créer des tags, les associer à des connexions et créer des stratégies de refus, demandez à votre administrateur de vous accorder les rôles IAM suivants sur l'organisation :
-
Pour créer et gérer des clés et des valeurs de tag : Administrateur de tags (
roles/resourcemanager.tagAdmin) -
Pour associer une valeur de tag à une connexion : Utilisateur de tags (
roles/resourcemanager.tagUser) sur la valeur de tag et Administrateur Developer Connect (roles/developerconnect.admin) sur la connexion -
Pour créer, mettre à jour et supprimer des stratégies de refus : Administrateur des refus (
roles/iam.denyAdmin)
Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.
Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.
Autorisations que vous pouvez refuser
Vous pouvez refuser les autorisations suivantes sur les liens de dépôt Git. Dans une stratégie de refus, utilisez le format developerconnect.googleapis.com/gitRepositoryLinks.PERMISSION.
Lire les données du dépôt
| Autorisation | Permet à un compte principal |
|---|---|
developerconnect.googleapis.com/gitRepositoryLinks.fetchCommit |
Obtenir un commit. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchCommitList |
Répertorie les commits. |
developerconnect.googleapis.com/gitRepositoryLinks.diffCommit |
Obtenez la différence entre les commits. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchFileBlame |
Obtenez des informations sur l'auteur d'un fichier. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchPullRequest |
Obtenir une demande d'extraction. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchPullRequestList |
Répertorier les demandes d'extraction. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchGitRefs |
Lister les branches et les tags. |
Modifier les données du dépôt
| Autorisation | Permet à un compte principal |
|---|---|
developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest |
Ouvrez une demande d'extraction. |
developerconnect.googleapis.com/gitRepositoryLinks.modifyPullRequest |
Modifiez une demande d'extraction, par exemple son titre, sa description ou son état. |
developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestComment |
Ajouter un commentaire à une demande d'extraction. |
developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestReviewComment |
Ajouter un commentaire d'examen à une demande d'extraction;extraction. |
Jetons d'accès et proxy Git
| Autorisation | Permet à un compte principal |
|---|---|
developerconnect.googleapis.com/gitRepositoryLinks.fetchReadToken |
Obtenez un jeton d'accès en lecture seule pour le dépôt. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchReadWriteToken |
Obtenez un jeton d'accès en lecture/écriture pour le dépôt. |
developerconnect.googleapis.com/gitRepositoryLinks.gitProxyRead |
Lire à partir du dépôt via le proxy Developer Connect. |
developerconnect.googleapis.com/gitRepositoryLinks.gitProxyWrite |
Écrire dans le dépôt via le proxy Developer Connect. |
Pour obtenir la liste complète des autorisations compatibles avec les stratégies de refus, consultez Autorisations compatibles avec les stratégies de refus.
Créer un tag et l'associer à une connexion
Dans cet exemple, vous allez créer une clé de tag nommée scm-agent-access avec une valeur de tag nommée read-only, puis associer la valeur de tag à une connexion.
Créez la clé de tag. La commande suivante crée la clé de tag dans votre organisation, afin que vous puissiez l'utiliser sur les connexions de n'importe quel projet :
gcloud resource-manager tags keys create scm-agent-access \ --parent=organizations/ORGANIZATION_ID \ --description="Controls agent access to Developer Connect repositories"
Remplacez ORGANIZATION_ID par votre ID d'organisation.
Vous pouvez également créer la clé de tag dans un projet en définissant
--parentsurprojects/PROJECT_ID. Une clé de tag au niveau du projet ne peut être associée qu'aux ressources de ce projet.Créez la valeur de tag :
gcloud resource-manager tags values create read-only \ --parent=ORGANIZATION_ID/scm-agent-access
Associez la valeur de tag à la connexion :
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
Remplacez les éléments suivants :
- PROJECT_NUMBER : numéro du projet contenant la connexion.
- LOCATION : région de la connexion, par exemple
us-central1. - CONNECTION_ID : ID de la connexion.
Vérifiez que le tag est associé à la connexion :
gcloud resource-manager tags bindings list \ --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \ --location=LOCATION
Pour en savoir plus sur la création et l'association de tags, consultez Créer et gérer des tags.
Créer une stratégie de refus
La stratégie de refus suivante empêche un compte de service d'ouvrir, de modifier ou de commenter des demandes d'extraction, et d'obtenir des jetons en lecture-écriture ou d'écrire via le proxy Developer Connect, dans n'importe quel lien de dépôt Git dont la connexion comporte le tag scm-agent-access défini sur read-only. Le compte de service peut toujours lire les commits et les demandes d'extraction, si une stratégie d'autorisation lui accorde ces autorisations.
Créez un fichier nommé
policy.jsonavec le contenu suivant :{ "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')" } } } ] }
Remplacez SERVICE_ACCOUNT_EMAIL par l'adresse e-mail du compte de service que vous souhaitez restreindre. Pour restreindre d'autres types de comptes principaux, tels que des utilisateurs ou des groupes, consultez Identifiants de comptes principaux.
Créez la stratégie de refus et associez-la à votre organisation :
gcloud iam policies create scm-agent-read-only \ --attachment-point=cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID \ --kind=denypolicies \ --policy-file=policy.json
Vous pouvez également associer la stratégie de refus à un dossier ou à un projet. Une stratégie de refus s'applique à toutes les ressources situées sous son point d'association.
Pour en savoir plus sur la création de stratégies de refus, consultez Refuser l'accès aux ressources.
Vérifier la stratégie de refus
Les modifications apportées aux tags et aux stratégies de refus sont cohérentes à terme. La prise en compte d'une nouvelle liaison de tag ou d'une nouvelle stratégie de refus peut prendre plusieurs minutes. Pour en savoir plus, consultez Impact des modifications de tags et Propagation des modifications d'accès.
Une fois les modifications propagées, une requête du compte principal refusé pour une autorisation refusée sur un lien de dépôt Git dans la connexion taguée échoue avec une erreur HTTP 403 PERMISSION_DENIED. Le message d'erreur indique l'autorisation et le lien vers le dépôt Git, et indique que l'accès a été refusé par une stratégie de refus IAM. Exemple :
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.
Les demandes d'autorisations que la stratégie ne refuse pas et les demandes de liens vers des dépôts Git dans des connexions qui ne comportent pas le tag ne sont pas affectées par la stratégie de refus.
Pour vérifier si la stratégie de refus s'applique à un principal et à un lien de dépôt Git, utilisez 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
Supprimer la restriction
Pour supprimer la restriction d'une seule connexion, supprimez la liaison de tag de la connexion :
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
Pour supprimer la restriction de toutes les connexions, supprimez la stratégie de refus :
gcloud iam policies delete scm-agent-read-only \ --attachment-point=cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID \ --kind=denypolicies
Limites
- Les tags sont associés par connexion. Vous pouvez associer des tags à des connexions, mais pas à des liens de dépôt Git. Tous les liens de dépôt Git d'une connexion partagent les tags de la connexion.
- Les conditions de refus n'acceptent que les tags. La condition d'une règle de refus ne peut utiliser que des fonctions de tag, telles que
resource.matchTag()etresource.hasTagKey(). Vous ne pouvez pas écrire de condition de refus basée sur le nom du dépôt ou d'autres attributs de ressource. Pour en savoir plus, consultez Conditions de refus. - Les clés de tag doivent être associées à un espace de noms. Dans
resource.matchTag(), identifiez la clé de tag par son nom d'espace de noms, tel queORGANIZATION_ID/scm-agent-accessouPROJECT_ID/scm-agent-access, et non par son nom court. - La propagation des modifications prend du temps. Les nouvelles liaisons de tags, les valeurs de tags modifiées et les stratégies de refus ne prennent pas effet immédiatement, et la suppression d'un tag ne rétablit pas l'accès immédiatement. Attendez quelques minutes après chaque modification et testez votre configuration avant de l'utiliser.
- Les tags effectifs sont listés sur les connexions. Pour afficher les tags qui s'appliquent à un lien de dépôt Git, listez les tags effectifs de sa connexion parente.
Étapes suivantes
- En savoir plus sur les stratégies de refus
- En savoir plus sur les tags et l'accès conditionnel
- Découvrez les rôles et les autorisations Developer Connect.