Чтобы обеспечить безопасность ваших ресурсов Firebase и данных пользователей, следуйте этим рекомендациям. Не все пункты обязательно подойдут для ваших задач, но учитывайте их при разработке приложения.
Избегайте агрессивных действий на дороге.
Настройте мониторинг и оповещения для серверных служб.
Для обнаружения вредоносного трафика, такого как DDoS-атаки, настройте мониторинг и оповещения для Cloud Firestore , Realtime Database , Cloud Storage и Hosting
Если вы подозреваете атаку на ваше приложение, как можно скорее свяжитесь со службой поддержки , чтобы сообщить им о происходящем.
Включить App Check
Чтобы гарантировать, что доступ к вашим серверным службам будут иметь только ваши приложения, включите Firebase App Check для каждой службы, которая его поддерживает.
Настройте Cloud Functions для масштабирования при обычной нагрузке.
Cloud Functions автоматически масштабируется в соответствии с потребностями вашего приложения, но в случае атаки это может означать большие затраты. Чтобы предотвратить это, вы можете ограничить количество одновременно запускаемых экземпляров функции в зависимости от обычной нагрузки на ваше приложение.
Настройте оповещения, чтобы получать уведомления о приближении к пределам.
Если в вашем сервисе наблюдаются всплески запросов, часто срабатывают квоты, автоматически ограничивая трафик к вашему приложению. Обязательно отслеживайте использование ресурсов и выставление счетов на панели мониторинга, но вы также можете настроить оповещения о превышении бюджета вашего проекта, чтобы получать уведомления, когда использование ресурсов превышает ожидаемые значения.
Предотвращение саморазрушительных атак: тестирование функций локально с помощью эмуляторов.
При разработке Cloud Functions легко случайно совершить DDoS-атаку: например, создав бесконечный цикл «триггер-запись». Предотвратить подобные ошибки в работе действующих сервисов можно, используя для разработки набор инструментов Firebase Local Emulator Suite .
А если вы случайно совершите DDoS-атаку, удалите свою функцию из index.js , а затем запустите...firebase deploy --only functions .
Там, где оперативность реагирования менее важна, структура функционирует в оборонительном режиме.
Если вам не нужно отображать результат функции в реальном времени, вы можете снизить нагрузку на систему, обрабатывая результаты партиями: публикуйте результаты в топик Pub/Sub и обрабатывайте их через регулярные интервалы с помощью запланированной функции .
Разберитесь с ключами API.
API-ключи для сервисов Firebase не являются секретными.
Ключи API для сервисов Firebase идентифицируют ваш проект и приложение Firebase только для этих сервисов. Авторизация осуществляется с помощью разрешений Google Cloud IAM, Firebase Security Rules и Firebase App Check .
Все ключи API, предоставляемые Firebase, автоматически ограничены API, связанными с Firebase . Если настройка вашего приложения соответствует рекомендациям на этой странице, то ключи API, ограниченные сервисами Firebase, не нужно рассматривать как секреты, и их можно безопасно включать в код или файлы конфигурации.
Настройте ограничения по ключу API.
Если вы используете ключи API для других сервисов Google, убедитесь, что вы применяете ограничения к ключам API , чтобы ограничить их использование только для клиентов вашего приложения и используемых вами API.
Используйте предоставленные Firebase ключи API только для API, связанных с Firebase . Если ваше приложение использует какие-либо другие API (например, Places API для карт или Gemini Developer API ), используйте отдельный ключ API и ограничьте его использование только соответствующим API.
Храните ключи сервера FCM в секрете.
В отличие от ключей API для сервисов Firebase, ключи сервера FCM (используемые устаревшим HTTP API FCM ) являются конфиденциальными и должны храниться в секрете.
Храните ключи учетных записей служб в секрете.
В отличие от ключей API для сервисов Firebase, закрытые ключи учетных записей сервисов (используемые Firebase Admin SDK ) являются конфиденциальными и должны храниться в секрете.
Firebase Security Rules
Инициализация правил в рабочем или заблокированном режиме.
При настройке Cloud Firestore , Realtime Database и Cloud Storage инициализируйте Firebase Security Rules , чтобы по умолчанию запрещать весь доступ, и добавляйте правила, предоставляющие доступ к определенным ресурсам, по мере разработки вашего приложения.
Для новых экземпляров Cloud Firestore (производственный режим) и Realtime Database (заблокированный режим) используйте один из параметров по умолчанию. Для Cloud Storage начните с настройки правил безопасности, подобной следующей:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if false;
}
}
}
Правила безопасности представляют собой схему; добавляйте правила при добавлении документов.
Не следует писать правила безопасности после создания приложения, в качестве задачи, предшествующей запуску. Вместо этого, пишите правила безопасности по мере разработки приложения, рассматривая их как схему базы данных: всякий раз, когда вам нужно использовать новый тип документа или структуру пути, сначала напишите соответствующее правило безопасности.
Протестируйте правила безопасности с помощью Local Emulator Suite ; добавьте его в систему непрерывной интеграции (CI).
Чтобы убедиться, что ваши правила безопасности соответствуют требованиям разработки вашего приложения, протестируйте их с помощью Firebase Local Emulator Suite и добавьте эти тесты в свой конвейер CI. См. эти руководства для Cloud Firestore и Realtime Database .
Аутентификация
Пользовательская аутентификация: создание JWT-токенов из доверенной (серверной) среды.
Если у вас уже есть надежная система авторизации, будь то собственная разработка или сторонний сервис, вы можете использовать существующую систему для аутентификации с помощью сервисов Firebase. Создайте собственные JWT-токены в доверенной среде, затем передайте эти токены клиенту, который использует их для аутентификации ( iOS+ , Android , Web , Unity , C++ ).
Пример использования пользовательской аутентификации со сторонним поставщиком можно найти в статье блога « Аутентификация с Firebase с помощью Okta» .
Управляемая аутентификация: поставщики OAuth 2.0 — самые безопасные.
Если вы используете управляемые функции аутентификации Firebase, то наиболее безопасными являются варианты провайдеров OAuth 2.0 / OpenID Connect (Google, Facebook и т. д.). По возможности следует поддерживать один или несколько из этих провайдеров (в зависимости от вашей пользовательской базы).
Аутентификация по электронной почте и паролю: установите жесткие квоты для конечной точки входа, чтобы предотвратить атаки методом перебора паролей.
Если вы используете управляемую службу аутентификации по электронной почте и паролю Firebase, ужесточите квоту по умолчанию для конечных точек identitytoolkit.googleapis.com , чтобы предотвратить атаки методом перебора паролей. Это можно сделать на странице API Identity Toolkit в консоли Google Cloud .
Аутентификация по электронной почте и паролю: включить защиту от перечисления адресов электронной почты.
Если вы используете управляемую службу аутентификации по электронной почте и паролю Firebase, включите защиту от перечисления адресов электронной почты , которая предотвратит злоумышленников от использования конечных точек аутентификации вашего проекта для подбора имен учетных записей.
Перейдите на Google Cloud Identity Platform для многофакторной аутентификации.
Для повышения безопасности при входе в систему вы можете добавить поддержку многофакторной аутентификации, обновив свою платформу до Google Cloud Identity Platform . Ваш существующий код Firebase Authentication продолжит работать после обновления.
Анонимная аутентификация
Используйте анонимную аутентификацию только для «теплого» адаптационного процесса.
Анонимная аутентификация используется только для сохранения базового состояния пользователей перед их фактическим входом в систему. Анонимная аутентификация не заменяет вход пользователя в систему.
Переведите пользователей на другой способ входа в систему, если они захотят использовать свои данные на других устройствах.
Анонимные данные аутентификации не будут сохраняться, если пользователь очистит локальное хранилище или сменит устройство. Если вам необходимо сохранять данные после перезапуска приложения на одном устройстве, переведите пользователя на постоянную учетную запись .
Используйте правила безопасности, требующие от пользователей перехода на использование стороннего сервиса авторизации или подтверждения адреса электронной почты.
В вашем проекте любой может создать анонимную учетную запись. Поэтому защитите все конфиденциальные данные с помощью правил безопасности, требующих определенных способов входа в систему или подтвержденных адресов электронной почты .
Например:
allow write: if request.auth.token.firebase.sign_in_provider != "anonymous";
allow write: if request.auth.token.email_verified = true;
Безопасность Cloud Functions
Никогда не размещайте конфиденциальную информацию в переменных среды.
В саморазмещенных приложениях Node.js часто используются переменные окружения для хранения конфиденциальной информации, такой как закрытые ключи. В Cloud Functions этого делать не следует . Поскольку Cloud Functions повторно использует переменные окружения между вызовами функций, конфиденциальную информацию не следует хранить в переменных окружения.
Для хранения ключей API Firebase (которые не являются секретными ) просто встройте их в код.
Если вы используете Firebase Admin SDK в Cloud Functions , вам не нужно явно указывать учетные данные сервисной учетной записи, поскольку Admin SDK может автоматически получить их во время инициализации.
Если вы обращаетесь к API Google и Google Cloud , требующим учетных данных сервисной учетной записи, библиотека Google Auth для Node.js может получить эти учетные данные из учетных данных приложения по умолчанию , которые автоматически заполняются в Cloud Functions .
Чтобы сделать закрытые ключи и учетные данные для сервисов, не относящихся к Google, доступными для ваших Cloud Functions , используйте Secret Manager .
Шифрование конфиденциальной информации
Если вам не удается избежать передачи конфиденциальной информации в ваши функции, вам необходимо разработать собственное решение для шифрования этой информации.
Простые функции безопаснее; если вам нужна сложность, рассмотрите Cloud Run
Старайтесь, чтобы ваши функции были максимально простыми и понятными. Сложность функций часто приводит к труднообнаружимым ошибкам или неожиданному поведению.
Если вам необходима сложная логика или настройка среды, рассмотрите возможность использования Cloud Run вместо Cloud Functions .
Управление окружающей средой
Настройка проектов разработки и тестирования
Создайте отдельные проекты Firebase для разработки, тестирования и продакшена. Не объединяйте клиентский код с продакшеном, пока он не будет протестирован в проекте тестирования.
Ограничьте доступ команды к производственным данным.
Если вы работаете в большой команде, вы можете смягчить последствия ошибок и утечек, ограничив доступ к производственным данным с помощью предопределенных ролей IAM или пользовательских ролей IAM .
Если ваша команда использует Firebase Local Emulator Suite (рекомендуется) для разработки, вам, возможно, не потребуется предоставлять более широкий доступ к производственному проекту.
Управление библиотекой
Обращайте внимание на орфографические ошибки в названиях библиотек или на новых сотрудников, занимающихся их обслуживанием.
При добавлении библиотек в ваш проект обращайте пристальное внимание на название библиотеки и имена её разработчиков. Библиотека с похожим названием может содержать вредоносный код.
Не обновляйте библиотеки, не понимая сути изменений.
Перед обновлением внимательно изучите журналы изменений всех используемых вами библиотек. Убедитесь, что обновление действительно приносит пользу, и проверьте, что разработчик по-прежнему является стороной, которой вы доверяете.
Установите библиотеки watchdog в качестве зависимостей для разработки или тестирования.
Используйте такую библиотеку, как Snyk, для сканирования вашего проекта на наличие небезопасных зависимостей.
Настройте мониторинг для Cloud Functions ; проверьте его после обновления библиотеки.
Если вы используете SDK для ведения Cloud Functions , вы можете отслеживать необычное поведение и получать оповещения о нем, в том числе о поведении, вызванном обновлениями библиотек.