环境权限(英文:Ambient Authority)是系统访问控制研究中的术语。当主体(比如某个计算机程序或Linux上的某个用户)指明它需要的客体(Object,比如某一文件)的名称和它将要对该客体执行的动作(Operation,比如“复制”)便可以完成该动作的时候,我们称该主体使用了环境权限。
在“环境权限”的定义中:
“环境权限”存在于“广泛的可见空间(比如全局环境变量)”,也就是说任何主体都可以通过名称请求它并完成动作。
下面是一个C程序通过open()程序调用来完成读取文件的操作:
open(“filename”,O_RDONLY, 0)
在程序调用过程中,程序仅仅指明了目标文件的文件名,此文件名不包含任何的权限信息,也就是说C程序无法从此文件名中获得权限信息。在这个语境中,权限信息存在于环境中,这也就是我们所说的“环境权限”。
当环境权限被请求时,是否授予或拒绝权限取决于动作的全局属性,比如作出动作的身份或角色(在Li/Unix语境下,这里的身份即为“用户”)。在使用环境权限的时候,权限的管理将独立于原有的权限控制表(英语:Access-control list)或基于角色的权限控制(英语:Role-based_access_control)等模式,因而正在使用环境权限的程序不会被传统的权限控制手段限制。在这种情况下,系统的权限控制机制无法区分环境权限的使用者是谁,导致了代理混淆问题(英语:Confused deputy problem)
下面的例子来自于 UC Barkely EECS学院 David Wagner教授的PLAS06课程:
# “cp” 必须运行在环境权限下,它可以访问任意用户能够访问的文件$ cp foo.txt bar.txt#“cat” 只需要它用得到的权限$ cat < foo.txt > bar.txt# 环境权限:即使你不需要,也会在调用时带来的权限