вариант
ДомДом Skill Безопасность iam-recommendations-fetcher

iam-recommendations-fetcher

google/skills google/skills

Извлекает рекомендации IAM и аналитические данные по безопасности из Google Cloud для указанной организации, папки или проекта с помощью инструментов MCP, командной строки gcloud или прямых вызовов API.

...Расширить все
14
Обновлено время 4 сентября 2026 г.

Получение рекомендаций IAM

В данном разделе приведены инструкции по получению рекомендаций и аналитических данных IAM из Google Cloud. Здесь рассматриваются проверка допустимости входной области действия, получение рекомендаций с помощью инструментов MCP, команд gcloud или прямых вызовов API, а также обработка типичных ошибок API.

Порядок действий

1. Проверка входной целевой области

Проверьте входную целевую область.

  1. Проверка формата: Убедитесь, что целевая область соответствует одному из следующих форматов:

    • organizations/{org_id}
    • папки/{id_папки}
    • projects/{project_id}
  2. Обработка неоднозначных/неформатированных целей: если пользователь указал только неформатированный идентификатор (без префикса):

    • Буквенно-цифровой (начинается с буквы): считать, что это идентификатор проекта. Оформить его в виде projects/{project_id} и продолжить.
    • Чисто цифровой: это неоднозначно (может быть номером организации, папки или проекта).
      • Попросите пользователя уточнить тип ресурса: > «Является ли идентификатор цели '{provided_id}' организацией, папкой или проектом?»
      • Как только пользователь уточнит, отформатируйте целевую область соответственно (например, добавьте в начало organizations/, folders/ или projects/) и продолжайте.
      • Если ответ пользователя неверный или он не может уточнить, рассматривайте это как ошибку и перейдите к разделу «Обработка ошибок (неверная цель)».
  3. Обработка номеров проектов: если цель является проектом, но использует чисто числовой идентификатор (номер проекта) вместо идентификатора проекта (например, projects/123456789):

    • командыgcloud recommender требуют идентификатора проекта. Попытайтесь преобразовать номер проекта в идентификатор проекта с помощью: gcloud projects list --filter="projectNumber={project_number}" --format="value(projectId)"
    • Если это преобразование возвращает пустой результат или завершается с ошибкой, связанной с правами доступа, не пытайтесь описывать проект, выполнять поиск в кодовой базе или искать фиктивные данные. Немедленно верните стандартизированный JSON-объект ошибки, указанный в разделе «Обработка ошибок», и остановите выполнение (не вызывайте дополнительные инструменты).
  4. Проверка записи: явно укажите проверенную и отформатированную целевую область действия (например, projects/123456789 или organizations/123456789012) в своём обосновании перед переходом к этапу извлечения.

2. Получение рекомендаций и аналитики (резервный поток)

Попробуйте следующие методы извлечения по порядку. Остановитесь при первом успехе.

КРИТИЧЕСКИ ВАЖНО: Быстрое прекращение при ошибках (чтобы избежать избыточных вызовов API, которые завершатся неудачей по тем же причинам, связанным с авторизацией/разрешениями): если любой из попытанных методов (вариант A или вариант B) завершится ошибкой на уровне API (такой как PERMISSION_DENIED, UNAUTHENTICATED или ресурс NOT_FOUND / не существует) или ошибкой проверки CLI (например, недопустимый номер проекта), НЕ пытайтесь использовать дальнейшие варианты (включая вариант C или прямые вызовы API/curl). Немедленно остановитесь, не вызывайте больше никаких инструментов и верните стандартизированный JSON-объект ошибки, как указано в разделе «Обработка ошибок».

Вариант A: Инструмент MCP (рекомендуется)

Используйте инструмент MCP, если он доступен. Инструменты MCP разработаны для эффективного и безопасного выполнения в внутренних средах Google и зачастую обеспечивают упрощённую аутентификацию и лучшую интеграцию по сравнению с универсальными командами CLI.

Если в вашем контексте доступен инструмент MCP для IAM Recommender:

  • вызовите инструмент с параметром target.

Вариант B: CLI gcloud (первый запасной вариант)

Если MCP недоступен, используйте run_command для выполнения следующего кода (замените переменные соответствующим образом):

Target Флаг
projects/{project_id} --project={project_id}
folders/{folder_id} --папка={id_папки}
организации/{идентификатор_организации} --организация={идентификатор_организации}

Команды для запуска:

GCLOUD_COMMON_FLAGS="--format=json --location=global \
--filter=stateInfo.state=ACTIVE"

# 1. Получение рекомендаций
gcloud recommender recommendations list \
--recommender=google.iam.policy.Recommender $GCLOUD_COMMON_FLAGS {mapped_flag}

# 2. Получение аналитических данных
gcloud recommender insights list --insight-type=google.iam.policy.Insight
$GCLOUD_COMMON_FLAGS {mapped_flag}

Вариант C: API Google Cloud (крайняя мера)

Попробуйте этот вариант только в том случае, если gcloud физически недоступен в среде (например, gcloud: команда не найдена). Клиентские библиотеки API требуют больше настроек и затрат на выполнение, поэтому их используют только в крайнем случае, если инструменты CLI отсутствуют. НЕ используйте этот вариант, если gcloud доступен, но завершил работу с ошибкой API.

Используйте клиентские библиотеки API Google Cloud Recommender с помощью вспомогательного скрипта (или прямых вызовов API, если библиотеки недоступны) для:

  1. Вызов list_recommendations (или recommendations.list) для google.iam.policy.Recommender (фильтр: stateInfo.state=ACTIVE).
  2. Вызвать list_insights (или insights.list) для google.iam.policy.Insight (фильтр: stateInfo.state=ACTIVE).

3. Определение формата вывода и доставка

КРИТИЧЕСКОЕ: Переходите к этому шагу только в том случае, если извлечение данных на шаге 2 прошло успешно. Если извлечение завершилось сбоем, пропустите этот шаг и перейдите непосредственно к разделу «Обработка ошибок».

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

КРИТИЧЕСКИ ВАЖНО: Если в исходном запросе пользователя уже указан формат вывода (например, «вернуть исходные результаты в формате JSON» или «отобразить в таблице»), не задавайте дополнительных вопросов и сразу переходите к этому формату.

В противном случае предложите пользователю выбрать из раскрывающегося меню один из следующих вариантов:

  1. Файл JSON
  2. Таблица в формате Markdown в чате

В зависимости от выбора (заранее заданного или выбранного пользователем) предоставьте результат:

Вариант A: Файл JSON

  1. Запишите исходные результаты в файл с именем iam_recommendations__.json (где — очищенный идентификатор ресурса, а имеет формат YYYYMMDD_HHMMSS) в текущем рабочем каталоге.
  2. Содержимое файла должно соответствовать структуре, показанной в «Примере выполнения».
  3. Ответьте пользователю, указав путь к файлу.

Вариант B: Таблица чата

  1. Сортировка рекомендаций: отсортируйте полученные рекомендации, поместив рекомендации агента службы в конец списка.
  2. Форматирование таблицы: отформатируйте отсортированные рекомендации в виде таблицы в формате Markdown. Таблица должна содержать следующие ключевые поля:
    • Подтип: подтип рекомендательной системы или подтип аналитической информации (например, указывающий, предназначена ли она для ролей на уровне ресурсов).
    • Рекомендуемое действие: краткое описание рекомендации.
    • Обоснование: обоснование/оправдание.
    • Связанные аналитические данные: Идентификаторы любых связанных аналитических данных (из associatedInsights).
  3. Ограничить отображение в чате: отображать в таблице чата только 10 лучших рекомендаций .
  4. Предоставить полный список: сохранить полный список рекомендаций и аналитических выводов в файл Markdown (например, iam_recommendations__.md, где — это очищенный идентификатор ресурса, а оформлен в формате ГГГГММДД_ЧЧММСС) и предоставить пользователю ссылку для его загрузки.
  5. Оформление таблицы аналитических данных: если имеются аналитические данные, оформите их в виде отдельной таблицы в файле Markdown (и, при желании, покажите сводку в чате, если это уместно, но не перегружайте чат). Таблица должна содержать ключевые поля:
    • Идентификатор аналитической информации: идентификатор аналитической информации (INSIGHT_ID).
    • Состояние: состояние аналитической информации (INSIGHT_STATE).
    • Подтип: подтип аналитической информации (INSIGHT_SUBTYPE).
    • Описание: описание аналитической информации (DESCRIPTION).
  6. НЕ предоставляйте файл JSON с необработанными результатами, если выбран этот вариант.

4. Пример выполнения

  • Целевой объект ввода: projects/my-test-project

  • Сопоставленный флаг: --project=my-test-project

  • Действие (вариант B): Запустить команду gcloud recommender recommendations list --recommender=google.iam.policy.Recommender --format=json --location=global --filter=stateInfo.state=ACTIVE --project=my-test-project

  • Ожидаемая структура вывода:

    {
      "raw_results": {
        "recommendations": [
          {
            "name": "projects/my-test-project/locations/global/recommenders/ \
            google.iam.policy.Recommender/recommendations/123",
            "content": { ... }
          }
        ],
        "insights": []
      },
      "error": null
    }
    

5. Обработка ошибок

КРИТИЧЕСКИ ВАЖНО: Если вы столкнётесь с любой из приведённых ниже ошибок (во время валидации или извлечения данных), немедленно остановитесь. Не пытайтесь отлаживать, переключаться между учётными записями, искать в коде или проверять наличие ресурса. Немедленно выведите указанную структуру JSON в качестве окончательного ответа и не вызывайте никаких других инструментов.

Если все методы завершились неудачей, верните:

  • При неверном целевом ресурсе: {"raw_results": null, "error": "Указанный целевой ресурс неверный или не существует."}
  • При проблемах с аутентификацией: {"raw_results": null, "error": "Пользователь не авторизован. Пожалуйста, пройдите аутентификацию (например, выполните команду 'gcloud auth login')."}
  • При проблемах с правами доступа: {"raw_results": null, "error": "Недостаточные права доступа. Убедитесь, что у вас есть роль 'roles/recommender.iamViewer' в целевой области действия."}
  • Прочее: {"raw_results": null, "error": "Не удалось получить данные: {error_details}"} (Не сообщайте пользователю о сбоях инструмента MCP).

Подводные камни

  • Фильтр состояния: всегда убеждайтесь, что вы фильтруете АКТИВНЫЕ рекомендации.
  • Местоположение: IAM Recommender всегда работает в глобальном масштабе.
Посмотреть на GitHub
---
name: iam-recommendations-fetcher
description: Fetches IAM recommendations and security insights from Google Cloud for a specified organization, folder, or project, using MCP tools, gcloud CLI, or direct API calls.
---

# IAM Recommendations Retrieval

This skill provides instructions for fetching IAM recommendations and insights
from Google Cloud. It covers validating the input target scope, retrieving
recommendations using MCP tools, gcloud commands, or direct API calls, and
handling common API errors.

## Procedures

### 1. Validate Input Target

Verify the input target scope.

1.  **Check Format**: Check if the target matches one of these formats:

    *   `organizations/{org_id}`
    *   `folders/{folder_id}`
    *   `projects/{project_id}`

2.  **Handle Ambiguous/Raw Target**: If the user provides only a raw ID (without
    the prefix):

    *   **Alphanumeric (starts with a letter)**: Assume it is a Project ID.
        Format it as `projects/{project_id}` and proceed.
    *   **Purely Numeric**: It is ambiguous (could be Organization, Folder, or
        Project Number).
        *   Ask the user to clarify the resource type: > "Is the target ID
            '{provided_id}' an Organization, a Folder, or a Project?"
        *   Once the user specifies, format the target scope accordingly (e.g.,
            prepend `organizations/`, `folders/`, or `projects/`) and proceed.
        *   If the user's response is invalid or they cannot clarify, treat it
            as an error and proceed to [Handle Errors](#5-handle-errors)
            (incorrect target).

3.  **Handle Project Numbers**: If the target is a project but uses a purely
    numeric ID (Project Number) instead of a Project ID (e.g.,
    `projects/123456789`):

    *   `gcloud` recommender commands require a Project ID. Attempt to resolve
        the Project Number to a Project ID using: `gcloud projects list
        --filter="projectNumber={project_number}" --format="value(projectId)"`
    *   If this resolution returns empty or fails with a permission error, do
        not attempt to describe the project, search the codebase, or search for
        mock data. Immediately return the standardized error JSON specified in
        [Handle Errors](#5-handle-errors) and stop execution (do not call any
        more tools).

4.  **Record Validation**: Explicitly state the validated and formatted target
    scope (e.g., `projects/123456789` or `organizations/123456789012`) in your
    thought/reasoning before proceeding to the fetch step.

### 2. Fetch Recommendations and Insights (Fallback Flow)

Attempt the following retrieval methods in order. Stop at the first success.

**CRITICAL: Fail Fast on Errors** (To avoid redundant API calls that will fail
for the same authorization/permission reasons): If any attempted method (Option
A or Option B) fails with an API-level error (such as `PERMISSION_DENIED`,
`UNAUTHENTICATED`, or resource `NOT_FOUND` / does not exist) or a CLI validation
error (such as project number not allowed), **do NOT attempt any further
options** (including Option C or direct API/curl calls). Stop immediately, do
not call any more tools, and return the standardized error JSON as specified in
the "Handle Errors" section.

#### Option A: MCP Tool (Preferred)

Use the MCP tool if available. MCP tools are designed for efficient, secure
execution within Google's internal environments, often providing streamlined
authentication and better integration compared to general-purpose CLI commands.

If an IAM Recommender MCP tool is available in your context:

*   Call the tool with the `target` parameter.

#### Option B: gcloud CLI (First Fallback)

If MCP is unavailable, use `run_command` to execute the following (replace
variables accordingly):

Target                            | Flag
:-------------------------------- | :---------------------------------
`projects/{project_id}`           | `--project={project_id}`
`folders/{folder_id}`             | `--folder={folder_id}`
`organizations/{organization_id}` | `--organization={organization_id}`

**Commands to run**:

```bash
GCLOUD_COMMON_FLAGS="--format=json --location=global \
--filter=stateInfo.state=ACTIVE"

# 1. Fetch Recommendations
gcloud recommender recommendations list \
--recommender=google.iam.policy.Recommender $GCLOUD_COMMON_FLAGS {mapped_flag}

# 2. Fetch Insights
gcloud recommender insights list --insight-type=google.iam.policy.Insight
$GCLOUD_COMMON_FLAGS {mapped_flag}
```

#### Option C: Google Cloud API (Final Fallback)

Only attempt this option if `gcloud` is physically unavailable in the
environment (e.g., `gcloud: command not found`). API client libraries require
more setup and execution overhead, so they are only used as a last resort if CLI
tools are missing. Do NOT use this option if `gcloud` is available but failed
with an API error.

Use Google Cloud Recommender API client libraries via a helper script (or direct
API calls if libraries are unavailable) to:

1.  Call `list_recommendations` (or `recommendations.list`) for
    `google.iam.policy.Recommender` (filter: `stateInfo.state=ACTIVE`).
2.  Call `list_insights` (or `insights.list`) for `google.iam.policy.Insight`
    (filter: `stateInfo.state=ACTIVE`).

### 3. Determine Output Format and Deliver

**CRITICAL**: Only proceed to this step if the retrieval in Step 2 was
successful. If the retrieval failed, skip this step and go directly to
[Handle Errors](#5-handle-errors).

Before presenting the results, determine the desired output format.

**CRITICAL**: If the user's initial prompt already specifies the output format
(e.g., "return the raw results in JSON" or "show it in a table"), bypass asking
and proceed directly to that format.

Otherwise, ask the user in a dropdown menu, with the options being:

1.  JSON file
2.  Markdown table in chat

Based on the choice (either pre-specified or chosen by the user), deliver the
output:

#### Option A: JSON File

1.  Write the raw results to a file named
    `iam_recommendations_<target_id>_<timestamp>.json` (where `<target_id>` is
    the sanitized resource identifier and `<timestamp>` is formatted as
    `YYYYMMDD_HHMMSS`) in the current working directory.
2.  The file content must match the structure shown in
    [Example Execution](#4-example-execution).
3.  Respond to the user with the file path.

#### Option B: Chat Table

1.  **Sort Recommendations**: Sort the retrieved recommendations, placing
    service agent recommendations last in the list.
2.  **Format Table**: Format the sorted recommendations into a markdown table.
    The table should contain key fields:
    -   **Subtype**: The recommender subtype or insight subtype (e.g.,
        indicating if it's for resource-level roles).
    -   **Recommended Action**: Summary of the recommendation.
    -   **Rationale**: Rationale/justification.
    -   **Associated Insights**: The IDs of any linked insights (from
        `associatedInsights`).
3.  **Limit Chat Display**: Display only the top 10 recommendations in the chat
    table.
4.  **Provide Full List**: Save the complete list of recommendations and
    insights to a markdown file (e.g.,
    `iam_recommendations_<target_id>_<timestamp>.md`, where `<target_id>` is the
    sanitized resource identifier and `<timestamp>` is formatted as
    `YYYYMMDD_HHMMSS`) and provide a link for the user to download it.
5.  **Format Insights Table**: If insights are present, format them in a
    separate table in the markdown file (and optionally show a summary in chat
    if appropriate, but keep the chat clean). The table should contain key
    fields:
    -   **Insight ID**: The insight identifier (`INSIGHT_ID`).
    -   **State**: The insight state (`INSIGHT_STATE`).
    -   **Subtype**: The insight subtype (`INSIGHT_SUBTYPE`).
    -   **Description**: Description of the insight (`DESCRIPTION`).
6.  **DO NOT** provide a JSON file with the raw results if this option is
    chosen.

### 4. Example Execution

*   **Input Target**: projects/my-test-project
*   **Mapped Flag**: --project=my-test-project
*   **Action (Option B)**: Run `gcloud recommender recommendations list
    --recommender=google.iam.policy.Recommender --format=json --location=global
    --filter=stateInfo.state=ACTIVE --project=my-test-project`
*   **Expected Output Structure**:

    ```json
    {
      "raw_results": {
        "recommendations": [
          {
            "name": "projects/my-test-project/locations/global/recommenders/ \
            google.iam.policy.Recommender/recommendations/123",
            "content": { ... }
          }
        ],
        "insights": []
      },
      "error": null
    }
    ```

### 5. Handle Errors

**CRITICAL**: If you encounter any of the error conditions below (during
validation or fetch), **stop immediately**. Do not attempt to debug, switch
accounts, search the codebase, or verify resource existence. Immediately output
the specified JSON structure as your final response and call no further tools.

If all methods fail, return:

*   For incorrect target: `{"raw_results": null, "error": "The specified target
    resource is incorrect or does not exist."}`
*   For authentication issues: `{"raw_results": null, "error": "User is
    unauthenticated. Please authenticate (e.g., run 'gcloud auth login')."}`
*   For permissions: `{"raw_results": null, "error": "Insufficient permissions.
    Please ensure you have 'roles/recommender.iamViewer' on the target scope."}`
*   Other: `{"raw_results": null, "error": "Failed to fetch: {error_details}"}`
    (Do not mention MCP tool failures to the user).

## Gotchas

*   **State Filter**: Always ensure you are filtering for `ACTIVE`
    recommendations.
*   **Location**: The location for IAM Recommender is always global.

Все файлы

0 файлов

Установить iam-recommendations-fetcher

Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.

Скачать ZIP

Клонируйте репозиторий и скопируйте файлы навыка в свой проект.

git clone https://github.com/google/skills/tree/main/skills/cloud/iam-recommendations-fetcher # Copy SKILL.md to your .claude/skills/ directory

Копировать Копировать
Быстрая настройка: Скопируйте папку со скиллом в .claude/skills/ Claude автоматически обнаружит и начнет использовать этот скилл
Репозиторий google/skills

Похожие навыки

gmgn-portfolio
Обновлено время 1 июля 2026 г.
zeroize-audit
Обновлено время 1 июля 2026 г.
device-integrity
Обновлено время 29 июня 2026 г.
flutter-use-http-package
Обновлено время 30 июня 2026 г.
OR