Catch up on everthing we announced at this year's Firebase Summit. Learn more

Управление и развертывание правил безопасности Firebase

Firebase предоставляет вам несколько инструментов для управления вашими правилами, каждый из которых полезен в определенных случаях, и каждый использует один и тот же внутренний API управления правилами безопасности Firebase.

Независимо от того, какой инструмент используется для его вызова, API управления:

  • Глотает источник правил: набор правил, как правило , файл кода , содержащих правила безопасности Firebase заявление.
  • Магазины заглатывание источника в качестве неизменного набора правил.
  • Треки развертывания каждого набора правил в пресс - релизе. Службы с включенными правилами безопасности Firebase ищут выпуск проекта, чтобы оценить каждый запрос защищенного ресурса.
  • Предоставляет возможность запускать синтаксические и семантические тесты набора правил.

Используйте интерфейс командной строки Firebase

С Firebase CLI , вы можете загрузить местные источники и развертывание релизов. Консоли в Firebase Local Emulator Люкс позволяет выполнять полное локальное тестирование источников.

Использование интерфейса командной строки позволяет держать правила под контролем версий с кодом приложения и развертывать правила как часть существующего процесса развертывания.

Создайте файл конфигурации

При настройке Firebase проекта с помощью Firebase CLI, необходимо создать .rules конфигурационный файл в директории проекта. Используйте следующую команду, чтобы начать настройку проекта Firebase:

Cloud Firestore

// Set up Firestore in your project directory, creates a .rules file
firebase init firestore

База данных в реальном времени

// Set up Realtime Database in your project directory, creates a .rules file
firebase init database

Облачное хранилище

// Set up Storage in your project directory, creates a .rules file
firebase init storage

Редактируйте и обновляйте свои правила

Измените источник правил непосредственно в .rules конфигурационного файла. Убедитесь, что любые изменения, которые вы вносите в интерфейс командной строки Firebase, отражаются в консоли Firebase или что вы постоянно вносите обновления с помощью консоли Firebase или интерфейса командной строки Firebase. В противном случае вы можете перезаписать любые обновления, сделанные в консоли Firebase.

Проверьте свои обновления

Пакет Local Emulator Suite предоставляет эмуляторы для всех продуктов, поддерживающих правила безопасности. Механизм правил безопасности для каждого эмулятора выполняет как синтаксическую, так и семантическую оценку правил, что превышает синтаксическое тестирование, предлагаемое API управления правилами безопасности.

Если вы работаете с CLI, Suite - отличный инструмент для тестирования правил безопасности Firebase. Используйте Local Emulator Suite , чтобы проверить свои обновления локально и подтверждает , что правила вашего приложения демонстрируют поведение , которое вы хотите.

Разверните свои обновления

После того, как вы обновили и протестировали свои правила, разверните исходники в производственной среде. Используйте следующие команды, чтобы выборочно развернуть свои Правила отдельно или развернуть их как часть обычного процесса развертывания.

Cloud Firestore

// Deploy your .rules file
firebase deploy --only firestore:rules

База данных в реальном времени

// Deploy your .rules file
firebase deploy --only database

Облачное хранилище

// Deploy your .rules file
firebase deploy --only storage

Используйте консоль Firebase

Вы также можете изменить правила источников и развернуть их в качестве выбросов из консоли Firebase. Синтаксический тестирование выполняется при редактировании в Firebase консоли пользовательского интерфейса, и symantic тестирование доступно с использованием правил Playground.

Редактируйте и обновляйте свои правила

  1. Откройте Firebase консоли и выберите проект.
  2. Затем выберите в реальном времени базы данных, Cloud Firestore или хранение с навигацией продукта, а затем щелкните Правила для перехода к редактору правил.
  3. Редактируйте свои правила прямо в редакторе.

Проверьте свои обновления

В дополнение к тестированию синтаксиса в редакторе UI, вы можете проверить поведение семантических правил, с использованием базы данных и ресурсы хранения вашего проекта, непосредственно в консоли Firebase, используя Rules площадка . Откройте экран Правила Playground в редакторе правил, измените настройки и нажмите кнопку Выполнить. Найдите подтверждающее сообщение вверху редактора.

Разверните свои обновления

После того, как вы удовлетворены , что ваши обновления , что вы ожидаете, нажмите Опубликовать.

Используйте Admin SDK

Вы можете использовать Admin SDK для Node.js наборов правил. Благодаря этому программному доступу вы можете:

  • Внедряйте настраиваемые инструменты, сценарии, информационные панели и конвейеры CI / CD для управления правилами.
  • Упростите управление правилами в нескольких проектах Firebase.

При программном обновлении правил очень важно избегать внесения непреднамеренных изменений в управление доступом для вашего приложения. При написании кода Admin SDK помните о безопасности, особенно при обновлении или развертывании правил.

Еще одна важная вещь, о которой следует помнить, - это то, что для полного распространения выпусков правил безопасности Firebase требуется несколько минут. При использовании Admin SDK для развертывания правил избегайте условий гонки, в которых ваше приложение немедленно полагается на правила, развертывание которых еще не завершено. Если ваш вариант использования требует частого обновления правил контроля доступа, рассмотрите возможность решения с использованием Cloud Firestore, который предназначен для уменьшения условий гонки, несмотря на частые обновления.

Также обратите внимание на эти ограничения:

  • При сериализации правила должны быть меньше 256 КБ текста в кодировке UTF-8.
  • В проекте может быть не более 2500 развернутых наборов правил. Как только этот предел будет достигнут, вы должны удалить некоторые старые наборы правил перед созданием новых.

Создание и развертывание наборов правил Cloud Storage или Cloud Firestore

Типичный рабочий процесс управления правилами безопасности с помощью Admin SDK может включать три отдельных шага:

  1. Создайте источник файла правил (необязательно)
  2. Создать набор правил
  3. Выпуск или развертывание нового набора правил

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 с наборами правил 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);

Управление наборами правил

Для того, чтобы помочь управлять большими наборами правил, администратор 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 с помощью самого API управления. API управления дает вам максимальную гибкость.

Имейте в виду, что для полного распространения выпусков правил безопасности Firebase требуется несколько минут. При использовании REST API управления для развертывания избегайте условий гонки, в которых ваше приложение немедленно полагается на правила, развертывание которых еще не завершено.

Также обратите внимание на эти ограничения:

  • При сериализации правила должны быть меньше 256 КБ текста в кодировке UTF-8.
  • В проекте может быть не более 2500 развернутых наборов правил. Как только этот предел будет достигнут, вы должны удалить некоторые старые наборы правил перед созданием новых.

Создание и развертывание наборов правил Cloud Storage или Cloud Firestore с помощью REST

В примерах в этом разделе используются правила хранения, хотя они также применимы к правилам Cloud Firestore.

В примерах также используется cURL для вызовов API. Шаги по настройке и передаче токенов аутентификации опущены. Вы можете поэкспериментировать с этим API с помощью API Explorer , интегрированный с нормативно - технической документацией .

Типичные шаги для создания и развертывания набора правил с помощью API управления:

  1. Создать исходный файл правил
  2. Создать набор правил
  3. Выпустить (развернуть) новый набор правил

Давайте предположим , что вы работаете над secure_commerce проектом Firebase и хотим развернуть Запирающееся Облако правил хранения. Вы можете реализовать эти правила в storage.rules файл.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

Теперь сгенерируйте для этого файла отпечаток пальца в кодировке base64. Затем вы можете использовать источник в этом файле для заполнения полезной нагрузки , необходимой для создания набора правил с projects.rulesets.create вызова REST. Здесь мы используем cat команду для вставки содержимого storage.rules в полезную нагрузку REST.

curl -X POST -d '{
  "source": {
    {
      "files": [
        {
          "content": "' $(cat storage.rules) '",
          "name": "storage.rules",
          "fingerprint": <sha fingerprint>
        }
      ]
    }
  }
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'

API возвращает ответ проверки и имя набора правил, например , projects/secure_commerce/rulesets/uuid123 . Если набор правил действителен, последним шагом является развертывание нового набора правил в названном выпуске.

curl -X POST -d '{
  "name": "projects/secure_commerce/releases/prod/v23   "  ,
  "rulesetName": "projects/secure_commerce/rulesets/uuid123",
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'

Обновление наборов правил базы данных реального времени с помощью REST

База данных Realtime предоставляет собственный интерфейс REST для управления правилами. См Управление Firebase Realtime базы данных правил с помощью REST .

Управляйте наборами правил с помощью REST

Чтобы помочь управлять крупными развертываниями правил, в дополнение к методу REST для создания наборов правил и выпусков API управления предоставляет методы для:

  • список, получить и удалять наборы правил
  • список, получить и удалять выпуски правила

Для очень больших развертываний, которые со временем достигают предела набора правил 2500, вы можете создать логику для удаления самых старых правил в фиксированном временном цикле. Например, чтобы удалить все наборы правил , развернутые в течение более чем 30 дней, вы можете вызвать projects.rulesets.list метод, анализировать список JSON из Ruleset объектов на их createTime ключи, а затем вызвать project.rulesets.delete на соответствующие наборы правил по ruleset_id .

Проверьте свои обновления с помощью REST

Наконец, API управления позволяет запускать синтаксические и семантические тесты на ресурсах Cloud Firestore и Cloud Storage в ваших производственных проектах.

Тестирование с помощью этого компонента API состоит из:

  1. Определение TestSuite объекта JSON для представления набора TestCase объектов
  2. Подавая TestSuite
  3. Синтаксический возвращаемые TestResult объекты

Давайте определим TestSuite объект с одним TestCase в testcase.json файле. В этом примере мы передаем исходный текст языка правил вместе с полезными данными REST вместе с набором тестов для запуска по этим правилам. Мы указываем ожидание оценки правил и клиентский запрос, по которому должен быть протестирован набор правил. Вы также можете указать, насколько полон отчет о тестировании, используя значение «FULL», чтобы указать результаты для всех выражений языка правил, которые должны быть включены в отчет, включая выражения, которые не были сопоставлены с запросом.

 {
  "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 для evalution с projects.test методом.

curl -X POST -d '{
    ' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'

Возвращенный TestReport (содержащий тест УСПЕХ / статус FAILURE, списки отладочных сообщений, списки посещенных Rules выражений и их отчеты об оценке) подтвердят со статусом УСПЕХА , что доступ правильно допускается.