你如何对处理应用程序内执行某些操作的权限的系统进行建模?
安全模型是一个广泛(且开放)的研究领域。有很多可供选择的模型,范围从简单到复杂:
Lampson的访问控制矩阵列出了系统中每个域对象和每个主体以及该主体被允许在该对象上执行的操作。它非常冗长,如果实际按照这种方式实现,会占用大量内存。
访问控制列表是Lampson矩阵的简化版本:将其视为类似于稀疏矩阵实现的东西,列出对象和主体以及允许的操作,并且不编码Lampson矩阵中所有“null”条目。访问控制列表可以包括“组”作为方便,列表可以通过对象或主体(有时通过程序,例如AppArmor或TOMOYO或LIDS)进行存储。
能力系统基于具有对象引用或指针的想法;进程可以访问初始一组能力,并且只能通过从系统上的其他对象接收它们来获得更多能力。这听起来相当遥远,但请考虑Unix文件描述符:它们是对特定打开文件的不可伪造引用,文件描述符可以传递给其他进程或不传递。如果您将描述符给另一个进程,则该进程将可以访问该文件。整个操作系统都是围绕这个想法编写的。(最著名的可能是KeyKOS和EROS,但我确定这是一个有争议的观点。:)
...从简单的开始,到更复杂的,这些都会为对象和主体分配安全标签:
安全环,例如在Multics和x86 CPU中实现,提供安全陷阱或门以允许进程在环之间转换;每个环具有不同的特权和对象。
Denning's Lattice是一个模型,其中主体以非常分层的方式与哪些安全标签进行交互。
Bell-LaPadula类似于Denning's Lattice,并提供规则以防止泄露最高机密数据到未分类的级别,常见扩展提供更好的军事风格“需要知道”支持的隔离和分类。
Biba Model类似于Bell-LaPadula,但是“颠倒过来”-Bell-LaPadula专注于保密性,但对完整性没有任何作用,而Biba专注于完整性,但对保密性没有任何作用。(Bell-LaPadula防止某人阅读所有间谍名单,但会很乐意让任何人将任何内容写入其中。Biba会很乐意让任何人阅读所有间谍名单,但几乎不允许任何人向其中写入。)
类型强制执行(及其姊妹,域类型强制执行)为主体和对象提供标签,并指定允许的对象-动词-主题(类)表。这是熟悉的SELinux和SMACK。
然后还有一些与时间流逝有关的技术:
Chinese Wall 是在商业环境中开发的,用于分离在给定市场上为竞争对手提供服务的组织内的员工:例如,一旦约翰逊开始为埃克森美孚账户工作,他将无法访问BP账户。如果约翰逊先从事BP工作,他将被拒绝访问埃克森美孚的数据。
LOMAC 和 high-watermark 是两种动态方法:LOMAC随着进程访问越来越高级别的数据而修改进程的权限,并禁止向较低级别写入(进程向“最高安全性”迁移),而high-watermark随着更高级别的进程访问数据而修改数据标签(数据向“最高安全性”迁移)。
Clark-Wilson 模型非常开放;它们包括不变量和规则,以确保每个状态转换不违反不变量。(这可以简单地是double-entry accounting或者像HIPPA一样复杂。)想象一下数据库事务和约束。
如果您想深入了解已发布的模型,Matt Bishop的《计算机安全:艺术与科学》绝对值得一读。