3.2 实施访问控制
实施访问控制主要有两种方法,即访问控制列表和访问控制能力。这两种方法各有优缺点,实现前文所述的四个基本任务的方式也各不相同。
3.2.1 访问控制列表
访问控制列表(Access Control List,ACL)包含允许特定方对既定系统拥有何种访问权限的相关信息列表。我们经常看到,实施访问控制列表时,通常作为应用软件或操作系统,以及某些硬件设备(如网络基础设施设备)固件的一部分。我们甚至可以看到,访问控制列表概念通过控制物理资源的软件系统,如门控系统的徽章读取器,能够扩展到物理世界。根据图3-2所示的访问控制列表可以发现,其允许Alice访问资源,而明确拒绝Bob访问。
图3-2 简单的访问控制列表
这看起来像是一个简单的概念,但在更大范围的实施过程中,可能会变得相当复杂。各组织通常使用访问控制列表,控制访问其操作系统所运行的文件系统,并控制连接网络的系统流量。你将在本章中了解两种类型的访问控制列表。
1. 文件系统访问控制列表
大多数文件系统中的访问控制列表拥有三种类型的权限(授权允许以特定方式访问特定资源):读取,允许用户访问文件或目录的内容;写入,允许用户写入文件或目录;执行,如果文件包含能够在相关系统上运行的程序或脚本,则允许用户执行文件内容。
一个文件或目录还可以附加多个访问控制列表。例如,在类似UNIX的操作系统中,给定文件可能有单独的针对特定用户或群组的访问列表。系统可能会授予某些个人用户(如特定开发人员)特定的读取、写入和执行权限;授予某些用户群组(如全体开发人员群组)不同的读取、写入和执行权限;授予任何其他经过身份验证的用户第三类读取、写入和执行权限。在基于Linux的操作系统上,你可以通过输入以下命令来查看这三组权限:
图3-3中显示了系统中的权限。
图3-3 类似UNIX操作系统上的文件权限
图3-3中每一行代表单个文件的权限。第一个文件ucf.conf的权限显示如下:
这看起来可能有点神秘。把命令符分为以下几个部分会有助于解读这些权限:
第一个字符通常表示文件类型:-
表示常规文件,d
表示目录。第二段表示拥有文件权限的用户,并设置为rw -
,意味着用户可以读写,但不能执行文件。
第三段群组权限被设置为r- -
,意味着被授予文件所有权的群组成员可以读取该文件,但不能写入或执行该文件。最后一段也被设置为r- -
,意味着任何非文件所有者或非文件群组成员的用户也可以读取,但不能写入或执行。在Linux系统中,用户权限仅适用于单个用户,群组权限适用于单个群组。
通过使用文件权限集,可以控制访问使用你的文件系统的操作系统和应用程序。大多数文件系统所使用的系统与分配权限的系统相似。
2. 网络访问控制列表
如果查看网络上的各种活动,无论是私有的还是公开的,你都会注意到控制活动的访问控制列表。在网络访问控制列表中,你通常基于网络事务标识符过滤访问,例如互联网协议(Internet Protocol,IP)地址、媒介访问控制地址和端口。你可以在网络基础设施(如路由器、交换机和防火墙设备)、软件防火墙、类似Facebook和Google等网站、电子邮件以及其他形式的软件中看到这样的访问控制列表。
网络访问控制列表中的权限往往是二元的,通常用于允许或拒绝某些活动,而不是读取、写入和执行。网络访问控制列表授予的权限通常针对流量,而不是用户。例如,当设置访问控制列表时,可以使用选定的一个或多个标识符,指明你引用哪种流量以及是否允许引用该流量。最好依靠多个标识符来过滤流量,原因你很快就会清楚。
媒介访问控制地址过滤是面向网络访问控制列表的最简单的形式之一。媒介访问控制地址是给定系统中对每个网络接口硬编码的唯一标识符。
遗憾的是,大多数操作系统中的软件设置可能会覆盖网络接口的媒介访问控制地址。由于更改起来很容易,因此它并非网络设备唯一标识符的最佳选项。
你可以改用IP地址。理论上,IP地址是分配给任何使用IP通信的网络中每台设备的唯一地址。你可以基于单个地址或整个IP地址范围进行过滤。例如,你可以允许10.0.0.2到10.0.0.10的IP地址传输流量,但拒绝10.0.0.11及以上的任何流量。然而,与媒介访问控制地址一样,你可以伪造IP地址,而且它们不是网络接口所特有的。此外,互联网服务提供商发布的IP地址经常变化,因此将IP地址作为过滤的唯一基础也存在不稳定因素。
黑洞
一些组织,如运营Web服务器、邮件服务器和互联网其他服务的组织,采用大规模过滤来阻止已知的攻击、垃圾邮件发送者和其他恶意流量。这种过滤可能包括丢弃来自单个IP地址、某个范围的IP地址或大型组织、互联网服务提供商甚至整个国家的整个IP空间的流量。这通常被称为黑洞,因为从用户的角度看,发送到过滤目的地的任何流量似乎都消失在黑洞之中。
第三种过滤流量的方式是使用在网络上用于通信的端口。网络端口是两台设备之间连接的数字标识,用于标记流量应路由到的应用程序。许多常见的服务和应用程序使用的是特定端口。例如,FTP使用20和21端口来传输文件,交互式邮件存取协议(Internet Message Access Protocol,IMAP)使用143端口来管理电子邮件,安全外壳(Secure Shell,SSH)使用的是22端口来管理到系统的远程连接。还有更多的例子,因为总计有65 535个端口。
你可以允许或拒绝来自或发送到你想要管理的任何端口的流量,控制网络上许多应用程序的使用。但与媒介访问控制和IP地址一样,应用程序使用的特定端口是约定,而不是绝对规则。你可以相对轻松地将应用程序使用的端口更改为完全不同的端口。
正如你刚才看到的,如果使用单一属性来构建网络访问控制列表,你可能会遇到各种问题。如果你使用的是IP地址,其属性可能不是唯一的。如果你使用的是媒介访问控制地址,你的属性将很容易更改,如果你使用端口,则依赖的是协议而不是规则。
当把几个属性组合在一起时,你将开始获得一种更安全的技术。例如,通常同时使用IP地址和端口,这种组合通常称为套接字(socket)。在使用套接字时,你能够通过网络上一个或多个应用程序,以可行的方式允许或拒绝来自一个或多个IP地址的网络流量。
你还可以构建访问控制列表,根据各种其他标准进行过滤。在某些情况下,你需要根据更具体的信息,如单个数据包或相关的一系列数据包的内容来允许或拒绝流量。你在使用这些技术时,可以过滤掉非法共享的受版权保护的资料的相关流量。
3. ACL系统的弱点
使用ACL管理权限的系统容易受到混淆代理问题的攻击。当具有资源访问权限的软件(代理)拥有比控制软件的用户更高级别的资源访问权限时,就会出现这类问题。如果你能欺骗软件滥用其更高级别的权限,你就有可能实施攻击[1]。
多种攻击实际上就利用了混淆代理问题。这通常涉及欺骗用户采取一些行动,而让他们真正认为自己在做完全不同的事情。许多攻击是客户端攻击,利用了用户计算机上运行的应用程序的弱点。这些攻击可能是通过Web浏览器发送并在本地计算机上执行的代码、格式错误的PDF文件,或嵌入攻击代码的图片和视频。在过去几年中,软件供应商越来越关注这类攻击,并开始在他们的软件中构建防御措施,但也经常出现新的攻击。跨站请求伪造(Cross-Site Request Forgery,CSRF)和点击劫持(clickjacking)是两种常见的利用混淆代理问题的攻击。
跨站请求伪造是一种滥用用户计算机浏览器权限的攻击。如果攻击者知道或可以猜到已经验证用户身份的网站,类似Amazon.com这样的常见网站,攻击者就可以在网页或基于HTML的电子邮件中嵌入链接,通常指向由攻击者控制的网站所托管的图片。当目标的浏览器试图获取链接中的图片时,同时会执行攻击者嵌入的附加命令,并常常以目标完全不可见的方式执行。
在图3-4所示的示例中,攻击者嵌入了将资金从BankCo账户转移到攻击者离岸账户的请求。由于BankCo服务器将请求视为来自经过身份验证和授权的用户,因此会继续转账。在这个示例中,混淆代理的是银行的服务器。
图3-4 跨站请求伪造攻击示例
点击劫持,也称为用户界面伪装,是一种特别狡猾且有效的客户端攻击,利用了较新的Web浏览器所提供的页面渲染功能。攻击者实施点击劫持攻击,必须合法控制或已经控制网站的某一部分。攻击者通过在客户常点击的地方放置一个看不见的层来创建或修改站点,这会导致客户端执行的命令与他们认为正在执行的命令不同。你可以通过点击劫持攻击欺骗客户购买、更改应用程序或操作系统中的权限,或执行其他多余的活动。
3.2.2 能力
ACL基于指定资源、标识符和一组权限来定义权限,其通常保存在某种类型的文件中。然而,你也可以基于用户的令牌或密钥定义权限,它们也称为能力。虽然令牌在大多数情况下不是实物,但你可以把它想象成用来打开楼门的徽章。这座大楼只有一道门,很多人都有一个可以开门的令牌,但是每个人都有不同的访问等级。一个人可能只被允许在工作日的营业时间进入大楼,而另一个人可能会被允许在一周中任何一天的任何时间进入大楼。
在基于能力的系统中,访问资源的权限完全基于拥有令牌,而不是谁拥有令牌。如果你将令牌交给其他人,他就能够以你所拥有的任何权限进入大楼。当涉及逻辑资产时,应用程序可以与其他应用程序共享令牌。
如果你使用能力而不是ACL来管理权限,那么可以防止混淆代理攻击。由于攻击者无法滥用用户权限,因此跨站请求伪造和点击劫持攻击就无法发生,除非攻击者有权访问用户的令牌。