使用 Gemini CLI(含扩展程序)进行代码审核和安全分析

1. 📖 简介

838a11ffed94b79e.png

在此 Codelab 中,您将学习 Gemini CLI 的基础知识,并在软件开发工作流程中使用其代码审核和安全分析扩展程序。

学习内容

  • 如何设置 Gemini CLI
  • 如何配置 Gemini CLI
  • 如何安装 Gemini CLI 扩展程序
  • 如何利用 Gemini CLI 扩展程序进行代码审核和安全分析
  • 如何为 Gemini CLI 配置 MCP
  • 如何在 CI/CD 中检查 Gemini CLI

所需条件

  • Chrome 网络浏览器
  • Gmail 账号
  • 启用了结算账号的 Cloud 项目

2. 🚀 准备研讨会开发设置

第 1 步:在 Cloud 控制台中选择有效项目

Google Cloud 控制台的项目选择器页面上,选择或创建一个 Google Cloud 项目(请参阅控制台的左上角部分)

6da543936f051b95.png

点击该项目,您将看到所有项目的列表,如以下示例所示:

3c3963e0fbb5ba4f.png

红色框表示的值是项目 ID ,本教程中将使用此值。

确保您的云项目已启用结算功能。如需检查此设置,请点击左上角栏中的汉堡图标 ☰,该图标会显示导航菜单,然后找到“结算”菜单

3291845833270d7f.png

ddf6f055d710f7a9.png

如果您在结算 / 概览 标题(Cloud 控制台的左上角部分 )下看到 “Google Cloud Platform 试用结算账号” ,则说明您的项目已准备好用于本教程。如果不是,请返回本教程的开头并兑换试用结算账号

45539d4ac57dd995.png

第 2 步:熟悉 Cloud Shell

您将在本教程的大部分内容中使用 Cloud Shell,请点击 Google Cloud 控制台顶部的“激活 Cloud Shell” 。如果系统提示您授权,请点击授权

26f20e837ff06119.png

79b06cc89a99f840.png

连接到 Cloud Shell 后,我们需要检查 Shell(或终端)是否已通过我们的账号进行身份验证

gcloud auth list

如果您看到个人 Gmail 账号,如以下示例输出所示,则一切正常

Credentialed Accounts

ACTIVE: *
ACCOUNT: alvinprayuda@gmail.com

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

如果不是,请尝试刷新浏览器,并确保在系统提示时点击授权 (可能会因连接问题而中断)

第 3 步:熟悉 Cloud Shell 编辑器并设置应用工作目录

现在,我们可以设置代码编辑器来执行一些编码操作。我们将使用 Cloud Shell 编辑器

我们需要克隆将与之交互的演示代码库。在终端中运行此命令以克隆代码库并打开 Cloud Shell 编辑器

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

现在,您的 Cloud Shell 编辑器工作目录应如下所示

3a72d901f5e78fcf.png

接下来,我们需要确保 Shell 是否已配置为正确的项目 ID。如果您在终端中看到 $符号之前的 ( ) 内有值(在下面的屏幕截图中,该值为“your-workshop-project”),则此值表示为有效 Shell 会话配置的项目。

8785d925a094c260.png

如果显示的 已经正确 ,您可以跳过 下一个命令 。但是,如果该值不正确或缺失,请运行以下命令

gcloud config set project <YOUR_PROJECT_ID>

现在,我们可以进入下一阶段

3. 🚀 设置和配置

如果您想在本地系统中安装 Gemini CLI,可以按照以下步骤操作:

  1. 确保您的系统安装了 Node 20+ 版本
  2. 通过以下任一方式启用 Gemini CLI:
  • 将其作为全局软件包安装
# Install as an executor

npm install -g @google/gemini-cli

# then run it from terminal
gemini
  • 或者直接从源代码高效运转,以始终获取最新版本
npx https://github.com/google-gemini/gemini-cli

首次运行时,系统会询问您几个问题。如果您从 IDE(例如 VSCode)运行,系统会询问您以下问题

91769e12a6214c89.png

然后,系统会询问您几个身份验证选项

61ba181d61e506dc.png

有以下几个选项:

  • 如果您选择使用 Google 账号登录,系统会在浏览器中打开 Google 身份验证页面,您只需接受即可
  • 如果您想使用 Gemini API 密钥,则需要在 AI Studio 页面 中创建一个,然后在工作目录中创建 .env 文件并设置变量 GEMINI_API_KEY (或在命令行中运行命令 export GEMINI_API_KEY="your-api-key"
  • 如果您选择使用 Vertex AI ,则需要一个像您之前设置的项目,并创建 .env 文件并设置 GOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATION

如果您想更改这些身份验证方法,可以从 Gemini CLI 运行 /auth 命令或修改配置文件。如果您想直接修改配置文件,在 Linux 上,该文件应位于 $HOME/.gemini/settings.json 中。您将看到 securityauth 类型并对其进行修改

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

2b894cdf68057d6a.png

4. 🚀 基本命令和内置工具

现在,让我们试用 Gemini CLI,以详细了解它。在终端中运行以下命令以进入 Gemini CLI

gemini

如果您正在寻找一些可使用的基本命令,可以输入 /help 以显示所有可用命令

d4776f0c740ad723.png

/help

您将看到如下输出290d620f3787b3d0.png

Gemini CLI 是一款 AI 智能体,因此它将配备工具来解决用户给定的任务。如需查看它具有的内置工具,请运行 /tools 命令

7367214e26b0da86.png

/tools

它将显示如下输出

363ae783ae902fe4.png

您可以看到,Gemini CLI 具有多种功能,例如读取和写入文件、网页搜索等。由于存在潜在风险,默认情况下,其中一些工具需要用户确认

现在,让我们看看它的实际效果,尝试在 Gemini CLI 中运行这些提示

be23caafc0184a6d.png

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

您将看到它会调用 GoogleSearch 工具,然后使用 WriteFile 工具写入结果。如果您使用 IDE,您将看到它会以差异形式呈现,并显示您是否要接受或拒绝建议的选项。在这里,您可以看到 Gemini CLI 请求您授予写入文件的权限

724bc8144b51752e.png

5. 🚀 扩展程序

为了通过 AI 智能体改进特定任务的输出,我们需要解决的难题包括如何精心设计合适的提示、如何通过合适的工具集成来管理合适的上下文工程等。

Gemini CLI 扩展程序是预先打包且易于安装的提示和集成,可以连接到外部工具。每个扩展程序都包含一个内置的“使用指南”,介绍如何有效地使用这些工具,并且可以由以下组件组成:

  • 自定义斜杠命令
  • MCP 配置
  • 上下文文件

cfe24ebe1dfb0152.png

安装安全扩展程序

例如,在本教程中,我们将探讨如何安装 code-reviewsecurity 扩展程序

运行以下命令,从终端安装 security 扩展程序

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

系统会显示以下问题,只需按 Enter 键接受即可

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.

安装代码审核扩展程序

接下来,我们安装 code-review 扩展程序,运行以下命令

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

完成后,再次运行 Gemini CLI

gemini

并运行 /extensions 命令,您将看到这两个扩展程序已安装

571556bdc2b3e914.png

/extensions

好了,现在让我们对您之前克隆的示例代码库执行实际操作

6. 🚀 互动模式 - 代码安全分析扩展程序应用

Security 扩展程序是一个开源 Gemini CLI 扩展程序,旨在增强代码库的安全性。该扩展程序向 Gemini CLI 添加了一个新命令,用于分析代码更改以识别各种安全风险和漏洞。

现在,我们先准备演示代码库,运行以下命令以更改为已应用安全风险更改的分支

git checkout refactor/analysis-demo

然后,在终端中运行 Gemini CLI

gemini

接下来,我们运行扩展程序

aab23afb4f4bfb3.png

/security:analyze

这将启动一个长时间运行的进程,在此过程中,您将收到多个中断,要求您授予运行特定操作的权限,例如 mkdir,如下所示

f889f7aca882f87d.png

这是一种保护机制,可确保用户了解 Gemini CLI 将执行的操作。在本教程的其余部分中,您可以始终允许它(选项 2)。

此扩展程序将调用一个长时间运行的进程,您可以看到它在 .gemini_security 目录中创建一个规划文件,并且可以看到清单,其中显示了哪些进程已完成或未完成。如下示例所示:

bf7f9e885f15ff89.png

完成任务需要一些时间,在等待期间,我们可以在 Github 代码库 中查看这些扩展程序的来源。此网址显示了用于运行所有这些安全扫描过程的提示

e5592755fcdf5a64.png

如您所见,为了执行此扫描,提示 Gemini CLI 执行两遍检查,即侦察遍 和更详细的调查遍

如果您在 Gemini CLI 中遇到以下提示,可以选择选项 2 以停用循环检测

74426d4ae8fae006.png

然后提示 Gemini CLI 继续

3ea7391ccbf2b872.png

continue

这是一种避免无限非生产性工具调用循环的机制,并且会随着时间的推移不断改进。

完成后,它将在互动式终端上显示报告,为了方便起见,我们指示 Gemini CLI 将其写入 security-analysis.md

86fcc1c406100224.png

write the result to security-analysis.md file

现在,您可以检查写入文件的结果

7. 🚀 非互动模式 - 代码审核扩展程序应用

code-review 扩展程序向 Gemini CLI 添加了一个新命令,用于分析代码更改以识别各种代码质量问题。

此扩展程序可以在 Gemini CLI 非互动模式下执行,这意味着所有进程都可以在无需进入 Gemini CLI Shell 的情况下执行。如需在非互动模式下运行 Gemini CLI,可以使用以下命令模式

gemini -p "put your command here"

但是,需要注意的是,在非互动模式下运行会停用任何需要用户权限的工具操作,因此我们需要添加 --yolo 标志以自动批准所有操作,这意味着在非互动模式下启用所有工具

如果您在 Cloud Shell 中运行此 yolo 标志,系统默认配置将禁止您运行该标志并显示此出错提示

Cannot start in YOLO mode when it is disabled by settings

运行以下命令以设置工作区级配置文件

mkdir .gemini && cloudshell edit .gemini/settings.json

现在,settings.json 文件将在编辑器中打开,复制以下配置以允许 yolo 模式

{
    "security": {
        "disableYoloMode": false
    }
}

现在,让我们使用以下命令运行 code-review 扩展程序

gemini -p "activate the code review skill and review code changes in current branch, then write the result to code-review.md" --yolo -e code-review

此命令将激活 code-review 扩展程序中包含的技能,并将 Gemini CLI 输出的结果写入 code-review.md 文件。请注意此处的 -e 标志,此标志控制在会话期间激活哪个扩展程序。在这里,我们仅激活 code-review 扩展程序,并停用其他扩展程序。

这需要一段时间,但完成后,您可以看到类似如下所示的结果写入 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. 🚀 Model Context Protocol 支持

现在,正如我们在扩展程序说明中检查的那样,Gemini CLI 可以连接到 MCP 服务器(通过 Model Context Protocol 提供工具和资源的应用)。通过此连接,Gemini CLI 可以使用 MCP 服务器作为本地环境和外部服务(如 API)的桥梁,与外部系统和数据源进行交互。

7d8738ee9c079aa1.png

如果您想自行设置 MCP 服务器,需要修改 .gemini/settings.json 文件并添加以下配置:

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

在本教程中,我们将配置与 Github 账号的连接,以将之前的报告数据推送到 Github

配置 Github MCP 服务器

首先,我们先创建 Gemini CLI 项目配置文件。运行以下命令

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

然后打开 .gemini/settings.json 文件,并填写以下配置

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

现在,我们需要您自己的 Github 个人访问令牌,因此请确保您已拥有自己的 Github 账号。

登录您的 Github,然后前往设置

c7d83d4e503602e2.png

之后,向下滚动以找到开发者设置 ,然后点击它

c6c9bfafe5021b9e.png

然后选择个人访问令牌 ,并选择 Tokens (classic)

e21f0ed9f361fc13.png

c3c26d7f41c51e1c.png

在此处为您的个人访问令牌命名,并选中 repo 范围

b0830480eaf3c15d.png

然后向下滚动并点击 Generate Token 按钮,确保您

点击 Generate new token button ,然后选择 Generate new token (classic) 。之后,复制生成的令牌并将其写入 .gemini/settings.json

30d1ea92bb24a7ba.png

因此,您的 .gemini/settings.json 应如下例所示

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

现在,我们来验证连接。运行此命令以进入 Gemini CLI

gemini

然后,运行 /mcp 命令,您应该会看到 Github MCP 已正确配置

1e9c8585ecb39ccb.png

/mcp

然后,我们通过提交此命令来测试此 MCP 连接

70e045049e8792a8.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

请注意此处的 @code-review.md@security-analysis.md 表示法,这是我们引用要传递给 Gemini CLI 的文件的方式。此命令将读取这两个文件的内容,并使用 Github MCP 连接向与此分支相关的拉取请求推送评论。之后,您可以在 拉取请求网址 中进行检查以验证它。

f6483c19e27d4d1c.png

9. 💡CI/CD 工作流中的 Gemini CLI

如果您是 Github 用户,则可以利用 run-gemini-cli Github Action 轻松将 Gemini CLI 嵌入到 CI/CD 流水线中。它既是处理关键日常编码任务的自主智能体,也是可快速将工作委托给它的按需协作工具

您可以使用它在 Github 代码库中直接使用 Gemini 对话式功能执行拉取请求审核、问题分类、代码分析和修改等操作

您可以在此 拉取请求 中检查此集成的示例,我们在运行程序中使用 Gemini CLI Security 扩展程序,并在创建拉取请求时提供审核

bc58be84fcbb313a.png

da9e2cde49cbebe5.png

3deda99e8a7fa4d3.png

d933d6b31b42e582.png

10. 💡探索其他 Gemini CLI 扩展程序

dd25e5619e91ad0b.png

您还可以在 https://geminicli.com/extensions 中探索更多扩展程序。快来看看,了解更多有趣的工具!

11. 🧹 清理

为避免系统因本 Codelab 中使用的资源向您的 Google Cloud 账号收取费用,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 管理资源 页面。
  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关停 以删除项目。