adminsdk.json — неофициальное имя для JSON-файла служебного аккаунта (service account key), который используется Firebase Admin SDK для авторизации на серверах. По содержанию это стандартный Google Cloud service account key в формате JSON. Типичные поля:
Этот файл даёт приложению "право от имени" сервисного аккаунта обращаться к Firebase/Google API. На практике он часто хранится как serviceAccountKey.json, adminsdk.json или любой другой файл в бэкенде.
Утечка такого JSON-файла эквивалентна компрометации ключа доступа с полномочиями, закреплёнными за сервис-аккаунтом. Последствия:
Факты и цифры: в 2020–2024 годах сотни инцидентов с утечками ключей происходили через публичные репозитории GitHub. По оценке разных аудитов, скомпрометированные сервис-аккаунты приводят к 4–7-значным потерям в зависимости от масштаба проекта.
Обычно файл получают в Google Cloud Console:
1. В Google Cloud Console → IAM & Admin → Service Accounts. 2. Создаёте сервис-аккаунт, назначаете роль(и). 3. На странице аккаунта → Keys → Create key → JSON → скачиваете файл.
Альтернативы генерации: gcloud CLI: gcloud iam service-accounts keys create key.json --iam-account=SERVICE_ACCOUNT_EMAIL
Важно: этот ключ — долгоживущий по умолчанию (до удаления). Поэтому хранение его в репозитории или публичном хранилище — ключевая ошибка.
Основные практики защиты:
1. Никогда не храните JSON в публичных репозиториях. Проверяйте git-историю. 2. Не держите файл на клиенте (браузер, мобильные приложения). Только бэкенд. 3. Используйте минимальные права: принцип наименьших привилегий (least privilege). Создавайте сервис-аккаунт с конкретными ролями (например, только Firestore read/write и/или Firebase Auth admin), а не роль Owner/editor. 4. Избегайте долгоживущих ключей: используйте Workload Identity Federation (WIF) и Application Default Credentials (ADC) для GCP-сервисов — тогда ключи не нужны. 5. Храните секреты в секрет-менеджере: Google Secret Manager, HashiCorp Vault, AWS Secrets Manager, CI/CD secret storage. 6. Используйте переменные окружения или доступ к секретам через защищённые API, а не файлы в репозитории. 7. Ограничивайте доступ в IAM: кто может создавать ключи для сервис-аккаунтов — это отдельное право.
Пример инициализации Admin SDK в Node.js (без коммита файла в репо): const admin = require('firebase-admin'); const serviceAccount = JSON.parse(process.env.SERVICE_ACCOUNT_JSON); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: 'https://PROJECT_ID.firebaseio.com' });
Лучше: при развёртывании на GCP (Cloud Run, GKE, Compute Engine) используйте персонаж-аккаунт (workload identity) и назначайте роли через IAM — тогда файл не нужен, SDK использует ADC автоматически.
Не давайте сервис-аккаунту роль Owner или Editor. Разбейте доступ:
Если SDK нужен только для отправки push-уведомлений (FCM), выдайте только соответствующие права. В крупных проектах используйте кастомные роли: перечислите точные permission'ы, которые нужны, и дайте только их.
Рекомендуемая практика:
Команды gcloud:
Примите политику: каждый новый релиз запускает проверку срока действия ключей и при необходимости — регенерацию.
1. Немедленно удалить скомпрометированный ключ: gcloud iam service-accounts keys delete KEY_ID --iam-account=SERVICE_ACCOUNT_EMAIL Или через Cloud Console → Service Account → Keys → Delete.
2. Создать новый ключ и обновить все окружения/CI/CD/серверы.
3. Проанализировать Audit Logs (Cloud Audit Logs) за действия сервис-аккаунта: - идентифицируйте IP-адреса - какие API использовали - какие данные были запрошены/изменены
Поиск в логах: в Log Explorer фильтр по resource.type="service_account" или по principalEmail=service-account@project.iam.gserviceaccount.com
4. Если есть подозрение на создание/изменение пользователей — откатите последствия: - Отмените сессии пользователей (revoke refresh tokens) для тех, чьи учётные записи могли быть скомпрометированы: auth.revokeRefreshTokens(uid) в Admin SDK. - Восстановите резервные копии данных, если есть удаление/изменение.
5. Проверьте CI/CD и репозитории на наличие других утечек (поиск по приватному ключу).
6. Проведите пост-инцидентный аудит доступа (кто мог создать ключ), введите ограничение на создание ключей и добавьте двухфакторную аутентификацию для учетных записей админов.
Workload Identity Federation позволяет приложениям извне GCP или в контейнерах получать временные креды без JSON-ключа. Преимущества:
Для большинства CI/CD/Cloud Run/GKE рекомендуется настроить Workload Identity и привязать роль сервис-аккаунта к поду/сервису.
1. Никогда не коммитьте adminsdk.json в репозиторий. 2. Держите файл только на server-side, не на клиентах. 3. Применяйте принцип least privilege при назначении ролей сервис-аккаунту. 4. Используйте Workload Identity/ADC вместо долгоживущих JSON, когда возможно. 5. Храните секреты в Secret Manager или аналогах. 6. Ротация ключей — каждые 60–90 дней и при подозрении на утечку. 7. Автоматизируйте создание/удаление ключей и обновление окружений. 8. Включите аудит и алерты на подозрительную активность сервис-аккаунтов. 9. Проводите регулярные сканирования репозиториев и CI/CD на наличие секретов. 10. Имея инцидент, сразу удаляйте ключ, создавайте новый, анализируйте логи и отзывайте пользовательские токены при необходимости.
adminsdk.json — это не просто файл конфигурации, а ключ к вашему проекту. Отношение к нему должно быть как к секрету банковской карты: минимальный доступ, строгий контроль и план действий при инциденте. Соблюдение перечисленных практик существенно уменьшит шанс масштабной утечки и быстроту реакции в случае компрометации.