Affectation d'accès à des objets dans un compartiment à l'aide de conditions d'accès IAM
Les politiques d'accès IAM permettent d'accorder des autorisations dans un compartiment d' Cloud Object Storage s à des groupes d'objets spécifiques. Cette approche permet un contrôle d'accès à granularité fine sur l'accès aux données, ce qui le rend utile dans les scénarios où différentes parties d'un compartiment doivent être accessibles à différents utilisateurs ou applications.
Si l'accès est requis pour l'ensemble du compartiment (c'est-à-dire lorsque le contrôle d'accès à granularité fine n'est pas requis), suivez les informations de la rubrique Affectation de l'accès à un compartiment individuel.
Chaque objet stocké dans un compartiment Cloud Object Storage possède une clé unique, et ces clés suivent souvent une structure hiérarchique similaire à un système de fichiers.
Liens connexes aux politiques d'accès IAM
- Conditions basées sur les attributs des ressources
- Comparaisons des chaînes
- Vérifier la version d'une politique dans la console
Exemple
- Un objet individuel avec la clé "folder1/subfolder1/file.txt" peut simuler un dossier ou une hiérarchie de répertoires, où le répertoire “folder1” contient un sous-répertoire nommé “sub-folder1” contenant un fichier "file.txt. L'accès peut être affecté à n'importe quel niveau de dossier.
- Une règle d'accès peut être créée pour tous les objets et-dans le dossier nommé “folder1”, ou l'accès peut être affecté uniquement aux objets du sous-répertoire nommé “subfolder1”.
Un administrateur de règles peut affecter l'accès à des objets et des dossiers individuels en configurant des conditions lors de la création de règles d'accès IAM. La section suivante explique comment construire ces types de règles.
Construction d'une règle de contrôle d'accès à granularité fine
La première étape de l'octroi de l'accès à des objets individuels dans un compartiment consiste à construire une règle IAM. Vous trouverez plus d'informations sur la construction d'une règle d'accès IAM pour Object Storage dans le Cloud Object Storage Limitation de l'accès à un seul compartiment Object Storage. Pour plus d'informations générales sur la génération de règles IAM, voir Fonctionnement d' IBM Cloud IAM. Les éléments suivants sont des composants clés pour l'élaboration d'une politique d'accès IAM pour vos ressources d' Object Storage.
Objet
Le sujet d'une règle d'accès peut être un utilisateur individuel, un groupe d'accès, un ID de service ou un profil sécurisé. Voir Quelles sont les règles IAM et qui peut les affecter? pour plus d'informations sur les types de sujets que vous pouvez appliquer à une règle.
Service
Le service est le service IBM Cloud qui contient la ressource à laquelle vous tentez d'affecter l'accès. Pour affecter l'accès à des objets individuels, utilisez le service Cloud Object Storage.
Ressource
IBM Cloud® Object Storage prend en charge les cibles de ressources suivantes:
- ID du groupe de ressources
- Instance de service
- Type de ressource avec la valeur " bucket
- ID ressource (nom du compartiment)
Rôle
Les rôles d'accès IBM Cloud sont des groupes d'actions. Les rôles d'accès permettent au sujet d'effectuer des tâches spécifiques dans le contexte des ressources cibles définies dans la politique. Cloud Object Storage prend en charge plusieurs rôles de service prédéfinis qui facilitent l'affectation des droits. Cloud Object Storage permet également la création de rôles personnalisés. Pour plus d'informations sur les rôles pris en charge pour Cloud Object Storage, voir RôlesIdentity and Access Management.
Pour obtenir la liste des rôles Cloud Object Storage et leur interaction avec les conditions, accédez à cette table.
Condition
Lorsqu'une ressource est identifiée, une condition peut être utilisée pour étendre l'accès d'un sujet à des objets individuels dans un compartiment, appelé contrôle d'accès à granularité fine.
Une seule règle IAM peut avoir plusieurs conditions en utilisant une instruction OR ou AND pour combiner les conditions. L'instruction de condition (contenant une ou plusieurs conditions) doit être évaluée à TRUE pour que la demande de l'utilisateur soit autorisée à effectuer l'action. La règle IAM refuse toute action qui ne peut pas être évaluée TRUE. L'instruction de règle doit contenir tous les attributs de condition requis par le
rôle. Si l'instruction de règle ne contient pas tous les attributs de condition requis par le rôle, les actions soumises aux attributs de condition omis seront refusées.
Utilisez une règle sans attribut de condition pour accorder un accès complet, tel que défini par le rôle, à la ressource cible.
Utilisez la stratégie d' v2 s IAM pour créer une stratégie IAM avec des conditions basées sur des attributs.
Utilisation de conditions dans une règle IAM
Cloud Object Storage prend en charge les attributs suivants pour spécifier les conditions d'affectation d'accès à granularité fine sur les ressources Cloud Object Storage:
Préfixe et délimiteur
Le préfixe et le délimiteur sont utilisés conjointement pour limiter toutes les autorisations de listage à des objets spécifiques dans un compartiment.
-
L'attribut de condition Préfixe définit le préfixe de l'ensemble de clés d'objet que cette condition doit autoriser pour la liste des objets ou des dossiers. Par exemple, dans l'objet nommé "folder1/subfolder1/file.txt", "folder1/" et “folder1/subfolder1/” sont des préfixes possibles.
-
Un délimiteur permet à l'utilisateur de naviguer dans le compartiment comme s'il s'agissait d'une hiérarchie de fichiers. L'affectation d'une instruction de condition de délimiteur limite le type de structure de dossier que l'utilisateur peut générer dans la liste. Dans un objet nommé "folder1/subfolder1/file.txt", le délimiteur "/ peut être utilisé pour simuler une hiérarchie de dossiers dans laquelle chaque dossier est séparé par un " /. Si une instruction de condition autorise uniquement un délimiteur " /, une demande de liste avec une autre valeur de délimiteur n'est pas autorisée.
En général, le préfixe et le délimiteur sont utilisés ensemble dans une instruction conditionnelle avec un AND opérateur. Il est possible d'utiliser un préfixe sans délimiteur dans une instruction de condition. Si la règle est
configurée avec un préfixe uniquement et non avec une instruction de condition de délimiteur, l'utilisateur peut utiliser n'importe quel délimiteur ou aucun délimiteur pour répertorier les objets.
Exemples d'utilisation d'instructions de condition Prefix et Delimiter
Prenons l'objet nommé "folder1/subfolder1/file.txt":
Préfixe de "folder1/" AND no Delimiter
- Vous pouvez renvoyer une liste de tous les objets commençant par folder1/ en effectuant une demande de liste sur folder1/ et en ne fournissant pas de délimiteur.
- Si vous utilisez le délimiteur "/" dans la demande de liste, ils ne pourront voir que le premier niveau des objets et des sous-dossiers dans folder1/.
- Si l'utilisateur tente de répertorier le sous-dossier (demandes de préfixe de liste = “folder1/subfolder1/”), l'accès est refusé.
Préfixe de "folder1/" AND Délimiteur de "/"
- Vous pouvez uniquement répertorier les objets et les sous-dossiers du premier niveau de folder1.
- Vous pouvez uniquement effectuer des demandes de liste qui spécifient un délimiteur "/".
- Si vous essayez de répertorier le contenu de subfolder1, l'accès est refusé (l'utilisateur doit avoir une condition d'autorisation du préfixe = “folder1/subfolder1/" pour pouvoir répertorier le contenu de subfolder1).
Les API suivantes sont soumises à des conditions de préfixe / délimiteur:
- Compartiment GET(objets de liste)
- GET Versions d'objet de compartiment (versions d'objet de liste)
- Liste des téléchargements en plusieurs parties
Pour consulter la liste complète des actions et des attributs de condition pris en charge, consultez les actions d' Identity and Access Management.
Pour permettre à un utilisateur à granularité fine d'accéder à son dossier dans l'interface utilisateur, l'utilisateur a besoin d'un accès pour répertorier le dossier racine du compartiment. Voir Scénario 4 pour savoir comment construire la règle pour l'activer.
Voie
Le chemin est utilisé pour définir la portée de tous les accès en lecture, écriture ou gestion sur des objets spécifiques.
Pour un objet nommé "folder1/subfolder1/file.txt", la clé d'objet complète est le chemin. Pour limiter les actions de lecture, d'écriture ou de gestion à cet objet, définissez une condition avec le chemin "folder1/subfolder1/file.txt".
Toutes les API Cloud Object Storage qui agissent directement sur un objet sont soumises à des conditions de chemin. Voir ActionsIdentity and Access Management pour la liste des actions d'API Cloud Object Storage qui prennent en charge le chemin.
Il est recommandé de définir à la fois une condition de préfixe / délimiteur et une condition de chemin lors de l'octroi d'actions de lecture, d'écriture ou de liste à un utilisateur dans la même règle. Manager, Writer,
Reader et Content Reader sont des exemples de rôles dans lesquels il est recommandé de définir à la fois un préfixe / délimiteur et une condition de chemin. Voir Scénario 4 pour savoir comment construire la règle pour l'activer. Une condition spécifiant le préfixe / délimiteur et une condition spécifiant le chemin doivent être logiquement ORed dans l'instruction de règle IAM pour permettre les
deux types d'opérations (lecture, écriture ou gestion d'objets ou liste d'objets).
Opérateurs utilisés avec les attributs de condition
Plusieurs opérateurs peuvent être utilisés lors de la définition d'attributs de condition. La liste complète des opérateurs pouvant être utilisés pour les attributs de condition de préfixe, de délimiteur et de chemin d'accès se trouve dans Conditions basées sur les attributs de ressource.
Utilisation de caractères génériques
Les valeurs d'un attribut de condition peuvent inclure un caractère générique lorsque l'opérateur est stringMatch ou stringMatchAnyOf.
Exemples d'utilisation de caractères génériques dans des instructions de condition:
Prenons l'objet nommé "folder1/subfolder1/file.txt":
Chemin d'accès à “folder1/*”
- Vous obtiendrez un accès en lecture, en écriture ou en gestion, tel que défini par le rôle, à tous les objets commençant par “folder1/”.
Préfixe de "folder1/*" AND no Delimiter
- Pour une demande de liste d'objets avec le préfixe “folder1/” et sans délimiteur, la demande de l'utilisateur renvoie tous les objets commençant par “folder1/”.
- Pour une demande de liste d'objets avec le préfixe “folder1/” et le délimiteur " /, la demande renvoie une vue des objets et des dossiers uniquement dans le premier niveau de folder1.
- Pour une demande de liste d'objets avec le préfixe “folder1/subfolder1/” et le délimiteur " /, la demande renvoie une vue des objets et des dossiers juste au premier niveau de folder1/subfolder1.
Préfixe de "folder1/*" AND Délimiteur de "/"
- Pour une demande de liste d'objets avec le préfixe “folder1/” et le délimiteur " /, la demande renvoie une vue des objets et des dossiers uniquement dans le premier niveau de folder1.
- Pour une demande de liste d'objets avec le préfixe “folder1/subfolder1/” et le délimiteur de " /, la demande renvoie les objets (et tous les sous-dossiers) dans folder1/subfolder1.
- Pour une demande de liste d'objets avec le préfixe “folder1/” et sans délimiteur, la demande ne sera pas autorisée car un délimiteur de " / doit être utilisé dans la demande de liste pour que cette règle ait la valeur true.
Actions qui n'utilisent pas de préfixe / délimiteur ou de chemin
Certaines API Cloud Object Storage ne spécifient pas de chemin ou de préfixe et de délimiteur. Les rôles de service Cloud Object Storage: Manager, Writer, Reader et Content Reader sont des
exemples de rôles qui contiennent ces actions. Cela s'applique également aux rôles personnalisés. Pour autoriser ces actions lors de l'utilisation d'une condition Préfixe / Délimiteur ou Chemin, l'instruction
de condition suivante est nécessaire dans la règle IAM:
((path stringExists = false) AND (prefix stringExists = false) AND (delimiter stringExists= false))
Consultez le tableau Actions Identity and Access Management pour obtenir la liste complète des actions d'API qui ne prennent pas en charge les conditions Préfixe / Délimiteur ou Chemin d'accès et qui nécessitent l'instruction ci-dessus lors de l'utilisation d'un accès à granularité fine.
Reportez-vous à la section Création d'une règle pour un utilisateur avec des conditions pour utiliser cette clause dans une règle IAM.
Utilisation de conditions avec des rôles de service Cloud Object Storage
| Rôle d'accès | Description des actions | Attributs de condition pris en charge |
|---|---|---|
| Responsable | Rendre les objets publics, créer et détruire des compartiments et des objets. | Voir la note |
| Auteur | Créer et détruire des compartiments et des objets. | Voir la note |
| Lecteur | Répertoriez les compartiments, les objets de liste et les objets de téléchargement. | Voir la note |
| Lecteur de contenu | Répertorier et télécharger des objets. | Voir la note |
| Lecteur d'objet | Télécharger des objets. | Voie |
| Rédacteur d'objet | Téléchargez des objets. | Voie |
Remarque: Ces rôles prennent en charge les attributs de condition Préfixe / Délimiteur et Chemin. Les rôles incluent également des actions qui ne spécifient pas de chemin ou de préfixe et de délimiteur. Utilisez la clause stringExists dans l'instruction de condition pour autoriser ces actions.
Voir link pour la liste complète des actions pour chaque rôle de service Cloud Object Storage et la liste des attributs de condition pris en charge par chaque action.
Créer une règle pour un utilisateur avec des conditions
L'exemple suivant fournit à un utilisateur le rôle de service “Writer” Cloud Object Storage avec la possibilité de:
- Répertoriez l'accès à la hiérarchie complète des objets dans un dossier nommé "folder1/subfolder1".
- Accès en lecture, écriture ou suppression à tous les objets d'un dossier nommé "subfolder1".
- Effectuez la gestion de la configuration de compartiment, telle que
HEAD BucketetGET/PUT Bucket Versioning.
Interface de ligne de commande d'une règle IAM avec une condition
Pour obtenir des informations générales sur l'utilisation de l'interface CLI, consultez la section consacrée à l'utilisation de l'interface de ligne de commande d' IBM Cloud®.
Exemple
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
Utilisez --api-version v2 avec des conditions d'attribut basées sur les ressources.
API d'une règle IAM avec une condition
Exemple
Demande
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"
}'
Réponse
{
"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 d'une règle IAM avec une condition
Exemple
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"
}
Renseignements supplémentaires
Pour des exemples d'utilisation des attributs de condition Préfixe / Délimiteur ou Chemin, voir le tutoriel sur le contrôle de l'accès à des objets individuels dans un compartiment.