← всі звіти · gcp-audit-2026-05-12.md

type: audit title: Ревізія Google Cloud — security & cost date: 2026-05-12 source: Сергій (paste у Telegram) owner: Сергій + Claude VPS status: action-pending

Ревізія Google Cloud акаунту — 2026-05-12

Контекст

Сергій передав повний security & cost audit GCP. VPS Claude не має gcloud встановленого → ці дії виконуються вручну через Cloud Console, або після інсталяції gcloud на VPS — автоматизуємо.

Передісторія: 14 квітня 2026 Antigravity вже робив повний аудит 22 GCP-проектів. Тоді знайдено DeltaProject з ключем 2018 (8 років без restrictions) + 9 «zombie» проектів. Прийнято рішення: НЕ видаляти, а Disable key / Disable Billing (session 2026-04-14, рядок 80).

🔍 Liveness check (12-05-2026)

Перевірив кожен проект з нинішнього аудиту проти VPS-side evidence: код, cron, systemd-сервіси, wiki, recent traffic.

Проєкт Liveness Evidence Дія
ad-analytics-hub 🟢 ALIVE prod daily_delta_monitor cron (04:30 UTC) + Google Ads OAuth + App Engine app IAM downgrade SA, ротація JSON-key, fix BQ Data Transfer
menopace-project 🟢 ALIVE prod gemini-sandbox.key споживається arteggia-bot.service (active 6 days) + legal-advisor + case-builder. ❓ але ключ названий «Med detective» у Menopace = topology mismatch IP restriction → 31.131.26.203 на gemini_sandbox ключ. Прояснити «Med detective» ключ.
Med detective (окремий project per wiki) 🟢 ALIVE prod med-detective.service + med-detective-menopace.service обидва active. У нинішньому аудиті НЕ з'явився як проблемний — мабуть restrictions вже стоять. Verify status у Console
biogaia-storybook-dm1 (Firebase Hosting) 🟢 ALIVE prod, ВЖЕ ЗАХИЩЕНИЙ .firebaserc показує цей project як прод Story Maker. Antigravity 14.04: «✅ Виправлено: BioGaia Storybook (HTTP referrer додано)». У новому аудиті відсутній. Нічого, статус OK
biogaia-story-maker (5 ключів у новому аудиті) 🟡 ORPHAN / suspect Firebase project ≠ цей. Нуль references на VPS на цей project_id. У списку Antigravity 14.04 цей вже значився як «незахищений» — значить існує мінімум місяць, з 5 ключами, без споживачів на VPS. Disable all 5 keys (rollback ready: re-enable якщо щось зламається на клієнтських сайтах)
gen-lang-client-0463685358 (Biogaia Carusle maker, 3 ключі) 🟡 ORPHAN / suspect Нуль references на VPS. Не у wiki. Можливо клієнтський веб-проект (карусель промо?). У 14.04 списку відсутній — означає створений після квітня. Disable all 3 keys + питання Сергію: який це продукт?
gen-lang-client-0153982687 (Zest Kids, 1 ключ) 🟡 ORPHAN / suspect Zest як продукт активний у Google Ads + CrewAI banner generation (квітень), але CrewAI використовує gemini-sandbox.key (правило routing у wiki). Сам project_id без VPS-references. Можливо клієнтський фронтенд. Disable key + питання: де працює цей ключ?
OpenClaw (€100 budget, €0 spend) 🔴 DEAD У 14.04 списку «незахищених». €0 spend за місяць. Нуль references. Стара R&D-ідея. Disable billing на проекті або archive
BioGaia (Computer Use research key, per wiki) 🟡 R&D / dormant gemini-computer-use-research.key файл є, але споживачів немає, тільки заплановано (Heafolik captcha, Ads cookie-refresh) Не критично. IP restriction профілактично.
banner-analytics-fluvir 🟢 ALIVE, без ключів Fluvir/Fluvyr продукт активний, GA4-аналітика Нічого, статус OK

Висновок з liveness-аналізу

Тільки 3 проекти потребують hardening як «живі з ключами»:

  1. menopace-project → IP restriction на gemini_sandbox
  2. ad-analytics-hub → IAM downgrade + key rotation + BQ Data Transfer fix
  3. Med detective → verify status (мабуть OK)

5 проектів-кандидатів на Disable (за рішенням 14.04 «disable, не delete»):

Якщо щось зламається після disable — re-enable + restrictions. Це безпечніше і швидше ніж класифікувати кожен ключ окремо.

🔴 Критичні знахідки

1. 10 Gemini API ключів без Application restrictions (4 проєкти)

Проєкт (ID) Ключів Recommended restriction Чому
gen-lang-client-0463685358 (Biogaia Carusle maker) 3 TODO classify (frontend/backend?) Не у wiki — треба з'ясувати призначення
gen-lang-client-0153982687 (Zest Kids) 1 TODO classify Не у wiki
menopace-project 2 IP restriction (VPS 31.131.26.203) gemini-sandbox → server-side. Med detective ключ у Menopace project — невідповідність топології, перевірити.
biogaia-story-maker 5 Mixed: див. нижче Один ключ підтверджено захардкоджений у frontend JS

Деталь по Biogaia Story Maker (5 ключів)

Browser key / Biogaia story Prod / Gemini API Key — використовуються у script.js напряму з браузера клієнта (gemini-2.5-pro для генерації, gemini-2.5-flash-image × 12 для ілюстрацій). Підтвердження у /srv/wiki/biogaia-story/index.md рядок 19: «script.js викликає Gemini API НАПРЯМУ (key захардкожений у JS!)».

Restriction type: HTTP referrer на біогая-сторі домен. Це єдиний спосіб захистити frontend-ключ без переписування архітектури на серверну. Жертва — ключ далі публічний, але обмежений джерелом запиту.

Гнучкіше довгострокове рішення: перенести на Cloud Function/Run, тоді → IP/SA.

Деталь по Menopace project (2 ключі)

2. Надмірні IAM права у ad-analytics-hub

🟡 Важливі знахідки

3. Бюджет

Дії:

  1. З'ясувати джерело росту: ймовірно BQ queries (Ad Analyzer daily delta), або Gemini API через AI Ultra (але це SaaS-підписка, не GCP billing).
  2. Підвищити бюджет до €25 на травень, налаштувати per-project alerts (50% / 80% / 100%).
  3. Включити Detailed billing export у BQ якщо ще не — щоб бачити breakdown.

4. BigQuery Data Transfer API — 100% errors

ad-analytics-hub → BQ Data Transfer API: 1 запит, 100% errors. Ймовірно зламана scheduled transfer job (можливо для GA4 → BQ або Google Ads → BQ).

Дія: перевірити Data Transfer Jobs у Console → BigQuery → Data Transfers → подивитись який job failed і error message.

5. ad-pipeline-worker — JSON ключ

Key ID daa8c73..., створений 16 Mar 2026, останнє використання 16 Apr 2026.

Файли на VPS: /srv/passepartout/google/ad-pipeline-worker-sa.json та bigquery-sa.json (у wiki відмічено як можливий дубль — open question #2).

Дії:

  1. Підтвердити який з двох файлів живий (з'явитись у logs за key_id).
  2. Видалити дубль.
  3. Workload Identity — НЕ застосовно, бо споживач не у GCP (/srv/services/ на нашому VPS, поза GCP). JSON key тут необхідний.
  4. Ротувати: створити новий key, оновити VPS, видалити старий через ~24 год.

6. OAuth consent screen

Biogaia Carusle maker + Biogaia Story Maker — попередження. Якщо ці проекти не використовують OAuth (тільки API keys), достатньо просто заповнити мінімально необхідні поля у Testing mode.

🟢 Що ОК

Пріоритетний план дій

# Що Тип Виконавець Estimated effort
1 Restrict Gemini ключі Biogaia Story Maker (3 frontend) → HTTP referrer Manual Console Сергій 10 хв
2 Restrict gemini-sandbox (Menopace) → IP 31.131.26.203 Manual Console Сергій 3 хв
3 З'ясувати призначення Biogaia Carusle (3) + Zest Kids (1) + bsm3 + Med detective у Menopace Discovery Сергій + Claude 15 хв
4 Знизити роль App Engine SA з Editor → BQ Data Viewer + Job User Manual Console Сергій 5 хв (з ризиком зламати App Engine app — перевірити які API вона викликає)
5 BQ Data Transfer — глянути failed job, пофіксити чи видалити Manual Console Сергій 10 хв
6 Ротація ad-pipeline-worker JSON ключа Mixed Сергій + Claude (підстановка нового ключа у VPS) 15 хв
7 Бюджетні alerts per-project (50/80/100%) + підвищити загальний до €25 Manual Console Сергій 10 хв
8 OAuth consent screen — заповнити Testing mode у 2 Biogaia проектах Manual Console Сергій 5 хв
9 Видалити дубль ad-pipeline-worker-sa.json vs bigquery-sa.json VPS Claude 5 хв (після підтвердження який живий)

Що Claude може автоматизувати (після apt install google-cloud-cli)

# Listing
gcloud projects list
gcloud iam service-accounts list --project=ad-analytics-hub
gcloud alpha services api-keys list --project=biogaia-story-maker

# Restrictions (приклад для referrer)
gcloud alpha services api-keys update KEY_ID \
  --allowed-referrers="https://*.biogaia-story.example/*" \
  --project=biogaia-story-maker

# IAM role downgrade
gcloud projects remove-iam-policy-binding ad-analytics-hub \
  --member="serviceAccount:ad-analytics-hub@appspot.gserviceaccount.com" \
  --role="roles/editor"
gcloud projects add-iam-policy-binding ad-analytics-hub \
  --member="serviceAccount:ad-analytics-hub@appspot.gserviceaccount.com" \
  --role="roles/bigquery.dataViewer"
gcloud projects add-iam-policy-binding ad-analytics-hub \
  --member="serviceAccount:ad-analytics-hub@appspot.gserviceaccount.com" \
  --role="roles/bigquery.jobUser"

Рекомендую встановити gcloud на VPS — тоді всі ці дії можна виконати з Claude session з логами і rollback-планом.

Open questions для Сергія

  1. Biogaia Carusle maker (project gen-lang-client-0463685358) — це який продукт? Не у wiki. 3 ключі — frontend чи server-side?
  2. Zest Kids (project gen-lang-client-0153982687) — який сервіс споживач?
  3. Med detective ключ у menopace-project — чому не в окремому проекті Med detective як було по wiki?
  4. bsm3 у Biogaia Story Maker — призначення?
  5. Чи можу встановити gcloud на VPS і автоматизувати pp.1–6?
  6. Application restrictions на frontend-ключ Biogaia Story Maker — який саме домен дозволяти (referrer pattern)?

Cross-references