Файл config/service account.json — это распространённое имя для JSON-файла с ключом сервисного аккаунта Google Cloud (Google Cloud Service Account key). Он часто используется для аутентификации приложений, CI/CD, скриптов и инфраструктуры. В криптопроектах такие файлы дают доступ к узлам, бакам с данными, бэкапам и другим сервисам — и именно поэтому их утечка может привести к серьёзным последствиям: от компрометации инфраструктуры до финансовых потерь.
Формально файл содержит закрытый ключ и метаданные: project_id, client_email, private_key_id и др. Этот ключ даёт право выступать от имени сервисного аккаунта до тех пор, пока не будет отозван.
Пример типичной структуры (редактированный):
{ "type": "service_account", "project_id": "my-project-123", "private_key_id": "abcd1234efgh5678ijkl9012mnop3456qrst7890", "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkq...\n-----END PRIVATE KEY-----\n", "client_email": "sa-name@my-project-123.iam.gserviceaccount.com", "client_id": "123456789012345678901", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/sa-name%40my-project-123.iam.gserviceaccount.com" }
Ключевые поля для безопасности:
В крипто-инфраструктуре это может быть:
1. Утечка в репозиторий: публичный репозиторий GitHub — самый распространённый источник утечек. По истории безопасности множество инцидентов начались с коммита секретов. 2. CI-пайплайн и логи: иногда значение переменной логируется случайно. 3. Docker-образы: если ключ включён в образ — он и там останется. 4. Кража на скомпрометированном рабочем месте или ноутбуке. 5. Некорректные права: сервисный аккаунт с большим числом привилегий = большая зона поражения.
Последствия:
1. Никаких long-lived ключей в репозиториях. 100% запрет на коммиты. 2. Минимальные права (principle of least privilege): давайте роли, только необходимые. Например, если нужен только доступ к одному bucket — назначьте роль Storage Object Viewer. 3. Ограничение числа ключей: в GCP можно иметь до 10 закрытых ключей на один сервисный аккаунт — используйте это аккуратно и удаляйте старые. 4. Ротация ключей каждые 90 дней (рекомендация). Для критичных аккаунтов — каждые 30 дней. 5. Файловые права: chmod 400 или chmod 600 на файл service account.json на хосте. 6. Хранение в менеджерах секретов: GCP Secret Manager, HashiCorp Vault, AWS Secrets Manager. Не держите ключи в plain-text. 7. Используйте Workload Identity Federation вместо JSON в CI/внешних системах — позволяет получать короткоживущие токены без длинных ключей. 8. Логирование и мониторинг: включите Cloud Audit Logs, настройте оповещения на необычную активность (например, создание ключа, удаление ключа, API-вызовы с необычных IP). 9. Ограничения по IP: для сервисных аккаунтов можно настроить VPC Service Controls или IAM Conditions с ограничением по источнику. 10. Не включайте ключи в Dockerfile/образ: лучше монтировать секреты на этапе запуска.
1. Создать новый ключ: gcloud iam service-accounts keys create /tmp/new-key.json --iam-account=sa-name@project.iam.gserviceaccount.com
2. Развернуть новый ключ в тех системах, где он нужен (CI, сервисы). Проверить работоспособность.
3. Убедиться, что все инстансы переключились на новый ключ.
4. Удалить старый ключ: gcloud iam service-accounts keys delete old-key-id --iam-account=sa-name@project.iam.gserviceaccount.com
5. Документировать ротацию и дату. Хранить метаданные в хранилище секретов с версионированием.
Примечание: ограничение — до 10 ключей на аккаунт. Планируйте ротации с учётом этого лимита.
1. Идентифицировать сервисный аккаунт по client_email/private_key_id. 2. Отозвать все ключи (gcloud iam service-accounts keys delete). 3. Временно отключить сервисный аккаунт (disable) или уменьшить роли до нулевых привилегий. 4. Провести ревизию облачных логов (Cloud Audit Logs) и определить активность — IP-адреса, вызовы API, временные метки. 5. Поставить уведомления и мониторинг, развернуть IDS/EDR. 6. Сообщить команде, провести форенсик и проверить бэкапы приватных ключей и трансакций. 7. Создать и развернуть новый ключ/механику аутентификации (желательно Workload Identity).
Workload Identity Federation (WIF) позволяет внешним средам (GitHub Actions, AWS, локальные CI) обменивать внешнюю идентичность за короткоживущий токен GCP без хранения private_key в JSON. Это современный и безопасный подход.
Преимущества:
Рекомендация: если вы используете CI/CD (GitHub Actions/GitLab) — настройте OIDC провайдера и WIF вместо хранения JSON-секрета.
1. Убедиться, что в репозиториях нет JSON-файлов с ключами (scanning). 2. Перейти на Workload Identity Federation там, где возможно. 3. Хранить ключи в Secret Manager/Vault и ограничивать доступ. 4. Ротировать ключи по расписанию (90/30 дней в зависимости от критичности). 5. Делегировать минимальные роли. 6. Включить Cloud Audit Logs и оповещения. 7. Ограничивать использование ключей по IP и сетевым политикам. 8. Обеспечить файловые права (400/600). 9. Проводить регулярные ревизии и учёту ключей (inventory). 10. Обучить разработчиков и DevOps избегать коммитов секретов.
Крипто-проекты особенно чувствительны к утечкам инфраструктурных ключей: в одной утечке могут пострадать кошельки, бэкапы приватных ключей, приватные ноды и мониторинг транзакций. Переход на принципы минимальных прав, использование WIF и секрет-менеджеров, регулярная ротация и автоматизация — это не «желательно», а необходимое условие надёжной работы.
Если вы работаете с config/service account.json сейчас — составьте план: ревизия доступа (1 день), перенос в секрет-менеджер и ограничение прав (1–3 дня), настройка WIF (1–2 недели в зависимости от CI), регулярная ротация и мониторинг (постоянно). Маленькие инвестиции в процесс и инструменты могут предотвратить масштабные инциденты и огромные финансовые потери.