Firebase предоставляет несколько инструментов для управления Security Rules. Каждый из них полезен в определенных случаях и использует один и тот же API управления правилами безопасности Firebase.
Независимо от того, какой инструмент используется для вызова, Management API:
- Принимает источник правил – набор правил, обычно файл кода, содержащий операторы Firebase Security Rules.
- Сохраняет источник в виде неизменяемого набора правил.
- Отслеживает развертывание каждого набора правил в выпуске. Сервисы, в которых включены правила безопасности Firebase, ищут выпуск для проекта, чтобы оценить каждый запрос защищенного ресурса.
- Позволяет выполнять синтаксические и семантические тесты набора правил.
Как использовать CLI Firebase
С помощью CLIFirebase вы можете загружать локальные источники и развертывать выпуски. Команда Firebase Local Emulator Suite позволяет полностью протестировать источники на локальном компьютере.
Использование CLI позволяет вам хранить правила под управлением версий вместе с кодом приложения и развертывать правила в рамках существующего процесса развертывания.
Как создать файл конфигурации
При настройке проекта Firebase с помощью интерфейса командной строки Firebase в каталоге проекта создается файл конфигурации .rules. Чтобы начать настройку проекта Firebase, используйте следующую команду:
Cloud Firestore
// Set up Firestore in your project directory, creates a .rules file firebase init firestore
Realtime Database
// Set up Realtime Database in your project directory, creates a .rules file firebase init database
Cloud Storage
// Set up Storage in your project directory, creates a .rules file firebase init storage
Как изменить или обновить правила
Измените источник правил непосредственно в файле конфигурации .rules.
Убедитесь, что все изменения, которые вы вносите в Firebase CLI, отражаются в консоли Firebase, или постоянно обновляйте данные с помощью консоли Firebase или интерфейса командной строки Firebase. В противном случае вы можете перезаписать изменения, внесенные в консоли Firebase.
Протестируйте обновления
В Local Emulator Suite есть эмуляторы для всех продуктов, в которых поддерживаются правила безопасности. Механизм правил безопасности для каждого эмулятора выполняет как синтаксическую, так и семантическую оценку правил, тем самым превосходя синтаксическое тестирование, предлагаемое API управления правилами безопасности.
Если вы работаете с CLI, Suite – отличный инструмент для Firebase Security Rules тестирования. Используйте Local Emulator Suite, чтобы протестировать обновления локально и убедиться, что Security Rules приложения работают правильно.
Как развернуть обновления
После обновления и тестирования Security Rules разверните источники в рабочей среде.
Для Cloud Firestore Security Rules свяжите файлы .rules с базами данных по умолчанию и дополнительными именованными базами данных, проверив и обновив файл firebase.json.
Используйте следующие команды, чтобы развернуть только Security Rules или развернуть их в рамках обычного процесса развертывания.
Cloud Firestore
// Deploy rules for all databases configured in your firebase.json firebase deploy --only firestore:rules
// Deploy rules for the specified database configured in your firebase.json firebase deploy --only firestore:<databaseId>
Realtime Database
// Deploy your .rules file firebase deploy --only database
Cloud Storage
// Deploy your .rules file firebase deploy --only storage
Используйте консоль Firebase
Вы также можете редактировать Security Rules источники и развертывать их как выпуски из консоли Firebase. Синтаксическое тестирование выполняется при редактировании в пользовательском интерфейсе консоли Firebase, а семантическое тестирование доступно в Security Rules Playground.
Как изменить или обновить правила
- Откройте консоль Firebase и выберите проект.
- Затем выберите Realtime Database, Cloud Firestore или Хранилище в меню навигации по продуктам и нажмите Правила, чтобы перейти в редактор Security Rules.
- Измените правила в редакторе.
Протестируйте обновления
Помимо проверки синтаксиса в редакторе, вы можете протестировать семантическое поведение Security Rules, используя базу данных и ресурсы хранилища проекта, непосредственно в консоли Firebase с помощью Security Rules Playground. Откройте экран Песочница правил в редакторе Security Rules, измените настройки и нажмите Запустить. В верхней части редактора появится подтверждение.
Как развернуть обновления
Когда все будет готово, нажмите Опубликовать.
Использование Admin SDK
Вы можете использовать наборы правил Admin SDK для Node.js. Программный доступ позволяет:
- Внедрите собственные инструменты, скрипты, панели управления и конвейеры CI/CD для управления правилами.
- Упрощенное управление правилами в нескольких проектах Firebase.
При программном обновлении правил очень важно избегать непреднамеренных изменений в контроле доступа для вашего приложения. Напишите код Admin SDK, уделяя особое внимание безопасности, особенно при обновлении или развертывании правил.
Также важно помнить, что для полного распространения выпусков Firebase Security Rules требуется несколько минут. При развертывании правил с помощью Admin SDK избегайте состояний гонки, когда приложение сразу же полагается на правила, развертывание которых ещё не завершено. Если вам нужно часто обновлять правила контроля доступа, используйте Cloud Firestore. Этот инструмент разработан так, чтобы снизить вероятность состояния гонки при частых обновлениях.
Также обратите внимание на следующие ограничения:
- Размер правил в сериализованном виде не должен превышать 256 КиБ текста в кодировке UTF-8.
- В проекте может быть не более 2500 развернутых наборов правил. Если вы достигли этого лимита, то, прежде чем создавать новые наборы правил, вам нужно удалить некоторые из старых.
Создание и развертывание наборов правил Cloud Storage или Cloud Firestore
Типичный рабочий процесс управления правилами безопасности с помощью Admin SDK может включать три отдельных шага:
- Как создать источник файла правил (необязательно)
- Как создать набор правил
- Опубликуйте или разверните новый набор правил.
SDK предоставляет метод, позволяющий объединить эти шаги в один вызов API для правил безопасности Cloud Storage и Cloud Firestore. Пример:
const source = `service cloud.firestore {
match /databases/{database}/documents {
match /carts/{cartID} {
allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
}
}
}`;
// Alternatively, load rules from a file
// const fs = require('fs');
// const source = fs.readFileSync('path/to/firestore.rules', 'utf8');
await admin.securityRules().releaseFirestoreRulesetFromSource(source);
Этот же шаблон работает для правил Cloud Storage с releaseFirestoreRulesetFromSource().
Вы также можете создать файл правил как объект в памяти, создать набор правил и развернуть его отдельно, чтобы лучше контролировать эти события. Пример:
const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
const rs = await admin.securityRules().createRuleset(rf);
await admin.securityRules().releaseFirestoreRuleset(rs);
Обновить Realtime Database набор правил
Чтобы обновить наборы правил Realtime Database с помощью Admin SDK, используйте методы getRules() и setRules() класса admin.database. Вы можете получить наборы правил в формате JSON или в виде строки с комментариями.
Чтобы изменить набор правил, выполните следующие действия:
const source = `{
"rules": {
"scores": {
".indexOn": "score",
"$uid": {
".read": "$uid == auth.uid",
".write": "$uid == auth.uid"
}
}
}
}`;
await admin.database().setRules(source);
Управление наборами правил
Чтобы вам было проще управлять большими наборами правил, Admin SDK позволяет получить список всех существующих правил с помощью admin.securityRules().listRulesetMetadata. Пример:
const allRulesets = [];
let pageToken = null;
while (true) {
const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
allRulesets.push(...result.rulesets);
pageToken = result.nextPageToken;
if (!pageToken) {
break;
}
}
Для очень крупных развертываний, которые со временем достигают лимита в 2500 наборов правил, можно создать логику для удаления самых старых правил по фиксированному временному циклу. Например, чтобы удалить все наборы правил, развернутые более 30 дней назад, выполните следующую команду:
const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
const promises = [];
allRulesets.forEach((rs) => {
if (new Date(rs.createTime) < thirtyDays) {
promises.push(admin.securityRules().deleteRuleset(rs.name));
}
});
await Promise.all(promises);
console.log(`Deleted ${promises.length} rulesets.`);
Как использовать REST API
Описанные выше инструменты хорошо подходят для различных рабочих процессов, включая управление Firebase Security Rules для нескольких баз данных Cloud Firestore в вашем проекте, но вы можете управлять и развертывать Firebase Security Rules с помощью самого Management API. Management API обеспечивает максимальную гибкость.
Также обратите внимание на следующие ограничения:
- Размер правил в сериализованном виде не должен превышать 256 КиБ текста в кодировке UTF-8.
- В проекте может быть не более 2500 развернутых наборов правил. Если вы достигли этого лимита, то, прежде чем создавать новые наборы правил, вам нужно удалить некоторые из старых.
Как создавать и развертывать наборы правил Cloud Firestore или Cloud Storage с помощью REST
В примерах в этом разделе используется Firestore Security Rules, но они также применимы к Cloud Storage Security Rules.
В примерах также используется cURL для вызовов API. Шаги по настройке и передаче токенов аутентификации опущены. Вы можете поэкспериментировать с этим API, используя API Explorer, интегрированный со справочной документацией.
Обычно для создания и развертывания набора правил с помощью Management API выполняются следующие действия:
- Как создать источники файлов правил
- Как создать набор правил
- Опубликуйте (разверните) новый набор правил.
Как создать источник
Предположим, вы работаете над проектом Firebase secure_commerce и хотите развернуть заблокированные Cloud Firestore Security Rules в базе данных east_store.
Эти правила можно реализовать в файле firestore.rules.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Как создать набор правил
Теперь создайте цифровой отпечаток с кодировкой Base64 для этого файла. Затем вы можете использовать источник в этом файле, чтобы заполнить полезную нагрузку, необходимую для создания набора правил с помощью вызова REST projects.rulesets.create. Здесь используйте команду cat, чтобы вставить содержимое firestore.rules в полезную нагрузку REST.
Чтобы связать это с базой данных east_store, задайте для attachment_point значение east_store.
curl -X POST -d '{
"source": {
"files": [
{
"content": "' $(cat storage.rules) '",
"name": "firestore.rules",
"fingerprint": <sha fingerprint>
},
"attachment_point": "firestore.googleapis.com/databases/east_store"
]
}
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'API возвращает ответ о проверке и название набора правил, например projects/secure_commerce/rulesets/uuid123.
Как опубликовать (развернуть) набор правил
Если набор правил действителен, последним шагом будет развертывание нового набора правил в именованном выпуске.
curl -X POST -d '{
"name": "projects/secure_commerce/releases/cloud.firestore/east_store" ,
"rulesetName": "projects/secure_commerce/rulesets/uuid123"
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'Обратите внимание, что для полного распространения выпусков Firebase Security Rules требуется несколько минут. При развертывании с помощью REST API управления избегайте состояний гонки, когда приложение сразу же полагается на правила, развертывание которых ещё не завершено.
Обновление наборов правил Realtime Database с помощью REST
Realtime Database предоставляет собственный интерфейс REST для управления Security Rules. Подробнее об управлении Realtime Database Security Rules Firebase через REST…
Управление наборами правил с помощью REST
Чтобы упростить развертывание больших наборов правил, в дополнение к методу REST для создания наборов правил и выпусков Management API предоставляет методы для:
- получать список наборов правил, а также получать и удалять их;
- получать список выпусков правил, а также получать и удалять их;
Для очень крупных развертываний, которые со временем достигают лимита в 2500 наборов правил, можно создать логику для удаления самых старых правил по фиксированному временному циклу. Например, чтобы удалить все наборы правил, развернутые более 30 дней назад, вызовите метод projects.rulesets.list, проанализируйте список объектов Ruleset в формате JSON по ключам createTime, а затем вызовите метод project.rulesets.delete для соответствующих наборов правил по ruleset_id.
Как протестировать обновления с помощью REST
Наконец, Management API позволяет выполнять синтаксические и семантические тесты ресурсов Cloud Firestore и Cloud Storage в рабочих проектах.
Тестирование этого компонента API состоит из следующих этапов:
- Определение объекта JSON
TestSuiteдля представления набора объектовTestCase - Отправка
TestSuite - В результате синтаксического анализа получено
TestResultобъектов.
Давайте определим объект TestSuite с одним элементом TestCase в файле testcase.json. В этом примере мы передаем исходный код на языке Security Rules в теле REST-запроса вместе с набором тестов, которые нужно выполнить для этих правил. Мы указываем ожидаемый результат оценки правил и запрос клиента, на котором будет тестироваться набор правил. Вы также можете указать, насколько полным должен быть отчет о тестировании. Значение FULL означает, что в отчет должны быть включены результаты для всех выражений на языке Security Rules, в том числе для тех, которые не соответствуют запросу.
{ "source": { "files": [ { "name": "firestore.rules", "content": "service cloud.firestore { match /databases/{database}/documents { match /users/{userId}{ allow read: if (request.auth.uid == userId); } function doc(subpath) { return get(/databases/$(database)/documents/$(subpath)).data; } function isAccountOwner(accountId) { return request.auth.uid == accountId || doc(/users/$(request.auth.uid)).accountId == accountId; } match /licenses/{accountId} { allow read: if isAccountOwner(accountId); } } }" } ] }, "testSuite": { "testCases": [ { "expectation": "ALLOW", "request": { "auth": {"uid": "123"}, "path": "/databases/(default)/documents/licenses/abcd", "method": "get"}, "functionMocks": [ { "function": "get", "args": [{"exact_value": "/databases/(default)/documents/users/123"}], "result": {"value": {"data": {"accountId": "abcd"}}} } ] } ] } }
Затем мы можем отправить этот TestSuite на оценку с помощью метода projects.test.
curl -X POST -d '{
' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'Возвращенный объект TestReport (содержащий статус SUCCESS/FAILURE, списки сообщений отладки, списки посещенных выражений правил и отчеты об их оценке) подтвердит со статусом SUCCESS, что доступ разрешен.
Управление разрешениями для межсервисного ресурса "Cloud Storage Security Rules"
Если вы создаете Cloud Storage Security Rules, которые используют содержимое документов Cloud Firestore для оценки условий безопасности, в консоли Firebase или интерфейсе командной строки Firebase вам будет предложено включить разрешения на подключение двух продуктов.
Если вы решите отключить эту функцию:
Прежде чем отключать функцию, измените правила, удалив все инструкции, в которых используются функции Security Rules для доступа к Cloud Firestore. В противном случае после отключения функции оценки Security Rules будут приводить к сбою запросов на хранение.
Чтобы удалить роль Firebase Rules Firestore Service Agent, откройте страницу IAM в консоли Google Cloud и следуйте инструкциям из руководства по отзыву ролей.
.
Вам будет предложено повторно включить эту функцию при следующем сохранении правил для нескольких сервисов в CLI Firebase или консоли Firebase.