Code source sécurisé

Code source sécurisé

À propos de cet atelier de programmation

subjectDernière mise à jour : mars 23, 2023
account_circleRédigé par Mike Ensor

1. Présentation

Les techniques de code source sécurisé sont un ensemble de pratiques permettant d'améliorer la sécurité du code source. Ces techniques peuvent vous aider à identifier et corriger les failles dans le code source, à empêcher tout accès non autorisé au code source et à protéger le code source contre la modification.

Voici quelques techniques courantes de code source sécurisé:

  • Linting:le processus d'analyse lint consiste à rechercher des erreurs et des problèmes de style dans le code source. Pour ce faire, utilisez un outil lint, qui analyse le code source et identifie les problèmes potentiels. Les outils lint peuvent être utilisés pour rechercher diverses erreurs, y compris les erreurs de syntaxe, les erreurs sémantiques, les erreurs de style et les failles de sécurité.
  • Tests de sécurité des applications statiques (SAST) : SAST est un type de test de sécurité qui analyse le code source, le code binaire ou le code d'octet pour identifier les failles de sécurité. Les outils SAST peuvent être utilisés pour détecter les failles dans divers langages de programmation, y compris Go, Java, Python, C++ et C#.
  • Analyse des licences:l'analyse des licences est le processus qui consiste à identifier les licences des composants logiciels tiers utilisés dans une application logicielle. Cette étape est importante, car elle permet de vérifier que l'application respecte les conditions des licences, ce qui permet d'éviter des problèmes juridiques.

Ces techniques peuvent être utilisées pour améliorer la sécurité du code source à toutes les étapes du cycle de développement du logiciel. L'analyse lint permet d'identifier les erreurs au début du processus de développement, de rechercher des failles avant la compilation ou le déploiement du code, et d'analyser les licences pour vérifier que l'application respecte les conditions des licences.

Leur utilisation peut contribuer à améliorer la sécurité du code source et à réduire le risque de brèches de sécurité.

Objectifs de l'atelier

Cet atelier présente les outils et techniques permettant de sécuriser le code source des logiciels.

  • Linting
  • Tests de sécurité des applications statiques
  • Numérisation de licences

Tous les outils et commandes utilisés dans cet atelier seront exécutés dans Cloud Shell.

2. Préparation

Configuration de l'environnement d'auto-formation

  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 modifier à 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. généralement, vous ne vous souciez pas de ce que c’est. Dans la plupart des ateliers de programmation, vous devrez référencer l'ID du projet (il est généralement identifié comme PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre au hasard. Vous pouvez également essayer la vôtre pour voir si elle est disponible. Il ne peut pas être modifié après cette étape et restera actif pendant toute la durée du projet.
  • Pour votre information, il existe une troisième valeur, le numéro de projet, utilisé par certaines API. 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 arrêter les ressources afin d'éviter que des frais ne vous soient facturés au-delà de ce tutoriel, vous pouvez supprimer les ressources que vous avez créées ou l'ensemble du projet. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai gratuit pour bénéficier d'un crédit de 300 $.

Démarrer l'éditeur Cloud Shell

Cet atelier a été conçu et testé pour être utilisé avec l'éditeur Google Cloud Shell. Pour accéder à l'éditeur,

  1. Accédez à votre projet Google à l'adresse https://console.cloud.google.com.
  2. En haut à droite, cliquez sur l'icône de l'éditeur Cloud Shell.

8560cc8d45e8c112.png

  1. Un nouveau volet s'ouvre au bas de la fenêtre.
  2. Cliquez sur le bouton "Ouvrir l'éditeur"

9e504cb98a6a8005.png

  1. L'éditeur s'ouvre avec un explorateur à droite et un éditeur dans la zone centrale
  2. Un volet de terminal devrait également être disponible au bas de l'écran.
  3. Si le terminal n'est PAS ouvert, utilisez la combinaison de touches Ctrl+ pour ouvrir une nouvelle fenêtre de terminal.

Configuration de l'environnement

Définissez GOPATH sur un répertoire unique pour simplifier les commandes utilisées dans cet atelier.

export GOPATH=$HOME/gopath

Créer un répertoire pour stocker notre travail

mkdir -p workspace
cd workspace

Cloner le dépôt du code source

git clone https://gitlab.com/gcp-solutions-public/shift-left-security-workshop/source-code-lab.git
cd source-code-lab
export WORKDIR=$(pwd)

3. Linting

L'analyse lint est utilisée pour vérifier les erreurs ou les défauts courants liés au style liés à la syntaxe. L'analyse lint contribue à la sécurité en fournissant un schéma syntaxique commun à plusieurs équipes, ce qui accélère les revues de code, le partage des connaissances et la clarté du code.

De plus, linting identifie les erreurs de syntaxe courantes qui peuvent entraîner des failles courantes, telles que l'utilisation incorrecte ou moins efficace des bibliothèques ou des API principales.

Installer l'outil d'association staticcheck

 go get honnef.co/go/tools/cmd/staticcheck@latest

Exécuter l'outil lint Go (staticcheck) dans le répertoire racine du projet

 staticcheck

Examiner le résultat

main.go:42:29: unnecessary use of fmt.Sprintf (S1039)

Cette erreur est renvoyée, car http.ListenAndServe() accepte une chaîne, alors que le code actuel utilise Sprintf sans transmettre de variables à la chaîne

Vérifiez l'état de sortie de la commande.

echo $?

Dans ce cas, étant donné que la commande a généré une erreur, l'état de sortie est supérieur ou égal à 1. Il s'agit d'une méthode qui peut être utilisée dans un pipeline CI/CD pour déterminer la réussite ou l'échec de l'outil.

Modifiez le fichier main.go et corrigez le code:

  • Mettez en commentaire la ligne située sous LINTING - Step 1 dans la méthode main() en ajoutant des barres obliques(//).
  • Dans la méthode main(), annulez la mise en commentaire des deux lignes situées juste en dessous de LINTING - Step 2 en supprimant les barres obliques au début.

Réexécutez staticcheck dans le répertoire racine du projet.

staticcheck

La commande ne doit renvoyer aucun résultat (c'est-à-dire une ligne vide).

Inspectez l'état de sortie de la commande.

  echo $?

Dans ce cas, étant donné que la commande n'a généré aucune erreur, l'état de sortie est zéro.

4. Tests de sécurité des applications statiques

Tests de sécurité statiques/AST : ils fournissent une analyse du code statique à la recherche de failles et expositions courantes ( CWE).

Installer l'outil AST (gosec)

    export GOSEC_VERSION="2.15.0"
    curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | \
          sh -s -- -b $(go env GOPATH)/bin v${GOSEC_VERSION}

Exécuter gosec avec le fichier de stratégie sur le code source

gosec -conf policies/gosec-policy.json -fmt=json ./...

Le résultat doit être semblable à ceci :

{
    "Golang errors": {},
    "Issues": [
        {
            "severity": "HIGH",
            "confidence": "LOW",
            "cwe": {
                "ID": "798",
                "URL": "https://cwe.mitre.org/data/definitions/798.html"
            },
            "rule_id": "G101",
            "details": "Potential hardcoded credentials",
            "file": "/home/random-user-here/shift-left-security-workshop/labs/source-code-lab/main.go",
            "code": "31: \t// STEP 2: Change this and the reference below to something different (ie, not \"pawsword\" or \"password\")\n32: \tvar pawsword = \"im-a-cute-puppy\"\n33: \tfmt.Println(\"Something a puppy would use: \", username, pawsword)\n",
            "line": "32",
            "column": "6"
        }
    ],
    "Stats": {
        "files": 1,
        "lines": 89,
        "nosec": 0,
        "found": 1
    }
}

L'outil a identifié un problème potentiel: Potential hardcoded credentials

5. Numérisation de licences

Les licences sont importantes pour la sécurité, car elles peuvent vous obliger légalement à exposer du code source que vous ne souhaitez peut-être pas exposer. Ce concept s'appelle copyleft" licences qui vous obligent à exposer le code source si vous utilisez des dépendances avec ces licences.

Installez golicense

mkdir -p /tmp/golicense
wget -O /tmp/golicense/golicense.tar.gz https://github.com/mitchellh/golicense/releases/download/v0.2.0/golicense_0.2.0_linux_x86_64.tar.gz
pushd /tmp/golicense
tar -xzf golicense.tar.gz
chmod +x golicense
mv golicense $(go env GOPATH)/bin/golicense
popd

Créer le fichier binaire

go build

Vérifiez la licence avec le fichier de règles actuel qui n'autorise pas "BSD-3-Clause" licences

golicense policies/license-policy.hcl hello-world

REMARQUE: Cette opération devrait échouer et renvoyer un résultat semblable à celui-ci:

 🚫 rsc.io/sampler    BSD 3-Clause "New" or "Revised" License
 🚫 rsc.io/quote      BSD 3-Clause "New" or "Revised" License
 🚫 golang.org/x/text BSD 3-Clause "New" or "Revised" License

Modifiez le fichier de stratégie policies/license-policy.hcl pour déplacer la clause "BSD-3-Clause". de la liste deny à la liste allow.

Relancer la vérification des licences

golicense policies/license-policy.hcl hello-world

REMARQUE: Cette opération doit normalement aboutir à un résultat semblable à celui-ci:

    ✅ rsc.io/quote      BSD 3-Clause "New" or "Revised" License
    ✅ rsc.io/sampler    BSD 3-Clause "New" or "Revised" License
    ✅ golang.org/x/text BSD 3-Clause "New" or "Revised" License

6. Félicitations

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

Ce que vous avez appris

  • Outils et techniques pour sécuriser le code source

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