在信息安全,计算机科学和其他领域,最小特权原则(PoLP
)要求在计算环境的特定抽象层中,每个模块(例如进程,用户或程序)必须只能访问对其合法目的必要的信息和资源。
概述
该原理意味着仅向用户帐户或进程授予执行其预期功能所必需的那些特权。例如,仅用于创建备份的用户帐户不需要安装软件:因此,它仅具有运行备份和与备份相关的应用程序的权限。其他任何特权(例如安装新软件)均被阻止。该原则也适用于通常使用普通用户帐户工作的个人计算机用户,并且仅在情况绝对需要时才打开受密码保护的超级用户权限。
最小特权原则被广泛认为是一种增强对数据和功能的保护的重要设计,以防止错误(容错)和恶意行为(计算机安全)。
该原则的好处包括:
- 更好的系统稳定性。如果将代码限制在对系统可以进行的更改范围内,则更容易测试其可能的操作以及与其他应用程序的交互。例如,以受限权限运行的应用程序将无权执行可能会使计算机崩溃或对运行在同一系统上的其他应用程序产生不利影响的操作。
- 更好的系统安全性。如果代码在系统范围内可能执行的操作中受到限制,则无法使用一个应用程序中的漏洞来利用计算机的其余部分。例如,
Microsoft
指出“以标准用户模式运行可为客户提供更多保护,以防止因“粉碎攻击”和恶意软件(例如根工具包,间谍软件和不可检测的病毒)造成的系统级意外损坏”。 - 易于部署。通常,应用程序所需的特权越少,则在更大的环境中进行部署就越容易。这通常是由前两个好处引起的,安装设备驱动程序或需要提升的安全特权的应用程序通常在部署过程中涉及其他步骤。例如,在
Windows
上,无需安装任何设备驱动程序的解决方案就可以直接运行,而必须使用Windows Installer
服务单独安装设备驱动程序才能授予驱动程序更高的特权。
在实践中,存在多个竞争的真正最低特权定义。由于程序复杂性以指数速度增长,这样做的潜在问题的数量,使预测方法不切实际。
另一个限制是操作环境对单个进程具有特权的控制粒度。在实践中,几乎不可能以所需的精度来控制进程对内存,处理时间,I/O设备地址或模式的访问。
从历史上看,最小特权的最旧实例可能是login.c
的源代码,该代码以超级用户权限开始执行,并且在不再需要它们时立即通过setuid()
将其关闭。
Linux
系统的最小特权原则实现
内核始终以最大权限运行,因为它是操作系统的核心,具有硬件访问特权。操作系统(尤其是多用户操作系统)的主要职责之一是管理硬件的可用性,并要求从运行的进程中访问它。当内核崩溃时,维护状态的机制也会失败。因此,即使有一种方法可以在不进行硬重置的情况下恢复CPU
,安全性仍将继续执行,但是由于无法检测到故障,操作系统无法正确响应故障。这是因为内核执行要么停止,要么程序计数器从一个无尽的(通常是非功能性的)循环中的某个位置恢复执行。
如果崩溃后通过加载和运行特洛伊木马程序恢复执行,那么特洛伊木马程序的作者就可以篡夺所有进程的控制权。最小特权原则会强制代码以最低的特权/权限级别运行。这意味着恢复代码执行的代码(无论是特洛伊木马程序还是仅从意外位置提取代码执行)将无法执行恶意或不良进程。可以在微处理器硬件中实现一种用于实现此目的的方法。例如,在Intel x86
架构中,制造商设计了四个(环0到环3)运行的“模式”,这些模式具有不同访问级别,就像国防和情报机构的系统安全许可一样。其中内核工作在0环,拥有最高权限,而应用程序工作在3环,对硬件访问受限。
当然,进程的不同阶段可能需要不同的特权。比如一个进程最开始的有效身份是真实身份,但运行到中间的时候,需要以其他的用户身份读入某些配置文件,然后再进行其他的操作。为了防止其他的用户身份被滥用,我们需要在操作之前,让进程的有效身份变更回来成为真实身份。这样,进程需要在两个身份之间变化。
存储身份就是真实身份之外的另一个身份。当我们将一个程序文件执行成为进程的时候,该程序文件的拥有者(owner
)和拥有组(owner group
)可以被存储成为进程的存储身份。在随后进程的运行过程中,进程就将可以选择将真实身份或者存储身份复制到有效身份,以拥有真实身份或者存储身份的权限。并不是所有的程序文件在执行的过程都设置存储身份的。需要这么做的程序文件会在其九位(bit)权限的执行位的x
改为s
。这时,这一位(bit)叫做set UID bit
或者set GID bit
。
我们通常使用chmod
来修改set-UID bit
和set-GID bit
:
$chmod 4700 file
我们看到,这里的chmod
后面不再只是三位的数字。最前面一位用于处理set-UID bit/set-GID bit
,它可以被设置成为4/2/1以及或者上面数字的和。4表示为set UID bit
, 2表示为set GID bit
,1表示为sticky bit
。必须要先有x
位的基础上,才能设置s
位。