We want something simpler than resources × principals × access types, something easier to manage & understand
Need to accurately prohibit "bad" access and allow "good" access
Traditional Unix
rwx rwx rwx
[user] [group] [other]
Originally, users had 1 group, but now they can have multiple.
ACLs - Access Control Lists
Owner of a resource can specify an access list.
An access list is a list of principals and their accesses.
In Solaris, a very simple ACL would look like this:
$ getfacl .
user::rwx
group::r_x
other::r_x
$ setfacl .
ACL key idea: making sure the default ACLs are correct when a resource is created
Role-Based Access Control (RBAC)
Replaces principals with roles.
Users can assume various roles.
Some example roles:
- backup (would have read access to everything)
- poweroff
- change grades
Applications run limited roles.
Mechanisms for enforcing access control
ACLs
Each resource has an ACL (controlled by the OS) attached to it, all accesses are mediated by the OS.
Capabilities
Each principal has a set of capabilities. They have a hashed pointer to the resource which the OS decrypts. (This can be done in hardware)
Trusted Software
From an OS viewpoint: Oses don't drust apps because they don't trust the users that run them.
However, some programs are trusted, like login. These programs have a bit set in their permissions that makes them run as the owner of the file when executed, this way they can do things only root can do.
But which programs do we trust?
- as few as possible
- and those programs should be as small as possible
How can we trust login? By checking a cryptographic checksum of the program.
Apparently there's a very large trusted computing base, which is a big security problem.