1. Introduction
VPC Service Controls (VPC-SC) est un contrôle de sécurité au niveau de l'organisation dans Google Cloud qui permet aux clients Enterprise de limiter les risques d'exfiltration de données. VPC Service Controls permet de mettre en place des accès "zéro confiance" aux services mutualisés. Pour ce faire, il permet aux clients de limiter l'accès aux adresses IP autorisées, au contexte du client et aux paramètres de l'appareil tout en se connectant aux services mutualisés depuis Internet ou d'autres services. L'objectif est de réduire les pertes intentionnelles et non intentionnelles. Comme nous l'avons vu dans le tutoriel de base sur VPC Service Controls I, vous pouvez utiliser VPC Service Controls pour créer des périmètres qui protègent les ressources et les données des services que vous spécifiez explicitement.
Les objectifs de ce tutoriel sont les suivants :
- Comprendre les principes de base de VPC Service Controls
- Mettre à jour un périmètre de service et le tester en mode dry run
- Protéger deux services avec VPC Service Controls
- Résoudre un problème de non-respect des règles de sortie VPC Service Controls lors de la liste d'un objet depuis Cloud Storage
2. Préparation
Pour ce tutoriel, nous avons besoin des prérequis suivants :
- Organisation GCP.
- Dossier sous l'organisation.
- Deux projets GCP de la même organisation placés dans le dossier.
- Les autorisations requises au niveau de l'organisation.
- Compte de facturation pour les deux projets.
- Tutoriel de base sur VPC Service Controls I : configuration de VPC Service Controls et d'Access Context Manager.

Resources-setup
- Configurez les ressources comme décrit dans la section "Configuration des ressources" du Tutoriel de base sur VPC Service Controls I.
- Vérifiez que vous disposez des autorisations requises pour administrer Cloud Storage.
- Pour ce tutoriel, nous allons commencer à utiliser la CLI au lieu de la console Cloud. Dans l'un des environnements de développement suivants, configurez la gcloud CLI :
- Cloud Shell : pour utiliser un terminal en ligne avec la gcloud CLI déjà configurée, activez Cloud Shell.
Activez Cloud Shell en cliquant sur l'icône en haut à droite de la console Cloud. L'initialisation de la session peut prendre quelques secondes. Pour en savoir plus, consultez le guide Cloud Shell.

- Shell local : pour utiliser un environnement de développement local, installez et initialisez la gcloud CLI.
Coût
Vous devez activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour désactiver les ressources et éviter ainsi que des frais ne vous soient facturés après ce tutoriel, vous pouvez supprimer le projet ou les ressources que vous avez créées. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.
Les seules ressources qui généreront des coûts sont l'instance de VM et l'objet Cloud Storage. Vous trouverez une estimation du coût de l'instance de VM dans le simulateur de coût. Le coût estimé de Cloud Storage est indiqué dans cette liste de prix.
3. Créer un bucket et un objet Storage
Comme mentionné précédemment, nous allons réutiliser les ressources créées dans le tutoriel précédent. Nous allons donc continuer à créer le bucket Cloud Storage. Pour ce tutoriel, nous allons commencer à utiliser gcloud CLI au lieu de la console.
- Dans la console Google, sélectionnez ProjectX. Dans ce projet, nous allons créer le bucket Storage et l'objet.
- Assurez-vous de configurer Cloud Shell pour qu'il utilise ProjectX en exécutant la commande suivante :
gcloud config set project PROJECT_ID
- Dans votre environnement de développement, exécutez la commande suivante :
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
- Créez un objet de stockage pour que nous puissions le lire à partir de l'instance de VM située dans ProjectZ. Nous allons créer un fichier .txt.
nano hello.txt
Ajoutez ce que vous voulez dans le fichier texte.
- Importez l'objet dans le bucket.
gcloud storage cp /home/${USER}/hello.txt gs://BUCKET_NAME
- Vérifiez que l'objet a bien été importé dans le bucket en l'listant.
gcloud storage ls gs://BUCKET_NAME
Le fichier hello.txt doit s'afficher dans la console.
4. Protéger l'API Cloud Storage
Dans l'atelier de programmation précédent, nous avons créé un périmètre et protégé l'API Compute Engine. Dans cet atelier de programmation, nous allons modifier le périmètre de notre mode test et ajouter Cloud Storage. Cela nous aidera à déterminer l'impact de la protection du périmètre en nous montrant les cas de non-respect de VPC Service Controls dans les journaux d'audit. Toutefois, les ressources resteront accessibles jusqu'à ce que nous appliquions le périmètre.
- Dans la console Google, sélectionnez votre organisation, puis accédez à VPC Service Controls. Assurez-vous d'être au niveau de l'organisation.
- Ouvrez Cloud Shell et mettez à jour le périmètre d'essai "SuperProtection" créé dans l'atelier précédent :
gcloud access-context-manager perimeters dry-run update SuperProtection --policy=POLICY --add-restricted-services=storage.googleapis.com
- Vérifier que l'API Cloud Storage a été mise à jour en décrivant le périmètre
gcloud access-context-manager perimeters dry-run describe SuperProtection --policy=POLICY
Dans la sortie, vous verrez que l'API Cloud Storage est listée sous les services restreints.
ainsi que l'API Compute Engine, mais avec un libellé "-vpcAccessibleServices: {}"" :

5. Vérifier que l'API Cloud Storage a été protégée
En mode d'essai à blanc, vérifiez que le périmètre "SuperProtection" nous indique le refus en listant l'objet de l'instance de VM créée dans ProjectZ vers ProjectX, qui héberge le bucket Storage.
- Dans la console Cloud, accédez au sélecteur de projet et sélectionnez ProjectZ, puis accédez à Compute Engine > Instances de VM.
- Cliquez sur le bouton SSH pour vous connecter à l'instance de VM et accéder à sa ligne de commande.

- Listez le fichier hello.txt que nous avons importé précédemment.
gcloud storage ls gs://BUCKET_NAME
Étant donné que l'API Cloud Storage est protégée en mode d'essai, vous devriez pouvoir lister les ressources, mais vous devez avoir un message d'erreur dans les journaux d'audit ProjectZ.
- Accédez à l'API Logs Explorer dans ProjectZ et recherchez le dernier message d'erreur de VPC Service Controls. Vous pouvez utiliser ce filtre pour obtenir le journal que nous recherchons :
protoPayload.status.details.violations.type="VPC_SERVICE_CONTROLS" "(Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:UNIQUE_ID"
Ce filtre nous montre la dernière infraction en mode d'essai appartenant à Cloud Storage. Voici un exemple de journal. Nous pouvons valider que l'infraction est une infraction de sortie lorsque nous essayons de lister le contenu du bucket situé dans ProjectX.
egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTX_ID"
sourceType: "Network"
targetResource: "projects/PROJECTZ_ID"
}
]
resourceNames: [
0: "projects//buckets/BUCKET_NAME"
]
securityPolicyInfo: {
organizationId: "ORGANIZATION_ID"
servicePerimeterName: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
vpcServiceControlsUniqueId: "UNIQUE_ID"
}
methodName: "google.storage.objects.list"
- Étant donné que nous avons validé que l'appel d'API à Cloud Storage génère une violation de VPC Service Controls, nous appliquerons le périmètre avec la nouvelle configuration. Ouvrez Cloud Shell et appliquez le périmètre d'exécution à sec :
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
- Connectez-vous à l'instance de VM à l'aide de SSH et listez à nouveau le bucket de stockage pour vérifier que le périmètre d'exécution à blanc a été appliqué correctement.
gcloud storage ls gs://BUCKET_NAME
Nous recevrons une notification de non-respect de VPC Service Controls dans l'interface de ligne de commande de la VM au lieu d'une liste des objets Storage :
ERROR: (gcloud.storage.ls) User [PROJECT_NUMBER-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:"UNIQUE_ID"
Nous avons réussi à empêcher l'exfiltration de données en utilisant VPC Service Controls pour empêcher la lecture de données ou leur copie sur une ressource en dehors du périmètre.
6. Résoudre les problèmes de refus de la fiche.
Nous allons résoudre le problème de refus que nous avons rencontré avec la CLI de l'instance de VM. Vérifions les journaux d'audit et recherchons l'ID unique de VPC Service Controls.
- Accédez au sélecteur de projet et sélectionnez "ProjectZ".
- Recherchez l'ID unique VPC Service Controls dans les journaux d'audit à l'aide de la requête suivante dans l'explorateur de journaux :
resource.type="audited_resource" protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
Tous les journaux d'audit VPC Service Controls s'affichent. Nous allons rechercher le dernier journal d'erreur. Étant donné que l'appel d'API a été effectué à partir de l'instance de VM, le principal doit être le compte de service Compute Engine "PROJECT_NUMBER-compute@developer.gserviceaccount.com"".
Comme nous disposons déjà de l'ID unique VPC Service Controls, nous pouvons l'utiliser pour obtenir le journal souhaité directement à l'aide de ce filtre :
protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_ID"
- Cliquez sur l'en-tête VPC Service Controls, puis sélectionnez "Dépanner le refus". L'outil de dépannage de VPC Service Controls s'ouvre.
Cette API nous indiquera dans une interface utilisateur conviviale la raison de la non-conformité, et si elle concerne l'entrée ou la sortie, entre autres informations utiles.
Dans cet exercice, nous allons rechercher les éléments suivants :
authenticationInfo: {
principalEmail: "PROJECT_ID-compute@developer.gserviceaccount.com"
egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTZ_ID"
sourceType: "Network"
targetResource: "projects/PROJECTX_ID"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
Ces informations nous suffisent pour savoir que nous devons créer une règle de sortie afin de permettre au compte de service Compute Engine d'accéder au bucket Storage du projet Z au projet X. Nous pouvons également constater que le réseau ne se trouve pas dans le même périmètre. Nous devons donc autoriser la communication VPC avec les services et partager les données entre les périmètres de service.
- Activez Cloud Shell et créez un fichier .yaml contenant la règle de sortie à l'aide d'un éditeur de texte.
nano egresstorage.yaml
- egressTo:
operations:
- serviceName: storage.googleapis.com
methodSelectors:
- method: \"*\"
resources:
- projects/PROJECTX_ID
egressFrom:
identities:
- serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com
- Mettez à jour la règle d'entrée qui protège ProjectZ.
gcloud access-context-manager perimeters update SuperProtection --set-egress-policies=egresstorage.yaml --policy=POLICY
Nous pouvons maintenant réessayer d'accéder au bucket depuis l'instance de VM.
- Dans la console Cloud, accédez au sélecteur de projet et sélectionnez ProjectZ, puis accédez à Compute Engine > Instances de VM.
- Cliquez sur le bouton SSH pour vous connecter à l'instance de VM et accéder à sa ligne de commande.
- Une fois dans l'interface de ligne de commande de la VM, essayez de lister les objets du bucket Storage.
gcloud storage ls gs://BUCKET_NAME/
Le message d'erreur suivant s'affiche :
ERROR: (gcloud.storage.ls) User [PROJECT_ID-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): PROJECT_ID-compute@developer.gserviceaccount.com does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist).
- Nous devons accorder une autorisation de lecteur d'objets au compte de service Compute Engine pour pouvoir lister les objets du bucket Storage.
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer
- Essayons à nouveau de lister le fichier hello.txt à partir de l'interface de ligne de commande de l'instance de VM .
gcloud storage ls gs://BUCKET_NAME/ . . gs://BUCKET_NAME/hello.txt
Nous pouvons maintenant lister l'objet sans violation des autorisations VPC Service Controls, mais qu'en est-il du téléchargement du fichier ? Essayons ça.
gcloud storage cp gs://BUCKET_NAME/hello.txt /home/${USER}
Nous obtenons le résultat suivant :
Copying gs://BUCKET_NAME/hello.txt to file:///home/${USER}
Completed files 1/1 | 54.0B/54.0B
7. Nettoyage
Bien que l'utilisation de VPC Service Controls ne fasse pas l'objet d'une facturation distincte lorsque le service n'est pas utilisé, il est recommandé de nettoyer la configuration utilisée dans cet atelier. Vous pouvez également supprimer votre instance de VM et/ou vos projets Cloud pour éviter des frais. La suppression de votre projet Cloud arrête la facturation de toutes les ressources utilisées dans ce projet.
- Pour supprimer votre instance de VM, cochez la case à gauche de son nom, puis cliquez sur Supprimer.

- Pour supprimer le périmètre, procédez comme suit :
- Dans la console Google Cloud, cliquez sur Sécurité, puis sur VPC Service Controls au niveau de l'organisation.
- Sur la page "VPC Service Controls", dans la ligne du tableau correspondant au périmètre que vous souhaitez supprimer, cliquez sur l'icône de suppression.
- Pour supprimer le niveau d'accès, procédez comme suit :
- Dans la console Google Cloud, ouvrez la page Access Context Manager au niveau du dossier.
- Dans la grille, sur la ligne du niveau d'accès que vous souhaitez supprimer, cliquez sur l'icône Supprimer, puis sur Supprimer.
- Pour supprimer l'objet et le bucket Storage, procédez comme suit :
- Dans la console Google Cloud, ouvrez la page Buckets Cloud Storage .
- Cochez la case à côté du bucket que vous avez créé.
- Cliquez sur Supprimer.
- Dans la fenêtre qui s'affiche, confirmez que vous souhaitez supprimer le bucket.
- Cliquez sur Supprimer.
- Pour arrêter votre projet, procédez comme suit :
- Dans la console Google Cloud, accédez à la page Paramètres IAM et administration du projet que vous souhaitez supprimer.
- Sur la page "IAM et paramètres d'administration", cliquez sur Arrêter.
- Saisissez l'ID du projet, puis cliquez sur Arrêter quand même.
8. Félicitations !
Dans cet atelier de programmation, vous avez mis à jour un périmètre VPC Service Controls en mode simulation, vous l'avez appliqué et vous l'avez dépanné.
En savoir plus
- Consultez la documentation de VPC Service Controls.
- Consultez la documentation Access Context Manager.
- Consultez la documentation de l'outil de dépannage de VPC-SC.
- Consultez la documentation sur les règles d'entrée et de sortie.
- Consultez la documentation sur l'exécution à blanc .
- Consultez la documentation Cloud Storage.
Licence
Ce document est publié sous une licence Creative Commons Attribution 2.0 Generic.