Un Capability System es un paradigma de seguridad que gestiona el acceso a recursos mediante el uso de 'capabilities'. A diferencia de los Access Control Lists (ACLs) que asocian permisos con el recurso, las capabilities son tokens que se otorgan a un sujeto (por ejemplo, un proceso o un usuario) y que encapsulan el derecho a realizar una operación específica sobre un objeto particular. Estas capabilities son intransferibles y no falsificables, lo que significa que un sujeto solo puede ejercer un derecho si posee la capability correspondiente, y no puede crear o modificar una capability por sí mismo. Esto permite un control de acceso granular y descentralizado, donde la posesión de la capability es la única prueba de autorización.
En el mundo real, los Capability Systems se han implementado en diversos contextos. Sistemas operativos experimentales como Cambridge CAP Computer y KeyKOS fueron pioneros en su uso a nivel de kernel para la gestión de recursos y la seguridad. En sistemas distribuidos, el concepto se aplica en la forma de tokens de autorización, como los JSON Web Tokens (JWTs) utilizados en la autenticación y autorización de APIs RESTful, donde el token en sí mismo es una capability que otorga derechos específicos. Otro ejemplo es el sistema de permisos de Unix, donde los descriptores de archivo (file descriptors) pueden verse como capabilities para acceder a archivos o sockets, aunque no son completamente no falsificables en el sentido estricto de un Capability System puro. Lenguajes de programación como Rust utilizan conceptos similares para la gestión segura de memoria y concurrencia, donde la propiedad y el borrowing de referencias actúan como capabilities para acceder a datos.
Para un Arquitecto de Sistemas, comprender los Capability Systems es crucial para diseñar arquitecturas seguras y robustas. Ofrecen un modelo de seguridad más flexible y descentralizado que las ACLs, lo que puede simplificar la gestión de permisos en sistemas distribuidos y microservicios. La naturaleza no falsificable de las capabilities reduce la superficie de ataque al eliminar la necesidad de que los recursos verifiquen constantemente la identidad del solicitante, confiando en la validez del token. Sin embargo, su implementación puede ser más compleja, requiriendo mecanismos robustos para la creación, revocación y gestión segura de las capabilities. La elección entre un Capability System y un modelo basado en ACLs implica un trade-off entre la flexibilidad y granularidad de los permisos frente a la complejidad de la implementación y la gestión del ciclo de vida de las capabilities, especialmente en entornos dinámicos donde los permisos cambian frecuentemente.