环境权限(英文:Ambient Authority)是系统访问控制研究中的术语。当主体(比如某个计算机程序或Linux上的某个用户)指明它需要的客体(Object,比如某一文件)的名称和它将要对该客体执行的动作(Operation,比如“复制”)便可以完成该动作的时候,我们称该主体使用了环境权限。[1][2][3]

在“环境权限”的定义中:

  1. 客体的“名称”指的是可被任何主体使用的某一客体的唯一标识符,这一“名称”本身不包含它所指代的客体的权限信息。(举例来说,有一客体名为“foo.txt”,主体“root”拥有权限“rwx”,名称指的就是“foo.txt”,并不包含权限“rwx”);
  2. 一个由主体发起的动作“获得许可(或称“可以完成”)”指的是该主体能够提出任何一种能够完成该动作的请求。(举例来说,主体“root”具有“foo.txt”的“r”权限,那么当主体提出“r foo.txt”的时候能够完成“r”的动作,我们说主体的“r”动作获得了许可)


“环境权限”存在于“广泛的可见空间(比如全局环境变量)”,也就是说任何主体都可以通过名称请求它并完成动作。

下面是一个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课程[4]

# “cp” 必须运行在环境权限下,它可以访问任意用户能够访问的文件
$ cp foo.txt bar.txt
#“cat” 只需要它用得到的权限
$ cat < foo.txt > bar.txt

# 环境权限:即使你不需要,也会在调用时带来的权限

今天,因为UnixWindows系统都是在用户启动程序后直接赋予程序所有用户拥有的权限,所以这两种操作系统都在使用环境权限模式进行权限管理。这不仅可能赋予被执行程序多于所需的权限,还无法控制程序使用了何种、来源于何的权限。这种情形下,用户只能祈望程序没有使用过多权限。

解决方案

与环境权限相对应的是“基于能力的权限控制”[5],这一模式要求程序执行时像接收数据那样接收并利用权限。权限授予机制在程序请求权限时审查并发放“权限”,以此赋予主体使用客体的“能力”,以便于避免代理混淆问题。

但是请注意,基于能力的权限管理系统与非环境权限授权系统并不是同义词。

参考文献

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.