Cloud Storage-Ressourcen mit benutzerdefinierten Einschränkungen verwalten

Die Organisationsrichtlinie bietet vordefinierte Einschränkungen für Cloud Storage. Wenn Sie jedoch eine detailliertere, anpassbare Steuerung der spezifischen Felder wünschen, die in Ihren Organisationsrichtlinien eingeschränkt werden, können Sie auch benutzerdefinierte Einschränkungen erstellen und diese benutzerdefinierten Einschränkungen in einer Organisationsrichtlinie verwenden.

Auf dieser Seite wird beschrieben, wie Sie benutzerdefinierte Einschränkungen festlegen, um Richtlinien für Cloud Storage-Ressourcen durchzusetzen.

Wenn Sie eine neue Einschränkung testen möchten, bevor sie in Ihrer Produktionsumgebung erzwungen wird, verwenden Sie den Richtliniensimulator.

Übernahme von Richtlinien

Standardmäßig werden Organisationsrichtlinien von den Nachfolgerelementen der Ressourcen übernommen, für die Sie die Richtlinie erzwingen. Wenn Sie beispielsweise eine Richtlinie für eine Organisation erzwingen, erzwingt Google Cloud die Richtlinie für alle Projekte in der Organisation. Weitere Informationen zu diesem Verhalten und zu dessen Änderung finden Sie unter Regeln für die Evaluierung der Hierarchie.

Preise

Der Organisationsrichtliniendienst, einschließlich vordefinierter und benutzerdefinierter Einschränkungen, wird kostenlos angeboten.

Beschränkungen

  • Benutzerdefinierte Einschränkungen für Cloud Storage-Ressourcen können nur mit der Google Cloud Console oder der Google Cloud CLI eingerichtet werden.

  • Benutzerdefinierte Einschränkungen können nur für die Methode CREATE oder UPDATE für Cloud Storage-Ressourcen erzwungen werden.

  • Neu erzwungene benutzerdefinierte Einschränkungen gelten nicht automatisch für vorhandene Ressourcen. Vorhandene Ressourcen müssen aktualisiert werden, damit die Einschränkung angewendet werden kann.

    Wenn Sie vorhandene Ressourcen finden möchten, die aktualisiert werden müssen, können Sie eine Organisationsrichtlinie für den Testlauf erzwingen.

  • Mit benutzerdefinierten Einschränkungen können keine ACLs oder IAM-Richtlinien für Objekte oder Buckets eingeschränkt werden.

Von Cloud Storage unterstützte Ressourcen

Bei Cloud Storage können Sie benutzerdefinierte Einschränkungen für die folgende Ressource festlegen:

  • Buckets: storage.googleapis.com/Bucket

Erforderliche Rollen

Informationen zu den Rollen, die zum Verwalten von Organisationsrichtlinien mit benutzerdefinierten Einschränkungen erforderlich sind, finden Sie unter Erforderliche Rollen.

Neben der Verwaltung von Organisationsrichtlinien können Sie auch die von Ihnen erstellten benutzerdefinierten Einschränkungen testen. Für den Test benutzerdefinierter Einschränkungen wird empfohlen, die am wenigsten permissive vordefinierte oder benutzerdefinierte Rolle zu verwenden, die die Berechtigungen enthält, die zum Testen der jeweiligen Einschränkung erforderlich sind. Informationen zu den erforderlichen Berechtigungen und Rollen finden Sie unter Rollen und Berechtigungen für Cloud Storage.

Benutzerdefinierte Einschränkung einrichten

Console

  1. Wechseln Sie in der Google Cloud Console zur Seite Organisationsrichtlinien.

    Zu den Organisationsrichtlinien

  2. Klicken Sie oben auf der Seite auf Projektauswahl.

  3. Wählen Sie in der Projektauswahl das Projekt aus, für das Sie die Organisationsrichtlinie festlegen möchten.

  4. Klicken Sie auf Benutzerdefinierte Einschränkung.

  5. Geben Sie im Feld Anzeigename einen nutzerfreundlichen Namen für die Einschränkung ein. Dieses Feld hat eine maximale Länge von 200 Zeichen. Verwenden Sie keine personenidentifizierbaren Informationen oder vertraulichen Daten in Einschränkungsnamen, da diese in Fehlermeldungen angezeigt werden können.

  6. Geben Sie im Feld Einschränkungs-ID den gewünschten Namen für die neue benutzerdefinierte Einschränkung ein. Eine benutzerdefinierte Einschränkung muss mit custom. beginnen und darf nur Großbuchstaben, Kleinbuchstaben oder Ziffern enthalten, z. B. custom.enforceBucketVersioning. Die maximale Länge dieses Feldes beträgt 70 Zeichen, das Präfix wird nicht gezählt (z. B. organizations/123456789/customConstraints/custom.).

  7. Geben Sie im Feld Beschreibung eine nutzerfreundliche Beschreibung der Einschränkung ein, die bei einer Verletzung der Richtlinie als Fehlermeldung angezeigt wird. Dieses Feld hat eine maximale Länge von 2000 Zeichen.

  8. Wählen Sie im Feld Ressourcentyp den Namen der REST-Ressource von Google Cloud aus, die das Objekt und das Feld enthält, das Sie einschränken möchten. Beispiel: storage.googleapis.com/Bucket

  9. Wählen Sie unter Methode erzwingen aus, ob die Einschränkung für die REST-Methode CREATE oder UPDATE erzwungen werden soll.

  10. Klicken Sie zum Definieren einer Bedingung auf Bedingung bearbeiten.

    1. Erstellen Sie im Bereich Bedingung hinzufügen eine CEL-Bedingung, die auf eine unterstützte Dienstressource verweist, z. B. resource.versioning.enabled == true. Dieses Feld hat eine maximale Länge von 1000 Zeichen.

    2. Klicken Sie auf Speichern.

  11. Wählen Sie unter Aktion aus, ob die ausgewertete Methode zugelassen oder abgelehnt werden soll, wenn die Bedingung erfüllt ist.

  12. Klicken Sie auf Einschränkung erstellen.

Wenn Sie in jedes Feld einen Wert eingegeben haben, wird rechts die entsprechende YAML-Konfiguration für diese benutzerdefinierte Einschränkung angezeigt.

gcloud

Zum Erstellen einer benutzerdefinierten Einschränkung mit der Google Cloud CLI erstellen Sie eine YAML-Datei für die benutzerdefinierte Einschränkung:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- RESOURCE_NAME
methodTypes:
- METHOD1
- METHOD2
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION

Ersetzen Sie dabei Folgendes:

  • ORGANIZATION_ID: Ihre Organisations-ID, z. B. 123456789.

  • CONSTRAINT_NAME: Name, den Sie für Ihre neue benutzerdefinierte Einschränkung verwenden möchten. Eine benutzerdefinierte Einschränkung muss mit custom. beginnen und darf nur Großbuchstaben, Kleinbuchstaben oder Ziffern enthalten, z. B. custom.enforceBucketVersioning. Die maximale Länge dieses Feldes beträgt 70 Zeichen, das Präfix wird nicht gezählt (z. B. organizations/123456789/customConstraints/custom.).

  • RESOURCE_NAME: der voll qualifizierte Name der Google Cloud-REST-Ressource, die das Objekt und das Feld enthält, das Sie einschränken möchten. Beispiel: storage.googleapis.com/Bucket.

  • METHOD1,METHOD2: Liste der RESTful-Methoden, für die die Einschränkung erzwungen werden soll. Kann CREATE oder CREATE und UPDATE sein.

  • CONDITION: eine CEL-Bedingung, die auf eine unterstützte Dienstressource verweist, z. B. "resource.versioning.enabled == true". Dieses Feld hat eine maximale Länge von 1.000 Zeichen. Weitere Informationen zur Verwendung von CEL finden Sie unter Common Expression Language.

  • ACTION: Aktion, die ausgeführt werden soll, wenn condition erfüllt ist. Dies kann entweder ALLOW oder DENY sein.

  • DISPLAY_NAME: Ein nutzerfreundlicher Name für die Einschränkung. Dieses Feld hat eine maximale Länge von 200 Zeichen.

  • DESCRIPTION: Eine nutzerfreundliche Beschreibung der Einschränkung, die als Fehlermeldung angezeigt werden soll, wenn die Richtlinie verletzt wird Dieses Feld hat eine maximale Länge von 2000 Zeichen.

Nachdem Sie die YAML-Datei für eine neue benutzerdefinierte Einschränkung erstellt haben, müssen Sie sie einrichten, um sie für Organisationsrichtlinien in Ihrer Organisation verfügbar zu machen. Verwenden Sie zum Einrichten einer benutzerdefinierten Einschränkung den Befehl gcloud org-policies set-custom-constraint:

gcloud org-policies set-custom-constraint CONSTRAINT_PATH
Ersetzen Sie CONSTRAINT_PATH durch den vollständigen Pfad zu Ihrer benutzerdefinierten Einschränkungsdatei. Beispiel: /home/user/customconstraint.yaml Nach Abschluss des Vorgangs sind Ihre benutzerdefinierten Einschränkungen als Organisationsrichtlinien in der Liste der Google Cloud-Organisationsrichtlinien verfügbar. Prüfen Sie mit dem Befehl gcloud org-policies list-custom-constraints, ob die benutzerdefinierte Einschränkung vorhanden ist:
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
Ersetzen Sie ORGANIZATION_ID durch die ID Ihrer Organisationsressource. Weitere Informationen finden Sie unter Organisationsrichtlinien aufrufen.

Wenn die Anfrage erfolgreich ist, sieht die Ausgabe in etwa so aus:

CUSTOM_CONSTRAINT             ACTION_TYPE  METHOD_TYPES   RESOURCE_TYPES                     DISPLAY_NAME
custom.uniformBucketLevelAccess  DENY         CREATE,UPDATE  storage.googleapis.com/Bucket  Enable object versioning

Weitere Informationen zum Einrichten und Verwalten benutzerdefinierter Einschränkungen finden Sie unter Benutzerdefinierte Einschränkungen erstellen und verwalten.

Einschränkung erzwingen

Sie können eine boolesche Einschränkung erzwingen, indem Sie eine Organisationsrichtlinie erstellen, die darauf verweist, und diese Organisationsrichtlinie dann auf eine Google Cloud-Ressource anwenden.

Console

  1. Wechseln Sie in der Google Cloud Console zur Seite Organisationsrichtlinien.

    Zu den Organisationsrichtlinien

  2. Wählen Sie in der Projektauswahl das Projekt aus, für das Sie die Organisationsrichtlinie festlegen möchten.
  3. Wählen Sie auf der Seite Organisationsrichtlinien die gewünschte Einschränkung aus, um die Seite Richtliniendetails aufzurufen.
  4. Zum Konfigurieren der Organisationsrichtlinie für diese Ressource klicken Sie auf Richtlinie verwalten.
  5. Wählen Sie auf der Seite Richtlinie bearbeiten die Option Richtlinie der übergeordneten Ressource überschreiben aus.
  6. Klicken Sie auf Regel hinzufügen.
  7. Wählen Sie im Abschnitt Erzwingung aus, ob die Erzwingung dieser Organisationsrichtlinie aktiviert oder deaktiviert werden soll.
  8. Klicken Sie optional auf Bedingung hinzufügen, um die Organisationsrichtlinie von einem Tag abhängig zu machen. Wenn Sie einer Organisationsrichtlinie eine bedingte Regel hinzufügen, müssen Sie mindestens eine bedingungsfreie Regel hinzufügen oder die Richtlinie kann nicht gespeichert werden. Weitere Informationen finden Sie unter Organisationsrichtlinie mit Tags festlegen.
  9. Wenn dies eine benutzerdefinierte Einschränkung ist, können Sie auf Änderungen testen klicken, um die Auswirkungen dieser Organisationsrichtlinie zu simulieren. Weitere Informationen finden Sie unter Änderungen an Organisationsrichtlinien mit dem Richtliniensimulator testen.
  10. Klicken Sie auf Richtlinie festlegen, um den Vorgang abzuschließen und die Organisationsrichtlinie anzuwenden. Es kann bis zu 15 Minuten dauern, bis die Richtlinie wirksam wird.

gcloud

Um eine Organisationsrichtlinie zu erstellen, die eine boolesche Einschränkung erzwingt, erstellen Sie eine YAML-Richtliniendatei, die auf die Einschränkung verweist:

      name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
    

Ersetzen Sie Folgendes:

  • PROJECT_ID: das Projekt, für das Sie die Einschränkung erzwingen möchten
  • CONSTRAINT_NAME: der Name, den Sie für Ihre benutzerdefinierte Einschränkung definiert haben. Beispiel: custom.uniformBucketLevelAccess.

Führen Sie den folgenden Befehl aus, um die Organisationsrichtlinie mit der Einschränkung zu erzwingen:

    gcloud org-policies set-policy POLICY_PATH
    

Ersetzen Sie POLICY_PATH durch den vollständigen Pfad zur YAML-Datei Ihrer Organisationsrichtlinie. Es kann bis zu 15 Minuten dauern, bis die Richtlinie wirksam wird.

Anfragen, die aufgrund eines Verstoßes gegen eine benutzerdefinierte Einschränkung abgelehnt werden, schlagen mit diesem 412-Fehler fehl: CUSTOM_ORGPOLICY_CONSTRAINT_FAILED.

Beispiel: Einschränkung erstellen, die vom Kunden verwaltete Verschlüsselungsschlüssel für Bucket erzwingt

gcloud

  1. Erstellen Sie eine enforceCMEK.yaml-Einschränkungsdatei mit den folgenden Informationen.

    name: organizations/ORGANIZATION_ID/customConstraints/custom.customerManagedEncryptionKeys
    resource_types: storage.googleapis.com/Bucket
    method_types: CREATE UPDATE
    condition: "has(resource.encryption.defaultKmsKeyName)"
    action_type: ALLOW
    display_name: Enforce Cloud KMS key
    description: When this constraint is enforced, newly created buckets and newly updated buckets must be encrypted with a
    Cloud KMS key. The Cloud KMS key on existing buckets can be updated but not deleted.
  2. Legen Sie die benutzerdefinierte Einschränkung fest.

    gcloud org-policies set-custom-constraint enforceCMEK.yaml
    
  3. Erstellen Sie eine enforceCMEK-policy.yaml-Richtliniendatei mit folgender Information:

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

    Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.

    In diesem Beispiel wird diese Einschränkung auf Projektebene erzwungen. Sie können diese Einschränkung aber auch auf Organisations- oder Ordnerebene festlegen.

  4. Richtlinie erzwingen

    gcloud org-policies set-policy enforceCMEK-policy.yaml
    

Beispiele für benutzerdefinierte Einschränkungen für häufige Anwendungsfälle

Die folgenden Abschnitte enthalten die Syntax einiger benutzerdefinierter Einschränkungen, die für Sie nützlich sein könnten:

Anwendungsfall Syntax
Die Aufbewahrungsdauer von Bucket-Aufbewahrungsrichtlinien muss in den angegebenen Zeiträumen liegen.
      name: organizations/ORGANIZATION_ID/customConstraints/custom.retentionPolicy
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.retentionPolicy.retentionPeriod not in [3600, 2678400]"
      action_type: DENY
      display_name: Bucket retention policy is either 3,600 seconds or 2,678,400 seconds
      description: Newly created buckets and newly updated buckets must have a
      retention policy that's either 3,600 seconds or 2,678,400 seconds.
Für die Bucket muss die Objektversionsverwaltung aktiviert sein.
      name: organizations/ORGANIZATION_ID/customConstraints/custom.enforceBucketVersioning
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.versioning.enabled == true"
      action_type: ALLOW
      display_name: Buckets must have Object Versioning enabled
      description: Newly created buckets and newly updated buckets must have Object Versioning enabled.
Bucket-Namen müssen mit einem bestimmten regulären Ausdruck benannt werden
      name: organizations/ORGANIZATION_ID/customConstraints/custom.bucketName
      method_types:
CREATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.name.matches('^[a-zA-Z]+$')"
      action_type: ALLOW
      display_name: Bucket names must match the specified regular expression
      description: Newly created buckets must have a name that matches the
      specified regular expression. Only letters are allowed in the bucket name.
Für Bucket kann die Bucket-Sperre nicht aktiviert sein.
      name: organizations/ORGANIZATION_ID/customConstraints/custom.prohibitBucketLock
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.retentionPolicy.isLocked == true"
      action_type: DENY
      display_name: Prohibit the use of Bucket Lock
      description: Newly created buckets and newly updated buckets cannot have
      Bucket Lock enabled.
Für Buckets kann die Objektaufbewahrungssperre nicht aktiviert sein.
      name: organizations/ORGANIZATION_ID/customConstraints/custom.prohibitObjectRetentionLock
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.objectRetention.mode == 'Enabled'"
      action_type: DENY
      display_name: Objects cannot have retention configurations
      description: Newly created buckets and newly updated buckets cannot have
      Object Retention Lock enabled.
Buckets in den Multi-Regionen US oder EU müssen eine Aufbewahrungsdauer von 86.400 Sekunden haben.
      name: organizations/ORGANIZATION_ID/customConstraints/custom.locationRetentionPolicy
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "(resource.location.startsWith('US') || resource.location.startsWith('EU')) && resource.retentionPolicy.retentionPeriod != 86400"
      action_type: DENY
      display_name: All buckets in US and EU must have a retention policy of 86,400 seconds
      description: Newly created buckets and newly updated buckets located in
      US and EU regions must have a retention policy of 86,400 seconds.
Buckets müssen Labels haben1
      name: organizations/ORGANIZATION_ID/customConstraints/custom.labels
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "'my_annotations.data.source' in resource.labels && resource.labels['my_annotations.data.source'] in ['SOURCE_IMAGES','SOURCE_TEXT','SOURCE_VIDEOS']"
      action_type: ALLOW
      display_name: Buckets must have a label classifying the contents of the bucket
      description: Newly created buckets and newly updated buckets must have the
      label my_annotations.data.source with the SOURCE_IMAGES, SOURCE_TEXT, or
      SOURCE_VIDEOS key.
Buckets müssen sich in einer Dual-Region befinden
      name: organizations/ORGANIZATION_ID/customConstraints/custom.dualRegionUS
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "'US-EAST1' in resource.customPlacementConfig.dataLocations && 'US-EAST4' in resource.customPlacementConfig.dataLocations"
      action_type: ALLOW
      display_name: Buckets must be located in a dual-region
      description: Newly created buckets and newly updated buckets must be located in a dual-region
      composed of the us-east1 and us-east4 regions.
Für Bucket können keine Legacy-Speicherklassen verwendet werden
      name: organizations/ORGANIZATION_ID/customConstraints/custom.disableLegacyStorageClass
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.storageClass in ['STANDARD', 'NEARLINE', 'COLDLINE', 'ARCHIVE']"
      action_type: ALLOW
      display_name: Buckets cannot use legacy storage classes
      description: Newly created buckets and newly updated buckets must use
      Standard storage, Nearline storage, Coldline storage, or Archive storage.

1 Wenn Sie einen nicht vorhandenen Bucket-Labelschlüssel angeben, wird der Fehler BAD_CONDITION zurückgegeben. Dieser Fehler verhindert, dass die Methoden CREATE und UPDATE im Bucket ausgeführt werden. Um diesen Fehler zu vermeiden, prüfen Sie zuerst mit "my_annotations.data.source" in resource.labels, ob der Labelschlüssel vorhanden ist.

Ausdrucksfelder für Bedingungen

In der folgenden Tabelle sind die Ausdrucksfelder aufgeführt, mit denen Sie Bedingungen erstellen können. Bedingungen werden in der Common Expression Language (CEL) geschrieben. Bei den Werten dieser Ausdrucksfelder wird die Groß- und Kleinschreibung berücksichtigt.

Beschreibungen der folgenden Ausdrucksfelder und der zulässigen Werte finden Sie in der Ressourcendarstellung von Buckets für die JSON API.

Ausdrucksfeld Werttyp
billing.requesterPays bool
cors list
cors.maxAgeSeconds int
cors.method list
cors.origin list
cors.responseHeader list
customPlacementConfig.dataLocations1 list
defaultEventBasedHold bool
encryption.defaultKmsKeyName string
iamConfiguration.publicAccessPrevention string
iamConfiguration.uniformBucketLevelAccess.enabled bool
labels map
lifecycle.rule list
lifecycle.rule.action.storageClass1 string
lifecycle.rule.action.type string
lifecycle.rule.condition.age int
lifecycle.rule.condition.createdBefore string
lifecycle.rule.condition.customTimeBefore string
lifecycle.rule.condition.daysSinceCustomTime int
lifecycle.rule.condition.daysSinceNoncurrentTime int
lifecycle.rule.condition.isLive bool
lifecycle.rule.condition.matchesPrefix list
lifecycle.rule.condition.matchesStorageClass list
lifecycle.rule.condition.matchesSuffix list
lifecycle.rule.condition.noncurrentTimeBefore string
lifecycle.rule.condition.numNewerVersions int
location1 string
locationType string
logging.logBucket string
logging.logObjectPrefix string
objectRetention.mode string
name string
projectNumber2 string
retentionPolicy.isLocked bool
retentionPolicy.retentionPeriod int
rpo string
softDeletePolicy.retentionDurationSeconds int
storageClass1 string
versioning.enabled bool
website.mainPageSuffix string
website.notFoundPage string

1: Der Wert für dieses Feld muss in Großbuchstaben geschrieben sein.

2 Die Verwendung dieses Feldes wurde eingestellt.

Hinweise

Bucket-Labels werden für die Verwendung in Bedingungen für benutzerdefinierte Einschränkungen nicht empfohlen. Verwenden Sie stattdessen Tags, die nur von Personen mit den erforderlichen IAM-Rollen festgelegt werden können und strenger kontrolliert werden als Labels.