Uno de los modelos mas simple es la matriz de control de acceso, donde hay una fila por usuario, una columna por objeto, y en su intersección se encuentran las acciones permitidas a ese usuario sobre ese objeto. Una matriz de este tipo seria muy grande para representar eficientemente en memoria.
Access Control Lists (ACL)
En vez de tener una matriz, se utiliza una lista por cada objeto, que contiene los usuarios y las operaciones permitidas.

Para poder modificar la ACL por dentro del sistema, se agrega el derecho de pertenencia (own), que puede ser asignado a quien crea el objeto o según el tipo de objeto, de forma que el owner de un objeto puede modificar los permisos. La transferencia de permisos tiene dos implementaciones posibles: traspaso, donde se cambia el sujeto de una entrada del ACL, y delegación, donde le podes otorgar a otro usuario las acciones que vos tenes permitidas, o podes otorgar las que no tenes permitidas.
También existen los usuarios privilegiados, implementados de forma que a ellos no les aplican los ACLs (como root en Linux), o que sean usuarios con ACLs especiales, donde tiene el derecho take ownership sobre todos los objetos. Se implementa una opción u otra. Pese a que los usuarios privilegiados pueden disminuir la seguridad, el hecho de poder hacer estos cambios por dentro del mismo sistema haciendo uso del take ownership hace que los cambios sean auditables.
Manejo en Volumen
Grupos
Aunque no sean una matriz, los ACLs pueden crecer mucho, por lo que en la práctica se utilizan grupos (también llamados roles), pese a no pertenecer al modelo clásico de ACLs.
Esto es un trade-off, pues pese a reducir el tamaño de ACLs, agregan una nueva dimensión de complejidad:
La combinación de grupos y usuarios puede llevar a conflictos, pues más de un Access Control pueden aplicar al mismo tiempo. Esto se resuelve de dos formas, Grant-All requiere que todos los ACs otorguen el derecho, First-Rule, donde el primer ACL encontrado es utilizado (esto requiere además definir un orden de evaluación de ACLs, en general esta estandarizado que el de un usuario particular viene antes del de grupos).
Derechos por Defecto
Los derechos por defecto permiten definir ACs a utilizar sobre sujetos para los cuales no hay un AC en la lista, en forma Override, donde si el sujeto tiene un AC, se utiliza, y si no se utiliza el default, o Augment, donde a partir del default se agregan ACs explícitos.
Revocación
Para quitarle derechos de un sujeto a un objeto, basta con que el owner quite el AC del sujeto del ACL, o los derechos necesarios dentro del AC. Pero si hay transferencia de permisos, se vuelve mucho más complejo, pues puede requerir borrar en cascada permisos delegados.
Listas de Capacidades
Representan filas de una matriz de acceso: Es decir, en vez de tener listas por objeto, tenes una lista por usuario que contiene (objeto, permisos). Lo que las hace interesantes es que como la información que tienen no esta ligada al usuario, es mucho más natural la transferencia en comparación con ACLs, e incluso es posible transferir estas capacidades entre sistemas, como en el protocolo Open Auth. Pese a esto, realmente en el fondo las dos implementaciones son equivalentes.
Las ACLs están más asociadas al procesamiento imperativo, e históricamente es el más desarrollado, mientras que las capacidades están más asociadas a procesamiento declarativo, por lo que se usan más en sistemas de seguridad.
El problema es que deben implementarse dos mecanismos de protección, evitar que un usuario altere capacidades, y que un usuario pueda crear capacidades nuevas.
- Tags: Marcas de bits controladas por el hardware que impiden la modificación de registros en procesos de bajo privilegio. Son cada vez menos comunes, era más común en mainframes.
- Paging/segmentos protegidos: Se almacenan las capacidades en un segmento de memoria marcado como de solo lectura, y los procesos acceden indirectamente a dichas capacidades, para evitar que estas puedan ser copiadas. Por ejemplo, los file descriptors en Linux.
- Criptografía: Se asocia a cada capacidad un hash criptográfico cifrado con una clave conocida solo por el sistema, y al presentar una capacidad el sistema verifica el hash.
Se conoce como control de copia a que, como la tenencia de una capacidad implica acceso, se debe restringir su copia. Esto se hace mediante el acceso indirecto a las capacidades, y luego la copia es controlada por el sistema.
Amplificación es la posibilidad de contar con capacidades extendidas temporalmente, por ejemplo al ejecutar ciertas funciones como las syscalls de un sistema.
Revocación
Esto implica revisar todas las listas de capacidades, lo cual es muy costoso y a veces imposibles, en el caso de sistemas remotos. Para resolver esto en sistemas remotos, se agregan tiempos de vencimiento a las capacidades o se implementan listas de capacidades revocadas, mientras que en otros casos se resuelve con indirección, donde las capacidades realmente son indices dentro de una tabla que no es accesible por los procesos, y basta con invalidar la entrada correspondiente en la tabla.
Secretos Compartidos
Es una implementación de políticas de separación de privilegios, donde una operación no puede ser ejecutada por una sola persona, es parte de un campo conocido como criptografía con umbrales.
Se define sobre dos parámetros , donde se crean partes o capacidades (sombras), y cualesquiera permiten acceder al objeto, mientras que cualesquiera no permiten accederlo.
Método de Shamir
Esta basado en el principio de que un polinomio de grado puede ser especificado mediante su evaluación en puntos diferentes.
Se construye:
- Armar .
- Sea el secreto a compartir
- , ,
- son las sombras.
Luego, para reconstruir el secreto:
- Sean , sombras cualesquiera.
- Se interpola el polinomio mediante el método de Lagrange.
- Se evalúa
Completar
Ver el resto de la clase despues del ejemplo del método de Shamir.