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

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:

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

Uso de condições com funções de serviço COS
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:

  1. Listar o acesso à hierarquia de objeto integral em uma pasta denominada "folder1/subfolder1".
  2. Acesso de leitura, gravação ou exclusão a todos os objetos em uma pasta denominada "subfolder1".
  3. Execute o gerenciamento de configuração do depósito, como HEAD Bucket e GET/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