Recursos Avançados de Política

Esta seção descreve os recursos de linguagem de política que permitem a você conceder acesso mais granular.

Condições

Como parte de uma instrução de política, você pode especificar uma ou mais condições que devem ser atendidas para que o acesso seja concedido.

Cada condição consiste em uma ou mais variáveis predefinidas para as quais você especifica valores na instrução da política. Posteriormente, quando alguém solicita acesso ao recurso em questão, se a condição na política for atendida, ela será avaliada como verdadeira e a solicitação será permitida. Se a condição não for atendida, ela será avaliada como falsa e a solicitação não será permitida.

Há dois tipos de variáveis: aquelas que são relevantes para a própria solicitação e aquelas relevantes para o recurso que está sendo usado na solicitação, também conhecidas como alvo. O nome da variável é prefixado adequadamente com request ou target seguido por um ponto. Por exemplo, há uma variável de solicitação chamada request.operation para representar a operação da API que está sendo solicitada. Esta variável permite que você grave uma ampla instrução de política, mas adicione uma condição com base na operação de API específica. Para obter um exemplo, consulte Permitir que os usuários gravem objetos em buckets do serviço Object Storage.

Importante:

A correspondência de condição não faz distinção entre maiúsculas e minúsculas. Isso é importante lembrar ao gravar condições de tipos de recursos que permitem a nomeação com distinção entre maiúsculas e minúsculas. Por exemplo, o serviço Object Storage permite que você crie um bucket chamado "BucketA" e um bucket chamado "bucketA" no mesmo compartimento. Se você gravar uma condição que especifica "BucketA", ela também será aplicada ao "bucketA", pois a correspondência de condições não faz distinção entre maiúsculas e minúsculas.

Variáveis que não são Aplicáveis a um Resultado da Solicitação em uma Solicitação Recusada

Se a variável não for aplicável à solicitação recebida, a condição será avaliada como falsa e a solicitação será recusada. Por exemplo, aqui estão as instruções básicas da política que juntas permitem que alguém adicione ou remova usuários de qualquer grupo, exceto Administradores:

Allow group GroupAdmins to use users in tenancy 
 where target.group.name != 'Administrators'

Allow group GroupAdmins to use groups in tenancy 
 where target.group.name != 'Administrators'

Dada a política acima, se o GroupAdmins tentou chamar uma operação de API geral para usuários como ListUsers ou UpdateUser (que permite alterar a descrição do usuário), a solicitação será recusada, mesmo que essas operações de API sejam abrangidas por use users. Isso ocorre porque a instrução de política acima para use users também inclui a variável target.group.name, mas a solicitação ListUsers ou UpdateUser não envolve a especificação de um grupo. Não há target.group.name para essas solicitações; portanto, a solicitação é recusada.

Se você também quiser conceder acesso a operações gerais de API do usuário que não envolvem um grupo específico, precisará de uma instrução adicional que forneça o nível de acesso que você deseja conceder, mas sem a condição. Por exemplo, se quiser conceder acesso a ListUsers, você precisará dessa instrução adicional:

Allow group GroupAdmins to inspect users in tenancy

Ou se quiser conceder acesso a UpdateUser, você precisa desta instrução adicional (que também abrange ListUsers porque o verbo use inclui os recursos do verbo inspect):

Allow group GroupAdmins to use users in tenancy

Este conceito geral também se aplica a grupos (por exemplo, ListGroups e UpdateGroup) e qualquer outro tipo de recurso com variáveis de destino.

Para obter mais informações sobre a sintaxe de condições, consulte Condições. Para obter uma lista de todas as variáveis que você pode usar em políticas, consulte as tabelas na Referência de Política.

Controle de Acesso Baseado em Tag

Usando condições e um conjunto de variáveis de tag, você pode gravar a política para acesso do escopo com base nas tags que foram aplicadas a um recurso. O acesso pode ser controlado com base em uma tag que existe no recurso solicitante (o grupo ou o grupo dinâmico na política) ou no destino da solicitação (recurso ou compartimento). O controle de acesso baseado em tag fornece mais flexibilidade às suas políticas permitindo que você defina o acesso que abrange compartimentos, grupos e recursos. Para obter detalhes sobre como gravar políticas para acesso a escopo por tags, consulte Usando Tags para Gerenciar o Acesso.

Permissões

Permissões são as unidades atômicas da autorização que controlam a capacidade de um usuário executar operações em recursos. O sistema Oracle define todas as permissões na linguagem da política. Quando você grava uma política, dando a um grupo acesso a um determinado verbo e tipo de recurso, na verdade está dando a esse grupo acesso a uma ou mais permissões predefinidas. As finalidades dos verbos são simplificar o processo de conceder várias permissões relacionadas que abrangem um amplo conjunto de acesso ou um cenário operacional específico. As próximas seções fornecem mais detalhes e exemplos.

Relação com Verbos

Para entender a relação entre permissões e verbos, vejamos um exemplo. Uma instrução de política que permite que um grupo inspect volumes efetivamente dê ao grupo acesso a uma permissão chamada VOLUME_INSPECT (as permissões são sempre gravadas com todas as letras maiúsculas e sublinhados). Em geral, essa permissão permite que o usuário obtenha informações sobre volumes em blocos.

À medida que você vai de inspect > read > use > manage, o nível de acesso geralmente aumenta e as permissões concedidas são cumulativas. A tabela a seguir mostra as permissões incluídas com cada verbo para o tipo de recurso volumes. Observe que nenhuma permissão adicional é concedida de inspect a read.

Inspect Volumes Read Volumes Use Volumes Manage Volumes
VOLUME_INSPECT VOLUME_INSPECT

VOLUME_INSPECT

VOLUME_UPDATE

VOLUME_WRITE

VOLUME_INSPECT

VOLUME_UPDATE

VOLUME_WRITE

VOLUME_CREATE

VOLUME_DELETE

A referência da política lista as permissões abrangidas por cada verbo para cada tipo de recurso fornecido. Por exemplo, para volumes em blocos e outros recursos abrangidos pelos Serviços Principais, consulte as tabelas em Detalhes para Combinações de Verbo + Tipo de Recurso. A coluna esquerda de cada uma dessas tabelas lista as permissões abrangidas por cada verbo. As outras seções da referência de política incluem o mesmo tipo de informação para os outros serviços.

Relação com Operações de API

Cada operação da API requer que o chamador tenha acesso a uma ou mais permissões. Por exemplo, para usar ListVolumes ou GetVolume, você deve ter acesso a uma única permissão: VOLUME_INSPECT. Para anexar um volume a uma instância, você deve ter acesso a várias permissões, algumas delas relacionadas ao tipo de recurso volumes, algumas ao tipo de recurso volume-attachments e algumas relacionadas ao tipo de recurso instances:

  • VOLUME_WRITE
  • VOLUME_ATTACHMENT_CREATE
  • INSTANCE_ATTACH_VOLUME

A referência da política lista quais permissões são necessárias para cada operação da API. Por exemplo, para as operações da API de Serviços Principais, consulte a tabela em Permissões Necessárias para Cada Operação da API.

Conceitos Básicos do Acesso de um Usuário

A linguagem da política foi projetada para permitir que você grave instruções simples envolvendo apenas verbos e tipos de recursos, sem precisar determinar as permissões desejadas na instrução. No entanto, pode haver situações em que um auditor ou membro da equipe de segurança deseja compreender as permissões específicas que um usuário tem. As tabelas na referência de política mostram cada verbo e as permissões associadas. Você pode verificar os grupos nos quais o usuário está e as políticas aplicáveis a esses grupos e compilar uma lista de permissões concedidas. No entanto, ter uma lista das permissões não é o principal. As condições em uma instrução de política podem definir como escopo o acesso de um usuário além das permissões individuais (consulte a próxima seção). Além disso, cada instrução de política especifica um compartimento em particular e pode ter condições que definam o escopo do acesso a somente determinados recursos desse compartimento.

Definindo o Escopo do Acesso com Permissões ou Operações de API

Em uma instrução de política, é possível usar condições combinadas com permissões ou operações de API para reduzir o escopo de acesso concedido por um verbo específico.

Por exemplo, digamos que o grupo XYZ possa listar, obter, criar ou atualizar grupos (ou seja, alterar sua descrição), mas não excluí-los. Para listar, obter, criar e atualizar grupos, você precisa de uma política com manage groups como o verbo e o tipo de recurso. De acordo com a tabela em Detalhes para Combinações de Verbos + Tipo de Recursos, as permissões abrangidas são:

  • GROUP_INSPECT
  • GROUP_UPDATE
  • GROUP_CREATE
  • GROUP_DELETE

Para restringir o acesso apenas às permissões desejadas, você pode adicionar uma condição que declara explicitamente as permissões que deseja permitir:

Allow group XYZ to manage groups in tenancy

 where any {request.permission='GROUP_INSPECT',
            request.permission='GROUP_CREATE',
            request.permission='GROUP_UPDATE'}

Uma alternativa seria uma política que permite todas as permissões, exceto GROUP_DELETE:

Allow group XYZ to manage groups in tenancy where request.permission != 'GROUP_DELETE'

No entanto, com essa abordagem, esteja ciente de que quaisquer permissões novas que o serviço possa adicionar no futuro seriam concedidas automaticamente ao grupo XYZ. Somente GROUP_DELETE seria omitido.

Outra alternativa seria gravar uma condição com base nas operações específicas da API. Observe que de acordo com a tabela em Permissões Necessárias para Cada Operação da API, tanto ListGroups quanto GetGroup exigem somente a permissão GROUP_INSPECT. Aqui está a política:

Allow group XYZ to manage groups in tenancy

 where any {request.operation='ListGroups',  
            request.operation='GetGroup',
            request.operation='CreateGroup',
            request.operation='UpdateGroup'}

Pode ser vantajoso usar permissões em vez de operações de API em condições. No futuro, se uma nova operação de API for adicionada que exija uma das permissões listadas na política baseada em permissão acima, essa política já controlará o acesso do grupo XYZ a essa nova operação de API.

Mas observe que você pode restringir ainda mais o acesso de um usuário a uma permissão especificando também uma condição baseada na operação de API. Por exemplo, você pode conceder a um usuário acesso ao GROUP_INSPECT, mas somente depois a ListGroups.

Allow group XYZ to manage groups in tenancy

 where all {request.permission='GROUP_INSPECT',  
            request.operation='ListGroups'}

Definindo o Escopo da Política pelo Endereço IP do Solicitante

Você pode definir o escopo apenas de um conjunto de endereços IP permitidos. Por exemplo, você pode gravar uma política para permitir que apenas solicitações de uma determinada faixa de IP público acessem um bucket específico do serviço Object Storage; ou você pode permitir que apenas sub-redes específicas de uma VCN específica façam solicitações por meio de um gateway de serviço.

Para restringir o acesso a um conjunto de endereços IP, faça o seguinte:

  1. Crie um objeto de origem de rede que especifique os endereços IP permitidos. Consulte Gerenciando Origens de Rede para obter detalhes.
  2. Grave uma política que use o objeto de origem de rede em uma condição.

Use a seguinte variável na sua política:

request.networkSource.name='<network_source_name>'

Por exemplo:

allow group GroupA to manage object-family in tenancy where request.networkSource.name='corpnet'

Restringindo o Acesso a Recursos com Base no Período

Você pode usar variáveis baseadas em tempo em suas políticas para restringir o acesso concedido na política apenas a determinados períodos. Esse recurso permite que você restrinja ações em recursos a momentos específicos. Por exemplo, você pode criar uma política que permita acesso apenas em uma data especificada. Uma política como essa será útil se sua empresa contratar contratantes e você quiser garantir que o acesso não seja permitido após a data final do contrato. Ou você pode permitir acesso a recursos somente durante o horário comercial (por exemplo, de segunda a sexta das 9h às 17h). Essa restrição pode diminuir o risco de um ator inválido fazer alterações quando tiver maior probabilidade de passar despercebido.

As variáveis que você pode usar para definir o escopo do acesso com base no período são:

  • request.utc-timestamp
  • request.utc-timestamp.month-of-year
  • request.utc-timestamp.day-of-month
  • request.utc-timestamp.day-of-week
  • request.utc-timestamp.time-of-day

O uso dessas variáveis é descrito com mais detalhes nas seções a seguir.

Informações para Trabalhar com Variáveis Baseadas no Tempo

Especifique o horário das variáveis usando o formato ISO 8601: AAAA-MM-DDThh:mm:ssZ. Os exemplos desse formato são:

  • Data e hora com segundos: '2020-04-01T15:00:00Z'
  • Data e hora com minutos: '2020-04-01T05:00Z'
  • Apenas data: '2020-04-01Z'
  • Somente hora: '05:00:00'

Embora você possa especificar um tempo abaixo de segundos, permita uma diferença de tempo de 5 minutos entre o timestamp da solicitação e o horário em que a solicitação é avaliada pelo serviço IAM. Essa diferença de tempo pode ser causada por vários fatores; portanto, esteja ciente dessa possível discrepância ao planejar e implementar suas políticas baseadas em tempo.

O tempo especificado é avaliado como Horário Universal Coordenado (UTC). Isso significa que você deve calcular o horário UTC correto para o fuso horário no qual a política é avaliada. Por exemplo, para especificar 9:00 AM no Horário Padrão do Pacífico para o valor de uma variável, você digitaria '17:00:00'. Se sua localidade adotar o horário de verão, atualize todas as políticas que mencionam uma hora específica quando a mudança de horário entrar em vigor.

Detalhes de Cada Variável Baseada em Tempo

O uso de cada variável é descrito nas seguintes seções:

request.utc-timestamp

Descrição: O horário em que a solicitação é recebida para autorização. Você pode criar uma política que permita o acesso apenas antes ou depois de um timestamp de data e hora específico. O timestamp deve seguir o formato ISO 8601: AAAA-MM-DDThh:mm:ssZ e estar no Horário Universal Coordenado (UTC).

Operadores suportados: antes | após

Valores permitidos: Timestamp no Horário Universal Coordenado (UTC), no formato ISO 8601: AAAA-MM-DDThh:mm:ssZ

Exemplo de Valores:
  • '2020-04-01T00:00:00Z'
  • '2020-04-01T00:00Z'

Exemplo de política: Permite que o grupo, Contratantes, acesse os recursos instance-family somente até uma determinada data:

Allow group Contractors to manage instance-family in tenancy where request.utc-timestamp before '2022-01-01T00:00Z'

O acesso concedido pela política ao grupo Contratantes expirará em 1º de janeiro de 2022, ao meio dia no UTC.

request.utc-timestamp.month-of-year

Descrição: O mês do ano em que a solicitação é recebida para autorização. Você pode criar uma política que permita o acesso apenas durante meses específicos.

Operadores suportados: = | != | em

Valores permitidos: Mês numérico (correspondente a ISO 8601)

Exemplo de Valores: '1', '2', '3', ... '12'

Exemplo de política: Permita que o grupo, SummerInterns, acesse os recursos instance-family somente durante junho, julho e agosto:

Allow group SummerInterns to manage instance-family in tenancy where ANY {request.utc-timestamp.month-of-year in ('6', '7', '8')}

O acesso concedido pela política ao grupo SummerInterns só é válido durante junho, julho e agosto de um determinado ano.

request.utc-timestamp.day-of-month

Descrição: O dia do mês em que a solicitação é recebida para autorização. Você pode criar uma política que permita o acesso apenas para dias específicos do mês. Lembre-se de que o intervalo do dia é calculado com base no UTC. Por exemplo, suponha que você esteja em Miami, Flórida, EUA e digite '1' para indicar o primeiro dia do mês. Para o mês de fevereiro, a política entrará em vigor de 12:00 AM até 11:59 PM UTC em 1º de fevereiro, que em Miami é de 7:00 PM em 31 de janeiro até 6:59 PM em 1º de fevereiro.

Operadores suportados: = | != | em

Valores permitidos: Dia numérico do mês

Exemplo de Valores: '1', '2', '3', ... '31'

Exemplo de política: Permita que o grupo, ComplianceAuditors, leia all-resources somente no primeiro dia do mês.

Allow group ComplianceAuditors to read all-resources in tenancy where request.utc-timestamp.day-of-month = '1'

O acesso concedido pela política ao grupo ComplianceAuditors só é válido no primeiro dia de cada mês (o dia é definido pelo horário UTC).

request.utc-timestamp.day-of-week

Descrição: O dia da semana em que a solicitação é recebida para autorização. Você pode criar uma política que permita acesso apenas para dias específicos da semana. Observe que o intervalo do dia é calculado com base no UTC. Por exemplo, suponha que você esteja em Miami, Flórida, EUA e digite 'monday'. A política entrará em vigor de 12:00 AM a 11:59 PM UTC na segunda-feira, que em Miami é de 7:00 PM (EST) no domingo a 6:59 PM na segunda-feira.

Operadores suportados: = | != | em

Valores permitidos: Nome do dia da semana em inglês

Exemplo de Valores: 'Monday', 'Tuesday', 'Wednesday' etc.

Exemplo de política: Permita que o grupo, WorkWeek, gerencieinstance-family somente durante a semana de trabalho da empresa.

Allow group WorkWeek to manage instance-family where ANY {request.utc-timestamp.day-of-week in ('monday', 'tuesday', 'wednesday', 'thursday', 'friday')}

O acesso concedido pela política ao grupo WorkWeek só é válido nos dias especificados (o dia é definido pelo horário UTC).

request.utc-timestamp.time-of-day

Descrição: A hora do dia em que a solicitação é recebida para autorização. Você pode criar uma política que permita o acesso apenas para um período específico durante o dia. Observe que a hora do dia é calculada com base no UTC. Se você viver em um fuso horário que adote o horário de verão, atualize a política quando o horário mudar.

Operadores suportados: entre

Valores permitidos: Intervalo de tempo UTC no formato ISO 8601: hh:mm:ssZ

Exemplo de Valores: '01:00:00Z' AND '2:01:00Z'

Exemplo de políticas: Permita que o grupo DayShift gerencie instâncias e recursos relacionados entre as horas de 9:00 AM e 5:00 PM Horário Padrão do Pacífico (PST).

Observe que os horários são convertidos em UTC:

Allow group DayShift to manage instance-family where request.utc-timestamp.time-of-day between '17:00:00Z' and '01:00:00Z'

Quero permitir que o grupo NightShift gerencie instâncias e recursos relacionados entre 5:00 PM e 9:00 AM PST.

Allow group NightShift to manage instance-family where request.utc-timestamp.time-of-day between '01:00:00Z' and '17:00:00Z'

Nos dois exemplos, a hora atual é calculada e testada para ver se está dentro do intervalo fornecido ou não (ignorando em qual dia a hora cai).