Zugriff auf Objekte in einem Bucket mithilfe von IAM-Zugriffsbedingungen zuweisen
IAM-Zugriffsrichtlinien ermöglichen die Vergabe von Berechtigungen in einem „ Cloud Object Storage “-Bucket an bestimmte Objektgruppen. Dieser Ansatz ermöglicht eine differenzierte Zugriffssteuerung für den Datenzugriff und macht ihn in Szenarios nützlich, in denen verschiedene Benutzer oder Anwendungen auf unterschiedliche Teile eines Buckets zugreifen müssen.
Wenn der Zugriff auf das gesamte Bucket erforderlich ist (d. h., wenn keine differenzierte Zugriffssteuerung erforderlich ist), folgen Sie den Informationen unter Zugriff auf ein einzelnes Bucket zuweisen.
Jedes Objekt, das in einem Cloud Object Storage-Bucket gespeichert ist, hat einen eindeutigen Schlüssel. Diese Schlüssel folgen häufig einer hierarchischen Struktur, die einem Dateisystem ähnelt.
Verwandte Links zu IAM-Zugriffsrichtlinien
- Ressourcenattributbasierte Bedingungen
- Zeichenfolgevergleiche
- Prüfen einer Richtlinienversion in der Konsole
Beispiel
- Ein einzelnes Objekt mit dem Schlüssel "folder1/subfolder1/file.txt" kann einen Ordner oder eine Verzeichnishierarchie simulieren, wobei das Verzeichnis “folder1” ein Unterverzeichnis mit dem Namen “sub-folder1” enthält, das eine Datei enthält "file.txt". Der Zugriff kann auf jeder Ordnerebene zugewiesen werden.
- Eine Zugriffsrichtlinie kann für alle Objekte und-im Ordner *“folder1”*erstellt werden oder der Zugriff kann nur für Objekte im Unterverzeichnis *“subfolder1”*zugewiesen werden.
Ein Richtlinienadministrator kann Zugriff auf einzelne Objekte und Ordner zuweisen, indem er beim Erstellen von IAM-Zugriffsrichtlinien Bedingungen konfiguriert. Im nächsten Abschnitt wird beschrieben, wie diese Richtlinientypen erstellt werden.
Differenzierte Richtlinie für die Zugriffssteuerung erstellen
Der erste Schritt beim Erteilen von Zugriff auf einzelne Objekte innerhalb eines Buckets ist das Erstellen einer IAM-Richtlinie. Weitere Informationen zum Erstellen einer IAM-Zugriffsrichtlinie für Object Storage finden Sie im Lernprogramm Cloud Object Storage Zugriff auf ein einzelnes Object Storage-Bucket begrenzen. Weitere allgemeine Informationen zum Erstellen von IAM-Richtlinien finden Sie unter Funktionsweise von IBM Cloud IAM. Die folgenden Punkte sind wichtige Komponenten für die Erstellung einer IAM-Zugriffsrichtlinie für Ihre Ressourcen in „ Object Storage “.
Betreff
Das Subjekt einer Zugriffsrichtlinie kann ein einzelner Benutzer, eine Zugriffsgruppe, eine Service-ID oder ein vertrauenswürdiges Profil sein. Weitere Informationen zu den Subjekttypen, die auf eine Richtlinie angewendet werden können, finden Sie unter Was sind IAM-Richtlinien und wer kann sie zuweisen?.
Service
Der Service ist der IBM Cloud-Service, der die Ressource enthält, der Sie den Zugriff zuweisen möchten. Verwenden Sie zum Zuweisen von Zugriff auf einzelne Objekte den Service Cloud Object Storage.
Ressource
IBM Cloud® Object Storage unterstützt die folgenden Ressourcenziele:
- Ressourcengruppen-ID
- Serviceinstanz
- Ressourcentyp mit Wert "bucket"
- Ressourcen-ID (Bucketname)
Rolle
IBM Cloud-Zugriffsrollen sind Gruppen von Aktionen. Zugriffsrollen ermöglichen es dem Subjekt, bestimmte Aufgaben im Rahmen der in der Richtlinie definierten Zielressourcen auszuführen. Cloud Object Storage unterstützt mehrere vordefinierte Servicerollen, die die Zuordnung von Berechtigungen vereinfachen. Cloud Object Storage ermöglicht auch die Erstellung angepasster Rollen. Weitere Informationen zu den unterstützten Rollen für Cloud Object Storagefinden Sie unter Identity and Access Management-Rollen.
Eine Liste der Cloud Object Storage-Rollen und ihrer Interaktion mit Bedingungen finden Sie in dieser Tabelle.
Bedingung
Wenn eine Ressource identifiziert wird, kann eine Bedingung verwendet werden, um den Bereichszugriff für ein Subjekt auf einzelne Objekte in einem Bucket weiter zu definieren, was als differenzierte Zugriffssteuerung bezeichnet wird.
Eine einzelne IAM-Richtlinie kann mehr als eine Bedingung haben, indem sie eine Anweisung OR oder AND verwendet, um die Bedingungen zu kombinieren. Die Bedingungsanweisung (die mindestens eine Bedingung enthält) sollte
mit TRUE ausgewertet werden, damit die Benutzeranforderung berechtigt ist, die Aktion auszuführen. Die IAM-Richtlinie verweigert jede Aktion, die nicht ausgewertet werden kann TRUE. Die Richtlinienanweisung sollte
alle Bedingungsattribute enthalten, die für die Rolle erforderlich sind. Wenn die Richtlinienanweisung nicht alle Bedingungsattribute enthält, die für die Rolle erforderlich sind, werden die Aktionen, die den übergangenen Bedingungsattributen
unterliegen, verweigert.
Verwenden Sie eine Richtlinie ohne Bedingungsattribute, um uneingeschränkten Zugriff, wie durch die Rolle definiert, auf die Zielressource zu erteilen.
Verwenden Sie die IAM- v2-Richtlinie, um eine IAM-Richtlinie mit attributbasierten Bedingungen zu erstellen.
Bedingungen in einer IAM-Richtlinie verwenden
Cloud Object Storage unterstützt die folgenden Attribute, um Bedingungen für die Zuweisung differenzierten Zugriffs auf Cloud Object Storage-Ressourcen anzugeben:
Präfix und Begrenzer
Präfix und Trennzeichen werden zusammen verwendet, um alle Listungsberechtigungen auf bestimmte Objekte in einem Bucket zu beschränken.
-
Das Bedingungsattribut Präfix definiert das Präfix für die Gruppe von Objektschlüsseln, die diese Bedingung für das Auflisten von Objekten oder Ordnern zulassen sollte. In dem Objekt mit dem Namen *"folder1/subfolder1/file.txt"*sind beispielsweise sowohl "folder1/" als auch “folder1/subfolder1/” mögliche Präfixe.
-
Ein Begrenzer hilft dem Benutzer beim Navigieren im Bucket, als wäre es eine Dateihierarchie. Das Zuweisen einer Begrenzerbedingungsanweisung beschränkt den Typ der Ordnerstruktur, die der Benutzer in der Liste generieren kann. In einem Objekt mit dem Namen *"folder1/subfolder1/file.txt"*kann das Trennzeichen "/" verwendet werden, um eine Ordnerhierarchie zu simulieren, bei der jeder Ordner durch ein *"/"*getrennt ist. Wenn eine Bedingungsanweisung nur den Begrenzer *"/"*zulässt, ist eine Listenanforderung mit einem anderen Begrenzerwert nicht zulässig.
In der Regel werden das Präfix und das Trennzeichen zusammen in einer Bedingungsanweisung mit einem AND Operator verwendet. In einer Bedingungsanweisung kann ein Präfix ohne Begrenzer verwendet werden. Wenn die Richtlinie nur
mit einem Präfix und nicht mit einer Begrenzerbedingungsanweisung konfiguriert ist, kann der Benutzer einen beliebigen oder keinen Begrenzer zum Auflisten der Objekte verwenden.
Beispiele für die Verwendung von Bedingungsanweisungen für Präfix und Begrenzer
Betrachten Sie das Objekt "folder1/subfolder1/file.txt":
Präfix "folder1/" AND ohne Begrenzer
- Sie können eine Liste aller Objekte zurückgeben, die mit folder1/ beginnen, indem Sie eine Listenanforderung für folder1/ ausführen und keinen Begrenzer angeben.
- Wenn Sie in der Listenanforderung das Trennzeichen "/" verwenden, ist die Anzeige auf die erste Ebene von Objekten und Unterordnern in *folder1/*beschränkt.
- Wenn der Benutzer versucht, den Unterordner aufzulisten (Anforderungen zum Auflisten des Präfix = “folder1/subfolder1/”), wird der Zugriff verweigert.
Präfix von "folder1/" AND Begrenzer von "/"
- Sie können die Objekte und Unterordner nur in der ersten Ebene von folder1auflisten.
- Sie können nur Anforderungen auflisten, die den Begrenzer *"/"*angeben.
- Wenn Sie versuchen, den Inhalt von subfolder1aufzulisten, wird der Zugriff verweigert. (Der Benutzer muss die Bedingung haben, dass das Präfix “folder1/subfolder1/" zulässig ist, damit der Inhalt von subfolder1aufgelistet werden kann.)
Die folgenden APIs unterliegen den Bedingungen für Präfix/Begrenzer:
- GET-Bucket(Objekte auflisten)
- GET Bucket Object Versions (Objektversionen auflisten)
- Mehrteilige Uploads auflisten
Die vollständige Liste der Aktionen und der unterstützten Zustandsattribute finden Sie unter „ Identity and Access Management-Aktionen “.
Um einem differenzierten Benutzer Zugriff zum Navigieren zu seinem Ordner in der Benutzerschnittstelle zu erteilen, benötigt der Benutzer Zugriff zum Auflisten des Stammordners des Buckets. In Szenario 4 erfahren Sie, wie Sie die Richtlinie erstellen, um dies zu aktivieren.
Pfad
Der Pfad wird verwendet, um alle Lese-, Schreib-oder Verwaltungszugriffe auf bestimmte Objekte zu definieren.
Für ein Objekt namens *"folder1/subfolder1/file.txt"*ist der vollständige Objektschlüssel der Pfad. Um Lese-, Schreib-oder Verwaltungsaktionen auf dieses Objekt zu beschränken, definieren Sie eine Bedingung mit dem Pfad "folder1/subfolder1/file.txt".
Alle Cloud Object Storage-APIs, die direkt auf ein Objekt reagieren, unterliegen Pfadbedingungen. Eine Liste der Cloud Object Storage-API-Aktionen zur Unterstützung von Path finden Sie unter Identity and Access Management-Aktionen.
Es wird empfohlen, sowohl eine Bedingung für Präfix/Begrenzer als auch eine Bedingung für Pfad zu definieren, wenn einem Benutzer in derselben Richtlinie Lese-, Schreib-oder Listenaktionen erteilt werden. Manager, Writer,
Reader und Content Reader sind Beispiele für Rollen, bei denen es empfohlen wird, sowohl ein Präfix/Begrenzer als auch eine Pfadbedingung zu definieren. In Szenario 4 erfahren Sie, wie Sie die Richtlinie erstellen, um dies zu aktivieren. Eine Bedingung, die Präfix/Begrenzer angibt, und eine Bedingung, die Pfad angibt, sollte logisch ORed in der IAM-Richtlinienanweisung sein, um beide Arten
von Operationen (Lesen, Schreiben oder Verwalten von Objekten oder Listenobjekte) zuzulassen.
Mit Bedingungsattributen verwendete Operatoren
Beim Definieren von Bedingungsattributen können mehrere Operatoren verwendet werden. Die vollständige Liste der Operatoren, die für Attribute für Präfix, Begrenzer und Pfadbedingungen verwendet werden können, finden Sie unter Ressourcenattributbasierte Bedingungen.
Verwendung von Platzhalterzeichen
Die Werte eines Bedingungsattributs können ein Platzhalterzeichen enthalten, wenn der Operator stringMatch oder stringMatchAnyOf ist.
Beispiele für die Verwendung von Platzhalterzeichen in Bedingungsanweisungen:
Betrachten Sie das Objekt "folder1/subfolder1/file.txt":
Pfad von “folder1/*”
- Sie erhalten Lese-, Schreib-oder Verwaltungszugriff, wie durch die Rolle definiert, auf alle Objekte, die mit *“folder1/”*beginnen.
Präfix von "folder1/*" AND ohne Begrenzer
- Bei einer Objektlistenanforderung mit dem Präfix “folder1/” und ohne Begrenzer gibt die Benutzeranforderung alle Objekte zurück, die mit *“folder1/”*beginnen.
- Für eine Objektlistenanforderung mit dem Präfix “folder1/” und dem Begrenzer *"/"*gibt die Anforderung eine Ansicht der Objekte und Ordner nur in der ersten Ebene von folder1zurück.
- Für eine Objektlistenanforderung mit dem Präfix “folder1/subfolder1/” und dem Begrenzer *"/"*gibt die Anforderung eine Ansicht der Objekte und Ordner auf der ersten Ebene von folder1/subfolder1zurück.
Präfix von "folder1/*" AND Begrenzer von "/"
- Für eine Objektlistenanforderung mit dem Präfix “folder1/” und dem Begrenzer *"/"*gibt die Anforderung eine Ansicht der Objekte und Ordner nur in der ersten Ebene von folder1zurück.
- Für eine Objektlistenanforderung mit dem Präfix “folder1/subfolder1/” und dem Begrenzer *"/"*gibt die Anforderung die Objekte (und Unterordner) in folder1/subfolder1zurück.
- Für eine Objektlistenanforderung mit dem Präfix “folder1/” und ohne Begrenzer ist die Anforderung nicht zulässig, da ein Begrenzer "/" in der Listenanforderung verwendet werden muss, damit diese Richtlinie als wahr ausgewertet wird.
Aktionen ohne Präfix/Begrenzer oder Pfad
Es gibt einige Cloud Object Storage-APIs, die keinen Pfad oder Präfix und keinen Begrenzer angeben. Die Cloud Object Storage-Servicerollen Manager, Writer, Reader und Content Reader sind
Beispiele für Rollen, die diese Aktionen enthalten. Dies gilt auch für angepasste Rollen. Um diese Aktionen bei Verwendung einer Bedingung Präfix/Begrenzer oder Pfad zuzulassen, ist die folgende Bedingungsanweisung
in der IAM-Richtlinie erforderlich:
((path stringExists = false) AND (prefix stringExists = false) AND (delimiter stringExists= false))
Die Tabelle Identity and Access Management-Aktionen enthält eine vollständige Liste der API-Aktionen, die keine Bedingungen für Präfix/Begrenzer oder Pfad unterstützen und die obige Anweisung erfordern, wenn differenzierter Zugriff verwendet wird.
Informationen zur Verwendung dieser Klausel in einer IAM-Richtlinie finden Sie im Abschnitt Neue Richtlinie für einen Benutzer mit Bedingungen erstellen.
Verwendung von Bedingungen mit Cloud Object Storage-Servicerollen
| Zugriffsrolle | Beschreibung der Aktionen | Unterstützte Bedingungsattribute |
|---|---|---|
| Manager | Objekte öffentlich machen, Buckets und Objekte erstellen und löschen. | Siehe Anmerkung |
| Schreibberechtigter | Erstellen und löschen Sie Buckets und Objekte. | Siehe Anmerkung |
| Leseberechtigter | Buckets auflisten, Objekte auflisten und Objekte herunterladen. | Siehe Anmerkung |
| Leseberechtigter für Inhalt (Content Reader) | Objekte auflisten und herunterladen. | Siehe Anmerkung |
| Objektleseberechtigter | Objekte herunterladen. | Pfad |
| Objektschreibberechtigter | Laden Sie Objekte hoch. | Pfad |
Hinweis: Diese Rollen unterstützen die Bedingungsattribute 'Präfix/Begrenzer' und 'Pfad '. Die Rollen enthalten auch Aktionen, die keinen Pfad oder Präfix und Begrenzer angeben. Verwenden Sie die Klausel stringExists in der Bedingungsanweisung, um diese Aktionen zuzulassen.
Unter Link finden Sie eine vollständige Liste der Aktionen für jede Cloud Object Storage-Servicerolle und die Liste der Bedingungsattribute, die von den einzelnen Aktionen unterstützt werden.
Neue Richtlinie für einen Benutzer mit Bedingungen erstellen
Im folgenden Beispiel wird einem Benutzer die “Writer” Cloud Object Storage-Servicerolle mit der folgenden Funktionalität bereitgestellt:
- Listenzugriff auf die vollständige Objekthierarchie in einem Ordner namens "folder1/subfolder1".
- Lese-, Schreib-oder Löschzugriff auf alle Objekte im Ordner "subfolder1".
- Führen Sie ein Bucketkonfigurationsmanagement wie
HEAD BucketundGET/PUT Bucket Versioningdurch.
Befehlszeilenschnittstelle einer IAM-Richtlinie mit einer Bedingung
Allgemeine Informationen zur Verwendung der CLI finden Sie im Abschnitt zur Verwendung der Befehlszeilenschnittstelle von IBM Cloud®.
Beispiel
policy.json:
{
"type": "access",
"subject": {
"attributes": [
{
"value": "IBMid-664001QJNU",
"operator": "stringEquals",
"key": "iam_id"
}
]
},
"resource": {
"attributes": [
{
"value": "cloud-object-storage",
"operator": "stringEquals",
"key": "serviceName"
},
{
"value": "e6156134-5ed7-4f73-80d3-d6d1ef56f1f9",
"operator": "stringEquals",
"key": "serviceInstance"
},
{
"value": "bucket",
"operator": "stringEquals",
"key": "resourceType"
},
{
"value": "fgac-tf-test",
"operator": "stringEquals",
"key": "resource"
}
]
},
"control": {
"grant": {
"roles": [
{
"role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
} ]
}
},
"rule": {
"operator": "or",
"conditions": [
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringEqualsAnyOf",
"value": [
"/",
""
]
}
]
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringExists",
"value": false
}
]
}
]
},
"pattern": "attribute-based-condition:resource:literal-and-wildcard"
}
ibmcloud iam user-policy-create hello@ibm.com --file policy.json --api-version v2
Verwenden Sie „ --api-version “ ( v2 ) mit ressourcenbasierten Attributbedingungen.
API einer IAM-Richtlinie mit einer Bedingung
Beispiel
Anforderung
curl -X POST 'https://iam.cloud.ibm.com/v2/policies' \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"type": "access",
"description": "access control for RESOURCE_NAME",
"resource": {
"attributes": [
{
"key": "serviceName",
"operator": "stringEquals",
"value": "cloud-object-storage"
},
{
"key": "serviceInstance",
"operator": "stringEquals",
"value": "$SERVICE_INSTANCE"
},
{
"key": "accountId",
"operator": "stringEquals",
"value": "$ACCOUNT_ID"
},
{
"key": "resourceType",
"operator": "stringEquals",
"value": "bucket"
},
{
"key": "resource",
"operator": "stringEquals",
"value": "$RESOURCE_NAME"
}
]
},
"subject": {
"attributes": [
{
"key": "iam_id",
"operator": "stringEquals",
"value": "IBMid-123453user"
}
]
},
"control": {
"grant": {
"roles": [
{
"role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
}
]
}
},
"rule": {
"operator": "or",
"conditions": [
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringEqualsAnyOf",
"value": [
"/",
""
]
}
]
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringExists",
"value": false
}
]
}
]
},
"pattern": "attribute-based-condition:resource:literal-and-wildcard"
}'
Antwort
{
"id": "d4078e99-d78a-4a50-95d6-b528e3c87dff",
"description": "access control for RESOURCE_NAME",
"type": "access",
"subject": {
"attributes": [
{
"key": "iam_id",
"operator": "stringEquals",
"value": "IBMid-123453user"
}
]
},
"resource": {
"attributes": [
{
"key": "serviceName",
"operator": "stringEquals",
"value": "cloud-object-storage"
},
{
"key": "serviceInstance",
"operator": "stringEquals",
"value": "$SERVICE_INSTANCE"
},
{
"key": "accountId",
"operator": "stringEquals",
"value": "$ACCOUNT_ID"
},
{
"key": "resourceType",
"operator": "stringEquals",
"value": "bucket"
},
{
"key": "resource",
"operator": "stringEquals",
"value": "$RESOURCE_NAME"
}
]
},
"pattern": "attribute-based-condition:resource:literal-and-wildcard",
"rule": {
"operator": "or",
"conditions": [
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringEqualsAnyOf",
"value": [
"/",
""
]
}
]
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringExists",
"value": false
}
]
}
]
},
"control": {
"grant": {
"roles": [
{
"role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
}
]
}
},
"href": "https://iam.cloud.ibm.com/v2/policies/d4078e99-d78a-4a50-95d6-b528e3c87dff",
"created_at": "2023-10-09T16:24:52.391Z",
"created_by_id": " IBMid-12345user",
"last_modified_at": "2023-10-09T16:24:52.391Z",
"last_modified_by_id": " IBMid-12345user",
"counts": {
"account": {
"current": 785,
"limit": 4020
},
"subject": {
"current": 1,
"limit": 1000
}
},
"state": "active",
"version": "v1.0"
}
Terraform einer IAM-Richtlinie mit einer Bedingung
Beispiel
data "ibm_resource_group" "cos_group" {
name = "Default"
}
resource "ibm_iam_user_policy" "example" {
ibm_id = “user_email_id”
roles = ["Writer"]
resources {
service = "cloud-object-storage"
resource_type = "bucket"
resource_instance_id = "cos instance guid"
resource = "bucket-name"
}
rule_conditions {
operator = "and"
conditions {
key = "{{resource.attributes.prefix}}"
operator = "stringMatch"
value = ["folder1/subfolder1/*"]
}
conditions {
key = "{{resource.attributes.delimiter}}"
operator = "stringEqualsAnyOf"
value = ["/",""]
}
}
rule_conditions {
key = "{{resource.attributes.path}}"
operator = "stringMatch"
value = ["folder1/subfolder1/*"]
}
rule_conditions {
operator = "and"
conditions {
key = "{{resource.attributes.delimiter}}"
operator = "stringExists"
value = ["false"]
}
conditions {
key = "{{resource.attributes.prefix}}"
operator = "stringExists"
value = ["false"]
}
conditions {
key = "{{resource.attributes.path}}"
operator = "stringExists"
value = ["false"]
}
}
rule_operator = "or"
pattern = "attribute-based-condition:resource:literal-and-wildcard"
}
Weitere Informationen
Beispiele zur Verwendung der Bedingungsattribute Prefix/Delimiter oder Path finden Sie im Lernprogramm zur Steuerung des Zugriffs auf einzelne Objekte in einem Bucket.