Analyse des failles basée sur les listes d'autorisation avec Container Analysis

Ce tutoriel explique comment développer et utiliser Kritis Signer avec Container Analysis pour rechercher les failles des images de conteneurs créées avec Cloud Build. Kritis Signer vérifie les failles identifiées en fonction de règles sur les failles. L'étape de compilation Cloud Build échoue si une faille identifiée ne respecte pas les règles sur les failles.

Présentation

Lorsque vous sécurisez votre chaîne d'approvisionnement logicielle basée sur des conteneurs, il peut être essentiel d'empêcher le déploiement d'une image de conteneur vulnérable. Container Analysis fournit des services d'analyse de failles appliqués aux images de conteneurs. Kritis Signer est un compilateur personnalisé Open Source pour Cloud Build qui s'exécute en tant qu'étape de compilation et qui utilise Container Analysis pour identifier les failles d'une image de conteneur. Il vérifie ensuite ces failles en fonction des règles sur les failles. Si l'une des failles identifiées ne respecte pas les règles sur les failles de Kritis Signer, la compilation échoue. Dans le contexte de l'autorisation binaire, vous pouvez ajouter une étape de compilation Kritis Signer à un pipeline de compilation d'images de conteneurs afin que la compilation échoue, avant la création d'une attestation, en cas de non-respect des règles.

Dans ce tutoriel, vous allez :

  1. cloner le dépôt Kritis ;
  2. créer le compilateur personnalisé Kritis Signer qui analyse les failles avec Container Analysis ;
  3. afficher des règles sur les failles ;
  4. envoyer à Cloud Build des exemples de compilations qui créent une image de conteneur et recherchent des failles.

    • Le premier exemple de compilation d'image de conteneur, cloudbuild-bad.yaml, est un exemple d'échec. Dans ce cas, Kritis Signer détecte des failles dans l'image de conteneur qui ne respectent pas les règles sur les failles. L'étape de compilation échoue, ce qui met fin au pipeline de compilation.

    • Le deuxième exemple de compilation d'image de conteneur, cloudbuild-good.yaml, est un exemple de réussite. Dans ce cas, Kritis Signer ne doit pas trouver de faille dans l'image de conteneur qui ne respecte pas les règles sur les failles. L'étape de compilation va donc réussir.

Produits utilisés dans ce tutoriel

Ce tutoriel utilise les produits Open Source et Google Cloud suivants :

  • Cloud Build est un produit Google Cloud qui exécute vos compilations sur l'infrastructure Google Cloud. Cloud Build exécute votre compilation sous la forme d'étapes de compilation, où chaque étape est exécutée dans un conteneur Docker. Dans ce tutoriel, Kritis Signer est intégré à un compilateur personnalisé Cloud Build qui peut être utilisé par la suite dans vos pipelines de compilation. Cloud Build est également utilisé pour créer les exemples de réussite et d'échec, en montrant comment inclure l'analyse des failles dans vos pipelines de compilation.

  • Kritis est une solution Open Source permettant de sécuriser votre chaîne d'approvisionnement logicielle pour les applications Kubernetes. Kritis Signer est un compilateur personnalisé Cloud Build qui vérifie les failles identifiées par Container Analysis en fonction des règles sur les failles.

  • Container Registry est un registre privé d'images de conteneurs Google Cloud qui s'exécute sur Google Cloud. Dans ce tutoriel, le compilateur personnalisé Kritis Signer et les exemples d'images de conteneurs sont stockés dans Container Registry.

  • Container Analysis est un produit Google Cloud qui permet d'analyser les failles et de stocker les métadonnées des artefacts logiciels. Le service effectue des analyses des failles sur des artefacts logiciels, tels que les images de Container Registry, puis stocke les métadonnées obtenues et les tient à disposition via une API. Dans ce tutoriel, Kritis Signer appelle Container Analysis pour identifier les failles dans les images de conteneurs.

Prérequis

Dans cette section, vous allez effectuer une configuration unique du système. Cela inclut les étapes suivantes :

  1. Configurer votre environnement
  2. Activer des API
  3. Définir des autorisations sur le compte de service utilisé par Cloud Build pour les opérations de lecture à partir de Container Analysis
  4. Cloner le dépôt Kritis
  5. Créer le compilateur personnalisé Cloud Build Kritis Signer
  6. Modifier les règles sur les failles

Dans la section suivante, vous allez exécuter des exemples de pipelines de compilation avec Cloud Build.

Configurer votre environnement

Tout d'abord, définissez PROJECT_ID dans votre projet Google Cloud. Ce projet est utilisé pour l'ensemble du tutoriel.

export PROJECT_ID=PROJECT-ID

PROJECT-ID correspond à l'ID du projet Google Cloud.

export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")

Activer des API

gcloud --project=$PROJECT_ID services enable cloudbuild.googleapis.com
gcloud --project=$PROJECT_ID services enable containerregistry.googleapis.com
gcloud --project=$PROJECT_ID services enable containeranalysis.googleapis.com
gcloud --project=$PROJECT_ID services enable containerscanning.googleapis.com

Configurer les autorisations

Exécutez la commande suivante pour accorder au compte de service Cloud Build l'accès en lecture aux informations sur les failles à partir de Container Analysis.

gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.occurrences.viewer

Créer le compilateur personnalisé Kritis Signer

Exécutez les commandes suivantes pour obtenir le code et les fichiers de configuration utilisés dans ce tutoriel.

  1. Clonez le dépôt Kritis.

    git clone --branch policy-check-v1.0.0 https://github.com/grafeas/kritis.git
    

    Ce dépôt contient les éléments suivants :

    • Les ressources Open Source pour Kritis.
    • Les fichiers de configuration de compilation utilisés par Cloud Build pour créer le compilateur personnalisé Kritis Signer.
    • Un exemple de règles sur les failles.
    • Un exemple de fichier de configuration de compilation Cloud Build qui présente l'analyse des failles de Kritis Signer dans un pipeline de compilation.
  2. Accédez au répertoire /kritis :

    cd kritis
    
  3. Envoyez le compilateur personnalisé Kritis Signer à votre projet.

    Cette étape unique permet de créer un compilateur personnalisé utilisé dans vos pipelines de failles.

    gcloud --project=$PROJECT_ID builds submit . --config deploy/kritis-signer/cloudbuild.yaml
    

Modifier les règles de signature des failles

Cette section décrit les règles sur les failles que Kritis Signer applique. Modifiez ces règles pour déterminer les niveaux de gravité autorisés et répertorier les failles spécifiques autorisées.

Pour afficher les règles sur les failles, exécutez la commande suivante :

cat samples/policy-check/policy.yaml

Elles doivent se présenter comme ceci :

apiVersion: kritis.grafeas.io/v1beta1
kind: VulnzSigningPolicy
metadata:
  name: my-vsp
spec:
  imageVulnerabilityRequirements:
    maximumFixableSeverity: MEDIUM
    maximumUnfixableSeverity: MEDIUM
    allowlistCVEs:
    - projects/goog-vulnz/notes/CVE-2020-10543
    - projects/goog-vulnz/notes/CVE-2020-10878
    - projects/goog-vulnz/notes/CVE-2020-14155

Où :

  • allowlistCVEs est une liste de failles. Notez que chaque entrée doit correspondre exactement au nom de la note.
  • maximumUnfixableSeverity et maximumFixableSeverity peuvent avoir les valeurs suivantes :

    • CRITICAL (CRITIQUE)
    • HIGH (ÉLEVÉ)
    • MEDIUM (MOYEN)
    • LOW (FAIBLE)
    • BLOCK_ALL (TOUT BLOQUER) – Échec dès lors qu'une faille est identifiée
    • ALLOW_ALL (TOUT AUTORISER) – L'opération réussit toujours

Tester le compilateur personnalisé Kritis Signer

Dans cette section, vous allez envoyer des exemples de compilation à Cloud Build.

Dans les étapes suivantes, deux compilations d'images de conteneurs sont envoyées à Cloud Build :

  • Exemple d'échec : la première compilation crée une image de conteneur présentant une faille, qui déclenche le non-respect des règles sur les failles. Cette compilation va échouer.
  • Exemple de réussite : la deuxième compilation crée une image de conteneur présentant des failles, mais qui sont autorisées par les règles sur les failles. Cette compilation va réussir.

Les deux exemples de fichiers de configuration de compilation contiennent les étapes suivantes :

  1. L'étape build crée une image de conteneur Docker.
  2. L'étape push transfère l'image de conteneur qui vient d'être créée vers Container Registry.
  3. L'étape vulnsign analyse l'image de conteneur en procédant comme suit :
    1. Elle attend que Container Analysis renvoie les résultats des failles sur la nouvelle image de conteneur.
    2. Elle vérifie les résultats en fonction des règles sur les failles.
    3. Elle détermine la réussite ou l'échec en fonction du respect des règles.

Envoyer l'exemple d'échec de la compilation

Cet exemple crée une image de conteneur basée sur Debian 9. Actuellement, le conteneur présente une faille qui n'est pas autorisée par les règles sur les failles décrites ci-dessus. Le compilateur personnalisé Kritis Signer échouera à l'étape de compilation vulnsign.

Pour afficher le contenu du fichier de compilation, saisissez la commande suivante :

cat samples/policy-check/cloudbuild-bad.yaml

Exécuter le pipeline de compilation

gcloud  --project=$PROJECT_ID builds submit --config=samples/policy-check/cloudbuild-bad.yaml samples/policy-check

Ce type de message s'affiche :

ERROR: (gcloud.builds.submit) build [BUILD-ID] completed with status "FAILURE"

Notez la valeur [BUILD-ID] et définissez la variable d'environnement $BUILD_ID pour l'étape suivante.

export BUILD_ID=BUILD-ID

Vous pouvez également trouver l'ID de la dernière compilation en exécutant la commande suivante :

gcloud builds list --limit 1

L'ID de compilation correspond au premier champ renvoyé. Modifiez la valeur --limit pour afficher plus de compilations ou supprimez complètement l'option pour afficher toutes les compilations.

Vérifier le résultat

gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "does not pass VulnzSigningPolicy"

Envoyer l'exemple de réussite de la compilation

Pour envoyer l'exemple de réussite de la compilation dans Cloud Build, procédez comme suit :

gcloud --project=$PROJECT_ID builds submit --config=samples/policy-check/cloudbuild-good.yaml samples/policy-check

Veillez à noter l'ID de la compilation et à le stocker dans la variable d'environnement $BUILD_ID :

export BUILD_ID=BUILD-ID

Enfin, pour vérifier le résultat, saisissez la commande suivante :

gcloud --project=$PROJECT_ID builds describe $BUILD_ID | grep status

Étapes suivantes