Специальные ограничения правил организации

В этой статье рассказывается, как использовать специальные ограничения сервиса правил организации Google Cloud, чтобы запретить определенные операции со следующими ресурсами Cloud Storage for Firebase:

  • firebasestorage.googleapis.com/DefaultBucket

Подробнее о специальных правилах организации…

Правила и ограничения организации

Сервис Organization Policy в Google Cloud позволяет централизованно и программно управлять ресурсами организации. Администратор правил организации может задавать правила организации – набор ограничений, называемых ограничениями, которые применяются к ресурсам Google Cloud и их дочерним ресурсам в иерархии ресурсов Google Cloud. Правила организации можно применять на уровне организации, папки или проекта.

В Organization Policy есть встроенные управляемые ограничения для различных сервисов Google Cloud. Однако если вам нужен более детальный и настраиваемый контроль над определенными полями, которые ограничены в правилах вашей организации, вы также можете создать пользовательские ограничения и использовать их в правилах организации.

Наследование правил

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

Кроме того, поскольку Cloud Storage for Firebase хранит файлы в базовых сегментах Cloud Storage, любые правила организации или пользовательские ограничения, применяемые к ресурсам Cloud Storage, также применяются к вашим сегментам Cloud Storage for Firebase.

Преимущества

  • Безопасность и управление. Обеспечьте централизованный контроль над инициализацией сегментов Cloud Storage, чтобы гарантировать соблюдение требований к хранению данных и управлению расходами.
  • Точный контроль атрибутов. Ограничьте создание сегментов по умолчанию на основе определенных атрибутов ресурсов, таких как storageClass или location.

Ограничения

При использовании специальных правил организации с Cloud Storage for Firebase действуют следующие ограничения:

  • Отсутствие обратной силы. Новые специальные ограничения не применяются к существующим ресурсам. Существующие сегменты по умолчанию не оцениваются, если они не обновлены. Чтобы выявить существующие ресурсы, которые могут нарушать ограничение, вы можете протестировать правила в режиме пробного выполнения.
  • Ограничения контроля доступа. Специальные ограничения не могут ограничивать списки контроля доступа (ACL) или политики IAM для сегментов.

Подготовка

  1. В консоли Firebase выберите или создайте проект Firebase.

    Убедитесь, что ваш проект относится к организации и что вы знаете ее идентификатор.

  2. Чтобы настроить и применить специальные ограничения с помощью командной строки, установите Google Cloud CLI (gcloud). Специальными правилами организации нельзя управлять с помощью интерфейса командной строки Firebase.

Необходимые роли

Чтобы получить разрешения, необходимые для управления специальными правилами организации, попросите администратора назначить вам роль IAM Администратор правил организации (roles/orgpolicy.policyAdmin) на уровне организации.

Cloud Storage for Firebase поддерживаемый ресурс

В таблице ниже перечислены ресурсы Cloud Storage for Firebase, на которые можно ссылаться в специальных ограничениях. Вы также можете ознакомиться с поддерживаемыми ресурсами Cloud Storage, поскольку специальные ограничения для этих ресурсов также применяются к сегментам Cloud Storage for Firebase.

Ресурс Поддерживаемые поля
firebasestorage.googleapis.com/DefaultBucket
  • resource.location
  • resource.storageClass

Как настроить специальное ограничение

Пользовательское ограничение определяется в файле YAML ресурсами, методами, условиями и действиями, которые поддерживаются сервисом, в котором вы применяете правило организации. Условия для специальных ограничений определяются с помощью Common Expression Language (CEL). Подробную информацию о том, как создавать условия в специальных ограничениях с помощью CEL, можно найти в разделе CEL статьи Создание специальных ограничений и управление ими.

Консоль

Чтобы создать специальное ограничение, выполните следующие действия:

  1. В консоли Google Cloud перейдите на страницу Правила организации.

    Перейти к правилам организации

  2. В меню выбора проекта укажите проект, для которого нужно настроить правила организации.
  3. Нажмите Специальное ограничение.
  4. В поле Отображаемое название введите человекочитаемое название ограничения. Это название используется в сообщениях об ошибках, а также для идентификации и отладки. Не используйте в отображаемых названиях информацию, позволяющую идентифицировать личность, или конфиденциальные данные, поскольку это название может быть показано в сообщениях об ошибках. Максимальная длина – 200 символов.
  5. В поле Constraint ID (Идентификатор ограничения) введите идентификатор нового специального ограничения. Специальное ограничение может содержать только буквы (включая заглавные и строчные) или цифры, например custom.restrictStorageClass. Это поле может содержать до 70 символов, не считая префикса (custom.), например organizations/123456789/customConstraints/custom.restrictStorageClass. Не включайте в идентификатор ограничения информацию, позволяющую идентифицировать личность, или конфиденциальные данные, поскольку они могут быть видны в сообщениях об ошибках.
  6. В поле Описание введите человекочитаемое описание ограничения. Это описание используется в качестве сообщения об ошибке при нарушении правила. Укажите, почему произошло нарушение правил и как его устранить. Не указывайте в описании информацию, позволяющую идентифицировать личность, или конфиденциальные данные, поскольку они могут быть показаны в сообщениях об ошибках. В этом поле можно указать до 2000 символов.
  7. В поле Resource type (Тип ресурса) выберите название ресурса REST, содержащего объект и поле, доступ к которым нужно ограничить, например firebasestorage.googleapis.com/DefaultBucket. Для большинства типов ресурсов поддерживается до 20 специальных ограничений. Если вы попытаетесь создать больше специальных ограничений, операция завершится ошибкой.
  8. В разделе Способ применения выберите, нужно ли применять ограничение к методу REST CREATE или к обоим методам (CREATE и UPDATE). Примечание. DefaultBucket поддерживает только CREATE.
  9. Чтобы задать условие, нажмите Изменить условие.
    1. На панели Добавить условие создайте условие CEL, которое ссылается на поддерживаемый ресурс сервиса, например resource.storageClass == 'STANDARD'. В этом поле может быть до 1000 символов. Подробные сведения об использовании CEL приведены в статье Common Expression Language.
    2. Нажмите Сохранить.
  10. В разделе Действие выберите, разрешить или запретить оцениваемый метод, если условие выполнено.

    Действие deny означает, что операция по созданию или обновлению ресурса блокируется, если условие оценивается как истинное.

    Действие allow означает, что операция по созданию или обновлению ресурса разрешена, только если условие имеет значение true. Все остальные случаи, кроме явно перечисленных в условии, блокируются.

  11. Нажмите Создать ограничение.

gcloud

  1. Чтобы создать специальное ограничение, создайте YAML-файл в следующем формате:
    name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
    resourceTypes: firebasestorage.googleapis.com/DefaultBucket
    methodTypes:
      -   CREATE
    condition: "resource.storageClass == 'STANDARD'"
    actionType: DENY
    displayName: Restrict Standard Storage Class
    description: Deny creating buckets with STANDARD storage class.
  2. После создания YAML-файла для нового специального ограничения его необходимо настроить, чтобы оно стало доступно для правил организации. Чтобы настроить специальное ограничение, используйте команду gcloud org-policies set-custom-constraint:
    gcloud org-policies set-custom-constraint CONSTRAINT_PATH

    Замените CONSTRAINT_PATH полным путем к файлу с пользовательским ограничением. Пример: /home/user/customconstraint.yaml.

  3. Чтобы проверить, существует ли специальное ограничение, используйте команду gcloud org-policies list-custom-constraints:
    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID

Как применить специальное правило организации

Вы можете применить ограничение, создав правило организации, которое ссылается на него, а затем применив это правило организации к ресурсу Google Cloud.

Консоль

  1. В консоли Google Cloud перейдите на страницу Правила организации.

    Перейти к правилам организации

  2. В меню выбора проекта укажите проект, для которого нужно настроить правила организации.
  3. В списке на странице Правила организации выберите ограничение, чтобы открыть страницу Сведения о правиле.
  4. Чтобы настроить правила организации для этого ресурса, нажмите Управление правилами.
  5. На странице Изменение политики выберите Переопределять политику родительского объекта.
  6. Нажмите Добавить правило.
  7. В разделе Применение укажите, применяется ли это правило организации.
  8. Чтобы применить политику организации в режиме пробного выполнения, нажмите Установить политику пробного выполнения. Подробнее о том, как тестировать правила организации…
  9. Убедившись, что правило организации в режиме пробного запуска работает правильно, нажмите Задать правило.

gcloud

  1. Чтобы создать правило организации с логическими правилами, создайте YAML-файл правила, который ссылается на ограничение:
    name: projects/PROJECT_ID/policies/custom.restrictStorageClass
    spec:
      rules:
      -   enforce: true
    dryRunSpec:
      rules:
      -   enforce: true
  2. Чтобы применить правила организации в режиме пробного выполнения, выполните следующую команду с флагом dryRunSpec:
    gcloud org-policies set-policy POLICY_PATH --update-mask=dryRunSpec
  3. Убедившись, что правила организации в режиме пробного запуска работают правильно, задайте действующие правила с помощью команды org-policies set-policy и флага spec:
    gcloud org-policies set-policy POLICY_PATH --update-mask=spec

Как протестировать специальное правило организации

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

Создайте ограничение

  1. Сохраните следующий файл как constraint-restrict-storage-class.yaml:

    name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
    resourceTypes:
    -   firebasestorage.googleapis.com/DefaultBucket
    methodTypes:
    -   CREATE
    condition: "resource.storageClass == 'STANDARD'"
    actionType: DENY
    displayName: Restrict Standard Storage Class
    description: Deny creating buckets with STANDARD storage class.
    

    Замените ORGANIZATION_ID идентификатором своей организации.

  2. Примените ограничение:

    gcloud org-policies set-custom-constraint ~/constraint-restrict-storage-class.yaml
    
  3. Убедитесь, что ограничение существует:

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

    Выходные данные будут выглядеть примерно так:

    CUSTOM_CONSTRAINT            ACTION_TYPE   METHOD_TYPES   RESOURCE_TYPES                                 DISPLAY_NAME
    custom.restrictStorageClass  DENY          CREATE         firebasestorage.googleapis.com/DefaultBucket   Restrict Standard Storage Class
    ...
    

Создайте правило

  1. Сохраните следующий файл как policy-restrict-storage-class.yaml:

    name: projects/PROJECT_ID/policies/custom.restrictStorageClass
    spec:
      rules:
      -   enforce: true
    

    Замените PROJECT_ID идентификатором своего проекта.

  2. Примените правило:

    gcloud org-policies set-policy ~/policy-restrict-storage-class.yaml
    
  3. Убедитесь, что правило существует:

    gcloud org-policies list --project=PROJECT_ID
    

    Выходные данные будут выглядеть примерно так:

    CONSTRAINT                   LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.restrictStorageClass  -              SET               CIqktscGELiZn6cC-
    

После применения правила подождите около двух минут, пока Google Cloud не начнет его применять.

Как протестировать правило

Попробуйте создать сегмент по умолчанию с помощью REST API Cloud Storage for Firebase, не указывая класс хранилища (по умолчанию используется STANDARD):

PROJECT_ID="PROJECT_ID"
TOKEN=$(gcloud auth print-access-token)

curl -X POST "https://firebasestorage.googleapis.com/v1beta/projects/${PROJECT_ID}/defaultBucket" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{"location": "US-EAST1"}'

Запрос завершается ошибкой, похожей на следующую:

FAILED_PRECONDITION: Operation denied by org policy: ["customConstraints/custom.restrictStorageClass": "Deny creating buckets with STANDARD storage class."].
-   '@type': type.googleapis.com/google.rpc.ErrorInfo
  domain: iam.googleapis.com
  metadata:
    customConstraints: customConstraints/custom.restrictStorageClass
  reason: CUSTOM_ORG_POLICY_VIOLATION

Примеры специальных правил организации для распространенных сценариев использования

В таблице ниже приведены примеры синтаксиса для некоторых распространенных специальных ограничений.

Описание Синтаксис ограничений
Запретить создание стандартных сегментов с классом хранилища STANDARD
name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
resourceTypes:
-   firebasestorage.googleapis.com/DefaultBucket
methodTypes:
-   CREATE
condition: "resource.storageClass == 'STANDARD'"
actionType: DENY
displayName: Restrict Standard Storage Class
description: Deny creating buckets with STANDARD storage class.
Требовать, чтобы сегменты по умолчанию создавались в определенном местоположении
name: organizations/ORGANIZATION_ID/customConstraints/custom.requireDefaultBucketLocation
resourceTypes:
-   firebasestorage.googleapis.com/DefaultBucket
methodTypes:
-   CREATE
condition: "resource.location != 'US-EAST1'"
actionType: DENY
displayName: Require US-EAST1 Location
description: Deny creating default buckets outside the US-EAST1 location.

Дальнейшие действия