Funciones avanzadas de políticas
En esta sección se describen las funciones de lenguaje de política que permiten otorgar un acceso más granular.
Condiciones
Como parte de una sentencia de política, puede especificar una o más condiciones que se deben cumplir para poder otorgar acceso.
Cada condición consta de una o más variables predefinidas para las que especifica valores en la sentencia de la política. Más tarde, cuando alguien solicita acceso al recurso en cuestión, si se cumple la condición de la política, se evalúa como truey se permite la solicitud. Si no se cumple la condición, se evalúa como falsey no se permite la solicitud.
Hay dos tipos de variables: las que son relevantes para la propia solicitud y las relevantes para el recurso sobre el que se está realizando la acción en la solicitud, también denominado destino. El nombre de la variable debe llevar el prefijo request
o target
, según corresponda, seguido de un punto. Por ejemplo, hay una variable de solicitud llamada request.operation
para representar la operación de API que se está solicitando. Esta variable permite escribir una sentencia de política amplia, pero agregar una condición basada en la operación de API específica. Para ver un ejemplo, consulte Permitir a los usuarios escribir objetos en los cubos de Object Storage.
La coincidencia de condiciones no es sensible a mayúsculas/minúsculas. Es importante recordarlo al escribir condiciones para tipos de recursos que permiten la nomenclatura sensible a mayúsculas/minúsculas. Por ejemplo, el servicio Object Storage permite crear un cubo denominado "BucketA" y un cubo denominado "bucketA" en el mismo compartimento. Si escribe una condición que especifica "BucketA", se aplicará también a "bucketA" porque la coincidencia de condiciones no es sensible a mayúsculas/minúsculas.
Variables no aplicables al resultado de una solicitud en una solicitud rechazada
Si la variable no es aplicable a la solicitud entrante, la condición se evalúa como falsey la solicitud se rechaza. Por ejemplo, las siguientes son sentencias de política básicas que permiten a alguien agregar o eliminar usuarios de cualquier grupo excepto 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 la política anterior, si GroupAdmins ha intentado llamar a una operación de API general para usuarios como ListUsers
o UpdateUser
(que le permite cambiar la descripción del usuario), la solicitud se rechazaría, aunque esas operaciones de API estén cubiertas por use users
. Esto se debe a que la sentencia de política anterior para use users
también incluye la variable target.group.name
, pero la solicitud de ListUsers
o UpdateUser
no implica especificar un grupo. No hay target.group.name
para esas solicitudes, por lo que la solicitud se rechaza.
Si también desea conceder acceso a las operaciones generales de la API de usuario que no incluyen un grupo concreto, necesitará una sentencia adicional que proporcione el nivel de acceso que desea otorgar, pero sin la condición. Por ejemplo, si desea conceder acceso a ListUsers
, necesita esta sentencia adicional:
Allow group GroupAdmins to inspect users in tenancy
O si desea conceder acceso a UpdateUser
, necesita esta sentencia adicional (que también cubre ListUsers
porque el verbo use
incluye las capacidades del verbo inspect
):
Allow group GroupAdmins to use users in tenancy
Este concepto general también se aplica a los grupos (por ejemplo, ListGroups
y UpdateGroup
) y a cualquier otro tipo de recurso con variables de destino.
Para obtener más información sobre la sintaxis de condiciones, consulte Condiciones. Para obtener una lista de todas las variables que puede utilizar en las políticas, consulte las tablas de la sección sobre visión general de las políticas de IAM.
Control de acceso basado en etiquetas
Con las condiciones y un conjunto de variables de etiquetas, puede escribir una política para restringir el acceso basándose en las etiquetas aplicadas a un recurso. El acceso se puede controlar con una etiqueta existente en el recurso solicitante (grupo o grupo dinámico en la política) o en el destino de la solicitud (recurso o compartimento). El control de acceso basado en etiquetas proporciona flexibilidad adicional a las políticas, ya que le permite definir el acceso a compartimentos, grupos y recursos. Para obtener más información sobre cómo escribir políticas para restringir el acceso por etiquetas, consulte Uso de etiquetas para gestionar el acceso.
Permisos
Los permisos son las unidades atómicas de autorización que controlan la capacidad de un usuario para realizar operaciones en recursos. Oracle define todos los permisos en el lenguaje de la política. Cuando escribe una política que proporciona a un grupo acceso a un verbo y un tipo de recurso específicos, en realidad concede a ese grupo acceso a uno o más permisos predefinidos. El propósito de los verbos es simplificar el proceso de concesión de varios permisos relacionados que abarquen un amplio juego de accesos o un escenario operativo concreto. En las siguientes secciones se proporcionan más detalles y ejemplos.
Relación con los verbos
Para comprender la relación entre permisos y verbos, veamos un ejemplo. Una sentencia de política que permite a un grupo inspeccionar volúmenes mediante inspect volumes
realmente proporciona al grupo el acceso a un permiso denominado VOLUME_INSPECT (los permisos siempre se escriben con letras mayúsculas y guiones bajos). En general, ese permiso permite al usuario obtener información sobre los volúmenes en bloque.
A medida que recorra la progresión inspect
> read
> use
> manage
, el nivel de acceso generalmente aumenta y los permisos concedidos son acumulativos. En la siguiente tabla se muestran los permisos incluidos en cada verbo para el tipo de recurso volumes
. Tenga en cuenta que no se otorgan permisos adicionales al pasar de inspect
a read
.
Inspeccionar volúmenes | Leer volúmenes | Usar volúmenes | Gestionar volúmenes |
---|---|---|---|
VOLUME_INSPECT | VOLUME_INSPECT |
VOLUME_INSPECT VOLUME_UPDATE VOLUME_WRITE |
VOLUME_INSPECT VOLUME_UPDATE VOLUME_WRITE VOLUME_CREATE VOLUME_DELETE |
Consulte Detalles de combinaciones de verbo + tipo de recurso de un servicio para obtener una lista completa de comandos detallados.
Relación con operaciones de API
Cada operación de API necesita que el emisor de llamada tenga acceso a uno o más permisos. Por ejemplo, para utilizar ListVolumes
o GetVolume
, debe tener acceso a un solo permiso: VOLUME_INSPECT. Para asociar un volumen a una instancia, debe tener acceso a varios permisos, algunos de los cuales están relacionados con el tipo de recurso volumes
, volume-attachments
o instances
:
- VOLUME_WRITE
- VOLUME_ATTACHMENT_CREATE
- INSTANCE_ATTACH_VOLUME
En la referencia de política se muestra qué permisos son necesarios para cada operación de API. Por ejemplo, para las operaciones de la API de servicios básicos, consulte la tabla en Permisos necesarios para cada operación de API.
Descripción del acceso de un usuario
El lenguaje de la política está diseñado para permitir escribir sentencias simples que incluyan solo verbos y tipos de recursos, sin tener que establecer los permisos deseados en la sentencia. Sin embargo, es posible que haya situaciones en las que un miembro del equipo de seguridad o auditor desee conocer los permisos específicos de un usuario determinado. Las tablas de la referencia de políticas de cada servicio muestran los verbos soportados y los permisos asociados. Puede ver los grupos en los que está el usuario y las políticas aplicables a esos grupos y, a partir de esa información, recopilar una lista de los permisos otorgados. Sin embargo, no basta con tener una lista de los permisos para contar con una visión completa. Las condiciones de una sentencia de política pueden ofrecer a un usuario un acceso más allá de los permisos individuales (consulte la siguiente sección). Además, cada sentencia de política especifica un compartimento concreto y puede tener condiciones que delimiten el acceso a determinados recursos en ese compartimento.
Delimitación del ámbito de acceso mediante permisos u operaciones de API
En una sentencia de política se pueden utilizar condiciones combinadas con permisos u operaciones de API para reducir el ámbito de acceso otorgado por un verbo concreto.
Por ejemplo, supongamos que desea que el grupo XYZ pueda mostrar, obtener, crear o actualizar grupos (es decir, cambiar su descripción), pero no suprimirlos. Para mostrar, obtener, crear y actualizar grupos, necesita una política con manage groups
como verbo y tipo de recurso. De acuerdo con la tabla de Detalles de combinaciones de verbo + tipo de recurso, los permisos cubiertos son:
- GROUP_INSPECT
- GROUP_UPDATE
- GROUP_CREATE
- GROUP_DELETE
Para restringir el acceso a los permisos deseados, podría agregar una condición que indique explícitamente los permisos que desea conceder:
Allow group XYZ to manage groups in tenancy
where any {request.permission='GROUP_INSPECT',
request.permission='GROUP_CREATE',
request.permission='GROUP_UPDATE'}
Una alternativa sería una política que conceda todos los permisos, excepto GROUP_DELETE:
Allow group XYZ to manage groups in tenancy where request.permission != 'GROUP_DELETE'
Sin embargo, tenga en cuenta que, con este enfoque, cualquier nuevo permiso que el servicio pudiera agregar en el futuro se otorgará automáticamente al grupo XYZ. Solo se omitiría GROUP_DELETE.
Otra alternativa sería escribir una condición basada en las operaciones de API específicas. Tenga en cuenta que, de acuerdo con la tabla de Permisos necesarios para cada operación de API, tanto ListGroups
como GetGroup
necesitan solo el permiso GROUP_INSPECT. Esta sería la política:
Allow group XYZ to manage groups in tenancy
where any {request.operation='ListGroups',
request.operation='GetGroup',
request.operation='CreateGroup',
request.operation='UpdateGroup'}
Puede ser beneficioso utilizar permisos en lugar de operaciones de API en las condiciones. En el futuro, si se agrega una nueva operación de API que requiera uno de los permisos enumerados en la política basada en permisos anterior, esa política ya controlará el acceso del grupo XYZ a esa nueva operación de API.
Sin embargo, tenga en cuenta que puede delimitar aún más el acceso de un usuario a un permiso especificando también una condición basada en una operación de API. Por ejemplo, podría dar a un usuario acceso a GROUP_INSPECT, pero solo a ListGroups
.
Allow group XYZ to manage groups in tenancy
where all {request.permission='GROUP_INSPECT',
request.operation='ListGroups'}
Política de restricción por dirección IP del solicitante
Puede restringir el acceso solo a un conjunto de direcciones IP permitidas. Por ejemplo, puede escribir una política que permita que solo las solicitudes de un rango de IP públicas determinado accedan a un cubo de Object Storage específico; o bien, puede permitir que solo subredes específicas de una VCN en particular realicen solicitudes por un gateway de servicios.
Para restringir el acceso a un conjunto de direcciones IP, realice lo siguiente:
- Cree un objeto de origen de red que especifique las direcciones IP permitidas. Consulte Gestión de orígenes de red para obtener más información.
- Escriba una política que utilice el objeto de origen de red en una condición.
Utilice la siguiente variable en la política:
request.networkSource.name='<network_source_name>'
Por ejemplo:
allow group GroupA to manage object-family in tenancy where request.networkSource.name='corpnet'
Restricción del acceso a los recursos en función del marco temporal
Puede utilizar variables basadas en el tiempo en las políticas para restringir el acceso otorgado en la política solo a determinados marcos temporales. Esta función permite restringir las acciones en los recursos a tiempos concretos. Por ejemplo, puede crear una política que permita el acceso solo hasta una fecha especificada. Una política como esta sería útil si su compañía contrata contratistas y desea asegurarse de que el acceso no esté permitido después de la fecha de finalización del contrato. O bien, puede permitir el acceso a los recursos solo durante el horario laborable (por ejemplo, de lunes a viernes de 9:00 a. m. a 5:00 p. m.). Esta restricción puede reducir el riesgo de que un mal actor realice cambios cuando es más probable que pasen desapercibidos.
Las variables que puede utilizar para definir el ámbito de acceso en función del tiempo son:
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
El uso de estas variables se describe con más detalle en las siguientes secciones.
Información para trabajar con variables basadas en el tiempo
Debe especificar la hora de las variables con el formato ISO 8601: AAAA-MM-DDThh:mm:ssZ. Algunos ejemplos de este formato son:
- Fecha y hora con segundos: '2020-04-01T15:00:00Z'
- Fecha y hora con minutos: '2020-04-01T05:00Z'
- Solo fecha: '2020-04-01Z'
- Solo hora: '05:00:00'
Aunque puede especificar un tiempo de inactividad en segundos, debe considerar una diferencia de tiempo de 5 minutos entre el registro de hora de la solicitud y la hora a la que el servicio IAM evalúa la solicitud. Esta diferencia de tiempo puede estar causada por varios factores, por lo que debe tener en cuenta esta posible discrepancia al planificar e implantar sus políticas basadas en el tiempo.
La hora que especifique se evalúa como Hora Universal Coordinada (UTC). Esto significa que debe calcular la hora UTC correcta para la zona horaria en la que se evalúa la política. Por ejemplo, para especificar la Hora Estándar del Pacífico de las 9:00 a. m. para el valor de una variable, debe introducir '17:00:00'. Si su configuración regional participa en el horario de verano, deberá actualizar todas las políticas que hagan referencia a una hora específica cuando el cambio de hora entre en vigor.
Detalles de cada variable basada en el tiempo
El uso de cada variable se describe en las siguientes secciones:
Descripción: hora a la que se recibe la solicitud para la autorización. Puede escribir una política que permita el acceso solo antes o después de un registro de fecha y hora específico. El registro de hora debe seguir el formato ISO 8601: AAAA-MM-DDThh:mm:ssZ en la Hora Universal Coordinada (UTC).
Operadores soportados: before | after
Valores permitidos: registro de hora en la Hora Universal Coordinada (UTC) con el formato ISO 8601: AAAA-MM-DDThh:mm:ssZ
- '2020-04-01T00:00:00Z'
- '2020-04-01T00:00Z'
Política de ejemplo: permita al grupo, Contractors, acceder a los recursos instance-family
solo hasta una fecha determinada:
Allow group Contractors to manage instance-family in tenancy where request.utc-timestamp before '2022-01-01T00:00Z'
El acceso otorgado por la política al grupo Contractors caducará el 1 de enero de 2022, a las 12:00 a. m., UTC.
Descripción: mes del año en que se recibe la solicitud para la autorización. Puede escribir una política que permita el acceso solo durante meses específicos.
Operadores soportados: = | != | in
Valores permitidos: mes numérico (que coincide con ISO 8601)
Valores de ejemplo: "1", "2", "3", ... "12"
Política de ejemplo: permita al grupo, SummerInterns, acceder a los recursos instance-family
solo durante junio, julio y agosto:
Allow group SummerInterns to manage instance-family in tenancy where ANY {request.utc-timestamp.month-of-year in ('6', '7', '8')}
El acceso otorgado por la política al grupo SummerInterns solo es válido durante junio, julio y agosto de un año determinado.
Descripción: día del mes en el que se recibe la solicitud para la autorización. Puede escribir una política que permita el acceso solo para días específicos del mes. Tenga en cuenta que el intervalo del día se calcula según el estándar UTC. Por ejemplo, supongamos que está en Miami, Florida, EE. UU. y que introduce '1' para indicar el primer día del mes. Para el mes de febrero, la política estará en vigor de las 12:00 a. m. a las 11:59 p. m. UTC el 1 de febrero, que en Miami sería de las 7:00 p. m. del 31 de enero a las 6:59 p. m. del 1 de febrero.
Operadores soportados: = | != | in
Valores permitidos: día numérico del mes
Valores de ejemplo: "1", "2", "3", ... "31"
Política de ejemplo: permita al grupo, ComplianceAuditors, leer all-resources
solo el primer día del mes.
Allow group ComplianceAuditors to read all-resources in tenancy where request.utc-timestamp.day-of-month = '1'
El acceso otorgado por la política al grupo ComplianceAuditors solo es válido el primer día de cada mes (el día se define según la hora UTC).
Descripción: día de la semana en el que se recibe la solicitud para la autorización. Puede escribir una política que permita el acceso solo para días específicos de la semana. Tenga en cuenta que el intervalo del día se calcula según el estándar UTC. Por ejemplo, supongamos que usted está en Miami, Florida, EE. UU., y que introduce 'monday'. La política entrará en vigor de las 12:00 a. m. a las 11:59 p. m. UTC el lunes, que en Miami sería de las 7:00 p. m. (EST) del domingo a las 6:59 p. m. del lunes.
Operadores soportados: = | != | in
Valores permitidos: nombre del día de la semana en inglés
Valores de ejemplo: 'Monday', 'Tuesday', 'Wednesday', etc.
Política de ejemplo: permita al grupo, WorkWeek, gestionarinstance-family
solo durante la semana laboral de la compañía.
Allow group WorkWeek to manage instance-family where ANY {request.utc-timestamp.day-of-week in ('monday', 'tuesday', 'wednesday', 'thursday', 'friday')}
El acceso otorgado por la política al grupo WorkWeek solo es válido en los días especificados (el día se define según la hora UTC).
Descripción: hora del día a la que se recibe la solicitud para la autorización. Puede escribir una política que permita el acceso solo durante un intervalo de tiempo específico durante el día. Tenga en cuenta que la hora del día se calcula según el estándar UTC. Si vive en una zona horaria que implanta el horario de verano, deberá actualizar la política cuando cambie la hora.
Operadores soportados: between
Valores permitidos: intervalo de tiempo UTC con el formato ISO 8601: hh:mm:ssZ
Valores de ejemplo: '01:00:00Z' Y '2:01:00Z'
Políticas de ejemplo: permita al grupo DayShift gestionar instancias y recursos relacionados entre las 9:00 a. m. y las 5:00 p. m. de la Hora Estándar del Pacífico (PST).
Tenga en cuenta que las horas se convierten a UTC:
Allow group DayShift to manage instance-family where request.utc-timestamp.time-of-day between '17:00:00Z' and '01:00:00Z'
Quiero permitir al grupo NightShift gestionar instancias y recursos relacionados entre las 5:00 p. m. y las 9:00 a. m. PST.
Allow group NightShift to manage instance-family where request.utc-timestamp.time-of-day between '01:00:00Z' and '17:00:00Z'
En ambos ejemplos, la hora actual se calcula y se prueba para comprobar si está dentro del rango proporcionado o no (ignorando el día en el que cae la hora).