Revue de code et analyse de sécurité avec la CLI Gemini et les extensions

1. 📖 Introduction

194a7f6f1a93b614.png

Dans cet atelier de programmation, vous allez découvrir les principes de base de l'interface de ligne de commande Gemini et utiliser son extension d'analyse du code et de la sécurité dans votre workflow de développement logiciel.

Points abordés

  • Configurer la CLI Gemini
  • Configurer la CLI Gemini
  • Installer l'extension Gemini CLI
  • Utiliser l'extension Gemini CLI pour l'examen du code et l'analyse de la sécurité
  • Configurer MCP pour la CLI Gemini
  • Inspecter la CLI Gemini dans CI/CD

Prérequis

  • Navigateur Web Chrome
  • Un compte Gmail
  • Un projet Cloud pour lequel un compte de facturation est activé

2. 🚀 Préparer la configuration de développement de l'atelier

Étape 1 : Sélectionnez le projet actif dans la console Cloud

Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud (voir la section en haut à gauche de la console).

3a143645e891087.png

Cliquez dessus pour afficher la liste de tous vos projets, comme dans cet exemple :

59e03077d1ba2039.png

La valeur indiquée par l'encadré rouge correspond à l'ID du projet. Elle sera utilisée tout au long du tutoriel.

Assurez-vous que la facturation est activée pour votre projet Cloud. Pour vérifier cela, cliquez sur l'icône ☰ en haut à gauche de la barre pour afficher le menu de navigation, puis recherchez le menu "Facturation".

973396bb9d9c3523.png

837e03fb7edafdc4.png

Si vous voyez le compte de facturation de l'essai Google Cloud Platform sous le titre Facturation / Présentation ( en haut à gauche de la console Cloud), votre projet est prêt à être utilisé pour ce tutoriel. Si ce n'est pas le cas, revenez au début de ce tutoriel et utilisez le compte de facturation de l'essai.

7f607aa026552bf5.png

Étape 2 : Familiarisez-vous avec Cloud Shell

Vous utiliserez Cloud Shell pour la majeure partie des tutoriels. Cliquez sur "Activer Cloud Shell" en haut de la console Google Cloud. Si vous êtes invité à donner votre autorisation, cliquez sur Autoriser.

1829c3759227c19b.png

b8fe7df5c3c2b919.png

Une fois connecté à Cloud Shell, nous devons vérifier si le shell ( ou le terminal) est déjà authentifié avec notre compte.

gcloud auth list

Si votre adresse Gmail personnelle s'affiche comme dans l'exemple ci-dessous, tout est en ordre.

Credentialed Accounts

ACTIVE: *
ACCOUNT: alvinprayuda@gmail.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

Si ce n'est pas le cas, essayez d'actualiser votre navigateur et assurez-vous de cliquer sur Autoriser lorsque vous y êtes invité ( la connexion peut être interrompue en raison d'un problème de connexion).

Ensuite, nous devons également vérifier si le shell est déjà configuré avec le bon ID de projet. Si une valeur est affichée entre parenthèses avant l'icône $ dans le terminal (dans la capture d'écran ci-dessous, la valeur est "your-workshop-project"), cela indique le projet configuré pour votre session de shell active.

25e65d7ad1d62de0.png

Si la valeur affichée est déjà correcte, vous pouvez ignorer la commande suivante. Toutefois, si elle est incorrecte ou manquante, exécutez la commande suivante :

gcloud config set project <YOUR_PROJECT_ID>

Étape 3 : Familiarisez-vous avec l'éditeur Cloud Shell et configurez le répertoire de travail de l'application

Nous pouvons maintenant configurer notre éditeur de code pour effectuer certaines tâches de codage. Pour cela, nous allons utiliser l'éditeur Cloud Shell.

Cliquez sur le bouton Ouvrir l'éditeur pour ouvrir l'éditeur Cloud Shell b16d56e4979ec951.png.

L'interface de l'éditeur Cloud Shell s'affiche, comme illustré ci-dessous.

74e9e030342164b6.png

Clonez maintenant le dépôt de démonstration avec lequel nous allons interagir. Nous devons d'abord ouvrir le terminal pour l'éditeur. Pour ce faire, cliquez sur Terminal > Nouveau terminal dans la barre de menu ou utilisez le raccourci clavier Ctrl+Maj+C. Une fenêtre de terminal s'ouvrira en bas du navigateur.

95e31ec63a88890d.png

Exécutez ensuite cette commande dans le terminal.

git clone https://github.com/alphinside/gemini-cli-code-analysis-demo.git code-analysis-demo

Ensuite, accédez à la section supérieure de l'éditeur Cloud Shell et cliquez sur File > Open Folder (Fichier > Ouvrir le dossier). Recherchez votre répertoire nom d'utilisateur, puis le répertoire du dépôt cloné code-analysis-demo, puis cliquez sur le bouton OK. Le répertoire choisi deviendra le répertoire de travail principal. Dans cet exemple, le nom d'utilisateur est alvinprayuda. Le chemin d'accès au répertoire est donc indiqué ci-dessous.

ee00d484ff2f8351.png

194f63ef6de51b9.png

Votre répertoire de travail de l'éditeur Cloud Shell devrait maintenant se présenter comme suit :

2d53c6161b553e68.png

Nous pouvons maintenant passer à la phase suivante.

3. 🚀 Configuration

Si vous souhaitez installer la Gemini CLI sur votre système local, vous pouvez suivre ces étapes :

  1. Assurez-vous que votre système dispose de Node version 20 ou ultérieure.
  2. Activez la CLI Gemini en procédant de l'une des manières suivantes :
  • Installation en tant que package global
# Install as an executor

npm install -g @google/gemini-cli

# then run it from terminal
gemini
  • Vous pouvez également l'exécuter directement à partir de la source pour toujours obtenir la dernière version.
npx https://github.com/google-gemini/gemini-cli

Lorsque vous l'exécutez pour la première fois, plusieurs questions vous sont posées. Si vous l'exécutez à partir d'un IDE (par exemple, VSCode), la question suivante vous sera posée :

7f0f7d5091df7abb.png

Il vous proposera ensuite plusieurs options d'authentification.

7ce5c6574f249304.png

Plusieurs possibilités s'offrent à vous :

  • Si vous choisissez Se connecter avec Google, une page d'authentification Google s'ouvre dans le navigateur. Il vous suffit de l'accepter.
  • Si vous préférez utiliser une clé API Gemini, vous devrez en créer une sur la page AI Studio, puis créer un fichier .env dans votre répertoire de travail avec la variable GEMINI_API_KEY définie ( ou exécuter la commande export GEMINI_API_KEY="your-api-key" sur la ligne de commande).
  • Si vous choisissez d'utiliser Vertex AI,vous aurez besoin d'un projet comme celui que vous avez configuré précédemment. Vous devrez également créer un fichier .env et définir les variables GOOGLE_CLOUD_PROJECT et GOOGLE_CLOUD_LOCATION.

Si vous souhaitez modifier ces méthodes d'authentification, vous pouvez exécuter la commande /auth à partir de la CLI Gemini ou modifier le fichier de configuration. Si vous souhaitez modifier directement le fichier de configuration, il devrait se trouver sous Linux dans $HOME/.gemini/settings.json . Vous verrez le type security et auth. Modifiez-le.

{
  "security": {
    "auth": {
      "selectedType": "vertex-ai" # or "gemini-api-key" or "oauth-personal"
    }
  }
}

72300c1f781857c8.png

4. 🚀 Commandes de base et outils intégrés

Maintenant, jouons avec la CLI Gemini pour en savoir plus. Si vous recherchez des commandes de base à utiliser, vous pouvez saisir /help pour afficher toutes les commandes disponibles.

800d1b06a5ad9f9c.png

/help

Le résultat doit ressembler à ceci : f46a75c6bb177a2b.png

La CLI Gemini est un agent d'IA. Elle dispose donc d'outils pour résoudre la tâche confiée par l'utilisateur. Pour afficher les outils intégrés, exécutez la commande /tools.

17a6d7fcf06df563.png

/tools

Le résultat doit ressembler à ceci :

7d22b38a387f45d0.png

Vous pouvez constater que la CLI Gemini possède plusieurs fonctionnalités, comme la lecture et l'écriture dans des fichiers, la recherche sur le Web et bien d'autres. Plusieurs de ces outils nécessitaient une confirmation de l'utilisateur par défaut en raison du risque potentiel.

Voyons maintenant comment cela fonctionne en exécutant ces requêtes dans Gemini CLI.

15e2d863a4eb8df4.png

Find top 10 OWASP security issue and write it down to owasp.md

Vous verrez qu'il invoquera l'outil GoogleSearch et qu'il écrira ensuite le résultat à l'aide de l'outil WriteFile. Si vous utilisez un IDE, vous verrez que les suggestions sont présentées sous forme de diff et d'option d'affichage, ce qui vous permet de les accepter ou de les refuser. Ici, vous pouvez voir que la CLI Gemini vous demande l'autorisation d'écrire le fichier.

8163f43b05ca59a3.png

5. 🚀 Extensions

Pour améliorer le résultat d'une tâche spécifique avec un agent d'IA, les difficultés résident dans la façon de rédiger une requête appropriée, de gérer une ingénierie contextuelle appropriée avec une intégration d'outils appropriée, etc.

Les extensions Gemini CLI sont des intégrations et des requêtes préconfigurées et faciles à installer qui peuvent se connecter à des outils externes. Chaque extension contient un "playbook" intégré sur la façon d'utiliser efficacement les outils. Elle peut se composer des éléments suivants :

  • Commandes à barre oblique personnalisées
  • Configurations MCP
  • Fichiers de contexte

6da12f33463ac755.png

Installer des extensions de sécurité

Par exemple, dans ce tutoriel, nous allons voir comment installer les extensions code-review et security.

Exécutez la commande suivante pour installer les extensions security à partir du terminal.

gemini extensions install https://github.com/gemini-cli-extensions/security

Les questions suivantes s'affichent. Appuyez simplement sur Entrée pour accepter.

Installing extension "gemini-cli-security".
**Extensions may introduce unexpected behavior. Ensure you have investigated the extension source and trust the author.**
This extension will run the following MCP servers:
  * securityServer (local): node /home/alvinprayuda/.gemini/extensions/gemini-cli-security/mcp-server/dist/security.js
This extension will append info to your gemini.md context using GEMINI.md
Do you want to continue? [Y/n]:
Extension "gemini-cli-security" installed successfully and enabled.

Installer des extensions d'examen du code

Ensuite, installons l'extension code-review en exécutant la commande ci-dessous.

gemini extensions install https://github.com/gemini-cli-extensions/code-review

Une fois l'opération terminée, exécutez à nouveau la CLI Gemini.

gemini

et exécutez la commande /extensions, vous verrez que ces deux extensions sont déjà installées.

88a86a0dc42fc510.png

/extensions

Bien, passons maintenant à l'exécution pratique sur l'exemple de dépôt que vous avez cloné précédemment.

6. 🚀 Mode interactif : application d'extension d'analyse de la sécurité du code

L'extension Security est une extension Gemini CLI Open Source conçue pour améliorer la sécurité du dépôt. L'extension ajoute une nouvelle commande à la CLI Gemini qui analyse les modifications de code pour identifier divers risques et failles de sécurité.

Préparons d'abord notre dépôt de démonstration. Exécutez la commande suivante pour passer à la branche où les modifications présentant un risque de sécurité sont déjà appliquées.

git checkout refactor/analysis-demo

Exécutez ensuite la CLI Gemini dans le terminal.

gemini

Exécutons ensuite les extensions.

e3fcf630238f9b2e.png

/security:analyze

Cela lancera un processus de longue durée. Au cours de ce processus, vous recevrez plusieurs interruptions vous demandant l'autorisation d'exécuter des opérations spécifiques telles que mkdir, comme indiqué ci-dessous.

10d6ad2ef91b5acf.png

Il s'agit d'un mécanisme de protection visant à s'assurer que les utilisateurs sont conscients de ce qui sera exécuté par Gemini CLI. Pour le reste du tutoriel, vous pouvez toujours l'autoriser ( option 2).

Cette extension appelle un processus de longue durée. Vous pouvez voir qu'elle crée un fichier de planification dans le répertoire .gemini_security et vous pouvez voir la checklist des processus effectués ou non. Comme le montre l'exemple ci-dessous :

543035cb65d27804.png

L'exécution des tâches prendra un certain temps. En attendant, nous pouvons vérifier la source de ces extensions dans le dépôt GitHub. Cette URL affiche l'invite utilisée pour exécuter tous ces processus d'analyse de sécurité.

73f4966870bc9ddf.png

Comme vous pouvez le voir, pour effectuer cette analyse, le prompt demande à la Gemini CLI d'effectuer une vérification en deux passes : la passe de reconnaissance et la passe d'investigation plus détaillée.

Si vous rencontrez l'invite suivante dans la Gemini CLI, vous pouvez choisir l'option 2 pour désactiver la détection de boucle.

a0af5e15627afa83.png

Demandez ensuite à Gemini CLI de continuer.

611a7ed0fb6fc44b.png

continue

Il s'agit d'un mécanisme permettant d'éviter les boucles infinies d'appels d'outils non productifs, qui continuera d'être amélioré au fil du temps.

Une fois terminé, le rapport s'affichera dans le terminal interactif. Pour faciliter la tâche, demandons à la Gemini CLI de l'écrire dans security-analysis.md.

b4cbad3aaeaa8dce.png

write the result to security-analysis.md file

Vous pouvez maintenant inspecter le résultat écrit dans le fichier.

7. 🚀 Mode non interactif : application d'extension d'examen du code

L'extension code-review ajoute une nouvelle commande à l'interface de ligne de commande Gemini qui analyse les modifications de code pour identifier divers problèmes de qualité du code.

Cette extension peut être exécutée en mode non interactif dans la CLI Gemini, ce qui signifie que l'ensemble du processus peut être exécuté sans avoir à saisir la ligne de commande de la CLI Gemini. Pour exécuter Gemini CLI en mode non interactif, vous pouvez utiliser le modèle de commande suivant :

gemini "put your command here"

Toutefois, il est important de noter que l'exécution en mode non interactif désactivera toute opération d'outil nécessitant l'autorisation de l'utilisateur. Nous devons donc ajouter l'indicateur --yolo pour approuver automatiquement toutes les actions, ce qui signifie activer tous les outils en mode non interactif.

Exécutons l'extension code-review avec la commande suivante :

gemini "/code-review" --yolo -e code-review > code-review.md

Cette commande écrit le résultat de la sortie de la CLI Gemini dans le fichier code-review.md. Notez l'indicateur -e ici. Il contrôle l'extension à activer pendant la session. Ici, nous n'activons que l'extension code-review et désactivons les autres.

Cela prendra un certain temps, mais une fois terminé, vous pourrez voir un résultat semblable à celui indiqué ci-dessous écrit dans le fichier Markdown.

Here are the results of the code review.

While the recent changes to rename `get_products` and `get_product` to `GetProducts` and `GetProduct` are minor, the codebase has some inconsistencies in its naming conventions. For instance, other functions like `create_product` use `snake_case`, while the newly renamed functions use `PascalCase`. For better code quality and readability, I recommend using a consistent naming convention throughout the project.

More importantly, I have identified several security vulnerabilities in the `main.py` file. Here is a summary of the findings:

### 1. SQL Injection
*   **Severity**: High
*   **Location**: 
    *   `main.py:99` in `get_products_by_category`
    *   `main.py:146` in `search_products`
    *   `main.py:372` in `get_user_transactions`
    *   `main.py:438` in `adjust_inventory_by_query`
*   **Description**: The endpoints directly use f-strings to construct SQL queries, making them vulnerable to SQL injection attacks. An attacker could manipulate the input to execute arbitrary SQL commands, potentially leading to data breaches or unauthorized modifications.
*   **Recommendation**: Use parameterized queries or an ORM to handle database interactions. This will ensure that user input is properly sanitized and prevent SQL injection attacks.

### 2. Server-Side Request Forgery (SSRF)
*   **Severity**: High
*   **Location**: `main.py:265` in `fetch_url`
*   **Description**: The `fetch_url` endpoint allows users to specify an arbitrary URL, which the server then requests. This can be exploited to make requests to internal services or local files, leading to information disclosure or other security breaches.
*   **Recommendation**: Implement a whitelist of allowed domains or protocols to restrict the URLs that can be requested. Additionally, you can disable redirects and use a timeout to limit the impact of an attack.

### 3. Information Exposure
*   **Severity**: Medium
*   **Location**: `main.py:423` in `get_environment_variables`
*   **Description**: The `get_environment_variables` endpoint exposes all environment variables to the user. This can include sensitive information such as API keys, database credentials, and other secrets.
*   **Recommendation**: Remove this endpoint or restrict access to it to authorized users. If you need to expose some environment variables, do so selectively and avoid exposing sensitive information.

8. 🚀 Compatibilité avec le protocole MCP

Comme nous l'avons vu précédemment dans les explications sur les extensions, la CLI Gemini peut se connecter aux serveurs MCP, c'est-à-dire aux applications qui fournissent des outils et des ressources via le protocole MCP (Model Context Protocol). Cette connexion permet à la CLI Gemini d'interagir avec des systèmes et des sources de données externes en utilisant des serveurs MCP comme ponts vers votre environnement local et des services externes tels que les API.

5f1cdd4be3e7b42a.png

Si vous souhaitez configurer votre propre serveur MCP, vous devez modifier votre fichier .gemini/settings.json et ajouter les configurations suivantes :

{
    ...
    # Previous settings above if any
    "mcpServers": {
       "server_name": {
           # MCP server configurations here
       }
    }
}

Pour ce tutoriel, configurons la connexion à notre compte GitHub afin d'envoyer les données du rapport précédent sur GitHub.

Configurer le serveur MCP GitHub

Commençons par créer le fichier de configuration du projet Gemini CLI. Exécutez la commande suivante :

mkdir -p .gemini && touch .gemini/settings.json

Ouvrez ensuite le fichier .gemini/settings.json et renseignez-le avec la configuration suivante.

{
  "mcpServers": {
       "github": {
            "httpUrl": "https://api.githubcopilot.com/mcp/",
            "headers": {
                "Authorization": "your-personal-access-token"
            },
            "timeout": 5000
       }
  }
}

Vous aurez besoin de votre propre jeton d'accès personnel GitHub. Assurez-vous donc d'avoir déjà un compte GitHub.

Connectez-vous à votre compte GitHub et accédez à Settings (Paramètres).

dc57f047ca9a2b83.png

Faites ensuite défiler la page vers le bas pour trouver Paramètres pour les développeurs et cliquez dessus.

59d9b700c41ca1b6.png

Sélectionnez ensuite Personal access tokens (Jetons d'accès personnels), puis choisissez Tokens (classic) (Jetons (classique)).

e96fccd80872e480.png

30ac727da307602b.png

Indiquez le nom de votre jeton d'accès personnel ici et cochez les champs d'application repo.

ad167223fa231e3c.png

Faites ensuite défiler la page vers le bas et cliquez sur le bouton Generate Token (Générer un jeton). Assurez-vous de

Cliquez sur le bouton Générer un nouveau jeton, puis sélectionnez Générer un nouveau jeton (classique). Copiez ensuite le jeton généré et écrivez-le dans .gemini/settings.json.

efd82711868093c0.png

Votre fichier .gemini/settings.json devrait donc ressembler à l'exemple suivant :

{
  "mcpServers": {
       "github": {
            "httpUrl": "https://api.githubcopilot.com/mcp/",
            "headers": {
                "Authorization": "ghp-xxxx"
            },
            "timeout": 5000
       }
  }
}

Vérifions maintenant la connexion. Saisissez la commande suivante pour accéder à Gemini CLI :

gemini

Exécutez ensuite la commande /mcp. Vous devriez voir que le MCP GitHub est déjà correctement configuré.

a97c9a98f07dc87c.png

/mcp

Testons ensuite cette connexion MCP en envoyant cette commande.

59bfd79aba7cc386.png

Aggregate the findings from @code-review.md and @security-analysis.md into a single report and ensure no duplicates issues reported. Post this report as a comment on the relevant pull request for the current git branch on GitHub and display the pull request URL for manual review

Notez la notation @code-review.md et @security-analysis.md ici. C'est ainsi que nous faisons référence aux fichiers à transmettre à la CLI Gemini. Cette commande lira le contenu des deux fichiers et enverra un commentaire à la demande d'extraction associée à cette branche à l'aide de la connexion GitHub MCP. Vous pouvez ensuite vérifier l'URL de la demande d'extraction.

864b859b56cfe9e7.png

9. 💡 Gemini CLI dans le workflow CI/CD

Si vous utilisez GitHub, vous pouvez facilement intégrer la CLI Gemini à votre pipeline CI/CD en utilisant l'action GitHub run-gemini-cli. Il agit à la fois comme un agent autonome pour les tâches de codage courantes et critiques, et comme un collaborateur à la demande à qui vous pouvez rapidement déléguer du travail.

Vous pouvez l'utiliser pour examiner les demandes d'extraction, trier les problèmes, analyser et modifier le code, et plus encore, en discutant avec Gemini directement dans les dépôts GitHub.

Vous pouvez examiner un exemple de cette intégration dans cette demande d'extraction, où nous utilisons l'extension de sécurité de la CLI Gemini dans le runner et fournissons les avis lorsque la demande d'extraction est créée.

ad2a8e8d0a15e3f5.png

3cb40f104ce6a594.png

8edb7277fa6324b.png

ef48414c02a16dfa.png

10. 💡 Découvrez d'autres extensions de la CLI Gemini

8a7939ee0328e6e2.png

Vous pouvez également découvrir d'autres extensions sur https://geminicli.com/extensions . Découvrez d'autres outils intéressants !

11. 🧹 Nettoyer

Pour éviter que les ressources utilisées dans cet atelier de programmation soient facturées sur votre compte Google Cloud :

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.
  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.