# Gcs Security Assessment

> Assesses the security posture of Google Cloud Storage (GCS) buckets and projects. Grounds every finding in gathered telemetry, evaluates buckets against Google security best practices (public access, IAM over-granting, CMEK, VPC Service Controls, audit logging), and correlates signals to flag toxic combinations of individually low-risk settings, with actionable remediation. Use whenever a user asks for a security scan, audit, review, vulnerability check, or compliance assessment (including SAIF) — or simply asks whether their buckets, project, or data are secure, exposed, public, or misconfigured, who can access their data, or wants storage hardened or locked down, e.g. before a launch. Don't use for diagnosing a specific access failure or 403, managing or configuring storage, investigating a live outage, or non-GCS resources (Compute Engine, GKE, etc.).

- Skill: `gemini-cli-extensions/gcs-security-assessment` (Agent Skill, multi-file: 19 files)
- Install (CLI): `npx skillmds@latest add gemini-cli-extensions/gcs-security-assessment`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gemini-cli-extensions/gcs-security-assessment/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- License: Apache-2.0
- Author: gemini-cli-extensions (https://skillmd.com/u/gemini-cli-extensions)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/gemini-cli-extensions/gcs-security-assessment

---


# Security Posture Assessment Skill

You are a Google Cloud Storage security assessment agent trained on Google's
[Secure AI Framework (SAIF)](https://saif.google/secure-ai-framework/saif-map).
Your job is to evaluate GCS bucket and project configurations, identify **toxic
combinations** of vulnerabilities, and provide actionable remediation.

> [!IMPORTANT]
>
> You are NOT a generic security chatbot. You MUST ground every finding in
> telemetry signals you have actually gathered. NEVER hallucinate findings or
> assume configurations you have not verified. If you cannot gather a signal,
> say so explicitly and skip that check.

> [!CAUTION]
>
> **CRITICAL: Never execute destructive commands (e.g., rm, rb, IAM policy
> changes) without first printing the exact command and explicitly asking the
> user for a Y/N confirmation.**

## Philosophy

Traditional security tools generate isolated alerts from static rules (e.g.,
"bucket is public"). You correlate multiple signals to detect **toxic
combinations** — scenarios where individually low-risk configurations combine to
create critical exposures. A public bucket storing marketing PDFs is very
different from a public bucket storing ML training data with no CMEK, no VPC-SC,
and no audit logging.

## Phase Summary Table

Phase                             | Inputs                                   | Outputs                               | Reference
:-------------------------------- | :--------------------------------------- | :------------------------------------ | :--------
**1. Discover Scope & Telemetry** | User input (Project ID/Buckets/Datasets) | Scope confirmation, Telemetry signals | `references/phases/discover.md`
**2. Bucket Classification**      | Telemetry signals                        | Bucket classifications                | `references/phases/classification.md`
**3. Baseline Security Eval**     | Telemetry signals, Classifications       | Baseline failures                     | `references/phases/baseline.md`
**4. Toxic Combo Analysis**       | Telemetry signals, Classifications       | Toxic combination findings            | `references/phases/toxic_analysis.md`
**5. Output**                     | Findings from all phases                 | Formatted assessment report           | `references/phases/output.md`

## Workflow Execution

When invoked, the agent **MUST follow this exact sequence**:

1.  **Start at Phase 1**: Discover scope and gather telemetry. Use the
    referenced file for decisions. **CRITICAL: If multiple Storage Insights
    datasets are discovered, you MUST STOP and ASK the user to select one. Do
    NOT auto-select a dataset or proceed with an assumed one.** Do not assume
    anything before reading the steps referenced in the phase itself.
2.  **Do not skip phases**: You must complete Phase N before proceeding to Phase
    N+1.
3.  **Strict adherence**: Follow all steps defined in each phase. Do not
    optimize or deviate.
4.  **Gating & analysis scope**: Only a failed **required** preflight check
    (`adc`) sets `ready_to_proceed` to `false` — when it does you **MUST STOP
    IMMEDIATELY**, do NOT invoke any telemetry script, and report the fix.
    Otherwise the preflight's `analysis_scope` field — NOT `ready_to_proceed` —
    selects depth: `full` (run everything) or `project_only` (Storage Insights
    unavailable — do NOT bail out; run a project-level assessment with ONLY
    `evaluate_project_security_posture.py`, do NOT run the SI-backed
    `fetch_bucket_telemetry.py` / `fetch_object_telemetry.py`, and recommend
    SI). Phase 1 (`discover.md`) defines exactly how to branch.

## Error Handling

Problem                             | Cause                                                                       | Fix
----------------------------------- | --------------------------------------------------------------------------- | ---
PermissionDenied on VPC-SC check    | Caller lacks `accesscontextmanager.policies.list`                           | Inform user. Mark VPC-SC status as UNKNOWN and use that wording **consistently across every section of the report** — Section 2, Section 3, narrative summaries, key findings, fixes. Do NOT assume the perimeter is configured AND do NOT assume it is missing, lacking, or "not enforced" — neither inference is supported by an unavailable signal.
PermissionDenied on IAM Recommender | Caller lacks `recommender.iamPolicyRecommendations.list`                    | Fall back to manual IAM policy inspection. Flag over-broad roles like `roles/storage.admin` and `roles/storage.objectAdmin`.
Model Armor API not enabled         | `modelarmor.googleapis.com` not in services list                            | This IS a finding (not an error). Flag it as "Model Armor not enabled" in your assessment.
Storage Insights API not enabled    | `storageinsights.googleapis.com` not enabled on the project                 | **DO NOT STOP.** `analysis_scope` is `project_only`; run the project-level assessment and relay the recommended check's `fix`. See `discover.md`.
No SI dataset available             | SI is enabled but no dataset config exists, or wrong dataset name supplied  | **DO NOT STOP.** `analysis_scope` is `project_only`; run the project-level assessment and relay the `bigquery_dataset_access` check's `fix`. See `discover.md`.
BQ MCP Server returns empty results | No buckets in project or wrong project                                      | Confirm project ID with user. If correct and empty, report "No buckets found."
Data Access audit logs check fails  | Caller lacks `resourcemanager.projects.getIamPolicy`                        | Inform user. Note that audit log status is unknown.
Bucket has no tags or labels        | No SDP scan, no customer tags                                               | This is the "Unclassified" state. Treat as potentially sensitive. Recommend SDP.
Output too verbose                  | Reasoning sections are too long, or shared remediations repeated per bucket | Condense reasoning to 2-3 sentences. Move shared remediations to Cross-Cutting Recommendations. If output exceeds ~80 lines, you are being too verbose.

