Uma política do RAM é uma política baseada em identidade que define quais identidades do RAM podem executar quais operações em quais recursos do OSS e sob quais condições. Use políticas do RAM para impor controle de acesso granular aos seus recursos do OSS.
Como funciona
As políticas do RAM autorizam identidades do Resource Access Management (RAM) — usuários do RAM, grupos de usuários e funções do RAM. Quando o OSS recebe uma solicitação, ele avalia todas as políticas aplicáveis (políticas do RAM e políticas de bucket) e determina o acesso na seguinte ordem:
Negação explícita primeiro: Se alguma política contiver uma regra
"Effect": "Deny"explícita correspondente à solicitação, o sistema negará imediatamente a solicitação.Busca por permissão explícita: Caso não exista nenhuma regra Deny correspondente, o sistema busca uma regra
"Effect": "Allow"explícita correspondente à solicitação. Se houver correspondência, o sistema permitirá a solicitação.Negação padrão: Se não existir nenhuma regra Deny ou Allow correspondente, o sistema negará a solicitação por padrão.
O OSS oferece suporte a dois tipos de política: políticas do sistema (predefinidas pela Alibaba Cloud, somente leitura) e políticas personalizadas (criadas e gerenciadas por você).
Conceder permissões usando políticas do sistema
Conceda políticas do sistema predefinidas a um usuário do RAM no console do RAM:
Acesse a lista de usuários do RAM. Na coluna Actions do usuário desejado, clique em Add Permissions.
-
Na caixa de pesquisa, insira o nome da política do sistema e selecione-a. O OSS oferece suporte às duas seguintes políticas do sistema:
AliyunOSSFullAccess: Concede controle total sobre o Object Storage Service (OSS).
AliyunOSSReadOnlyAccess: Concede permissão de somente leitura para o Object Storage Service (OSS).
Clique em Confirm New Authorization para concluir as configurações de permissão.
Conceder permissões usando políticas personalizadas
Para usar uma política personalizada, crie-a primeiro e depois anexe-a à identidade desejada.
Etapa 1: Criar uma política personalizada
Acesse a lista de Policies. Clique em Create Policy.
-
Selecione Edit Script. No editor, insira a política de autorização no formato JSON. Use o RAM Policy Editor para gerar rapidamente uma política de autorização.
A política de exemplo a seguir concede controle total sobre o bucket
example-buckete todos os recursos dentro dele.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:*", "Resource": [ "acs:oss:*:*:example-bucket", "acs:oss:*:*:example-bucket/*" ] } ] }Uma política de autorização completa inclui uma Version e uma ou mais Statements.
Version: A versão da política de acesso. O valor é fixo em
1e não pode ser alterado.-
Statement: O corpo principal da política. Contém uma ou mais regras específicas de permissão ou negação. Cada instrução inclui Effect, Action, Resource e Condition.
Elemento da política
Descrição
Effect
O efeito da política. Os valores válidos são
AlloweDeny.Action
A operação específica a ser executada no recurso. O caractere curinga
*é suportado.Resource
O escopo de recursos ao qual a política se aplica.
Condition
As condições para que a política entre em vigor.
Se você configurar múltiplas condições, a política só entrará em vigor quando todas as condições forem atendidas (um AND lógico).
Todos os elementos de política suportados estão documentados em Sintaxe e elementos de autorização do OSS.
Clique em OK. Insira um Policy Name e, em seguida, clique em OK para criar a política personalizada.
Etapa 2: Conceder permissões a uma identidade
Anexe a política personalizada a um usuário do RAM:
Acesse a lista de usuários do RAM. Na coluna Actions do usuário desejado, clique em Add Permissions.
Na caixa de pesquisa, insira o nome da política personalizada e selecione-a.
Clique em Confirm New Authorization para concluir as configurações de permissão.
Cenários comuns de autorização
Os cenários a seguir demonstram configurações comuns de políticas do RAM. Modifique os nomes dos buckets, caminhos e endereços IP para corresponder ao seu ambiente.
Cenário 1: Conceder a um usuário do RAM controle total sobre um bucket
O exemplo a seguir concede a um usuário do RAM controle total sobre um bucket chamado mybucket.
Para aplicativos móveis, conceder aos usuários controle total sobre um bucket representa um risco de segurança muito alto e deve ser evitado sempre que possível.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:mybucket",
"acs:oss:*:*:mybucket/*"
]
}
]
}
Cenário 2: Negar a um usuário do RAM permissão para excluir arquivos que correspondem a um padrão específico em um bucket
O exemplo a seguir nega a um usuário do RAM a permissão para excluir todos os arquivos com o prefixo abc e o formato .txt em um bucket chamado mybucket.
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:mybucket/abc*.txt"
]
}
]
}
Cenário 3: Conceder a um usuário do RAM permissão para listar e ler todos os recursos em um bucket
-
Este exemplo concede a um usuário do RAM permissão para listar e ler todos os recursos em um bucket chamado
mybucketusando um SDK do OSS ou a interface de linha de comando (CLI).NotaA operação
ListObjects(Action) deve usar o bucket inteiro como Resource.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:ListObjects", "Resource": "acs:oss:*:*:mybucket" }, { "Effect": "Allow", "Action": "oss:GetObject", "Resource": "acs:oss:*:*:mybucket/*" } ] } -
Já este exemplo concede a um usuário do RAM permissão para listar e ler todos os recursos em um bucket chamado
mybucketusando o console do OSS.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketLifecycle", "oss:GetBucketWorm", "oss:GetBucketVersioning", "oss:GetBucketAcl" ], "Resource": "acs:oss:*:*:*" }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetBucketAcl" ], "Resource": "acs:oss:*:*:mybucket" }, { "Effect": "Allow", "Action": [ "oss:GetObject", "oss:GetObjectAcl" ], "Resource": "acs:oss:*:*:mybucket/*" } ] }
Cenário 4: Negar a um usuário do RAM permissão para excluir um bucket
O exemplo a seguir nega a um usuário do RAM a permissão para excluir um bucket chamado mybucket.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:mybucket",
"acs:oss:*:*:mybucket/*"
]
},
{
"Effect": "Deny",
"Action": [
"oss:DeleteBucket"
],
"Resource": [
"acs:oss:*:*:mybucket"
]
}
]
}
Cenário 5: Conceder a um usuário do RAM permissão para acessar várias pastas em um bucket
Suponha que um bucket chamado mybucket seja usado para armazenar fotos. Esse bucket contém várias pastas que representam locais de fotos. Cada pasta de local contém subdiretórios de ano.
mybucket[Bucket]
├── beijing
│ ├── 2014
│ └── 2015
└── hangzhou
├── 2014
└── 2015
Conceda a um usuário do RAM acesso de somente leitura a mybucket/hangzhou/2014/ e mybucket/hangzhou/2015/. A complexidade da política varia conforme o método de acesso:
-
Conceda a um usuário do RAM permissão para ler apenas o conteúdo dos arquivos nas pastas
mybucket/hangzhou/2014/emybucket/hangzhou/2015/.Use esta política quando o usuário souber os caminhos exatos dos arquivos.
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] } ] } -
Conceda a um usuário do RAM permissão para usar a CLI do OSS para acessar as pastas
mybucket/hangzhou/2014/emybucket/hangzhou/2015/e listar os arquivos nelas contidos.Se o usuário precisar navegar pelo conteúdo das pastas, adicione a permissão
ListObjects.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects" ], "Resource": [ "acs:oss:*:*:mybucket" ], "Condition":{ "StringLike":{ "oss:Prefix": [ "hangzhou/2014/*", "hangzhou/2015/*" ] } } } ] } -
Conceda a um usuário do RAM permissão para acessar pastas usando o console do OSS.
O console do OSS exige navegação a partir do diretório raiz para chegar a
mybucket/hangzhou/2014/emybucket/hangzhou/2015/, portanto, permissões adicionais de listagem são necessárias:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketLifecycle", "oss:GetBucketWorm", "oss:GetBucketVersioning", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:GetObject", "oss:GetObjectAcl" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects" ], "Resource": [ "acs:oss:*:*:mybucket" ], "Condition": { "StringLike": { "oss:Delimiter": "/", "oss:Prefix": [ "", "hangzhou/", "hangzhou/2014/*", "hangzhou/2015/*" ] } } } ] }
Cenário 6: Negar a um usuário do RAM permissão para excluir qualquer arquivo em um bucket
O exemplo a seguir nega a um usuário do RAM a permissão para excluir qualquer arquivo em um bucket chamado mybucket.
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:mybucket/*"
]
}
]
}
Cenário 7: Negar a um usuário do RAM permissão para acessar objetos com tags específicas
A política Deny a seguir nega a um usuário do RAM a permissão para acessar objetos com as tags status:ok e key1:value1 no bucket examplebucket.
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:GetObject"
],
"Resource": [
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition": {
"StringEquals": {
"oss:ExistingObjectTag/status":"ok",
"oss:ExistingObjectTag/key1":"value1"
}
}
}
]
}
Cenário 8: Conceder a um usuário do RAM permissão para acessar o OSS a partir de endereços IP específicos
-
Adicione uma restrição de endereço IP a uma autorização
Allow.O exemplo a seguir adiciona uma restrição de endereço IP a uma autorização
Allow. Ele concede a um usuário do RAM permissão para ler todos os recursos em um bucket chamadomybucketapenas a partir dos intervalos de endereços IP192.168.0.0/16e198.51.100.0/24.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ], "Condition":{ "IpAddress": { "acs:SourceIp": ["192.168.0.0/16", "198.51.100.0/24"] } } } ] } -
Adicione uma restrição de endereço IP a uma autorização
Deny.O exemplo a seguir adiciona uma restrição de endereço IP a uma autorização
Deny. Ele nega a um usuário do RAM cujo endereço IP de origem não esteja no intervalo192.168.0.0/16a execução de qualquer operação no OSS.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ] }, { "Effect": "Deny", "Action": "oss:*", "Resource": [ "acs:oss:*:*:*" ], "Condition":{ "NotIpAddress": { "acs:SourceIp": ["192.168.0.0/16"] } } } ] }NotaComo Deny tem precedência, o acesso a partir de um endereço IP fora do intervalo
192.168.0.0/16é negado.
Cenário 9: Conceder permissões a outros usuários por meio do RAM ou STS
Conceda a um usuário com o endereço IP 192.168.0.1 permissão para executar as seguintes operações usando um cliente Java SDK por meio do RAM ou Security Token Service (STS).
Listar objetos com o prefixo
foono bucketmybucket.Fazer upload, baixe e exclua objetos com o prefixo
fileno bucketmybucket.
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:GetBucketAcl",
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:177530505652xxxx:mybucket"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:UserAgent": "java-sdk",
"oss:Prefix": "foo"
},
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
},
{
"Action": [
"oss:PutObject",
"oss:GetObject",
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:177530505652xxxx:mybucket/file*"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:UserAgent": "java-sdk"
},
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
}
]
}
Cenário 10: Proibir a definição das ACLs de buckets e objetos como acesso público
O exemplo a seguir proíbe definir as listas de controle de acesso (ACLs) de buckets e objetos como públicas para garantir a segurança dos dados do OSS.
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:PutBucket",
"oss:PutBucketAcl"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"oss:x-oss-acl": "private"
}
}
},
{
"Effect": "Deny",
"Action": [
"oss:PutObject",
"oss:PutObjectAcl"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"oss:x-oss-object-acl": [
"private",
"default"
]
}
}
}
]
}
Cenário 11: Conceder a um usuário do RAM permissão para usar recursos relacionados ao IMM
A política do RAM a seguir concede a um usuário do RAM permissão para usar o recurso de processamento de documentos do Intelligent Media Management (IMM).
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:PostProcessTask",
"oss:ProcessImm"
],
"Resource": "*"
},
{
"Action": [
"imm:CreateOfficeConversionTask",
"imm:GetWebofficeURL"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Effect": "Allow",
"Action": "ram:PassRole",
"Resource": "acs:ram:*:*:role/aliyunimmdefaultrole"
}
]
}
Cenário 12: Conceder a um usuário do RAM permissão para alterar o tipo de redundância de armazenamento
-
Conceda a um usuário do RAM permissão para alterar o tipo de redundância de armazenamento de um bucket específico.
O exemplo a seguir concede a um usuário do RAM permissão para alterar o tipo de redundância de armazenamento do bucket
mybucket.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:CreateBucketDataRedundancyTransition", "oss:GetBucketDataRedundancyTransition", "oss:ListBucketDataRedundancyTransition", "oss:DeleteBucketDataRedundancyTransition" ], "Resource": "acs:oss:*:*:mybucket" } ] } -
Conceda a um usuário do RAM permissão para alterar o tipo de redundância de armazenamento de todos os buckets.
ImportanteO exemplo a seguir concede a um usuário do RAM permissão para alterar o tipo de redundância de armazenamento de todos os buckets na sua conta Alibaba Cloud. Proceda com cautela.
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:CreateBucketDataRedundancyTransition", "oss:GetBucketDataRedundancyTransition", "oss:ListBucketDataRedundancyTransition", "oss:DeleteBucketDataRedundancyTransition" ], "Resource": "acs:oss:*:*:*" } ] }
**Cenário 13: Conceder a um usuário do RAM permissão para criar pedidos de planos de recursos do OSS **
A política do RAM a seguir concede a um usuário do RAM permissão para criar pedidos de planos de recursos do OSS .
Depois que um usuário do RAM cria um pedido para um plano de recursos do OSS , ele pode entrar em contato com o proprietário da conta Alibaba Cloud para concluir o pagamento. Para permitir que o usuário do RAM pague pelo pedido, o proprietário da conta Alibaba Cloud deve conceder ao usuário do RAM a permissão bss:PayOrder. A permissão bss:PayOrder é uma permissão de alto risco que envolve operações financeiras. Não conceda essa permissão a menos que seja necessário.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:CreateOrder",
"Resource": "acs:oss:*:*:*"
}
]
}
Cenário 14: Conceder a um usuário do RAM permissão para ativar o OSS
A política do RAM a seguir concede a um usuário do RAM permissão para ativar o OSS.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:ActivateProduct",
"Resource": "acs:oss:*:*:*"
}
]
}
Cenário 15: Conceder a um usuário do RAM permissão para ler e gravar dados em buckets com tags específicas
A política do RAM a seguir concede a um usuário do RAM permissão para ler e gravar dados em buckets com uma tag específica. A chave da tag é key1 e o valor da tag é value1.
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:ListBuckets",
"oss:GetBucketStat",
"oss:GetBucketInfo",
"oss:GetBucketAcl",
"oss:ListObjects",
"oss:PutObject",
"oss:GetObject"
],
"Resource": [
"acs:oss:*:*:*"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"oss:BucketTag/key1": "value1"
}
}
}
]
}
Após a política entrar em vigor, o usuário do RAM poderá executar as operações especificadas apenas em buckets do OSS com a tag key1=value1. O comportamento varia conforme o método de acesso:
Ao usar um SDK do OSS ou ossutil para enviar uma solicitação
ListBuckets, adicione parâmetros de filtragem de tags, comotag-key=key1,tag-value=value1. Se a política estiver configurada corretamente, a resposta retornará apenas os buckets correspondentes às condições de tag especificadas.Ao usar o console do OSS para enviar uma solicitação
ListBuckets, a solicitação será negada porque o console não consegue anexar parâmetros de tag. A solicitação não atende à condição da política (oss:BucketTag/key1=value1) e o sistema relata um erro de permissão.Outras operações, como
PutObjecteGetObject, também estão sujeitas à condição de tag. O bucket alvo da operação deve ter a tagkey1=value1.
Melhores práticas para ambientes de produção
Siga estas melhores práticas para minimizar riscos de violação de dados e impor controle preciso de permissões:
Siga o princípio do menor privilégio: Conceda apenas as permissões mínimas necessárias. Evite permissões amplas como
oss:*, a menos que seja absolutamente necessário.Use funções do RAM e credenciais temporárias do STS: Para aplicações em instâncias ECS ou em containers, utilize funções do RAM com credenciais temporárias do STS em vez de pares de AccessKey permanentes. Credenciais temporárias expiram automaticamente, eliminando o risco de segredos codificados rigidamente.
-
Separe usuários humanos e usuários programáticos: Crie usuários do RAM separados para pessoas e aplicações para permitir controle de permissões granular.
Usuários humanos: Configure o console access. Use uma conta e senha para acessar o console do produto. Recomendamos que você ative a autenticação multifator (MFA).
Usuários programáticos: Configure o programmatic access with a permanent AccessKey pair. Use o par de AccessKey para chamar APIs e acessar recursos da nuvem.
-
Gerenciamento de segurança de pares de AccessKey:
Nunca codifique rigidamente pares de AccessKey no código do projeto.
Use credenciais temporárias do STS ou variáveis de ambiente para autorização de acesso.
Faça o rodízio regular dos seus pares de AccessKey.
-
Recomendações de segurança para funções do RAM:
Não altere a entidade confiável de uma função do RAM sem consideração cuidadosa — isso pode criar riscos de superautorização.
Defina um período de validade razoável para o token STS. Evite longos períodos de validade para prevenir riscos de segurança.
Audite permissões regularmente: Revise e remova usuários e políticas do RAM desnecessários para manter as permissões alinhadas com as necessidades atuais do negócio.
Use Condition para aumentar a segurança: Adicione elementos
Conditionpara restringir o acesso por endereço IP de origem, VPC ou outras dimensões.