Обзор кода и анализ безопасности с помощью Gemini CLI с расширениями

1. 📖 Введение

194a7f6f1a93b614.png

В этой лабораторной работе вы изучите основы Gemini CLI и будете использовать его расширение для обзора кода и анализа безопасности в рабочем процессе разработки программного обеспечения.

Чему вы научитесь

  • Как настроить Gemini CLI
  • Как настроить Gemini CLI
  • Как установить расширение Gemini CLI
  • Как использовать расширение Gemini CLI для проверки кода и анализа безопасности
  • Как настроить MCP для Gemini CLI
  • Как проверить Gemini CLI в CI/CD

Что вам понадобится

  • веб-браузер Chrome
  • Аккаунт Gmail
  • Облачный проект с включенным платежным аккаунтом

2. 🚀 Подготовка к разработке семинара

Шаг 1: Выберите активный проект в облачной консоли.

В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud (см. верхнюю левую часть консоли).

3a143645e891087.png

Нажмите на него, и вы увидите список всех ваших проектов, как в этом примере,

59e03077d1ba2039.png

Значение, указанное в красной рамке, является ИДЕНТИФИКАТОРОМ ПРОЕКТА , и это значение будет использоваться на протяжении всего урока.

Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Для этого нажмите на значок бургера ☰ в левом верхнем углу панели, где отображается меню навигации, и найдите меню «Выставление счетов».

973396bb9d9c3523.png

837e03fb7edafdc4.png

Если вы видите «Пробный платёжный аккаунт Google Cloud Platform» в разделе «Биллинг/Обзор» ( в левом верхнем углу облачной консоли ), ваш проект готов к использованию в рамках этого руководства. Если нет, вернитесь к началу руководства и активируйте пробный платёжный аккаунт.

7f607aa026552bf5.png

Шаг 2: Знакомство с Cloud Shell

В большинстве обучающих программ вы будете использовать Cloud Shell . Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud. Если появится запрос на авторизацию, нажмите «Авторизовать».

1829c3759227c19b.png

b8fe7df5c3c2b919.png

После подключения к Cloud Shell нам нужно будет проверить, аутентифицирована ли оболочка (или терминал) с помощью нашей учетной записи.

gcloud auth list

Если вы видите свой личный Gmail, как в примере ниже, все в порядке.

Credentialed Accounts

ACTIVE: *
ACCOUNT: alvinprayuda@gmail.com

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

Если нет, попробуйте обновить браузер и обязательно нажмите кнопку «Авторизовать» при появлении соответствующего запроса (возможно, процесс был прерван из-за проблем с подключением).

Далее нам также необходимо проверить, настроена ли оболочка на правильный идентификатор ПРОЕКТА , который у вас есть. Если вы видите значение внутри ( ) перед значком $ в терминале (на снимке экрана ниже это значение «your-workshop-project» ), это значение показывает настроенный проект для вашего активного сеанса оболочки.

25e65d7ad1d62de0.png

Если отображаемое значение верно , вы можете пропустить следующую команду . Однако, если оно неверно или отсутствует, выполните следующую команду.

gcloud config set project <YOUR_PROJECT_ID>

Шаг 3: Знакомство с редактором Cloud Shell и настройка рабочего каталога приложения

Теперь мы можем настроить наш редактор кода для написания кода. Для этого мы будем использовать Cloud Shell Editor.

Нажмите кнопку «Открыть редактор» , чтобы открыть редактор Cloud Shell. b16d56e4979ec951.png

Теперь вы увидите интерфейс Cloud Shell Editor, как показано ниже.

74e9e030342164b6.png

Теперь клонируем демонстрационный репозиторий, с которым мы будем работать. Для начала нам нужно открыть терминал для редактора. Это можно сделать, нажав «Терминал» -> «Новый терминал» в строке меню или нажав Ctrl + Shift + C , чтобы открыть окно терминала в нижней части браузера.

95e31ec63a88890d.png

Затем выполните эту команду на терминале

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

После этого перейдите в верхнюю часть редактора Cloud Shell и выберите Файл -> Открыть папку, найдите каталог с вашим именем пользователя и клонированный каталог репозитория code-analysis-demo , затем нажмите кнопку ОК. Выбранный каталог станет основным рабочим каталогом. В этом примере имя пользователя — alvinprayuda , поэтому путь к каталогу показан ниже.

ee00d484ff2f8351.png

194f63ef6de51b9.png

Теперь ваш рабочий каталог Cloud Shell Editor должен выглядеть так:

2d53c6161b553e68.png

Теперь мы можем перейти к следующему этапу.

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), вам будет задан следующий вопрос:

7f0f7d5091df7abb.png

Затем он предложит вам несколько вариантов аутентификации.

7ce5c6574f249304.png

Есть несколько вариантов:

  • Если вы выберете «Войти через Google» , в браузере откроется страница аутентификации Google, и вам останется только принять ее.
  • Если вы предпочитаете использовать ключ API Gemini , вам нужно будет создать его на странице AI Studio , а затем создать файл .env в вашем рабочем каталоге с установленной переменной GEMINI_API_KEY (или выполнить команду export GEMINI_API_KEY="your-api-key" в командной строке).
  • Если вы решите использовать Vertex AI, вам понадобится проект, подобный тому, который вы настроили ранее, а также создайте файл .env и задайте параметры GOOGLE_CLOUD_PROJECT и GOOGLE_CLOUD_LOCATION.

Если вы хотите изменить эти методы аутентификации, выполните команду /auth в интерфейсе командной строки Gemini или отредактируйте файл конфигурации. Если вы хотите редактировать файл конфигурации напрямую, в Linux он должен находиться в $HOME/.gemini/settings.json . Вы увидите параметры security и тип auth и сможете изменить их.

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

72300c1f781857c8.png

4. 🚀 Базовые команды и встроенные инструменты

Теперь давайте поэкспериментируем с Gemini CLI, чтобы узнать о нем больше. Если вы ищете какую-то базовую команду, которую можно использовать, вы можете ввести /help чтобы отобразить все доступные команды.

800d1b06a5ad9f9c.png

/help

Вы увидите такой вывод f46a75c6bb177a2b.png

Gemini CLI — это агент искусственного интеллекта, поэтому он будет оснащен инструментами для решения поставленной пользователем задачи. Чтобы увидеть встроенные инструменты, выполните команду /tools

17a6d7fcf06df563.png

/tools

Он покажет вам такой вывод

7d22b38a387f45d0.png

Как видите, Gemini CLI обладает рядом возможностей, таких как чтение и запись в файлы, поиск в интернете и многое другое. Некоторые из этих инструментов по умолчанию требуют подтверждения пользователя из-за потенциального риска.

Теперь давайте посмотрим на это в действии, попробуйте запустить эти команды в Gemini CLI

15e2d863a4eb8df4.png

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

Вы увидите, как он вызовет инструмент GoogleSearch , а затем запишет результат с помощью WriteFile . Если вы используете IDE, вы увидите, что он будет представлен в виде сравнения и выбора, хотите ли вы принять или отклонить предложенные варианты. Здесь вы видите, что Gemini CLI запрашивает разрешение на запись файла.

8163f43b05ca59a3.png

5. 🚀 Расширения

Чтобы улучшить результаты выполнения конкретной задачи с помощью ИИ-агента, необходимо решить следующие сложные вопросы: как создать правильную подсказку, как управлять правильной разработкой контекста с правильной интеграцией инструментов и т. д.

Gemini CLI Extensions — это готовые и легко устанавливаемые подсказки и интеграции, которые можно подключать к внешним инструментам. Каждое расширение содержит встроенную инструкцию по эффективному использованию инструментов и может состоять из следующих компонентов:

  • Пользовательские слэш-команды
  • Конфигурации MCP
  • Контекстные файлы

6da12f33463ac755.png

Установка расширений безопасности

Например, в этом руководстве мы рассмотрим, как можно установить расширения code-review и security .

Выполните следующую команду для установки расширений 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 , вы увидите, что эти 2 расширения уже установлены

88a86a0dc42fc510.png

/extensions

Хорошо, теперь давайте выполним практическое выполнение на примере репозитория, который вы клонировали ранее.

6. 🚀 Интерактивный режим — приложение расширения анализа безопасности кода

Расширение Security — это расширение Gemini CLI с открытым исходным кодом, разработанное для повышения безопасности репозитория. Оно добавляет в Gemini CLI новую команду, которая анализирует изменения кода для выявления различных угроз безопасности и уязвимостей.

Теперь давайте сначала подготовим наш демонстрационный репозиторий, выполнив следующую команду, чтобы перейти на ветку, где уже применены изменения, несущие риск для безопасности.

git checkout refactor/analysis-demo

После этого запустите Gemini CLI в терминале.

gemini

Тогда давайте запустим расширения

e3fcf630238f9b2e.png

/security:analyze

Это запустит длительный процесс, и во время него вы получите несколько прерываний, запрашивающих ваше разрешение на выполнение определенной операции, например mkdir как показано ниже.

10d6ad2ef91b5acf.png

Это защитный механизм, гарантирующий, что пользователи знают, какие команды будут выполняться Gemini CLI. До конца руководства вы всегда можете разрешить его (вариант 2).

Это расширение запустит длительный процесс. Вы увидите, как он создаст файл планирования в каталоге .gemini_security , и вы увидите контрольный список, показывающий, какой процесс выполнен, а какой нет. Как показано в примере ниже:

543035cb65d27804.png

Выполнение задач займёт некоторое время. Пока вы ждёте, мы можем проверить исходный код этих расширений в репозитории Github . Этот URL-адрес показывает командную строку, используемую для запуска всех этих процессов сканирования безопасности.

73f4966870bc9ddf.png

Как вы можете видеть, для этого нужно отсканировать подсказку в виде Gemini CLI, чтобы выполнить двухпроходную проверку: проход разведки и более подробный проход расследования.

Если вы видите следующее сообщение в Gemini CLI, вы можете выбрать опцию 2, чтобы отключить обнаружение петель.

a0af5e15627afa83.png

Затем предложите Gemini CLI продолжить.

611a7ed0fb6fc44b.png

continue

Это механизм, позволяющий избежать бесконечных непродуктивных циклов вызова инструментов, и он будет совершенствоваться с течением времени.

После завершения отобразится отчет на интерактивном терминале. Чтобы упростить задачу, давайте попросим Gemini CLI записать его в security-analysis.md

b4cbad3aaeaa8dce.png

write the result to security-analysis.md file

Теперь вы можете проверить результат, записанный в файл.

7. 🚀 Неинтерактивный режим — приложение для расширения проверки кода

Расширение code-review добавляет новую команду в Gemini CLI, которая анализирует изменения кода для выявления различных проблем с качеством кода.

Это расширение может быть запущено в неинтерактивном режиме Gemini CLI, что означает, что весь процесс может быть выполнен без необходимости входа в оболочку Gemini CLI. Для запуска Gemini CLI в неинтерактивном режиме можно использовать следующую команду:

gemini "put your command here"

Однако важно отметить, что работа в неинтерактивном режиме отключит любые операции инструментов, требующие разрешения пользователя, поэтому нам нужно добавить флаг --yolo для автоматического одобрения всех действий, что означает включение всех инструментов в неинтерактивном режиме.

Давайте запустим расширение code-review с помощью следующей команды:

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

Эта команда запишет результат работы Gemini CLI в файл code-review.md . Обратите внимание на флаг -e : он определяет, какое расширение активировать во время сеанса. Здесь мы активируем только расширение code-review и отключаем остальные.

Это займет некоторое время, но после завершения вы увидите результат, аналогичный показанному ниже, записанный в файл разметки.

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. 🚀 Поддержка протокола контекста модели

Как мы уже упоминали в пояснениях к расширению, Gemini CLI может подключаться к серверам MCP — приложениям, предоставляющим инструменты и ресурсы, через протокол контекста модели. Это подключение позволяет Gemini CLI взаимодействовать с внешними системами и источниками данных, используя серверы MCP в качестве мостов к вашей локальной среде и внешним сервисам, таким как API.

5f1cdd4be3e7b42a.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 и перейдите в Настройки.

dc57f047ca9a2b83.png

После этого прокрутите вниз, чтобы найти раздел «Настройки разработчика» , и нажмите на него.

59d9b700c41ca1b6.png

Затем выберите « Персональные токены доступа» и выберите «Токены (классические) ».

e96fccd80872e480.png

30ac727da307602b.png

Укажите здесь имя вашего личного токена доступа и проверьте области действия репозитория.

ad167223fa231e3c.png

Затем прокрутите вниз и нажмите кнопку «Сгенерировать токен» , убедитесь, что вы

Нажмите кнопку «Сгенерировать новый токен» и выберите « Сгенерировать новый токен (классический) ». После этого скопируйте сгенерированный токен и запишите его в файл .gemini/settings.json.

efd82711868093c0.png

Итак, ваш .gemini/settings.json должен выглядеть, как в следующем примере

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

Теперь проверим подключение. Войдите в командную строку Gemini, выполнив следующую команду:

gemini

Затем выполните команду /mcp , вы должны увидеть, что Github MCP уже правильно настроен.

a97c9a98f07dc87c.png

/mcp

Давайте проверим это MCP-соединение, выполнив следующую команду:

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

Обратите внимание на обозначения @code-review.md и @security-analysis.md — именно так мы ссылаемся на файлы, передаваемые в Gemini CLI. Эта команда прочитает содержимое обоих файлов и добавит комментарий в запрос на извлечение, относящийся к этой ветке, используя соединение Github MCP. После этого вы можете проверить его, перейдя по URL запроса на извлечение .

864b859b56cfe9e7.png

9. 💡Gemini CLI в рабочем процессе CI/CD

Если вы являетесь пользователем Github, вы можете легко встроить Gemini CLI в свой конвейер непрерывной интеграции/разработки (CI/CD) с помощью действия Github run-gemini-cli . Оно действует как автономный агент для критически важных рутинных задач по написанию кода, так и как инструмент совместной работы по запросу, которому можно быстро делегировать работу.

Вы можете использовать его для проверки запросов на включение внесенных изменений, сортировки проблем, анализа и модификации кода, а также для многого другого, используя Gemini в режиме диалога непосредственно в репозиториях Github.

Пример этой интеграции можно увидеть в этом запросе на извлечение , где мы используем расширение Gemini CLI Security внутри бегуна и предоставляем отзывы при создании запроса на извлечение.

ad2a8e8d0a15e3f5.png

3cb40f104ce6a594.png

8edb7277fa6324b.png

ef48414c02a16dfa.png

10. 💡Изучите другие расширения Gemini CLI

8a7939ee0328e6e2.png

Вы также можете ознакомиться с другими расширениями на сайте https://geminicli.com/extensions . Там вы найдете ещё больше интересных инструментов!

11. 🧹 Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этой лабораторной работе, выполните следующие действия:

  1. В консоли Google Cloud перейдите на страницу Управление ресурсами .
  2. В списке проектов выберите проект, который вы хотите удалить, а затем нажмите Удалить .
  3. В диалоговом окне введите идентификатор проекта, а затем нажмите кнопку «Завершить», чтобы удалить проект.