Sécuriser l'approvisionnement logiciel

1. Présentation

Artifact Registry vous permet de stocker différents types d'artefacts, de créer plusieurs dépôts dans un seul projet et d'associer une région ou un emplacement multirégional spécifique à chaque dépôt. Il existe plusieurs modes de dépôt. Chaque mode a une utilité différente. Le schéma suivant montre l'une des nombreuses façons d'utiliser des dépôts dans différents modes. Le schéma montre un workflow dans deux projets Google Cloud. Dans un projet de développement, les développeurs compilent une application Java. Dans un projet d'exécution distinct, une autre compilation crée une image de conteneur avec l'application à déployer sur Google Kubernetes Engine.

5af5e4da3ccfdff3.png

Dans cet atelier, vous allez apprendre à effectuer les tâches suivantes :

  • Utiliser des dépôts standards pour déployer vos packages privés
  • Utiliser des dépôts distants pour mettre en cache les packages centraux Maven
  • Utiliser des dépôts virtuels pour combiner plusieurs dépôts en amont dans une seule configuration

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pouvez le mettre à jour à tout moment.
  • L'ID du projet est unique parmi tous les projets Google Cloud et non modifiable une fois défini. La console Cloud génère automatiquement une chaîne unique (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID de votre projet (généralement identifié par PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire. Vous pouvez également en spécifier un et voir s'il est disponible. Après cette étape, l'ID n'est plus modifiable et restera donc le même pour toute la durée du projet.
  • Pour information, il existe une troisième valeur (le numéro de projet) que certaines API utilisent. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite 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 gratuit pour bénéficier d'un crédit de 300 $.

Configuration de Workspace

Configurer gcloud

Dans Cloud Shell, définissez l'ID et le numéro de votre projet. Enregistrez-les en tant que variables PROJECT_ID et PROJECT_NUMBER.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

Activer les API

gcloud services enable artifactregistry.googleapis.com

Cloner le dépôt

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/container-registry/container-analysis

2. Dépôts standards

Les dépôts standards permettent de stocker vos packages privés et de les partager entre vos autres applications.

Créer un dépôt Maven standard

Dans Cloud Shell, exécutez la commande suivante pour créer un dépôt d'artefacts Java:

gcloud artifacts repositories create container-dev-java-repo \
    --repository-format=maven \
    --location=us-central1 \
    --description="Java package repository for Container Dev Workshop"

Cliquez sur "Autoriser" si l'invite d'autorisation de Cloud Shell s'affiche.

Accédez à la console Google Cloud - Artifact Registry - Repositories (Google Cloud Console - Artifact Registry - Dépôts) et examinez le dépôt Maven que vous venez de créer, nommé container-dev-java-repo. Si vous cliquez dessus, vous constaterez qu'il est vide pour le moment.

gcloud artifacts repositories describe container-dev-java-repo \
    --location=us-central1

Vous devriez obtenir une réponse semblable à celle-ci :

Encryption: Google-managed key
Repository Size: 0.000MB
createTime: '2023-03-21T19:01:45.461589Z'
description: Java package repository for Container Dev Workshop
format: MAVEN
mavenConfig: {}
mode: STANDARD_REPOSITORY
name: projects/qwiklabs-gcp-03-4304110dc461/locations/us-central1/repositories/container-dev-java-repo
updateTime: '2023-03-21T19:01:45.461589Z'

Configurer Maven pour Artifact Registry

Exécutez la commande suivante pour imprimer la configuration du dépôt à ajouter à votre projet Java:

gcloud artifacts print-settings mvn \
    --repository=container-dev-java-repo \
    --location=us-central1

La commande précédente renvoie du code XML à ajouter au fichier pom.xml de vos projets.

  • La section repositories (Dépôts) spécifie où Maven peut télécharger des artefacts distants à utiliser par le projet en cours.
  • La section distributionManagement spécifie le dépôt distant vers lequel le projet sera transféré lors de son déploiement.
  • La section extensions ajoute artifactregistry-maven-wagon, qui active la couche d'authentification et de transport requise pour se connecter à Artifact Registry.
  • Remarque: Les extensions peuvent se trouver dans pom.xml ou extensions.xml. Si le projet dépend d'un projet parent, ces dépendances sont accessibles avant le chargement du reste des entrées du fichier pom.xml. Pour s'assurer que le parent a accès à l'extension, celle-ci peut être placée dans un fichier extensions.xml qui est chargé avant le fichier pom.xml, ce qui la rend disponible pour les dépendances parentes.

Copiez les trois sections, puis ouvrez le fichier pom.xml dans l'éditeur Cloud Shell et ajoutez les paramètres renvoyés au bas du fichier, juste après la balise project de fermeture.

Conseil: Dans Cloud Shell, exécutez la commande suivante dans le terminal pour ouvrir l'éditeur dans le répertoire actuel.

cloudshell workspace .

Exemple: (les noms de vos projets seront différents dans vos URL)

  ...

  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>

Importer votre package Java dans Artifact Registry

Maintenant qu'Artifact Registry est configuré dans Maven, vous pouvez l'utiliser pour stocker des fichiers JAR Java à utiliser par d'autres projets de votre organisation.

Exécutez la commande suivante pour importer votre package Java dans Artifact Registry:

mvn deploy -DskipTests

Si vous souhaitez exécuter à nouveau cette commande, veillez à augmenter la version dans le fichier pom.xml.

Vérifier le package Java dans Artifact Registry

Accédez à Cloud Console - Artifact Registry - Repositories (Console Cloud - Artifact Registry - Repositories). Cliquez sur container-dev-java-repo et vérifiez que l'artefact binaire hello-world est présent:

147eac5168648db1.png

3. Dépôts distants

Les dépôts distants permettent de mettre en cache des packages tiers pour améliorer la fiabilité et la sécurité.

Créer un dépôt distant

Remarque: Pour en savoir plus sur l'authentification et la configuration, consultez la documentation du produit.

Dans Cloud Shell, exécutez la commande suivante pour créer un dépôt distant pour les artefacts Maven Central:

gcloud artifacts repositories create maven-central-cache \
    --project=$PROJECT_ID \
    --repository-format=maven \
    --location=us-central1 \
    --description="Remote repository for Maven Central caching" \
    --mode=remote-repository \
    --remote-repo-config-desc="Maven Central" \
    --remote-mvn-repo=MAVEN-CENTRAL

Examiner le dépôt dans la console

Accédez à Cloud Console - Artifact Registry - Repositories (Console Cloud - Artifact Registry - Repositories). Cliquez sur maven-central-cache. Vous constaterez qu'il a été créé et qu'il est actuellement vide.

Examiner le dépôt dans le terminal

gcloud artifacts repositories describe maven-central-cache \
    --location=us-central1

Intégrer le dépôt dans votre projet

Exécutez la commande suivante pour imprimer la configuration du dépôt à ajouter à votre projet Java:

gcloud artifacts print-settings mvn \
    --repository=maven-central-cache \
    --location=us-central1

Ajoutez la section du dépôt dans votre fichier pom.xml. Veillez à ne pas copier la balise <repositories> externe à partir de la sortie.

Remplacez l'ID du dépôt nouvellement ajouté par "central" pour vous assurer que chaque entrée de dépôt dispose d'un ID unique.

Exemple: (les noms de vos projets seront différents dans vos URL)

  ...

  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>

    <repository>
      <id>central</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/maven-central-cache</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>


  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>

Exécutez les commandes suivantes dans votre terminal pour créer un extensions.xml pour votre projet. Pour utiliser le mécanisme des extensions de base, assurez-vous que Maven peut résoudre les dépendances parentes ou de plug-in à partir d'Artifact Registry.

mkdir .mvn 
cat > .mvn/extensions.xml << EOF
<extensions xmlns="http://maven.apache.org/EXTENSIONS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd">
  <extension>
    <groupId>com.google.cloud.artifactregistry</groupId>
    <artifactId>artifactregistry-maven-wagon</artifactId>
    <version>2.2.0</version>
  </extension>
</extensions>
EOF

Extraire les dépendances du dépôt distant

Exécutez la commande suivante pour compiler votre application à l'aide du dépôt distant:

rm -rf ~/.m2/repository 
mvn compile

Examiner les packages dans la console

Accédez à Cloud Console - Artifact Registry - Repositories (Console Cloud - Artifact Registry - Repositories). Cliquez sur maven-central-cache et vérifiez que les artefacts binaires mis en cache y figurent:

9deea93caa5fefd7.png

4. Dépôts virtuels

Les dépôts virtuels servent d'interface pour accéder à plusieurs dépôts via une seule configuration. Cela simplifie la configuration du client pour les consommateurs de vos artefacts et renforce la sécurité en atténuant les attaques de confusion des dépendances.

Créer un fichier de règles

cat > ./policy.json << EOF
[
  {
    "id": "private",
    "repository": "projects/${PROJECT_ID}/locations/us-central1/repositories/container-dev-java-repo",
    "priority": 100
  },
  {
    "id": "central",
    "repository": "projects/${PROJECT_ID}/locations/us-central1/repositories/maven-central-cache",
    "priority": 80
  }
]

EOF

Créer le dépôt virtuel

gcloud artifacts repositories create virtual-maven-repo \
    --project=${PROJECT_ID} \
    --repository-format=maven \
    --mode=virtual-repository \
    --location=us-central1 \
    --description="Virtual Maven Repo" \
    --upstream-policy-file=./policy.json

Intégrer le dépôt dans votre projet

Exécutez la commande suivante pour imprimer la configuration du dépôt à ajouter à votre projet Java:

gcloud artifacts print-settings mvn \
    --repository=virtual-maven-repo \
    --location=us-central1

Remplacez l'intégralité de la section "repositories" de votre fichier pom par la section "repositories virtuels" de la sortie.

Exemple: (les noms de vos projets seront différents dans vos URL)

  ...


  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/virtual-maven-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>


Extraire des dépendances du dépôt virtuel

Étant donné que le dépôt virtuel est un transfert et ne stocke aucun paquet, pour illustrer clairement le processus, vous allez supprimer le dépôt maven-central-cache que vous avez créé précédemment et le recréer pour recommencer avec un dépôt vide.

Exécutez les commandes suivantes pour recréer le dépôt de cache.

gcloud artifacts repositories delete maven-central-cache \
    --project=$PROJECT_ID \
    --location=us-central1 \
    --quiet

gcloud artifacts repositories create maven-central-cache \
    --project=$PROJECT_ID \
    --repository-format=maven \
    --location=us-central1 \
    --description="Remote repository for Maven Central caching" \
    --mode=remote-repository \
    --remote-repo-config-desc="Maven Central" \
    --remote-mvn-repo=MAVEN-CENTRAL

Vous pouvez consulter le dépôt vide dans la console. Accédez à Cloud Console - Artifact Registry - Repositories (Cloud Console - Artifact Registry - Repositories).

Exécutez maintenant le dépôt virtuel en créant votre projet avec la commande suivante :

rm -rf ~/.m2/repository 
mvn compile

Examiner les packages dans la console

Accédez à Cloud Console - Artifact Registry - Repositories (Console Cloud - Artifact Registry - Repositories). Cliquez sur maven-central-cache et vérifiez que les artefacts binaires ont été configurés pour être extraits du dépôt virtuel, mais qu'ils ont finalement été extraits de maven-central-cache:

9deea93caa5fefd7.png

5. Félicitations !

Félicitations, vous avez terminé cet atelier de programmation.

Points abordés

  • Utilisation de dépôts standards pour déployer vos packages privés
  • Utilisation de dépôts distants pour mettre en cache les packages centraux Maven
  • Utilisation de dépôts virtuels pour combiner plusieurs dépôts en amont dans une seule configuration

Nettoyage

Exécutez la commande suivante pour supprimer le projet :

gcloud projects delete ${PROJECT_ID}

Dernière mise à jour: 22/03/23