ALFA , el lenguaje abreviado para autorización, es un lenguaje de pseudocódigo utilizado en la formulación de políticas de control de acceso. [2] [3]
Paradigma | Programación declarativa |
---|---|
Diseñada por | Pablo Giambiagi |
Desarrollador | Axiomática |
Apareció por primera vez | 16 de julio de 2012 [1] |
Extensiones de nombre de archivo | .esparto |
Sitio web | Enlace |
Implementaciones importantes | |
Axiomática | |
Influenciado por | |
XML , XACML |
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 conduce a un texto inflado y poco amigable para los humanos, [4] por lo tanto, era necesaria una notación nueva y más liviana. El investigador de Axiomática, Pablo Giambiagi, diseñó ALFA, el Lenguaje Axiomático de Autorización.
ALFA se asigna directamente a 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 de OASIS XACML [5] para avanzar en su estandarización.
En consecuencia, ALFA pasó a llamarse Lenguaje abreviado para autorización y se presentó para su estandarización. Se puede acceder a su versión actual aquí .
Casos de uso de muestra
- Caso de uso médico: los médicos pueden ver los registros médicos de los pacientes con los que tienen una relación.
- Caso de uso financiero: los empleados de Singapur pueden ver las cuentas de clientes de los empleados con sede en Singapur.
- Caso de uso de seguros: un agente de seguros puede aprobar el reclamo de un usuario si el reclamo se encuentra en la misma región que el agente y si el monto del reclamo es menor que el monto de aprobación del agente.
Las palabras médico, vista, historial médico, Singapur ... son ejemplos de valores de atributo. Los atributos constituyen los componentes básicos de las políticas en ABAC y, en consecuencia, en ALFA.
Estructura
Al igual que XACML, ALFA tiene tres elementos estructurales:
- PolicySet
- Política
- Regla
Como en XACML, un PolicySet puede contener elementos PolicySet y Policy. Una política puede contener elementos de regla. Una Regla contiene una decisión (ya sea Permitir o Denegar). Además, en ALFA, es posible agregar elementos de regla a PolicySet y elementos de política. Los elementos PolicySet, Policy y Rule se pueden anidar o hacer referencia a ellos.
Para resolver conflictos entre hermanos, ALFA (al igual que XACML) utiliza algoritmos de combinación. Hay varios algoritmos de combinación que se pueden utilizar. Su comportamiento se define en esta tabla de verdad.
Tipos de datos
ALFA admite todos los tipos de datos que se definen en la especificación principal de OASIS XACML . Algunos tipos de datos, por ejemplo, el mapa numérico (entero, doble) y booleano directamente de ALFA a XACML. Otros deben convertirse, como los atributos de fecha u hora. Para convertir un atributo en el tipo de datos relevante, use el "valor": notación de tipo de datos. Vea a continuación para ver ejemplos
Valores de atributos nativos mapeados directamente de ALFA a XACML
Las cadenas, enteros, dobles y booleanos se asignan directamente desde ALFA a XACML. No necesitan conversión
Política de ALFA utilizando atributos booleanos
espacio de nombres exampleBoolean {artículo de política {cláusula de destino userRole == "editor" y actionId == "editar" y itemType == "artículo"aplicar primerorule PublishedArticles {cláusula de destino publicada == verdaderopermiso}}}
Valores de atributo que necesitan una conversión explícita
Los siguientes tipos de datos de atributos necesitan 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: nombres: tc: xacml: 1.0: tipo de datos: x500Name
- urn: oasis: nombres: tc: xacml: 1.0: tipo de datos: rfc822Name
- urn: oasis: nombres: tc: xacml: 2.0: tipo de datos: ipAddress
- urn: oasis: nombres: tc: xacml: 2.0: tipo de datos: dnsName
- urn: oasis: nombres: tc: xacml: 3.0: tipo de datos: xpathExpression
Ejemplo: Política de ALFA usando anyURI
En esta política, convertimos un valor de cadena a cualquier URL.
atributo userDisallowedResources { category = subjectCat id = "userDisallowedResources" type = string }
rule allowProfileAccess {url de la cláusula de destino == "http: // : / profile /": anyURI permit }
Políticas de muestra
Una política y una regla simples 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 tiene una condición que se usa para comparar 2 atributos juntos para implementar una verificación de relación (el ID de usuario debe ser igual al propietario). Siempre que uno necesite marcar 2 atributos juntos, deben usar una condición.
ejemplo de espacio de nombres {artículo de política {cláusula de destino itemType == "artículo"aplicar primeroregla editArticle {cláusula de destino actionId == "editar" y userRole == "editor"permisocondición userId == propietario}}}
Uso del tiempo en una política XACML escrita en ALFA
espacio de nombres exampleTime {policy checkTimeAccess {aplicar primero rule checkNightAccess { función de cláusula de destino == "supervisor" y documento == "registro médico" condición timeInRange (timeOneAndOnly (currentTime), "22:00:00": hora, "06:00:00": hora)permiso} }}
Referencias de políticas en ALFA
ALFA puede utilizar referencias de políticas (conjuntos). De hecho, se utilizan implícitamente al hacer lo siguiente.
espacio de nombres com.axiomatics {ejemplo de espacio de nombres {/ ** * Una política sobre lo que pueden hacer los gerentes. Está vinculado a desde el * conjunto de políticas de documentos. * /administradores de políticas {rol de cláusula de destino == "administrador"aplicar primerorule allowSameDepartment {condición user.department == document.departmentpermiso}}}/ ** * La política principal. Hace referencia a la política de los gerentes * /documentos del conjunto de políticas {cláusula de destino resourceType == "documento"aplicar primero// La siguiente es una referencia de políticaejemplo.managers}}
Obligaciones y Asesoramiento en ALFA
Las obligaciones y los consejos son declaraciones en XACML que pueden devolverse del PDP al PEP junto con la decisión (Permitir, Denegar ...). Las obligaciones y los consejos se activan con el Permiso o la Denegación.
ejemplo de espacio de nombres { importar atributos. * aviso de notificación = "ejemplo.notificar" policy readDocuments { cláusula de destino actionId == "leer" y objectType == "documento" aplicar primero / ** * Esta regla deniega el acceso si el tiempo no está entre las 9 y las 5 * / rule denyOutsideHours { cláusula de destino currentTime <"09:00:00": hora o currentTime> "17:00:00": hora negar en negar{ aviso notificar { acme.obligations.message = "No puede acceder a este servicio fuera del horario de oficina" } } } / ** * Esta regla otorga acceso a los administradores * / rule allowManagers { cláusula de destino acme.user.role == "administrador" permiso } / ** * Esta regla captura cualquier otra cosa que pueda haber caído hasta este punto. * / rule failsafeDeny { negar en negar{ aviso notificar { acme.obligations.message = "Su solicitud no coincide con la política. Vuelva a intentarlo" } } } } }
Escenario de autorización de Break the Glass
Comencemos por definir los atributos y obligaciones que usaremos.
espacio de nombres com.axiomatics.examples {importar atributos. *obligación breakTheGlass = "com.axiomatics.examples.breakTheGlass"obligación auditLog = "com.axiomatics.examples.auditLog"usuario del espacio de nombres {función de atributo {categoría = sujetoCatid = "com.axiomatics.examples.user.role"tipo = cadena}identificador de atributo {categoría = sujetoCatid = "com.axiomatics.examples.user.identifier"tipo = cadena}}paciente del espacio de nombres {atributo asignadoDoctor {categoría = recursoCatid = "com.axiomatics.examples.user.assignedDoctor"tipo = cadena}}registro de espacio de nombres {identificador de atributo {categoría = recursoCatid = "com.axiomatics.examples.record.identifier"tipo = cadena}}atributo actionId {categoría = actionCatid = "com.axiomatics.examples.actionId"tipo = cadena}atributo objectType {categoría = recursoCatid = "com.axiomatics.examples.objectType"tipo = cadena}atributo isEmergency {categoría = entornoCatid = "com.axiomatics.examples.isEmergency"tipo = booleano}mensaje de atributo {categoría = entornoCatid = "com.axiomatics.examples.message"tipo = cadena}
Ahora podemos definir la política con 3 reglas:
- la primera regla es para el acceso normal (los médicos pueden ver los registros de los pacientes a los que están asignados.
- la segunda regla es para acceso especial porque el vidrio se ha roto.
- la tercera regla es la regla que desencadena la obligación de decirle al usuario cómo romper el vidrio.
/ ** * Controlar el acceso a los registros médicos. * /policy accessMedicalRecord {cláusula de destino actionId == "ver" y objectType == "historial médico"aplicar primero/ ** * Los médicos pueden ver los registros médicos de los pacientes a los que están asignados * /rule allowRegularAccess {cláusula de destino user.role == "doctor"condición patient.assignedDoctor == user.identifierpermiso}/ ** * Los médicos pueden ver cualquier motivo médico en caso de emergencia. * /rule allowBreakTheGlassAccess {la cláusula de destino es Emergencia == verdaderopermisoen permiso {obligación auditLog {message = "Un médico ha obtenido acceso a un historial médico al romper el cristal"user.identifier = user.identifierrecord.identifier = record.identifiercurrentDateTime = currentDateTime}}}/ ** * Denegar otros accesos. Si normalmente se niega el acceso, informe a los médicos cómo * Pueden acceder "rompiendo el cristal". * /rule denyAccess {negaren negar{obligación breakTheGlass {message = "No tiene acceso a este registro médico. Para que se le conceda acceso, establezca el indicador isEmergency en verdadero".record.identifier = record.identifiercurrentDateTime = currentDateTime}}}}}
Política de autorización detallada basada en el tiempo
El siguiente es un ejemplo de una política ABAC implementada usando ALFA. Utiliza el tiempo como atributos. Utiliza una condición XACML para comparar el atributo currentTime con el valor que representa las 5 pm (expresado en 24 horas). Tenga en cuenta el uso de: time para convertir el valor de cadena al tipo de datos correcto.
rule allowAfter5pm { permiso condición currentTime> "17:00:00": hora}
Políticas HL7
Casos de uso
HL7 define una serie de casos de uso de control de acceso médico que se pueden definir fácilmente en ALFA.
Ejemplos de políticas de ALFA para HL7
Control de acceso según 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 * Acceso a notas de progreso * /policy progressNotes {cláusula de destino objectType == "nota de progreso"aplicar primero/ * * Un médico de cabecera puede crear una nota de progreso del paciente * /regla createNote {función de cláusula de destino == "médico" y acción == "crear"condición primaryPhysician == requestorIdpermiso}/ * * Un médico puede actualizar la nota de progreso de un paciente que él mismo escribió. * /actualización de la reglaNote {función de la cláusula de destino == "médico" y acción == "actualizar"condición autor == requestorIdpermiso}/ * * Regla de seguridad para denegar explícitamente el acceso a menos que una de las reglas coincidentes anteriores haya coincidido * /rule safetyHarness {negar}}
El complemento ALFA para Eclipse
El complemento ALFA para Eclipse es una herramienta que convierte su IDE de programación Eclipse en un editor dedicado de políticas de autorización utilizando la sintaxis ALFA. Las políticas de ALFA pueden convertirse fácilmente en políticas XACML 3.0 reales y cargarse en su herramienta de administración de políticas XACML. [6]
Referencias
- ^ Gebel, Gerry (16 de julio de 2012). "Axiomatics lanza un complemento gratuito para el IDE de Eclipse para crear políticas XACML3.0" . Axiomática . Consultado el 31 de mayo de 2017 .
- ^ " wiki de la etiqueta ' alfa'" .
- ^ "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
- ^ "¿Cómo puedo utilizar las referencias de políticas en ALFA?" . 2016-10-10.
Referencias externas
Analistas europeos hablan de ALFA
Una interfaz de generación de políticas basada en plantillas para servicios web RESTful