El Lenguaje Abreviado para la Autorización ( ALFA ) es un lenguaje específico de dominio utilizado en la formulación de políticas de control de acceso. [ 2 ]
Historia
Origen
XACML , el lenguaje de marcado de control de acceso extensible , utiliza XML como su principal lenguaje de codificación. Escribir políticas XACML directamente en XACML da como resultado un texto extenso y difícil de leer [ 3 ] , por lo que se necesitaba una notación nueva y más ligera. Por ello, el investigador de Axiomatics, Pablo Giambiagi, diseñó ALFA, el lenguaje de Axiomatics para la autorización.
ALFA se corresponde directamente con XACML. ALFA contiene los mismos elementos estructurales que XACML, es decir, PolicySet, Policy y Rule.
Axiomatics dona ALFA a OASIS.
En marzo de 2014, Axiomatics anunció que donaría ALFA al Comité Técnico OASIS XACML [ 4 ] con el fin de avanzar en su estandarización.
En consecuencia, ALFA pasó a llamarse Lenguaje Abreviado para la Autorización y se solicitó su estandarización.
Ejemplos de casos de uso
- Caso de uso médico : los médicos pueden consultar los historiales médicos de los pacientes con los que tienen una relación.
- Caso de uso financiero: los empleados en Singapur pueden ver las cuentas de clientes de los empleados con sede en Singapur.
- Caso de uso en seguros: un agente de seguros puede aprobar la reclamación de un usuario si la reclamación se encuentra en la misma región que el agente y si el importe de la reclamación es inferior al importe máximo que el agente puede aprobar.
Las palabras doctor, vista, historial médico, Singapur... son ejemplos de valores de atributos. Los atributos constituyen los componentes básicos de las políticas en ABAC y, por consiguiente, en ALFA.
Estructura
Al igual que XACML, ALFA tiene tres elementos estructurales:
- Conjunto de políticas
- Política
- Regla
Al igual que en XACML, un PolicySet puede contener elementos PolicySet y Policy. Un Policy puede contener elementos Rule. Un Rule contiene una decisión (Permitir o Denegar). Además, en ALFA, es posible agregar elementos Rule a los elementos PolicySet y Policy. Los elementos PolicySet, Policy y Rule pueden estar anidados o referenciados.
Para resolver conflictos entre hermanos, ALFA (al igual que XACML) utiliza algoritmos de combinación. Existen varios algoritmos de combinación que se pueden utilizar.
Tipos de datos
ALFA admite todos los tipos de datos definidos en la especificación principal de OASIS XACML . Algunos tipos de datos, como los numéricos (entero, doble) y los booleanos, se asignan directamente de ALFA a XACML. Otros, como los atributos de fecha u hora, requieren conversión. Para convertir un atributo al tipo de dato correspondiente, utilice la notación "valor":tipo de dato. Consulte los ejemplos a continuación [ 5 ].
Valores de atributos nativos mapeados directamente de ALFA a XACML.
Las cadenas de caracteres, los enteros, los números decimales y los booleanos se asignan directamente de ALFA a XACML. No necesitan ninguna conversión.
Política ALFA utilizando atributos booleanos
espacio de nombres ejemploBooleano{ artículo de política{ cláusula objetivo userRole == "editor" and actionId == "edit" and itemType=="article" Aplicar primero Aplicable regla artículos publicados{ cláusula objetivo publicada == verdadero permiso } } } Valores de atributos que requieren una conversión explícita
Los siguientes tipos de datos de atributos requieren una conversión explícita:
- http://www.w3.org/2001/XMLSchema#time
- http://www.w3.org/2001/XMLSchema#date
- http://www.w3.org/2001/XMLSchema#dateTime
- http://www.w3.org/2001/XMLSchema#anyURI
- http://www.w3.org/2001/XMLSchema#hexBinary
- http://www.w3.org/2001/XMLSchema#base64Binary
- http://www.w3.org/2001/XMLSchema#dayTimeDuration
- http://www.w3.org/2001/XMLSchema#yearMonthDuration
- urn:oasis:names:tc:xacml:1.0:data-type:x500Name
- urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name
- urn:oasis:names:tc:xacml:2.0:data-type:ipAddress
- urn:oasis:names:tc:xacml:2.0:data-type:dnsName
- urn:oasis:names:tc:xacml:3.0:data-type:xpathExpression
Ejemplo: Política ALFA usando anyURI
Esta política convierte un valor de tipo String a cualquier URI.
atributo userDisallowedResources { categoría = subjectCat id = "userDisallowedResources" tipo = cadena }regla allowProfileAccess { cláusula de destino url == "http://<host>:<port>/profile/":anyURI permitir } Ejemplos de políticas
Una política y regla sencilla con una condición
El siguiente ejemplo de ALFA representa una política XACML que contiene una sola regla. Tanto la política como la regla tienen un objetivo. La regla también incluye una condición que se utiliza para comparar dos atributos y verificar una relación (el ID de usuario debe ser igual al del propietario). Siempre que se necesite comparar dos atributos, se debe usar una condición.
ejemplo de espacio de nombres{ artículo de política{ cláusula objetivo itemType=="article" Aplicar primero Aplicable regla editarArtículo{ cláusula objetivo actionId == "edit" y userRole == "editor" permiso condición userId == propietario } } } Uso del tiempo en una política XACML escrita en ALFA
espacio de nombres exampleTime{ política checkTimeAccess { Aplicar primero Aplicable regla checkNightAccess { Función de la cláusula objetivo == "supervisor" y documento == "expediente médico" condición timeInRange(timeOneAndOnly(currentTime), "22:00:00":time, "06:00:00":time) permiso } } } Referencias de políticas
ALFA puede usar referencias a políticas (conjuntos). De hecho, se usan implícitamente cuando se hace lo siguiente.
espacio de nombres com.axiomatics{ ejemplo de espacio de nombres{ /** * Una política sobre lo que los gerentes pueden hacer. Está vinculada desde el * política de documentos establecida. */ gestores de políticas{ Función de la cláusula objetivo == "gerente" Aplicar primero Aplicable regla permitirMismoDepartamento{ condición user.department == document.department permiso } } } /** * La política principal. Hace referencia a la política de los gerentes. */ documentos de conjunto de políticas{ Tipo de recurso de la cláusula de destino == "documento" Aplicar primero Aplicable // Lo siguiente es una referencia a la política. ejemplo.gerentes } } Obligaciones y consejos
Las obligaciones y recomendaciones son declaraciones en XACML que el PDP puede devolver al PEP junto con la decisión (Permitir, Denegar...). Las obligaciones y recomendaciones se activan tanto al permitir como al denegar.
ejemplo de espacio de nombres{ Importar atributos.* aviso notificar = "ejemplo.notificar" política leerDocumentos{ cláusula objetivo actionId="read" y objectType="document" Aplicar primero Aplicable /** * Esta regla deniega el acceso si la hora no está entre las 9 y las 5. */ regla denegarFueraDeHoras{ cláusula objetivo currentTime<"09:00:00":time o currentTime>"17:00:00":time denegar en denegar{ aviso notificar{ acme.obligations.message = "No puede acceder a este servicio fuera del horario de oficina" } } } /** * Esta regla otorga acceso a los administradores */ regla permitirAdministradores{ cláusula objetivo acme.user.role=="manager" permiso } /** * Esta regla abarca cualquier otra cosa que pudiera haber caído hasta este punto. */ regla failsafeDeny{ denegar en denegar{ aviso notificar{ acme.obligations.message = "Su solicitud no coincide con la política. Inténtelo de nuevo." } } } } } Escenario de autorización de ruptura de cristal
Comience por definir los atributos y las obligaciones:
espacio de nombres com.axiomatics.examples{ Importar atributos.* obligación breakTheGlass = "com.axiomatics.examples.breakTheGlass" Obligación auditLog = "com.axiomatics.examples.auditLog" espacio de nombres usuario{ rol de atributo{ categoría = subjectCat id = "com.axiomatics.examples.user.role" tipo = cadena } identificador de atributo{ categoría = subjectCat id = "com.axiomatics.examples.user.identifier" tipo = cadena } } espacio de nombres paciente{ atributo asignadoDoctor{ categoría = resourceCat id = "com.axiomatics.examples.user.assignedDoctor" tipo = cadena } } registro de espacio de nombres{ identificador de atributo{ categoría = resourceCat id = "com.axiomatics.examples.record.identifier" tipo = cadena } } atributo actionId{ categoría = actionCat id = "com.axiomatics.examples.actionId" tipo = cadena } atributo objectType{ categoría = resourceCat id = "com.axiomatics.examples.objectType" tipo = cadena } atributo esEmergencia{ categoría = entornoCat id = "com.axiomatics.examples.isEmergency" tipo = booleano } mensaje de atributo{ categoría = entornoCat id = "com.axiomatics.examples.message" tipo = cadena } Ahora la política se puede definir con 3 reglas:
- La primera regla es para el acceso normal (los médicos pueden ver los registros de los pacientes que les han sido asignados).
- La segunda regla es para acceso especial porque el cristal está roto.
- La tercera regla es la que activa la obligación de indicarle al usuario cómo romper el cristal.
/** * Controlar el acceso a los registros médicos */ acceso a políticas de historial médico cláusula objetivo actionId == "view" y objectType == "registro médico" Aplicar primero Aplicable /** * Los médicos pueden ver los historiales médicos de los pacientes que les han sido asignados. */ regla permitirAccesoRegular{ cláusula objetivo usuario.role == "doctor" condición paciente.médicoasignado == usuario.identificador permiso } /** * Los médicos pueden considerar cualquier motivo médico en caso de emergencia. */ regla permitirRomperElAccesoAlCristal{ La cláusula objetivo esEmergencia == verdadero permiso con permiso{ obligación auditLog{ mensaje = "Un médico ha accedido a un historial clínico rompiendo el cristal" usuario.identificador = usuario.identificador identificador.registro = identificador.registro fecha y hora actual = fecha y hora actual } } } /** * Deniegue otros accesos. Si el acceso normalmente está denegado, informe a los médicos cómo * Pueden acceder "rompiendo el cristal". */ regla denegar acceso{ denegar en denegar{ obligación romperElVaso{ mensaje = "No tiene acceso a este historial médico. Para obtener acceso, establezca la bandera isEmergency en verdadero." identificador.registro = identificador.registro fecha y hora actual = fecha y hora actual } } } } } Política de autorización detallada basada en el tiempo
A continuación se muestra un ejemplo de una política ABAC implementada con ALFA. Utiliza el tiempo como atributo. Emplea una condición XACML para comparar el atributo currentTime con el valor que representa las 5 p. m. (expresado en formato de 24 horas). Nótese el uso de :time para convertir el valor String al tipo de dato correcto.
regla permitirDespuésDeLas5pm { permitir condición currentTime > "17:00:00":hora } Políticas HL7
Casos de uso
HL7 define una serie de casos de uso para el control de acceso médico que pueden definirse fácilmente en ALFA.
Ejemplos de políticas ALFA para HL7
Control de acceso basado en la categoría de acción
/* * Control de acceso basado en la categoría de acción * URL: https://web.archive.org/web/20160304081703/http://wiki.hl7.org/index.php?title=Security_and_Privacy_Ontology_Use_Cases#Access_Control_Based_on_Category_of_Action#Access_Control_Based_on_Category_of_Action * Acceso a las notas de progreso */ Notas de progreso de la política{ cláusula objetivo objectType=="nota de progreso" Aplicar primero Aplicable /* * Un médico de cabecera puede crear una nota de progreso del paciente. */ regla crearNota{ cláusula objetivo rol="médico" y acción="crear" condición médicoprincipal==requestorId permiso } /* * Un médico puede actualizar la nota de progreso del paciente que él mismo haya escrito. */ Nota de actualización de regla{ cláusula objetivo rol="médico" y acción="actualizar" condición autor==requestorId permiso } /* * Regla de seguridad para denegar explícitamente el acceso a menos que se haya cumplido alguna de las reglas coincidentes anteriores. */ arnés de seguridad de regla{ denegar } }Implementaciones
Extensión de VS Code
Una extensión gratuita para el editor VS Code que admite autocompletado de código, resaltado de sintaxis , refactorización y navegación a definiciones. También puede compilar ALFA a XACML 3.0. [ 6 ]
Plugin para Eclipse
El complemento ALFA para Eclipse es una herramienta que convierte su entorno de desarrollo integrado (IDE) Eclipse en un editor dedicado de políticas de autorización mediante la sintaxis ALFA. Posteriormente, las políticas ALFA se pueden convertir fácilmente en políticas XACML 3.0 y cargarse en su herramienta de gestión de políticas XACML. [ 7 ]
Referencias
- ↑ Gebel, Gerry (16 de julio de 2012). "Axiomatics lanza un complemento gratuito para el IDE Eclipse para crear políticas XACML3.0" . Axiomatics . Consultado el 31 de mayo de 2017 .
- ↑ "Simplificando XACML: el complemento Axiomatics ALFA para Eclipse IDE" . KuppingerCole . Consultado el 10 de febrero de 2017 .
- ↑ "XACML 3, sección 4.2.3" (PDF) . OASIS . Consultado el 2 de mayo de 2021 .
- ↑ https://www.linkedin.com/grp/post/3934718-5851696088934801412
- ↑ "Guía rápida de ALFA | Documentación de Enforcer" .
- ↑ "ALFA - Visual Studio Marketplace" . 10 de septiembre de 2021.
- ↑ "¿Cómo puedo usar referencias a políticas en ALFA?" . 10/10/2016.
Referencias externas
- Analistas europeos hablan de ALFA.
- Interfaz de generación de políticas basada en plantillas para servicios web RESTful
- Lenguajes de programación basados en XML