Designando acesso a objetos dentro de um depósito usando condições de acesso do IAM
As políticas de acesso IAM permitem conceder permissões em um bucket do Cloud Object Storage a grupos específicos de objetos. Essa abordagem permite o controle de acesso de baixa granularidade sobre o acesso a dados, tornando-o útil em cenários em que diferentes partes de um bucket precisam ser acessados por diferentes usuários ou aplicativos.
Se o acesso for necessário para o depósito inteiro (ou seja, quando o controle de acesso de baixa granularidade não for necessário), siga as informações em Designando acesso a um depósito individual.
Cada objeto armazenado em um depósito do Cloud Object Storage tem uma chave exclusiva e essas chaves geralmente seguem uma estrutura hierárquica semelhante a um sistema de arquivos.
Links relacionados a políticas de acesso IAM
- Condições baseadas em atributos de recursos
- Comparações de Cadeia
- Verificação da versão de uma política no console
Exemplo
- Um objeto individual com a chave "folder1/subfolder1/file.txt" pode simular uma pasta ou hierarquia de diretórios, em que o diretório “folder1” contém um subdiretório denominado “sub-folder1” contendo um arquivo "file.txt". O acesso pode ser designado em qualquer nível de pasta
- Uma política de acesso pode ser criada para todos os objetos e-na pasta denominada *“folder1”*ou o acesso pode ser designado apenas para objetos no subdiretório denominado “subfolder1”.
Um administrador de política pode designar acesso a objetos e pastas individuais configurando condições ao criar políticas de acesso do IAM. A seção a seguir descreve como construir esses tipos de políticas
Construindo uma política de controle de acesso de baixa granularidade
A primeira etapa para conceder acesso a objetos individuais dentro de um depósito é construir uma política do IAM. É possível localizar mais informações sobre como construir uma política de acesso do IAM para Object Storage no tutorial Cloud Object Storage Limitando o acesso a um único depósito do Object Storage. Para obter mais informações gerais sobre a construção de políticas do IAM, acesse Como o IBM Cloud IAM funciona Os itens a seguir são componentes essenciais para a criação de uma política de acesso IAM para seus recursos do Object Storage.
Assunto
O assunto de uma política de acesso pode ser um usuário individual, um grupo de acesso, um ID de Serviço ou um Perfil Confiável Consulte Quais políticas do IAM e quem pode designá-las? para obter mais informações sobre os tipos de assuntos que podem ser aplicados a uma política.
Serviço
O serviço é o Serviço do IBM Cloud que contém o recurso ao qual você está tentando designar acesso. Para designar acesso a objetos individuais, use o serviço Cloud Object Storage.
Recurso
IBM Cloud® Object Storage suporta os destinos de recursos a seguir:
- ID do grupo de recursos
- Instância de serviço
- Tipo de recurso com valor de "bucket"
- ID do recurso (nome do depósito)
Função
Funções de acesso do IBM Cloud são grupos de ações. As funções de acesso permitem que o sujeito conclua tarefas específicas dentro do contexto dos recursos-alvo definidos na política. O Cloud Object Storage suporta várias funções de serviço predefinidas que facilitam a designação de permissões.. Cloud Object Storage também permite a criação de funções customizadas. Para obter mais informações sobre as funções suportadas para o Cloud Object Storage, consulte Identity and Access Management.
Para obter a lista de funções do Cloud Object Storage e sua interação com as condições, acesse esta tabela
Condição
Quando um recurso é identificado, uma condição pode ser usada para o acesso de escopo adicional para um sujeito a objetos individuais em um depósito, que é referido como controle de acesso de baixa granularidade.
Uma única Política do IAM pode ter mais do que uma condição usando uma instrução OR ou AND para combinar as condições A instrução de condição (contendo uma ou mais condições) deve ser avaliada como TRUE para que a solicitação do usuário possa executar a ação. A Política do IAM negará qualquer ação que não seja avaliada como TRUE. A instrução de política deve conter todos os atributos de condições requeridos pela função Se a
instrução de política não contiver todos os atributos de condição requeridos pela função, as ações sujeitas aos atributos de condição omitidos serão negadas
Use uma política sem atributos de condição para fornecer acesso total, conforme definido pelo recurso de destino.
Use a política IAM " v2 " (Condições baseadas em atributos) para criar uma política IAM com condições baseadas em atributos.
Usando condições em uma política do IAM
O Cloud Object Storage suporta os atributos a seguir para especificar condições para designar acesso de baixa granularidade em recursos do Cloud Object Storage:
Prefixo e Delimitador
O prefixo e o delimitador são usados juntos para restringir todas as permissões de listagem a objetos específicos em um bucket.
-
O atributo de condição Prefixo define o prefixo para o conjunto de teclas de objeto que essa condição deve permitir para listagem de objetos ou pastas Por exemplo, no objeto denominado "folder1/subfolder1/file.txt", ambos "folder1/" e “folder1/subfolder1/” são prefixos possíveis
-
Um Delimitador ajuda o usuário a navegar no depósito como se ele fosse uma hierarquia de arquivo Designar uma instrução de condição de delimitador restringe o tipo de estrutura de pastas que o usuário pode gerar na listagem. Em um objeto denominado "folder1/subfolder1/file.txt", o delimitador "/" pode ser usado para simular uma hierarquia de pastas em que cada pasta é separada por um "/".. Se uma instrução de condição permitir apenas um delimitador de "/", uma solicitação de lista com qualquer outro valor de delimitador não será permitida.
Normalmente, o prefixo e o delimitador são usados juntos em uma instrução condicional com um AND operador. É possível usar um prefixo sem um delimitador em uma instrução de condição. Se a política for configurada apenas com um
prefixo e não com uma instrução de condição de delimitador, o usuário poderá usar qualquer ou nenhum delimitador para listar os objetos.
Exemplos de uso de instruções de condição de Prefixo e Delimitador
Considere o objeto denominado "folder1/subfolder1/file.txt":
Prefixo de "folder1/" AND no Delimiter
- É possível retornar uma lista de cada objeto que inicia com folder1/ fazendo uma solicitação de lista em folder1/ e não fornecendo um delimitador.
- Se você usar um delimitador de "/" na solicitação de lista, eles serão restritos a ver apenas o primeiro nível de objetos e subpastas em folder1/
- Se o usuário tentar listar a subpasta (solicitações para listar prefixo = “folder1/subfolder1/”), o acesso será negado.
Prefixo de "folder1/" AND Delimitador de "/"
- É possível listar somente os objetos e subpastas no primeiro nível de folder1.
- É possível executar apenas solicitações de lista que especificam um delimitador de "/".
- Se você tentar listar o conteúdo de subfolder1, o acesso será negado (o usuário precisaria ter uma condição de permitir o prefixo = “folder1/subfolder1/" para permitir a listagem do conteúdo de subfolder1.
As APIs a seguir estão sujeitas a condições de Prefixo / Delimitador:
- Depósito GET(Listar Objetos)
- GET Bucket Object Versions (Listar Versões de Objeto)
- Listar uploads de várias partes
Para ver a lista completa de ações e os atributos de condição suportados, consulte Ações do Identity and Access Management.
Para fornecer a um usuário de baixa granularidade acesso para navegar para sua pasta na UI, o usuário precisa de acesso para listar a pasta raiz do depósito. Consulte Cenário 4 para saber como construir a política para ativar isso.
Caminho
O caminho é usado para definir o escopo de todo acesso de leitura, gravação ou gerenciamento em objetos específicos.
Para um objeto denominado "folder1/subfolder1/file.txt", a chave do objeto integral é o caminho... Para restringir ações de leitura, gravação ou gerenciamento a esse objeto, defina uma condição com Caminho de "folder1/subfolder1/file.txt".
Todas as APIs do Cloud Object Storage que atuam diretamente em um objeto estão sujeitas a condições de Caminho Consulte Identity and Access Management actions para obter a lista de ações da API do Cloud Object Storage que suportam Caminho.
É recomendado que você defina uma condição Prefix / Delimiter e uma condição Path ao conceder ações de leitura, gravação ou lista para um usuário na mesma política. Manager, Writer, Reader e Content Reader são exemplos de funções em que é recomendado definir uma condição Prefixo / Delimitador e Caminho. Consulte Cenário 4 para
saber como construir a política para ativar isso. Uma condição que especifica Prefixo / Delimitador e uma condição que especifica Caminho devem ser logicamente ORed na instrução de Política do IAM para permitir ambos os tipos
de operações (leitura, gravação ou gerenciamento de objetos ou objetos de lista).
Operadores usados com atributos de condições
Há vários operadores que podem ser usados ao definir atributos de condições.. A lista completa de operadores que podem ser usados para os atributos de prefixo, delimitador e condição do caminho pode ser localizada em Condições baseadas em atributo de recurso
Uso de curingas
Os valores de um atributo de condição podem incluir um curinga quando o operador for stringMatch ou stringMatchAnyOf
Exemplos de uso de curinga em instruções de condições:
Considere o objeto denominado "folder1/subfolder1/file.txt":
Caminho de “folder1/*”
- Você obterá acesso de leitura, gravação ou gerenciamento, conforme definido pela função, para todos os objetos iniciados com “folder1/”.
Prefixo de "folder1/*" AND no Delimiter
- Para uma solicitação de lista de objetos com prefixo configurado como “folder1/” e sem delimitador, a solicitação do usuário retorna todos os objetos iniciados com “folder1/”.
- Para uma solicitação de lista de objetos com prefixo configurado como “folder1/” e delimitador de "/", a solicitação retorna uma visualização dos objetos e pastas apenas no primeiro nível de folder1.
- Para uma solicitação de lista de objetos com prefixo configurado como “folder1/subfolder1/” e delimitador de "/", a solicitação retorna uma visualização dos objetos e pastas apenas no primeiro nível de folder1/subfolder1.
Prefixo de "folder1/*" AND Delimitador de "/".
- Para uma solicitação de lista de objetos com prefixo configurado como “folder1/” e delimitador de "/", a solicitação retorna uma visualização dos objetos e pastas apenas no primeiro nível de folder1.
- Para uma solicitação de lista de objetos com prefixo configurado como “folder1/subfolder1/” e delimitador de "/", a solicitação retorna os objetos (e quaisquer subpastas) em folder1/subfolder1.
- Para uma solicitação de lista de objetos com prefixo configurado como “folder1/” e nenhum delimitador, a solicitação não será permitida, pois um delimitador de "/" deve ser usado na solicitação de lista para que essa política seja avaliada como true.
Ações que não usam um Prefixo / Delimitador ou Caminho.
Há algumas APIs do Cloud Object Storage que não especificam um caminho ou prefixo e delimitador. As funções do serviço Cloud Object Storage: Manager, Writer, Reader e Content Reader são exemplos
de funções que contêm essas ações. Isso também se aplica a funções customizadas.. Para permitir essas ações ao usar uma condição Prefixo / Delimitador ou Caminho, a instrução de condição a seguir é necessária
na política do IAM:
((path stringExists = false) AND (prefix stringExists = false) AND (delimiter stringExists= false))
Consulte a tabela Identity and Access Management actions para obter a lista completa de ações da API que não suportam as condições Prefixo / Delimitador ou Caminho e requerem a instrução acima ao usar o acesso de baixa granularidade.
Consulte a seção sobre como Criar uma nova política para um usuário com condições para usar essa cláusula em uma política do IAM
Uso de condições com funções de serviço do Cloud Object Storage
| Função de acesso | Descrição das ações | Atributos de Condição Suportados |
|---|---|---|
| Gerente | Torne objetos públicos, crie e elimine buckets e objetos. | consulte a observação |
| Gravador | Crie e elimine buckets e objetos. | consulte a observação |
| Leitor | Listar depósitos, objetos de lista e objetos de download. | consulte a observação |
| Leitor de conteúdo | Listar e fazer o download de objetos | consulte a observação |
| Leitor de objetos | Faça o download de objetos | Caminho |
| Gravador de objetos | Fazer upload de objetos.. | Caminho |
Nota: Essas funções suportam os atributos de condição Prefix / Delimiter e Path. As funções também incluem ações que não especificam um caminho ou prefixo e delimitador. Use a cláusula stringExists na instrução
de condição para permitir essas ações..
Consulte link para obter a lista completa de ações para cada função de serviço Cloud Object Storage e a lista de atributos de condição que são suportados por cada ação.
Criar uma nova política para um usuário com condições
O exemplo a seguir fornece a um usuário a função de serviço “Writer” Cloud Object Storage com a capacidade de:
- Listar o acesso à hierarquia de objeto integral em uma pasta denominada "folder1/subfolder1".
- Acesso de leitura, gravação ou exclusão a todos os objetos em uma pasta denominada "subfolder1".
- Execute o gerenciamento de configuração do depósito, como
HEAD BucketeGET/PUT Bucket Versioning
CLI de uma política do IAM com uma condição
Para obter informações gerais sobre como usar a CLI, consulte a seção sobre como usar a Interface de Linha de Comando do IBM Cloud®.
Exemplo
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
Use --api-version v2 com condições de atributos baseadas em recursos.
API de uma política do IAM com uma condição
Exemplo
Solicitação
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"
}'
Resposta
{
"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 de uma política do IAM com uma condição
Exemplo
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"
}
Informações Adicionais
Para obter exemplos sobre como usar os atributos de condições Prefixo / Delimitador ou Caminho, consulte o tutorial sobre como controlar o acesso a objetos individuais em um depósito