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 entreprises clientes de limiter les risques d'exfiltration de données. VPC Service Controls offre un accès "zéro confiance" aux services mutualisés en permettant aux clients de limiter l'accès aux adresses IP autorisées, au contexte du client et aux paramètres de l'appareil lorsqu'ils se connectent aux services mutualisés depuis Internet et d'autres services. L'objectif est de réduire les pertes intentionnelles et involontaires. 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 à l'aide du mode de simulation
- Protéger deux services à l'aide de VPC Service Controls
- Résoudre un problème de non-respect des règles de sortie VPC Service Controls lors de la création d'une liste d'objets à partir de Cloud Storage
2. Préparation
Pour ce tutoriel, nous avons besoin des prérequis suivants:
- Organisation GCP.
- Un dossier dans 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.
Configuration des ressources
- Configurez les ressources comme décrit dans la section "Resources-setup" de la section Tutoriel de base de 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, configurez la gcloud CLI:
- Cloud Shell: pour utiliser un terminal en ligne avec la CLI gcloud configurée, activez Cloud Shell.
Activez Cloud Shell en cliquant sur l'icône située 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.
- Interface système locale: 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 d'une valeur de 300 $.
Les seules ressources qui engendreront un coût sont l'instance de VM et l'objet Cloud Storage. Une estimation du coût de l'instance de VM est disponible dans le simulateur de coût. Le coût estimé de Cloud Storage est disponible dans cette grille tarifaire.
3. Créer un bucket et un objet Storage
Comme indiqué 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 ProjetX. Dans ce projet, nous allons créer le bucket Storage et l'objet.
- Assurez-vous de configurer Cloud Shell pour utiliser 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 tout 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 le répertoriant.
gcloud storage ls gs://BUCKET_NAME
Le fichier hello.txt doit s'afficher dans la console.
4. API Protect Cloud Storage
Dans l'atelier de programmation précédent, nous avons créé un périmètre et une API Compute Engine protégée. Dans cet atelier de programmation, nous allons modifier le périmètre du mode simulation et ajouter Cloud Storage. Cela nous aidera à déterminer l'impact de la protection périmétrique en nous montrant dans les journaux d'audit les cas de non-respect liés à VPC Service Controls. Toutefois, les ressources resteront accessibles jusqu'à ce que le périmètre soit appliqué.
- Dans la console Google, sélectionnez votre organisation. Accédez à VPC Service Controls. Assurez-vous d'être au niveau de l'organisation.
- Ouvrir Cloud Shell et mettre à jour le périmètre de dry run "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 le résultat, vous verrez que l'API Cloud Storage est listée en dessous des services restreints.
ainsi que l'API Compute Engine, mais avec l'étiquette "-vpcAccessibleServices: {}"
" :
5. Vérifier que l'API Cloud Storage a été protégée
En mode dry run, vérifiez que la "SuperProtection" le périmètre nous montre 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 ProjetZ, 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
L'API Cloud Storage étant protégée en mode de simulation, vous devriez pouvoir lister les ressources, mais un message d'erreur doit s'afficher dans les journaux d'audit ProjectZ.
- Accédez à l'API Explorateur de journaux 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 montrera la dernière infraction en mode dry run (test à blanc), qui appartient à Cloud Storage. Voici un exemple de journal. Nous pouvons vérifier que la violation est bien un problème de sortie lorsque vous essayez 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"
- Comme nous avons vérifié que l'appel d'API à Cloud Storage générait 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 de simulation:
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
- Connectez-vous à l'instance de VM via SSH et répertoriez à nouveau le bucket de stockage pour vérifier que le périmètre de simulation a bien été appliqué.
gcloud storage ls gs://BUCKET_NAME
Nous obtiendrons une violation VPC Service Controls dans la CLI 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 ou la copie de données vers une ressource située en dehors du périmètre.
6. Résoudre les problèmes liés au refus de liste.
Nous allons résoudre le problème de refus obtenu à partir de 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 ProjetZ.
- Trouvez 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 de VPC Service Controls s'affichent. Nous allons rechercher le dernier journal d'erreurs. Comme l'appel d'API a été effectué à partir de l'instance de VM, le compte 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 directement le journal souhaité à l'aide du filtre suivant:
protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_ID"
- Cliquez sur l'en-tête VPC Service Controls, puis sélectionnez "Résoudre les problèmes de refus". ce qui ouvrira l'outil de dépannage de VPC Service Controls.
Cette API nous indiquera le motif de non-respect dans une interface utilisateur conviviale et nous indiquera, entre autres, s'il s'agissait d'un non-respect des règles d'entrée ou de sortie.
Dans cet exercice, nous allons étudier 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 pour permettre au compte de service Compute Engine d'accéder au bucket de stockage de ProjectZ à ProjectX. Nous constatons également que le réseau n'est pas dans le même périmètre. Nous devons donc autoriser la communication VPC avec les services et partager des données entre les périmètres de service.
- Activez Cloud Shell et créez un fichier .yaml avec 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 à partir de l'instance de VM.
- Dans la console Cloud, accédez au sélecteur de projet et sélectionnez ProjetZ, 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 que vous êtes dans la CLI 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 répertorier les objets dans le bucket Storage.
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer
- À nouveau, essayons de répertorier le fichier hello.txt à partir de la CLI de l'instance de VM .
gcloud storage ls gs://BUCKET_NAME/ . . gs://BUCKET_NAME/hello.txt
Nous pouvons maintenant répertorier l'objet sans violation des autorisations VPC Service Controls. Mais qu'en est-il du téléchargement du fichier ? Essayons.
gcloud storage cp gs://BUCKET_NAME/hello.txt /home/${USER}
Nous obtenons la sortie suivante :
Copying gs://BUCKET_NAME/hello.txt to file:///home/${USER} Completed files 1/1 | 54.0B/54.0B
7. Nettoyage
Bien qu'il n'y ait pas de frais distincts pour l'utilisation de VPC Service Controls lorsque le service n'est pas utilisé, il est recommandé de nettoyer la configuration utilisée dans ce laboratoire. 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 située à 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, sur 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 "Supprimer l'icône", puis sur Supprimer.
- Pour supprimer l'objet Storage et le bucket, 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 IAM et Paramètres d'administration du projet que vous souhaitez supprimer.
- Dans l'IAM et Paramètres de l'administrateur, 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 de simulation VPC Service Controls, vous l'avez appliqué et vous l'avez résolu.
En savoir plus
- Consultez la documentation de VPC Service Controls.
- Consultez la documentation d'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 le mode test.
- Consultez la documentation Cloud Storage.
Licence
Ce document est publié sous une licence Creative Commons Attribution 2.0 Generic.