Análise de segurança e revisão de código com a CLI do Gemini e extensões

1. 📖 Introdução

194a7f6f1a93b614.png

Neste codelab, você vai aprender os fundamentos da CLI Gemini e usar a extensão de revisão de código e análise de segurança no seu fluxo de trabalho de desenvolvimento de software.

O que você vai aprender

  • Como configurar a CLI do Gemini
  • Como configurar a CLI do Gemini
  • Como instalar a extensão da CLI do Gemini
  • Como usar a extensão da CLI do Gemini para revisão de código e análise de segurança
  • Como configurar o MCP para a CLI do Gemini
  • Como inspecionar a CLI do Gemini em CI/CD

O que é necessário

  • Navegador da Web Google Chrome
  • Uma conta do Gmail
  • Um projeto do Cloud com uma conta de faturamento ativada

2. 🚀 Preparando a configuração de desenvolvimento do workshop

Etapa 1: selecionar "Projeto ativo" no Console do Cloud

No console do Google Cloud, na página de seletor de projetos, selecione ou crie um projeto do Google Cloud (consulte a seção no canto superior esquerdo do console).

3a143645e891087.png

Clique nele para ver uma lista de todos os seus projetos, como neste exemplo:

59e03077d1ba2039.png

O valor indicado pela caixa vermelha é o ID DO PROJETO, que será usado em todo o tutorial.

Verifique se o faturamento está ativado para seu projeto do Cloud. Para verificar, clique no ícone de hambúrguer ☰ na barra superior esquerda, que mostra o menu de navegação, e encontre o menu "Faturamento".

973396bb9d9c3523.png

837e03fb7edafdc4.png

Se você encontrar a "Conta de faturamento de teste do Google Cloud Platform" no título Faturamento / Visão geral ( seção superior esquerda do console da nuvem), seu projeto está pronto para ser usado neste tutorial. Caso contrário, volte ao início deste tutorial e resgate a conta de faturamento de teste.

7f607aa026552bf5.png

Etapa 2: conhecer o Cloud Shell

Você vai usar o Cloud Shell na maior parte dos tutoriais. Clique em "Ativar o Cloud Shell" na parte de cima do console do Google Cloud. Se for preciso autorizar, clique em Autorizar.

1829c3759227c19b.png

b8fe7df5c3c2b919.png

Depois de se conectar ao Cloud Shell, precisamos verificar se o shell ( ou terminal) já está autenticado com nossa conta.

gcloud auth list

Se você vir seu Gmail pessoal como no exemplo de saída abaixo, tudo está certo.

Credentialed Accounts

ACTIVE: *
ACCOUNT: alvinprayuda@gmail.com

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

Caso contrário, atualize o navegador e clique em Autorizar quando solicitado. A autorização pode ser interrompida devido a um problema de conexão.

Em seguida, também precisamos verificar se o shell já está configurado com o ID DO PROJETO correto. Se você vir um valor entre parênteses antes do ícone $ no terminal (na captura de tela abaixo, o valor é "your-workshop-project"), esse valor mostra o projeto configurado para sua sessão de shell ativa.

25e65d7ad1d62de0.png

Se o valor mostrado já estiver correto, pule o próximo comando. No entanto, se não estiver correto ou estiver faltando, execute o seguinte comando:

gcloud config set project <YOUR_PROJECT_ID>

Etapa 3: conhecer o editor do Cloud Shell e configurar o diretório de trabalho do aplicativo

Agora, podemos configurar nosso editor de código para fazer algumas coisas de programação. Vamos usar o editor do Cloud Shell para isso.

Clique no botão Abrir editor para abrir um editor do Cloud Shell b16d56e4979ec951.png.

Agora você vai ver a interface do editor do Cloud Shell, como mostrado abaixo.

74e9e030342164b6.png

Agora, clone o repositório de demonstração com que vamos interagir. Primeiro, precisamos abrir o terminal do editor. Para fazer isso, clique em Terminal -> Novo terminal na barra de menus ou use Ctrl + Shift + C. Isso vai abrir uma janela de terminal na parte de baixo do navegador.

95e31ec63a88890d.png

Em seguida, execute este comando no terminal:

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

Depois disso, acesse a seção superior do editor do Cloud Shell e clique em Arquivo->Abrir pasta,encontre o diretório nome de usuário e o diretório do repositório clonado code-analysis-demo e clique no botão "OK". Isso vai definir o diretório escolhido como o principal de trabalho. Neste exemplo, o nome de usuário é alvinprayuda. Portanto, o caminho do diretório é mostrado abaixo.

ee00d484ff2f8351.png

194f63ef6de51b9.png

Agora, o diretório de trabalho do Editor do Cloud Shell deve ficar assim:

2d53c6161b553e68.png

Agora podemos passar para a próxima fase

3. 🚀 Configuração

Se você quiser instalar a CLI do Gemini no seu sistema local, siga estas etapas:

  1. Confira se o sistema tem o Node versão 20 ou mais recente.
  2. Ative a CLI do Gemini de uma destas maneiras:
  • Instalar como um pacote global
# Install as an executor

npm install -g @google/gemini-cli

# then run it from terminal
gemini
  • Ou execute diretamente da fonte para sempre ter a versão mais recente
npx https://github.com/google-gemini/gemini-cli

Quando você executar o app pela primeira vez, ele vai fazer várias perguntas. Se você executar em um IDE (por exemplo, VSCode), a seguinte pergunta será feita:

7f0f7d5091df7abb.png

Em seguida, ele vai pedir várias opções para autenticação.

7ce5c6574f249304.png

Há várias opções:

  • Se você escolher Fazer login com o Google, uma página de autenticação do Google será aberta no navegador. Basta aceitar.
  • Se preferir usar uma chave da API Gemini, crie uma na página do AI Studio e, em seguida, crie o arquivo .env no diretório de trabalho com a variável GEMINI_API_KEY definida ou execute o comando export GEMINI_API_KEY="your-api-key" na linha de comando.
  • Se você escolher usar a Vertex AI, vai precisar de um projeto como o que você configurou anteriormente, criar um arquivo .env e definir GOOGLE_CLOUD_PROJECT e GOOGLE_CLOUD_LOCATION.

Se quiser mudar esses métodos de autenticação, execute o comando /auth na CLI do Gemini ou edite o arquivo de configuração. Se você quiser editar o arquivo de configuração diretamente, no Linux ele estará em $HOME/.gemini/settings.json . Você vai ver e editar o tipo security e auth.

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

72300c1f781857c8.png

4. 🚀 Comandos básicos e ferramentas integradas

Agora, vamos testar a CLI do Gemini para saber mais sobre ela. Se você estiver procurando um comando básico que possa ser usado, digite /help para mostrar todos os comandos disponíveis.

800d1b06a5ad9f9c.png

/help

Você vai ver uma saída como esta f46a75c6bb177a2b.png

A CLI do Gemini é um agente de IA e, portanto, tem ferramentas equipadas para resolver a tarefa dada pelo usuário. Para conferir as ferramentas integradas, execute o comando /tools.

17a6d7fcf06df563.png

/tools

A saída será semelhante a esta:

7d22b38a387f45d0.png

É possível notar que a CLI do Gemini tem vários recursos, como leitura e gravação em arquivos, pesquisa na Web e muito mais. Várias dessas ferramentas exigiam confirmação do usuário por padrão devido ao risco potencial.

Agora vamos ver como funciona. Execute estes comandos na CLI do Gemini.

15e2d863a4eb8df4.png

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

Você vai notar que ele vai invocar a ferramenta GoogleSearch e depois escrever o resultado usando WriteFile. Se você usa uma IDE, ela vai aparecer como uma opção de diff e exibição, seja para aceitar ou rejeitar as sugestões. Aqui, você pode ver que a CLI do Gemini pede permissão para gravar o arquivo.

8163f43b05ca59a3.png

5. 🚀 Extensões

Para melhorar a saída de uma tarefa específica com um agente de IA, os desafios são como criar um comando adequado, gerenciar uma engenharia de contexto adequada com a integração de ferramentas adequadas e assim por diante.

As extensões da CLI do Gemini são comandos e integrações pré-empacotados e fáceis de instalar que podem se conectar a ferramentas externas. Cada extensão contém um "playbook" integrado sobre como usar as ferramentas de forma eficaz e pode ser composta destes componentes:

  • Comandos de barra personalizados
  • Configurações do MCP
  • Arquivos de contexto

6da12f33463ac755.png

Instalar extensões de segurança

Por exemplo, neste tutorial, vamos mostrar como instalar as extensões code-review e security.

Execute o comando a seguir para instalar as extensões security no terminal:

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

As seguintes perguntas vão aparecer. Basta pressionar Enter para aceitar.

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.

Instalar extensões de revisão de código

Em seguida, instale a extensão code-review executando o comando abaixo:

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

Depois de terminar, execute a CLI do Gemini novamente.

gemini

e execute o comando /extensions. Você vai ver que essas duas extensões já estão instaladas.

88a86a0dc42fc510.png

/extensions

Agora vamos fazer uma execução prática no repositório de amostra que você clonou anteriormente.

6. 🚀 Modo interativo: aplicativo de extensão de análise de segurança de código

A extensão de segurança é uma extensão de código aberto da CLI do Gemini criada para melhorar a segurança do repositório. A extensão adiciona um novo comando à CLI do Gemini que analisa mudanças no código para identificar vários riscos e vulnerabilidades de segurança.

Agora vamos preparar nosso repositório de demonstração. Execute o seguinte comando para mudar para a ramificação em que as mudanças com risco de segurança já foram aplicadas:

git checkout refactor/analysis-demo

Depois disso, execute a CLI do Gemini no terminal.

gemini

Em seguida, vamos executar as extensões

e3fcf630238f9b2e.png

/security:analyze

Isso vai iniciar um processo de longa duração. Durante o processo, você vai receber várias interrupções pedindo sua permissão para executar operações específicas, como mkdir, conforme mostrado abaixo.

10d6ad2ef91b5acf.png

Esse é um mecanismo de proteção para garantir que os usuários saibam o que será executado pela CLI Gemini. Para o restante do tutorial, você pode sempre permitir ( opção 2).

Essa extensão vai invocar um processo de longa duração. Você pode ver a criação de um arquivo de planejamento no diretório .gemini_security e a lista de verificação com os processos concluídos ou não. Como mostrado neste exemplo abaixo:

543035cb65d27804.png

Vai levar algum tempo para concluir as tarefas. Enquanto isso, podemos verificar a origem dessas extensões no repositório do GitHub. Esse URL mostra o comando usado para executar todos esses processos de verificação de segurança.

73f4966870bc9ddf.png

Como você pode ver, para fazer essa verificação, o comando é usado como a CLI do Gemini para fazer uma verificação de duas etapas: a etapa de reconhecimento e a etapa de investigação mais detalhada.

Se você encontrar o seguinte comando na CLI do Gemini, escolha a opção 2 para desativar a detecção de loops.

a0af5e15627afa83.png

Em seguida, peça para a CLI do Gemini continuar

611a7ed0fb6fc44b.png

continue

Esse é um mecanismo para evitar loops infinitos e improdutivos de chamadas de função, que será aprimorado com o tempo.

Depois de concluído, o relatório vai aparecer no terminal interativo. Para facilitar, vamos instruir a CLI do Gemini a gravar em security-analysis.md

b4cbad3aaeaa8dce.png

write the result to security-analysis.md file

Agora você pode inspecionar o resultado gravado no arquivo.

7. 🚀 Modo não interativo: aplicativo de extensão de revisão de código

A extensão code-review adiciona um novo comando à CLI do Gemini que analisa mudanças no código para identificar vários problemas de qualidade.

Essa extensão pode ser executada no modo não interativo da CLI do Gemini, ou seja, todo o processo pode ser executado sem a necessidade de entrar no shell da CLI do Gemini. Para executar a CLI do Gemini no modo não interativo, use o seguinte padrão de comando:

gemini "put your command here"

No entanto, é importante observar que a execução no modo não interativo desativa qualquer operação de ferramentas que exija permissão do usuário. Portanto, precisamos adicionar a flag --yolo para aprovar automaticamente todas as ações, o que significa ativar todas as ferramentas durante o modo não interativo.

Vamos executar a extensão code-review com o seguinte comando:

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

Esse comando grava o resultado da saída da CLI do Gemini no arquivo code-review.md. Observe a flag -e aqui. Ela controla qual extensão será ativada durante a sessão. Aqui, ativamos apenas a extensão code-review e desativamos as outras.

Isso vai levar um tempo, mas depois de concluído, você verá um resultado semelhante ao mostrado abaixo gravado no arquivo 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. 🚀 Suporte ao protocolo de contexto de modelo

Agora, como inspecionamos antes nas explicações da extensão, a CLI do Gemini pode se conectar a servidores MCP, que são aplicativos que fornecem ferramentas e recursos pelo protocolo de contexto de modelo. Essa conexão permite que a CLI do Gemini interaja com sistemas e fontes de dados externos usando servidores MCP como pontes para seu ambiente local e serviços externos, como APIs.

5f1cdd4be3e7b42a.png

Se você quiser fazer sua própria configuração do servidor MCP, modifique o arquivo .gemini/settings.json e adicione as seguintes configurações :

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

Neste tutorial, vamos configurar a conexão com nossa conta do GitHub para enviar os dados do relatório anterior para o GitHub.

Como configurar o servidor MCP do GitHub

Primeiro, vamos criar o arquivo de configuração do projeto da CLI do Gemini. Execute este comando

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

Em seguida, abra o arquivo .gemini/settings.json e preencha com a seguinte configuração:

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

Agora, vamos precisar do seu token de acesso pessoal do GitHub. Por isso, verifique se você já tem uma conta do GitHub.

Faça login no GitHub e acesse Configurações.

dc57f047ca9a2b83.png

Depois disso, role a tela para baixo, encontre e clique em Configurações do desenvolvedor.

59d9b700c41ca1b6.png

Em seguida, selecione Tokens de acesso pessoal e escolha Tokens (clássico).

e96fccd80872e480.png

30ac727da307602b.png

Dê um nome ao seu token de acesso pessoal e marque os escopos repo.

ad167223fa231e3c.png

Em seguida, role a tela para baixo e clique no botão Gerar token.

Clique no botão Gerar novo token e selecione Gerar novo token (clássico). Depois disso, copie o token gerado e escreva-o em .gemini/settings.json.

efd82711868093c0.png

Assim, seu arquivo .gemini/settings.json vai ser semelhante ao exemplo a seguir:

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

Agora, vamos verificar a conexão. Execute este comando para acessar a CLI do Gemini

gemini

Em seguida, execute o comando /mcp. O MCP do GitHub já vai estar configurado corretamente.

a97c9a98f07dc87c.png

/mcp

Em seguida, vamos testar essa conexão do MCP enviando este comando

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

Observe a notação @code-review.md e @security-analysis.md aqui. É assim que referenciamos os arquivos a serem transmitidos para a CLI do Gemini. Esse comando vai ler o conteúdo dos dois arquivos e enviar um comentário para a solicitação de pull relacionada a essa ramificação usando a conexão MCP do GitHub. Depois disso, confira o URL da solicitação de pull para verificar.

864b859b56cfe9e7.png

9. 💡CLI do Gemini no fluxo de trabalho de CI/CD

Se você usa o GitHub, pode incorporar facilmente a CLI do Gemini no seu pipeline de CI/CD usando a run-gemini-cli GitHub Action. Ele atua como um agente autônomo para tarefas de programação rotineiras críticas e como um colaborador on demand a quem você pode delegar trabalho rapidamente.

Você pode usar o Gemini para fazer revisões de solicitações de pull, triagem de problemas, análise e modificação de código e muito mais usando a conversa do Gemini diretamente nos repositórios do GitHub.

O exemplo dessa integração pode ser inspecionado nesta solicitação de envio, em que usamos a extensão de segurança da CLI do Gemini no runner e fornecemos as revisões quando a solicitação de envio é criada.

ad2a8e8d0a15e3f5.png

3cb40f104ce6a594.png

8edb7277fa6324b.png

ef48414c02a16dfa.png

10. 💡Conheça outras extensões da CLI do Gemini

8a7939ee0328e6e2.png

Você também pode conferir mais extensões em https://geminicli.com/extensions . Confira outras ferramentas interessantes!

11. 🧹 Limpeza

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste codelab, siga estas etapas:

  1. No console do Google Cloud, acesse a página Gerenciar recursos.
  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir.
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.