Configure o controle de acesso refinado para buckets, diretórios e objetos do OSS usando políticas do RAM. Entenda como o modelo de armazenamento plano e a listagem baseada em prefixos afetam o design das políticas e aprenda a conceder permissões no nível de diretório para diferentes usuários do RAM.
Estrutura de armazenamento e autorização
Modelo de armazenamento do OSS
O OSS utiliza um modelo de armazenamento plano para armazenar objetos como pares chave-valor. Todos os objetos pertencem diretamente a um bucket; portanto, não existe hierarquia física de diretórios. Os "diretórios" exibidos no console usam os prefixos das chaves dos objetos e um delimitador (/) para simular uma estrutura de pastas.
Para o bucket examplebucket, o console exibe a seguinte estrutura de diretórios e chaves de objetos:
examplebucket
├── Development/ # Key: Development/ (directory object)
│ ├── Alibaba Cloud.pdf # Key: Development/Alibaba Cloud.pdf
│ ├── ProjectA.docx # Key: Development/ProjectA.docx
│ └── ProjectB.docx # Key: Development/ProjectB.docx
├── Marketing/ # Key: Marketing/ (directory object)
│ ├── data2020.xlsx # Key: Marketing/data2020.xlsx
│ └── data2021.xlsx # Key: Marketing/data2021.xlsx
├── Private/ # Key: Private/ (directory object)
│ └── 2017/ # Key: Private/2017/ (directory object)
│ ├── images.zip # Key: Private/2017/images.zip
│ └── promote.pptx # Key: Private/2017/promote.pptx
└── oss-dg.pdf # Key: oss-dg.pdf
A chave de um objeto de diretório termina com /. O OSS usa esse sufixo para identificar diretórios. No armazenamento, todos os objetos, incluindo os objetos de diretório, são armazenados de forma plana.
Como o OSS não possui hierarquia real de diretórios, conceder acesso a um "diretório" significa conceder acesso a todos os objetos com um prefixo específico. Por exemplo, conceder acesso ao diretório Development/ equivale a conceder acesso a todos os objetos cujas chaves começam com Development/.
Diferenças nas requisições de bucket, diretório e objeto
Operações distintas exigem requisições de API e configurações de Resource diferentes.
Mecanismo da requisição ListObjects
O console exibe uma estrutura semelhante a diretórios utilizando dois parâmetros da operação de API GetBucket (ListObjects):
|
Parâmetro |
Descrição |
Valor de exemplo |
|
|
Restringe a resposta para incluir apenas objetos cujas chaves começam com o prefixo especificado. |
|
|
|
Caractere usado para agrupar objetos, geralmente |
|
Ao clicar na pasta Development/ no console, você envia esta requisição ao OSS:
GET /?prefix=Development/&delimiter=/ HTTP/1.1
Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
O OSS retorna todos os objetos que começam com Development/. Como delimiter=/ foi especificado, o OSS retorna subdiretórios (como Development/SubFolder/) como CommonPrefixes, em vez de listar todos os arquivos dentro deles.
Configuração de Resource**
|
Alvo da operação |
API acionada |
Configuração de Resource** |
Pontos de configuração da política |
|
Listar o diretório raiz de um bucket |
ListObjects, prefix está vazio, delimiter é |
|
|
|
Entrar em um diretório |
ListObjects, onde prefix é |
|
|
|
Ler e gravar conteúdo de arquivo |
|
O Resource pode ser especificado até um caminho e suporta o caractere curinga |
Console vs. acesso via API/SDK
O acesso pelo console exige navegação desde a lista de buckets até o diretório de destino, o que requer mais permissões do que chamadas diretas de API ou SDK.
|
Método de acesso |
Permissões necessárias |
|
API/SDK |
Apenas as permissões do recurso de destino são necessárias, como |
|
Console |
Permissões do recurso de destino mais permissões auxiliares, como |
Cenário
Considere que a ACL padrão de leitura/gravação para todos os arquivos no bucket examplebucket seja privada. A estrutura do bucket é a seguinte:
examplebucket
├── Development/ # Development directory
│ ├── Alibaba Cloud.pdf
│ ├── ProjectA.docx
│ └── ProjectB.docx
├── Marketing/ # Marketing directory
│ ├── data2020.xlsx
│ └── data2021.xlsx
├── Private/ # Confidential directory
│ └── 2017/
│ ├── images.zip
│ └── promote.pptx
└── oss-dg.pdf
Objetivos de controle de acesso:
|
Usuário/grupo de usuários do RAM |
Alvo da autorização |
Tipo de permissão |
|
Usuária do RAM Anne |
Pasta |
Leitura e gravação |
|
Usuário do RAM Leo |
Pasta |
Somente leitura |
|
Todos os membros de um grupo de usuários específico |
Diretório |
Negar acesso |
Etapa 1: Crie um bucket e carregue objetos
Acesse a Lista de Buckets e clique em Create Bucket para criar um bucket, por exemplo,
examplebucket.No bucket, clique em Create Directory para criar os diretórios:
Development,MarketingePrivate(crie também um subdiretório2017dentro dePrivate).-
Clique em Upload Object para carregar objetos nos seguintes caminhos:
Diretório raiz:
oss-dg.pdfDiretório
Development/:Alibaba Cloud.pdf,ProjectA.docx,ProjectB.docxDiretório
Marketing/:data2020.xlsx,data2021.xlsxDiretório
Private/2017/:images.zip,promote.pptx
Etapa 2: Crie os usuários do RAM Anne e Leo
Acesse a página Users no console do RAM e clique em Create User para criar os usuários Anne e Leo.
Etapa 3: Conceder acesso de leitura e gravação ao diretório Development
Design da política
O acesso de leitura e gravação a Development/ exige dois tipos de permissão:
Permissão de listagem: Liste objetos em
Development/(oss:ListObjects), com umaConditionque restrinja a listagem ao prefixoDevelopment.Permissões de leitura e gravação: Leia e carregue arquivos em
Development/(oss:GetObject,oss:PutObject), com Resource definido comoexamplebucket/Development/*.
Crie e anexe uma política
Acesse a página Policies no console do RAM e clique em Create Policy.
-
Na aba JSON, insira o seguinte documento de política:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:ListObjects", "Resource": "acs:oss:*:*:examplebucket", "Condition": { "StringLike": { "oss:Prefix": [ "Development", "Development/*" ] } } }, { "Effect": "Allow", "Action": [ "oss:GetObject", "oss:PutObject", "oss:GetObjectAcl" ], "Resource": "acs:oss:*:*:examplebucket/Development/*" } ] }Análise da política:
Primeira instrução: Concede permissão de listagem no bucket, usando
Conditioncomoss:Prefixpara restringir a listagem ao diretórioDevelopmente seus subdiretórios.Segunda instrução: Concede acesso de leitura e gravação a todos os objetos sob
Development/*.
Clique em OK, insira um Policy Name (como
AllowAnneAccessDevelopment) e clique em OK para concluir a criação.Acesse a página Users, localize a usuária do RAM Anne e clique em add permissions para anexar a política recém-criada.
Etapa 4: Conceder acesso somente leitura ao diretório Marketing
Crie e anexe uma política de somente leitura para o usuário do RAM Leo seguindo o mesmo procedimento da Etapa 3. Esta política inclui apenas operações de leitura em Action:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:ListObjects",
"Resource": "acs:oss:*:*:examplebucket",
"Condition": {
"StringLike": {
"oss:Prefix": [
"Marketing",
"Marketing/*"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:GetObjectAcl"
],
"Resource": "acs:oss:*:*:examplebucket/Marketing/*"
}
]
}
Como oss:PutObject foi excluído de Action, o Leo pode ler arquivos, mas não pode carregá-los ou modificá-los.
Etapa 5: Negar acesso ao diretório Private
Adicione os usuários do RAM que não devem acessar a pasta Private/ a um grupo de usuários e, em seguida, anexe uma política de negação ao grupo.
Isso se aplica apenas aos membros do grupo. Para negar acesso a todos os usuários do RAM na sua conta, incluindo futuros usuários, use uma bucket policy.
Crie um grupo de usuários e adicione membros
Acesse a lista de grupos de usuários do RAM e clique em Create User Group para criar um grupo (por exemplo,
DenyPrivateAccessGroup).Clique em Add Group Members e adicione ao grupo os usuários do RAM que precisam ter o acesso negado à pasta
Private/.
Crie e anexe uma política de negação
Acesse a página Policies no console do RAM e clique em Create Policy.
-
Na aba JSON, insira o seguinte documento de política:
{ "Version": "1", "Statement": [ { "Effect": "Deny", "Action": "oss:*", "Resource": "acs:oss:*:*:examplebucket/Private/*" }, { "Effect": "Deny", "Action": "oss:ListObjects", "Resource": "acs:oss:*:*:examplebucket", "Condition": { "StringLike": { "oss:Prefix": [ "Private/", "Private/*" ] } } } ] }Análise da política:
Primeira instrução: Nega todas as operações em objetos sob
Private/.Segunda instrução: Nega a listagem do conteúdo de
Private/, impedindo que os usuários visualizem a lista de arquivos.
Clique em OK, insira um Policy Name (como
DenyAccessPrivateFolder) e clique em OK para concluir a criação.Acesse a página Groups, localize o grupo de usuários e clique em add permissions para anexar a política recém-criada.
Se um membro do grupo tentar listar ou baixar arquivos na pasta Private/, o OSS retornará um erro de permissão negada.