翻译:中国科学技术大学信息安全专业老师 第二部分实践 第六章Unix的安全 现在,我们已经考察了各种独立的安全机制。在真正的实现中,它们是互相依赖的。例如,访问控制和授权必须 协同工作,缺了任何一方,另一方都不能有效地工作。所以,我们现在转入对操作系统提供的安全机制的考察。Unix 是我们的第一个例子,它让我们有机会在一个相当具体的层次上考察安全机制。 目标: 理解一个典型的操作系统提供的安全特性 介绍Unx安全基础 明白一般的安全原则在一个实际系统中是如何实现的 懂得在持续变化的环境中进行安全管理的任务。 6概述 操作系统通过组合诸如识别、验证、访问控制和审计等模块实现统一的安全控制。一旦我们决定提供灵活且特性 多样的安全策略,安全机制就会越来越复杂。在那些环境下,对内核来说,可信计算基础础(TCB)会显得太大。现在 我们在层次模型(图6.1)中,来考察操作系统这个层次所提供的安全控制。 当评价一个操作系统的安全时,下列问题可以指导分析过程 实现了哪些安全特征? 这些安全特征是怎么管理的? 这些安全特征的有效性如何保证? 应用 服务 操作系统 硬件 图6.1操作系统的保护 在大部分操作系统中,有一种一般模式指导安全控制的组织。用户(访问主体)的信息存储在用户帐号中。任何授 予用户的权限(特权, privilege)都可以存储在这个帐号中。识别(身份识别, identification)和验证(身份验证, authentication)检査(鉴定)用户的身份,使系统把用户的权限和用户所启动的进程联系起来。资源(对象(客体, object))舶的许可由系统管理员或者资源的属主设置。在决定是否允许或拒绝访问请求时,操作系统可以参考用户标识 (身份, identity)、用户权限和对象的许可(权限, permission)情况。 安全机制不仅负责防止非授权的行为,还负责检测这些行为。我们必须面对攻击者可能会绕过保护机制这样的事 实。必须采取措施记录用户的行为以便考察安全漏洞(破坏, breaches)或者追踪可能的攻击。所以,操作系统必须 保存并保护好安全相关事件的审计日志(审计索引(踪迹,tai))。 最后,如果运用不得法,再好的操作系统的安全特性也是没有价值的。一个系统必须开始于一个安全的状态,所 第1页共45页创建日期:2003-11
翻译:中国科学技术大学信息安全专业老师 第 1 页 共 45 页 创建日期:2003-11 第二部分 实践 第六章 Unix 的安全 现在,我们已经考察了各种独立的安全机制。在真正的实现中,它们是互相依赖的。例如,访问控制和授权必须 协同工作,缺了任何一方,另一方都不能有效地工作。所以,我们现在转入对操作系统提供的安全机制的考察。Unix 是我们的第一个例子,它让我们有机会在一个相当具体的层次上考察安全机制。 目标: ⚫ 理解一个典型的操作系统提供的安全特性; ⚫ 介绍 Unix 安全基础; ⚫ 明白一般的安全原则在一个实际系统中是如何实现的; ⚫ 懂得在持续变化的环境中进行安全管理的任务。 6.1 概述 操作系统通过组合诸如识别、验证、访问控制和审计等模块实现统一的安全控制。一旦我们决定提供灵活且特性 多样的安全策略,安全机制就会越来越复杂。在那些环境下,对内核来说,可信计算基础础 (TCB)会显得太大。现在 我们在层次模型(图 6.1)中,来考察操作系统这个层次所提供的安全控制。 当评价一个操作系统的安全时,下列问题可以指导分析过程: ⚫ 实现了哪些安全特征? ⚫ 这些安全特征是怎么管理的? ⚫ 这些安全特征的有效性如何保证? 在大部分操作系统中,有一种一般模式指导安全控制的组织。用户(访问主体)的信息存储在用户帐号中。任何授 予用户的权限(特权,privilege)都可以存储在这个帐号中。识别(身份识别,identification)和验证(身份验证, authentication)检查(鉴定)用户的身份,使系统把用户的权限和用户所启动的进程联系起来。资源(对象(客体, object))的许可由系统管理员或者资源的属主设置。在决定是否允许或拒绝访问请求时,操作系统可以参考用户标识 (身份,identity)、用户权限和对象的许可(权限,permission)情况。 安全机制不仅负责防止非授权的行为,还负责检测这些行为。我们必须面对攻击者可能会绕过保护机制这样的事 实。必须采取措施记录用户的行为以便考察安全漏洞(破坏,breaches)或者追踪可能的攻击。所以,操作系统必须 保存并保护好安全相关事件的审计日志(审计索引(踪迹,trail))。 最后,如果运用不得法,再好的操作系统的安全特性也是没有价值的。一个系统必须开始于一个安全的状态,所 应用 服务 操作系统 操作系统内核 硬件 图 6.1 操作系统的保护
翻译:中国科学技术大学信息安全专业老师 以,操作系统的安装和配置是很重要的问题。不当的缺省配置可能成为主要的安全弱点。操作系统是非常复杂且不断 演变的软件系统。所以,总是有可能在新的发行版本中检测到或者引入新的漏洞。警觉的系统管理员必须时常查阅 CERT( Computer Emergency Response Teams,计算机紧急事件响应小组),获得安全忠告,以便和现时的安全发展同 我们已经勾画出一个构建系统安全的框架: 登录和用户帐户 访问控制 审计 ●配置和管理 本章考察Unix系统的安全特性。由于历史原因,Unix显得不够可靠和安全(参见[102]),不过它确实提供了 套安全措施,如果使用得当,还是相当有效的。Unⅸ的版本很多,这些版本之间在技术和安全控制的执行上存在差别。 不过,现在正在尝试对Unⅸx安全进行标准化。 POSIX1003系列的标准定义了Unⅸx系统的通用接口,其中的 POSIX 1003.6就是涉及安全机制的。本章并不是对Un安全的完整的介绍,也不是指导如何建立安全的Unⅸ系统。我们的 介绍限于对Unⅸx安全基础的考察,同时突出可以阐明一般原则的安全特性。我们选择的角度较为接近人机标尺上的 机器端(图62)。 特殊的 普通的 复合的 简单的 集中于用户 集中于数据 用户端 机器端 图62人机标尺上的Unx安全 62Unix安全体系结构 大多数安全操作系统的安全体系结构解释了如何实施安全措施和安全相关数据的保存,而Unx却有一个版本分 分合合的历史。公正地反映了客观情况的是,安全特性并不作为一个原始设计目标,而是在有需求的时候才被加入系 统。随着Unix的发展,新的安全控制被加入,现存的控制机制得到加强。设计者在决定如何实现新的特性时,考虑 得最多的还是尽量避免触动Unⅸx现有的结构。 63登录和用户帐号 Unix通过用户名识别用户,通过口◇进行验证。许多Unx系统中的口令限制在八个字符内。口令由 crypto3)算 法加密,以全零数据块作为初始值,口令作为密钥,用稍做修改的DES算法重复计算25次,得到的密文存放在 etc/passwd文件中。文件中的条目格式如下 user name: encrypted password: user ID: group ID: ID string: home directory: login shell 字段 ID string是用户的全名。serD和 group ID会在稍后介绍。最后两个字段指明了用户的主目录和成功登录后可 用的shel(命令行解释器)。系统的行为在retc/ profile里指明。关于用户特定配置的进一步说明在用户主目录的 profile 文件中定义。用户最后一次登录记录放在/usr/ adm/lastlog中,可以通过 finger命令显示。用cat/ etc/passwd或者less /ec/ passwd显示口令文件时会有如下输出: dieter: RT. QSZE EsxT92: 10026: Dieter Gollman /home/staff/dieter: /usr/local/bin/bash 口令字段为空表示用户不需要在登录时提供口令。口令字段以一个星号开头,表示用户无法登录,因为对明文口令单 向加密不可能出现这样的值,这是禁止一个用户帐号的常用方法 用户可以通过 passwd(1)改变口令。这要求你首先提供旧口令,这是为了防止有人在你暂时离开机器的时候(这 可是个不好的习惯)改变你的口令。因为输入口令时字符不回显,所以你必须两次输入新口令来保证你想输入的和你 实际输入的保持一致。口令改变后,你可以重新登录或者用su(I) set user)命令确认变更 有些面向安全的Unⅸx版本提供进一步的措施来保证口令安全。口令可能被“盐化”( be salted)并保存在一个影子 口令文件中,比如 secure/ete/passwd。避免使用脆弱口令是选择口令时的好习惯,也可以设置口令的无效日期以及控 第2页共45页创建日期:2003-11
翻译:中国科学技术大学信息安全专业老师 第 2 页 共 45 页 创建日期:2003-11 以,操作系统的安装和配置是很重要的问题。不当的缺省配置可能成为主要的安全弱点。操作系统是非常复杂且不断 演变的软件系统。所以,总是有可能在新的发行版本中检测到或者引入新的漏洞。警觉的系统管理员必须时常查阅 CERT(Computer Emergency Response Teams,计算机紧急事件响应小组),获得安全忠告,以便和现时的安全发展同 步。 我们已经勾画出一个构建系统安全的框架: ⚫ 登录和用户帐户 ⚫ 访问控制 ⚫ 审计 ⚫ 配置和管理 本章考察 Unix 系统的安全特性。由于历史原因,Unix 显得不够可靠和安全(参见[102]),不过它确实提供了一 套安全措施,如果使用得当,还是相当有效的。Unix 的版本很多,这些版本之间在技术和安全控制的执行上存在差别。 不过,现在正在尝试对 Unix 安全进行标准化。POSIX 1003 系列的标准定义了 Unix 系统的通用接口,其中的 POSIX 1003.6 就是涉及安全机制的。本章并不是对 Unix 安全的完整的介绍,也不是指导如何建立安全的 Unix 系统。我们的 介绍限于对 Unix 安全基础的考察,同时突出可以阐明一般原则的安全特性。我们选择的角度较为接近人机标尺上的 机器端(图 6.2)。 特殊的 普通的 复合的 简单的 集中于用户 集中于数据 用户端 机器端 图 6.2 人机标尺上的 Unix 安全 6.2 Unix 安全体系结构 大多数安全操作系统的安全体系结构解释了如何实施安全措施和安全相关数据的保存,而 Unix 却有一个版本分 分合合的历史。公正地反映了客观情况的是,安全特性并不作为一个原始设计目标,而是在有需求的时候才被加入系 统。随着 Unix 的发展,新的安全控制被加入,现存的控制机制得到加强。设计者在决定如何实现新的特性时,考虑 得最多的还是尽量避免触动 Unix 现有的结构。 6.3 登录和用户帐号 Unix 通过用户名识别用户,通过口令进行验证。许多 Unix 系统中的口令限制在八个字符内。口令由 crypt(3)算 法加密,以全零数据块作为初始值,口令作为密钥,用稍做修改的 DES 算法重复计算 25 次,得到的密文存放在 /etc/passwd 文件中。文件中的条目格式如下: user name: encrypted password: user ID: group ID: ID string: home directory: login shell 字段 ID string 是用户的全名。user ID 和 group ID 会在稍后介绍。最后两个字段指明了用户的主目录和成功登录后可 用的 shell(命令行解释器)。系统的行为在/etc/profile 里指明。关于用户特定配置的进一步说明在用户主目录的.profile 文件中定义。用户最后一次登录记录放在/usr/adm/lastlog 中,可以通过 finger 命令显示。用 cat /etc/passwd 或者 less / etc/passwd 显示口令文件时会有如下输出: dieter:RT.QsZEEsxT92:10026:Dieter Gollman:/home/staff/dieter:/usr/local/bin/bash 口令字段为空表示用户不需要在登录时提供口令。口令字段以一个星号开头,表示用户无法登录,因为对明文口令单 向加密不可能出现这样的值,这是禁止一个用户帐号的常用方法。 用户可以通过 passwd(1)改变口令。这要求你首先提供旧口令,这是为了防止有人在你暂时离开机器的时候(这 可是个不好的习惯)改变你的口令。因为输入口令时字符不回显,所以你必须两次输入新口令来保证你想输入的和你 实际输入的保持一致。口令改变后,你可以重新登录或者用 su(1)(set user)命令确认变更。 有些面向安全的 Unix 版本提供进一步的措施来保证口令安全。口令可能被“盐化”(be salted)并保存在一个影子 口令文件中,比如/.secure/etc/passwd。避免使用脆弱口令是选择口令时的好习惯,也可以设置口令的无效日期以及控
翻译:中国科学技术大学信息安全专业老师 制旧口令的重用。以超级用户Root身份登录可被限制在! ete/ttys中指定的终端上进行。第三方Unix安全产品提供类 似的安全服务 631用户和超级用户 Unix用一个用户名代表用户,用户名最多有8个字符,内部表示为一个16位的数字,即用户 IDqUID)。UID和 用户名通过 /etc/passwd映射。Unix不区分拥有相同UID的用户。一些UID有特殊的意义,如图63所示 root daemon uucp games audit 图63特殊的用户ID 每个Unⅸ系统中都有一个特权用户,这个超级用户的UD为0,用户名通常为root。这个根帐号被操作系统用 来执行基本的任务,比如登录、记录审计信息或者访问LAO设备等。几乎所有的安全检查都对超级用户关闭,在执行 某些系统管理任务时根帐号也是必要的。系统管理员不应该把根帐号当成他的个人帐号。需要使用超级用户时可以通 过不指定用户名的/ ete/su命令变普通帐号为根帐号 超级用户几乎可以做任何事情。例如超级用户可以变为任何别的用户,可以改变系统时钟,可以绕过施加于他的 某些限制。例如,以只读模式挂上的文件系统本来是不能写的,超级用户却可以通过先卸下该文件系统再以可写模式 重新挂上它来绕过写的限制。不过超级用户不能解开口令,因为 crypt是单向函数。 超级用户如此强大,因此它也成为Unⅸ的一个主要弱点。处于超级用户状态的攻击者实际上接管了整个系统, 必须采取每一个可能的防范措施来控制普通用户获得超级用户状态。文件/etc/ passwd和/ etc/group必须有写保护。有 编辑/ etc/passwd文件能力的攻击者通过把UID变为0就可以成为超级用户。使用/ bin/su将普通用户改变为超级用户 则避免了让操作系统调用其他什么人的目录中的s。把所有su的调用试图连同调用者都记载在审计日志中。分散系 统管理者的工作职责,例如让uucp或者 daemon处理网络事务。特殊帐号中的一个出现问题不会造成全盘的损害。 6.32属组 用户隶属于一个或多个组。以组的方式来组织用户提供了访问控制决策的方便的基础。例如,把可以访问e-mail 的所有用户放进mai组,把可以进行所有操作的用户放进 operator组。每个用户都属于一个基本组 (primary group) primary组的标识符ID(GID)存储在 etc/passwd中。文件 etc/group包括了属组的列表。其中的表项格式如下 group name: group password: GID: list of users 例如,表项 infosecwww:*: 209: chez, af 告诉我们 infosecwww组没有口令,GID为209,并且有两个成员chez和af。图64列出了有特殊意义的组ID 在 System V Unix上,一个用户在一个时刻只能属于一个组。可以用 newer命令修改当前属组。用户可自由改 到他已为成员的组。否则,当用户试图改到一个他不是成员的属组时, newer会要求用户提供一个口令,如果组口 令正确,用户就会被收纳成为此组的暂时成员。在 Berkley Unix中,用户可以同时属于多个组,所以 newer命令是 不必要的 svstem/whee daemon men 7 terminal 图64有特殊意义的组ID 第3页共45页创建日期:2003-11
翻译:中国科学技术大学信息安全专业老师 第 3 页 共 45 页 创建日期:2003-11 制旧口令的重用。以超级用户 Root 身份登录可被限制在/etc/ttys 中指定的终端上进行。第三方 Unix 安全产品提供类 似的安全服务。 6.3.1 用户和超级用户 Unix 用一个用户名代表用户,用户名最多有 8 个字符,内部表示为一个 16 位的数字,即用户 ID(UID)。UID 和 用户名通过/etc/passwd 映射。Unix 不区分拥有相同 UID 的用户。一些 UID 有特殊的意义,如图 6.3 所示。 -2 nobody 0 root 1 daemon 2 uucp 3 bin 4 games 9 audit 图 6.3 特殊的用户 ID 每个 Unix 系统中都有一个特权用户,这个超级用户的 UID 为 0,用户名通常为 root。这个根帐号被操作系统用 来执行基本的任务,比如登录、记录审计信息或者访问 I/O 设备等。几乎所有的安全检查都对超级用户关闭,在执行 某些系统管理任务时根帐号也是必要的。系统管理员不应该把根帐号当成他的个人帐号。需要使用超级用户时可以通 过不指定用户名的/etc/su 命令变普通帐号为根帐号。 超级用户几乎可以做任何事情。例如超级用户可以变为任何别的用户,可以改变系统时钟,可以绕过施加于他的 某些限制。例如,以只读模式挂上的文件系统本来是不能写的,超级用户却可以通过先卸下该文件系统再以可写模式 重新挂上它来绕过写的限制。不过超级用户不能解开口令,因为 crypt 是单向函数。 超级用户如此强大,因此它也成为 Unix 的一个主要弱点。处于超级用户状态的攻击者实际上接管了整个系统, 必须采取每一个可能的防范措施来控制普通用户获得超级用户状态。文件/etc/passwd 和/etc/group 必须有写保护。有 编辑/etc/passwd 文件能力的攻击者通过把 UID 变为 0 就可以成为超级用户。使用/bin/su 将普通用户改变为超级用户 则避免了让操作系统调用其他什么人的目录中的 su。把所有 su 的调用试图连同调用者都记载在审计日志中。分散系 统管理者的工作职责,例如让 uucp 或者 daemon 处理网络事务。特殊帐号中的一个出现问题不会造成全盘的损害。 6.3.2 属组 用户隶属于一个或多个组。以组的方式来组织用户提供了访问控制决策的方便的基础。例如,把可以访问 e-mail 的所有用户放进 mail 组,把可以进行所有操作的用户放进 operator 组。每个用户都属于一个基本组(primary group)。 primary 组的标识符 ID(GID)存储在/etc/passwd 中。文件/etc/group 包括了属组的列表。其中的表项格式如下: group name: group password: GID: list of users 例如,表项 infosecwww: *: 209: chez,af 告诉我们 infosecwww 组没有口令,GID 为 209,并且有两个成员 chez 和 af。图 6.4 列出了有特殊意义的组 ID。 在 System V Unix 上,一个用户在一个时刻只能属于一个组。可以用 newgrp 命令修改当前属组。用户可自由改 到他已为成员的组。否则,当用户试图改到一个他不是成员的属组时,newgrp 会要求用户提供一个口令,如果组口 令正确,用户就会被收纳成为此组的暂时成员。在 Berkley Unix 中,用户可以同时属于多个组,所以 newgrp 命令是 不必要的。 0 system/wheel 1 daemon 2 uucp 3 men 4 bin 7 terminal 图 6.4 有特殊意义的组 ID
翻译:中国科学技术大学信息安全专业老师 633设置UID和GID 让我们回到我们最感兴趣的一个话题:调用控制。在执行某些系统调用时Unⅸx要求超级用户特权,但又不 能给普通用户以超级用户状态。所以必须找到满足这两个要求的方法。Uniⅸx采用的方法是提供设置用户标识符 SUID和设置组标识符SGID程序。这样的程序以属主或者属组的有效UID和有效GID运行,拥有暂时的或者 受限的访问权限,这些访问权限通常情况下是不赋予普通用户的。经常有这样的情况,如果root是SUID程序 的属主,这时运行这个程序的用户就会获得执行中的超级用户状态。重要的SUD程序有: /bin/passwd 改变口令 /bin/login 登录程序 /bin/at 提交批处理作业 /bin/su 改变UID程序 在这里我们照例要提出警告,既然用户拥有了运行时的SUID程序属主的特权,我们只应该让这个程序做其属主 打算做的事情。这一点对于属主是root的SUD程序尤其重要。一个可以改变SUID程序执行行为的攻击者,比如可 以中断程序执行的攻击者,不仅可以在攻击时获得超级用户权限,还可以改变系统使其在别的情况下同样具有这样的 权限。这方面的危险发生在有用户交互的SUID程序中。一个特别的漏洞是” shell escapes”,它使用户能以超级用户权 限运行 shell命令。除非实在必要,程序不应该被设置SUD。系统管理员应该注意监视SUD程序的完整性。参考文 献55给出了两个SUID程序被用作成功攻击的研究实例 64访问控制 访问控制是基于用户属性和资源(亦即文件、IO设备、内存等)属性之上的。标准的Unix系统以属主( owner)、属 组( group)、其他人( world)三个粒度进行控制。超级用户不受这种访问控制的限制。Unx以统一的方式处理所有的资源 它并不区分文件和设备 64.1Unix文件结构 Unⅸx以树型结构组织文件系统,这个系统包括文件和目录。目录里的每个文件条目是一个指针,指向一个叫做 i-结点(inde)的数据结构。图65给出了结点中与访问控制有关的字段。每个目录有一个指向自身的文件“”,还有 个指向它的父目录的文件“”。每个文件有一个属主,通常这个属主是建立文件的用户。每个文件都属于某个组。新 建文件有可能属于它的建立者的属组,也有可能属于它的目录的属组,取决于不同的Unix版本。 在讨论i-结点中的字段之前,我们先用ls-来考察一个目录,结果如下 rw-r--r-- 1 dieter staff 1617 Oct 2811: 01 adcryptex drwx-----. 2 dieter staff 512 Oct 2517: 44 ads/ 分析一下得到的信息: 第一个字符给出了文件的类型。“”表示是一个常规文件,“d”表示是一个目录,“b”代表一个块设备文件,而 “c”代表一个字符设备文件 接下来的九个字符给出了文件的许可位,下面还要讨论 后面的数字字段是链接计数器,它给出了链接到这个文件上的链接(指针)数目 接下来的两个字段是文件属主和属组的名字; 然后是文件的字节大小 接下来的时间和日期是 mtime,即最后修改的时间。ls-lu显示 atime,即最后访问的时间,ls-显示 itime 即最后对i-结点进行修改的时间 最后一个字段是文件的名字。ads后面的”表示是一个目录。 文件类型和访问权限 文件属主 d 文件属组 文件的最后访问时间 mtime 文件的最后修改时间 Itime 结点的最后修改时间 block count文件大小 物理位置 图6.5i结点中的精选字段 第4页共45页创建日期:2003-11
翻译:中国科学技术大学信息安全专业老师 第 4 页 共 45 页 创建日期:2003-11 6.3.3 设置 UID 和 GID 让我们回到我们最感兴趣的一个话题:调用控制。在执行某些系统调用时 Unix 要求超级用户特权,但又不 能给普通用户以超级用户状态。所以必须找到满足这两个要求的方法。Unix 采用的方法是提供设置用户标识符 SUID 和设置组标识符 SGID 程序。这样的程序以属主或者属组的有效 UID 和有效 GID 运行,拥有暂时的或者 受限的访问权限,这些访问权限通常情况下是不赋予普通用户的。经常有这样的情况,如果 root 是 SUID 程序 的属主,这时运行这个程序的用户就会获得执行中的超级用户状态。重要的 SUID 程序有: /bin/passwd 改变口令 /bin/login 登录程序 /bin/at 提交批处理作业 /bin/su 改变 UID 程序 在这里我们照例要提出警告,既然用户拥有了运行时的 SUID 程序属主的特权,我们只应该让这个程序做其属主 打算做的事情。这一点对于属主是 root 的 SUID 程序尤其重要。一个可以改变 SUID 程序执行行为的攻击者,比如可 以中断程序执行的攻击者,不仅可以在攻击时获得超级用户权限,还可以改变系统使其在别的情况下同样具有这样的 权限。这方面的危险发生在有用户交互的 SUID 程序中。一个特别的漏洞是”shell escapes”,它使用户能以超级用户权 限运行 shell 命令。除非实在必要,程序不应该被设置 SUID。系统管理员应该注意监视 SUID 程序的完整性。参考文 献 55 给出了两个 SUID 程序被用作成功攻击的研究实例。 6.4 访问控制 访问控制是基于用户属性和资源(亦即文件、I/O 设备、内存等)属性之上的。标准的 Unix 系统以属主(owner)、属 组(group)、其他人(world)三个粒度进行控制。超级用户不受这种访问控制的限制。Unix 以统一的方式处理所有的资源, 它并不区分文件和设备。 6.4.1 Unix 文件结构 Unix 以树型结构组织文件系统,这个系统包括文件和目录。目录里的每个文件条目是一个指针,指向一个叫做 i-结点(inode)的数据结构。图 6.5 给出了 i-结点中与访问控制有关的字段。每个目录有一个指向自身的文件“.”,还有一 个指向它的父目录的文件“..”。每个文件有一个属主,通常这个属主是建立文件的用户。每个文件都属于某个组。新 建文件有可能属于它的建立者的属组,也有可能属于它的目录的属组,取决于不同的 Unix 版本。 在讨论 i-结点中的字段之前,我们先用 ls –l 来考察一个目录,结果如下: -rw-r--r-- 1 dieter staff 1617 Oct 28 11:01 adcryp.tex drwx------ 2 dieter staff 512 Oct 25 17:44 ads/ 分析一下得到的信息: ⚫ 第一个字符给出了文件的类型。“-”表示是一个常规文件,“d”表示是一个目录,“b”代表一个块设备文件,而 “c”代表一个字符设备文件; ⚫ 接下来的九个字符给出了文件的许可位,下面还要讨论; ⚫ 后面的数字字段是链接计数器,它给出了链接到这个文件上的链接(指针)数目; ⚫ 接下来的两个字段是文件属主和属组的名字; ⚫ 然后是文件的字节大小; ⚫ 接下来的时间和日期是 mtime,即最后修改的时间。ls –lu 显示 atime,即最后访问的时间,ls –lc 显示 itime, 即最后对 i-结点进行修改的时间; ⚫ 最后一个字段是文件的名字。ads 后面的”/”表示是一个目录。 mode 文件类型和访问权限 uid 文件属主 gid 文件属组 atime 文件的最后访问时间 mtime 文件的最后修改时间 itime i-结点的最后修改时间 block count 文件大小 物理位置 图 6.5 i-结点中的精选字段
翻译:中国科学技术大学信息安全专业老师 文件访问许可位分为三组,分别定义了属主、属组和其他人的读、写和执行的权限。“表示权限没有被授予。所 以rwr-r-表示属主有读写权,属组和其他人有读权。rwx--表示属主有读写和执行的权力,属组和其他人没有任 何权利。 用ls-显示一个SUID程序的时候,属主的执行位用s,而不是用x表示: rws--X--3 root bin 16384 Nov 16 1996 passwd* 用ls-显示一个SGID程序的时候,属组的执行位用s,而不是用x表示 许可位以下面的次序检验: 如果你的uid指出你是文件的属主,那么属主许可位决定了你可否访问 如果你的ud表明你不是文件的属主,但是你的gid指出你的属组拥有这个文件,那么属组许可位决定了你可否 访问; 如果你既不是文件的属主,也不是拥有文件的属组的成员,那么其他人许可位决定了你可否访问。 所以,设置许可位让文件的属主比其他用户拥有更少的权力是可能的。也许这样不太合乎常理,但是却是相 当有价值的想法。不管是哪一种访问控制机制,你必须精确地知道不同的访间标准的校验次序 642改变许可 文件的许可位可以用 chmod命令修改,这个修改的执行者只能是文件的属主或者超级用户。这个命令有如下的 格式 hmod [] absolute file 指定所有许可位的值 chmod|- RI whol+ permission file添加许可 chmod|- RI whol- permission file删除许可 chmod- RI whol= permission file重置许可 在绝对模式中,文件许可由一个八进制数直接指定。这些数字的意义如图66所示。例如,许可rwr--用 chmod644 设置。对所有人授予所有权力用 chmod777设置。 40投子用户1执行权(见下文 2000授予组ID执行权(见下文) 1000设置粘住位(见下文) 0400属主有读权 0200属主有写权 0100属主有执行权 0040属组有读权 000属组有写权 0010属组有执行权 0004其他人有读权 002其他人有写权 001其他人有执行权 图6.6访问许可的八进制表示 在符号模式下,当前文件许可位被修改。参数who可以用以下值带入 改变属主许可 g改变属组许可 改变其他人许可 a改变所有人许可 permission参数可以用以下值带入 r读许可 第5页共45页创建日期:2003-11
翻译:中国科学技术大学信息安全专业老师 第 5 页 共 45 页 创建日期:2003-11 文件访问许可位分为三组,分别定义了属主、属组和其他人的读、写和执行的权限。“-”表示权限没有被授予。所 以 rw-r--r--表示属主有读写权,属组和其他人有读权。rwx------表示属主有读写和执行的权力,属组和其他人没有任 何权利。 用 ls –l 显示一个 SUID 程序的时候,属主的执行位用 s,而不是用 x 表示: -rws--x--3 root bin 16384 Nov 16 1996 passwd* 用 ls –l 显示一个 SGID 程序的时候,属组的执行位用 s,而不是用 x 表示: 许可位以下面的次序检验: ⚫ 如果你的 uid 指出你是文件的属主,那么属主许可位决定了你可否访问; ⚫ 如果你的 uid 表明你不是文件的属主,但是你的 gid 指出你的属组拥有这个文件,那么属组许可位决定了你可否 访问; ⚫ 如果你既不是文件的属主,也不是拥有文件的属组的成员,那么其他人许可位决定了你可否访问。 所以,设置许可位让文件的属主比其他用户拥有更少的权力是可能的。也许这样不太合乎常理,但是却是相 当有价值的想法。不管是哪一种访问控制机制,你必须精确地知道不同的访问标准的校验次序。 6.4.2 改变许可 文件的许可位可以用 chmod 命令修改,这个修改的执行者只能是文件的属主或者超级用户。这个命令有如下的 格式: chmod [-fR] absolute file 指定所有许可位的值 chmod [-fR] [who] +permission file 添加许可 chmod [-fR] [who] - permission file 删除许可 chmod [-fR] [who] = permission file 重置许可 在绝对模式中,文件许可由一个八进制数直接指定。这些数字的意义如图 6.6 所示。例如,许可 rw-r--r--用 chmod 644 设置。对所有人授予所有权力用 chmod 777 设置。 4000 授予用户 ID 执行权(见下文) 2000 授予组 ID 执行权(见下文) 1000 设置粘住位(见下文) 0400 属主有读权 0200 属主有写权 0100 属主有执行权 0040 属组有读权 0020 属组有写权 0010 属组有执行权 0004 其他人有读权 0002 其他人有写权 0001 其他人有执行权 图 6.6 访问许可的八进制表示 在符号模式下,当前文件许可位被修改。参数 who 可以用以下值带入: u 改变属主许可 g 改变属组许可 o 改变其他人许可 a 改变所有人许可 permission 参数可以用以下值带入: r 读许可
翻译:中国科学技术大学信息安全专业老师 w写许可 x文件的执行许可,目录的搜索许可 X只有在fle是一个目录或者至少一个执行位设置的情况下的执行许可 S SUID或者SGID许可 t保存正文段许可(设置粘住位) -f选项抑止错误消息,-R选项在目前目录的所有的子目录中递归地施加这个命令。一个程序的SUID许可可以这样 设置 chmod4555ffe设置标志( suidSet suid flag) chmod u+ s file设置suid标志 chmod555fle清除suid标志 chmod u-s file清除suid标志 GUID许可不使用u,它使用g选项。 chown命令改变文件的属主, chgrp改变文件的属组。 chown是不受欢迎的SUID程序的潜在来源。一个用户可 以建立一个SUID程序,然后把它的属主变为root。为了避免这样的攻击,有些版本的Unx只允许超级用户运行 chown 别的版本允许用户使用 chown于他们自己的文件上,不过这时就关闭了SUD和SGID位。类似的考虑适用于 chgrp 64.3缺省许可位 Unⅸx工具(实用程序, utilities),比如编辑器或者编译器,在新建文件的时候,通常使用666作为缺省许可位 而在新建程序的时候,通常使用777作为缺省许可位。这些许可位可以用 umask调整。 umask是一个三个数字的八 进制数,它指定了应该被保留(抑制, be withheld)的权限。所以, umask777拒绝所有访问, umask000就不作任 何限制。敏感的缺省设置有 属主的所有许可,属组和其他人的读和执行许可 037属主的所有许可,属组的读许可,其他人没有许可 077属主的所有许可,属组和其他人没有许可 实际的缺省许可位用 umask屏蔽Unⅸx工具的缺省许可位而来。缺省的许可位和 umask的位的取反值的逻辑与被计算 比如,缺省的许可位666和 umask077 0666 AND NOT(0077 0600 这样,文件属主有读写权而其他权力被拒绝。 umask可以被下面的命令改变 umask I-S ImaskI 这里,-S显示是符号模式。如果没有模式给出,就显示当前 umask etc/ profile里的 umask定义了一个系统范围的缺省设置。这些缺省设置可以被用户重载,具体方式是设置用户的 主目录里的 umask,根据Unix的具体安装,可以在! etc/profile,, profile, login或者 cshre里。和VMS一样,不可能 为目录定义单独的缺省许可位,也不可能让它们从目录里继承许可 用cp新建文件时,文件的许可位从 umask而来。用mw通过重命名的方式新建文件时,己有的许可位被沿用 644目录的许可 每一个用户都有一个主目录。可以用 mkdir建立子目录。在一个目录里存放文件和目录,用户必须拥有正确的文 件许可位 读许可允许查找哪些文件在目录中,比如用ls或者别的类似的命令 写许可允许从目录中添加或者删除文件 执行许可在使目录为当前目录以打开文件的过程中是必要的。你可以打开你知道的在某个目录中存在的文件 但是你不能用ls查看目录内容。 所以,为了访问你自己的文件,你需要在目录中有执行许可。为了防止别的用户读你的文件,你既可以设置相应 文件的访问许可位,也可以阻止对目录的访问。为了删除文件,你需要对目录的写和执行许可。并不需要有关文件的 任何许可,它甚至可能属于别的用户。这个特性要提醒系统管理员: 第6页共45页创建日期:2003-11
翻译:中国科学技术大学信息安全专业老师 第 6 页 共 45 页 创建日期:2003-11 w 写许可 x 文件的执行许可,目录的搜索许可 X 只有在 file 是一个目录或者至少一个执行位设置的情况下的执行许可 s SUID 或者 SGID 许可 t 保存正文段许可(设置粘住位) -f 选项抑止错误消息,-R 选项在目前目录的所有的子目录中递归地施加这个命令。一个程序的 SUID 许可可以这样 设置: chmod 4555 file 设置标志(suidSet suid flag) chmod u+s file 设置 suid 标志 chmod 555 file 清除 suid 标志 chmod u-s file 清除 suid 标志 GUID 许可不使用 u,它使用 g 选项。 chown 命令改变文件的属主,chgrp 改变文件的属组。chown 是不受欢迎的 SUID 程序的潜在来源。一个用户可 以建立一个SUID程序,然后把它的属主变为root。为了避免这样的攻击,有些版本的Unix只允许超级用户运行chown。 别的版本允许用户使用 chown 于他们自己的文件上,不过这时就关闭了 SUID 和 SGID 位。类似的考虑适用于 chgrp。 6.4.3 缺省许可位 Unix 工具(实用程序,utilities),比如编辑器或者编译器,在新建文件的时候,通常使用 666 作为缺省许可位, 而在新建程序的时候,通常使用 777 作为缺省许可位。这些许可位可以用 umask 调整。umask 是一个三个数字的八 进制数,它指定了应该被保留(抑制,be withheld)的权限。所以,umask 777 拒绝所有访问,umask 000 就不作任 何限制。敏感的缺省设置有: 022 属主的所有许可,属组和其他人的读和执行许可 037 属主的所有许可,属组的读许可,其他人没有许可 077 属主的所有许可,属组和其他人没有许可 实际的缺省许可位用 umask 屏蔽 Unix 工具的缺省许可位而来。缺省的许可位和umask 的位的取反值的逻辑与被计算。 比如,缺省的许可位 666 和 umask 077 0666 AND NOT (0077) 0600 这样,文件属主有读写权而其他权力被拒绝。umask 可以被下面的命令改变; umask [-S] [mask] 这里,-S 显示是符号模式。如果没有模式给出,就显示当前 umask。 /etc/profile 里的 umask 定义了一个系统范围的缺省设置。这些缺省设置可以被用户重载,具体方式是设置用户的 主目录里的 umask,根据 Unix 的具体安装,可以在/etc/profile,profile,login 或者.cshrc 里。和 VMS 一样,不可能 为目录定义单独的缺省许可位,也不可能让它们从目录里继承许可。 用 cp 新建文件时,文件的许可位从 umask 而来。用 mv 通过重命名的方式新建文件时,已有的许可位被沿用。 6.4.4 目录的许可 每一个用户都有一个主目录。可以用 mkdir 建立子目录。在一个目录里存放文件和目录,用户必须拥有正确的文 件许可位。 ⚫ 读许可允许查找哪些文件在目录中,比如用 ls 或者别的类似的命令; ⚫ 写许可允许从目录中添加或者删除文件; ⚫ 执行许可在使目录为当前目录以打开文件的过程中是必要的。你可以打开你知道的在某个目录中存在的文件 但是你不能用 ls 查看目录内容。 所以,为了访问你自己的文件,你需要在目录中有执行许可。为了防止别的用户读你的文件,你既可以设置相应 文件的访问许可位,也可以阻止对目录的访问。为了删除文件,你需要对目录的写和执行许可。并不需要有关文件的 任何许可,它甚至可能属于别的用户。这个特性要提醒系统管理员:
翻译:中国科学技术大学信息安全专业老师 果你试图安装一个水久的文件到某一个用户的目录里,那么麻烦就真的来了。 从早期Unⅸx而来的一个遗留物是粘住位。它使一个程序的代码段在初次使用后还留在虚存中。这样系统就避免 了把经常访问的程序的代码在内存和外部页面间倒来倒去。你可以指定这个许可位,不过在OSF/中,它并无效果 用ls-查看一个带有粘住位的文件时,t出现在x本来应该出现的地方。如果一个目录被设置了粘住位,那么它的删 除就是受限的。一个设置了粘住位的目录中的文件只有在用户拥有目录的写许可并且用户是文件和目录的属主(或者 用户是超级用户)的情况下才能被删除 6.5一般安全原则的实例 在这部分,我们以Unx为实例,来看看一些我们的一般安全原则是怎么实现的。 651受控调用 一个会被多用户访问的敏感资源,比如一个口令或者配置文件,可以用组合了属主、许可位和SUD程序的受控 调用方案( scheme)加以保护: 建立一个拥有资源和全部需要访问此资源的程序的新的UID 只给这个资源属主许可 ●把需要访问资源的程序设为SUID程序。 小心保护过分。如果你拒绝了用户对他们需要以之完成工作的文件的直接访问,你必须以SUD程序的形 提供间接访问。有问题的SUID程序可能比精心设置的许可位给予用户更多的权力。在资源和SUD程序的属目 是像rot一样的特权用户时尤其是这样。 在这个例子里,我们还有一个在安全系统设计里经常出现的实例。一个抽象属性在系统里用数据结构描述,这个 数据结构又被另一个安全机制以不同的目的重用。UD被用来代表系统中真实的用户。现在,UID被用来进行一种新 的访问控制,这里它并不代表任何真实用户。66.1节会阐述因这样的设计而带来的问题。 652删除文件 这里有两个内容:逻辑的和物理的内存结构。特别的,如果我们从文件系统删除了一个文件会怎么样?这个文件 还会以某种形式存在吗? Unⅸx有两种拷贝文件的方法。p创建了一个一模一样但是独立的副本。除了cp,还有一些命令(limk,hn),它 们只是创建了一个有指针指向原来文件的文件名,同时增加了原来文件的链接数。新旧文件共享文件内容。如果原来 的文件用rm或者 rmdir删除了,那么它就从它的父目录中消失了,但是它的内容和它的拷贝依然存在。这样,用户 可能认为他们已经删除了文件,但是实际上它仍然在另外的目录中存在,而且用户仍然拥有它。如果你想彻底删除 个文件,超级用户必须运行 ncheck列出文件的所有链接并且删除这些链接。如果一个文件在被别的进程打开后由属 主删除,这个文件在进程关闭它之前都还一直存在 旦一个文件被删除,分配给它的内存空间就被释放了。不过,直到这些内存被实际地再使用,它们仍然保留着 文件的内容。为了避免这样的内存残余,在删除文件前你应该用全0或者别的合适于存储媒介的模式抹去它的内容 653设备的保护 下一个话题仍然和逻辑的和物理的内存结构的区别有关。Unix把设备像文件一样对待。这样,对内存或者对打印 机的访问都可以像访问文件一样设置许可位。设备文件用 mknod命令建立,它只能由root执行。通常可以在ldev里 发现的一个关于设备信息的小例子如下: /dev/console 控制台终端 /dev/mem 主存的映像设备(物理存储器的映像 /dev/kmem 内核存储的映像设备(虚拟存储器的映像) /dev/tty 终端 如果攻击者能够访问存放文件和目录的内存设备,那么他们就能绕过设置在其上的安全控制。如果内存设备对其 他人( world)的读写许可位被打开,攻击者就能浏览内存或者修改数据,而不受存储在此内存中的文件上设定的许可条 第7页共45页创建日期:2003-11
翻译:中国科学技术大学信息安全专业老师 第 7 页 共 45 页 创建日期:2003-11 如果你试图安装一个永久的文件到某一个用户的目录里,那么麻烦就真的来了。 从早期 Unix 而来的一个遗留物是粘住位。它使一个程序的代码段在初次使用后还留在虚存中。这样系统就避免 了把经常访问的程序的代码在内存和外部页面间倒来倒去。你可以指定这个许可位,不过在 0SF/1 中,它并无效果。 用 ls –l 查看一个带有粘住位的文件时,t 出现在 x 本来应该出现的地方。如果一个目录被设置了粘住位,那么它的删 除就是受限的。一个设置了粘住位的目录中的文件只有在用户拥有目录的写许可并且用户是文件和目录的属主(或者 用户是超级用户)的情况下才能被删除。 6.5 一般安全原则的实例 在这部分,我们以 Unix 为实例,来看看一些我们的一般安全原则是怎么实现的。 6.5.1 受控调用 一个会被多用户访问的敏感资源,比如一个口令或者配置文件,可以用组合了属主、许可位和 SUID 程序的受控 调用方案(scheme)加以保护: ⚫ 建立一个拥有资源和全部需要访问此资源的程序的新的 UID; ⚫ 只给这个资源属主许可; ⚫ 把需要访问资源的程序设为 SUID 程序。 小心保护过分。如果你拒绝了用户对他们需要以之完成工作的文件的直接访问,你必须以 SUID 程序的形式 提供间接访问。有问题的 SUID 程序可能比精心设置的许可位给予用户更多的权力。在资源和 SUID 程序的属主 是像 root 一样的特权用户时尤其是这样。 在这个例子里,我们还有一个在安全系统设计里经常出现的实例。一个抽象属性在系统里用数据结构描述,这个 数据结构又被另一个安全机制以不同的目的重用。UID 被用来代表系统中真实的用户。现在,UID 被用来进行一种新 的访问控制,这里它并不代表任何真实用户。6.6.1 节会阐述因这样的设计而带来的问题。 6.5.2 删除文件 这里有两个内容:逻辑的和物理的内存结构。特别的,如果我们从文件系统删除了一个文件会怎么样?这个文件 还会以某种形式存在吗? Unix 有两种拷贝文件的方法。cp 创建了一个一模一样但是独立的副本。除了 cp,还有一些命令(link,ln),它 们只是创建了一个有指针指向原来文件的文件名,同时增加了原来文件的链接数。新旧文件共享文件内容。如果原来 的文件用 rm 或者 rmdir 删除了,那么它就从它的父目录中消失了,但是它的内容和它的拷贝依然存在。这样,用户 可能认为他们已经删除了文件,但是实际上它仍然在另外的目录中存在,而且用户仍然拥有它。如果你想彻底删除一 个文件,超级用户必须运行 ncheck 列出文件的所有链接并且删除这些链接。如果一个文件在被别的进程打开后由属 主删除,这个文件在进程关闭它之前都还一直存在。 一旦一个文件被删除,分配给它的内存空间就被释放了。不过,直到这些内存被实际地再使用,它们仍然保留着 文件的内容。为了避免这样的内存残余,在删除文件前你应该用全 0 或者别的合适于存储媒介的模式抹去它的内容。 6.5.3 设备的保护 下一个话题仍然和逻辑的和物理的内存结构的区别有关。Unix 把设备像文件一样对待。这样,对内存或者对打印 机的访问都可以像访问文件一样设置许可位。设备文件用 mknod 命令建立,它只能由 root 执行。通常可以在/dev 里 发现的一个关于设备信息的小例子如下: /dev/console 控制台终端 /dev/mem 主存的映像设备(物理存储器的映像) /dev/kmem 内核存储的映像设备(虚拟存储器的映像) /dev/tty 终端 如果攻击者能够访问存放文件和目录的内存设备,那么他们就能绕过设置在其上的安全控制。如果内存设备对其 他人(world)的读写许可位被打开,攻击者就能浏览内存或者修改数据,而不受存储在此内存中的文件上设定的许可条
翻译:中国科学技术大学信息安全专业老师 件约束。因此几乎所有的设备都应该禁止其他人的读写 类似ps的命令显示内存的使用情况,因此需要对内存设备的访问设置许可。把ps定义为SUID将允许roo的程 序获得必要的许可,不过,对ps的损害会让攻击者得到root权限(特权, privilege)。更好的解决办法是让ps成为 SGID程序,让mm组拥有内存设备。 t!y终端设备是另外一个有趣的例子。用户登录的时候,一个终端文件就被分配给这个用户,用户就成了本次会 话中这个文件的属主。(终端文件闲置的时候,它的属主是root)。让这个文件对别人可读写是很方便的,因为这样 来,用户就可以接收来自其他用户的消息。不过,这样也带来了漏洞。别人现在可以监视进出这个终端的流量,这里 面可能包含用户的口令。他们可以向这个用户终端传送命令,比如,重新设定一个功能键,再让不知情的用户执行这 些命令。在一些系统中,智能终端会自动执行某些命令,这就给攻击者用别的用户的权限提交命令提供了机会 6.54挂接文件系统 当你拥有不同的安全区域并且要从别的区域往你的系统里引进对象的时候,你必须重新定义这些对象的访问控制 属性 Unⅸx文件系统把存在于不同物理设备上的文件系统链接在同一个根(用”P表示)下面。这是用 mount命令实现 的。在网络环境中,远程文件系统可以从别的网络结点中挂接。同样,允许用户通过他们自己的软盘驱动器挂接文件 系统 如果你是安全专家的话,警钟就要开始长鸣了。挂接上的文件系统可能包括各种不受欢迎的文件,比如,隐藏在 攻击者目录中的指向root的SUD程序。一旦文件系统被挂接,攻击者就可以通过运行此类程序获得超级用户状态。 允许直接访问内存的设备文件也很危险,在这里许可已被设置从而使攻击者可以访问这些文件。所以,命令 mount I-rl I-o options device directory 里的-r标志就表示只读挂接。 options里包括 nosuid在挂接的文件系统中关闭SUID和SGID位 noexec挂接的文件系统中的二进制文件不能被执行 nodes在挂接的文件系统中不能访问块或者字符特殊设备 当然,不同版本的Unx实现了 mount的不同的选项。 65.5改变文件系统的根 可以通过把对象放进一个未授权用户不能访问的地方来实现访问控制。在Unix中,改变根(root)命令 chroot 限制了未授权用户可访问的文件系统。这个命令只能被root执行。 chroot directory command 执行时,根目录从””变成了" directory”。只有新根目录下的文件是可访问的。如果你采用这种方案,你必须确定用户 程序可以找到所有它们所需的系统文件。这些文件的预期所在为像/bin,dev,letc,mp或者usr这样的目录。必须 在新的根目录下建立有着相同名字的新目录,然后拷贝或者链接到原来目录里的文件 656搜索路径 我们最后要讨论的是从“错误”位置启动的程序。Unix用户通过 shell(一个命令行解释器)和操作系统交互。为 了方便的缘故,用户在运行一个程序时,可以只敲入它的名字而不说明它在文件系统里的全路径。命令行解释器shel 会依照在用户主目录的 profile文件中赋值的PATH环境变量指定的搜索路径査找程序。(用ls-a来查看你的主目录 里的所有文件,用more, profile来看这个文件)。当找到一个包含所给名字的程序的目录时,搜索结束,并且执行那 个程序。一个典型的搜索路径就像这样: PATH=: SHOME/bin: /usr/ucb: /usr/bin: /usr/local: /usr/new: / usr/host 注:冒号 在这里例子里,搜索路径里的目录用“”分隔。第一个条目“”是当前目录。于是就有可能以这样的方式插入特洛 伊木马:给木马取一个和现有程序一样的名字,把它放在一个比存放原始程序的目录更早搜索到的目录中 为了防止这样的攻击,就要用全路径名来启动程序,比如,用/bin/su而不是su。当然,确定当前目录不在root 的搜索路径上。另一个具有相同问题的表现就是伴侣病毒(见8.8.5节) 66审计日志和入侵检测 旦安装好可运行的系统,它的安全机制就应该阻止非法的用户操作。但是,保护机制可能是不够的或者是有缺 第8页共45页创建日期:2003-11
翻译:中国科学技术大学信息安全专业老师 第 8 页 共 45 页 创建日期:2003-11 件约束。因此几乎所有的设备都应该禁止其他人的读写。 类似 ps 的命令显示内存的使用情况,因此需要对内存设备的访问设置许可。把 ps 定义为 SUID 将允许 root 的程 序获得必要的许可,不过,对 ps 的损害会让攻击者得到 root 权限(特权,privilege)。更好的解决办法是让 ps 成为 SGID 程序,让 mem 组拥有内存设备。 tty 终端设备是另外一个有趣的例子。用户登录的时候,一个终端文件就被分配给这个用户,用户就成了本次会 话中这个文件的属主。(终端文件闲置的时候,它的属主是 root)。让这个文件对别人可读写是很方便的,因为这样一 来,用户就可以接收来自其他用户的消息。不过,这样也带来了漏洞。别人现在可以监视进出这个终端的流量,这里 面可能包含用户的口令。他们可以向这个用户终端传送命令,比如,重新设定一个功能键,再让不知情的用户执行这 些命令。在一些系统中,智能终端会自动执行某些命令,这就给攻击者用别的用户的权限提交命令提供了机会。 6.5.4 挂接文件系统 当你拥有不同的安全区域并且要从别的区域往你的系统里引进对象的时候,你必须重新定义这些对象的访问控制 属性。 Unix 文件系统把存在于不同物理设备上的文件系统链接在同一个根(用”/”表示)下面。这是用 mount 命令实现 的。在网络环境中,远程文件系统可以从别的网络结点中挂接。同样,允许用户通过他们自己的软盘驱动器挂接文件 系统。 如果你是安全专家的话,警钟就要开始长鸣了。挂接上的文件系统可能包括各种不受欢迎的文件,比如,隐藏在 攻击者目录中的指向 root 的 SUID 程序。一旦文件系统被挂接,攻击者就可以通过运行此类程序获得超级用户状态。 允许直接访问内存的设备文件也很危险,在这里许可已被设置从而使攻击者可以访问这些文件。所以,命令 mount [-r] [-o options] device directory 里的-r 标志就表示只读挂接。options 里包括: nosuid 在挂接的文件系统中关闭 SUID 和 SGID 位 noexec 挂接的文件系统中的二进制文件不能被执行 nodev 在挂接的文件系统中不能访问块或者字符特殊设备 当然,不同版本的 Unix 实现了 mount 的不同的选项。 6.5.5 改变文件系统的根 可以通过把对象放进一个未授权用户不能访问的地方来实现访问控制。在 Unix 中,改变根(root)命令 chroot 限制了未授权用户可访问的文件系统。这个命令只能被 root 执行。 chroot directory command 执行时,根目录从”/”变成了”directory”。只有新根目录下的文件是可访问的。如果你采用这种方案,你必须确定用户 程序可以找到所有它们所需的系统文件。这些文件的预期所在为像/bin,/dev,/etc,/tmp 或者/usr 这样的目录。必须 在新的根目录下建立有着相同名字的新目录,然后拷贝或者链接到原来目录里的文件。 6.5.6 搜索路径 我们最后要讨论的是从“错误”位置启动的程序。Unix 用户通过 shell(一个命令行解释器)和操作系统交互。为 了方便的缘故,用户在运行一个程序时,可以只敲入它的名字而不说明它在文件系统里的全路径。命令行解释器 shell 会依照在用户主目录的.profile 文件中赋值的 PATH 环境变量指定的搜索路径查找程序。(用 ls –a 来查看你的主目录 里的所有文件,用 more .profile 来看这个文件)。当找到一个包含所给名字的程序的目录时,搜索结束,并且执行那 个程序。一个典型的搜索路径就像这样: PATH=.:$HOME/bin:/usr/ucb:/usr/bin:/usr/local:/usr/new:/usr/hosts 注:冒号: 在这里例子里,搜索路径里的目录用“:”分隔。第一个条目“.”是当前目录。于是就有可能以这样的方式插入特洛 伊木马:给木马取一个和现有程序一样的名字,把它放在一个比存放原始程序的目录更早搜索到的目录中。 为了防止这样的攻击,就要用全路径名来启动程序,比如,用/bin/su 而不是 su。当然,确定当前目录不在 root 的搜索路径上。另一个具有相同问题的表现就是伴侣病毒(见 8.8.5 节) 6.6 审计日志和入侵检测 一旦安装好可运行的系统,它的安全机制就应该阻止非法的用户操作。但是,保护机制可能是不够的或者是有缺
翻译:中国科学技术大学信息安全专业老师 陷的。在像Unⅸx这么复杂的系统中,可能会为了保持系统运行而强制采用不合需要的安全设置。所以,采用进一步 的安全机制,在安全漏洞(违反, violation)或者其他可疑事件发生时或者发生后进行检测,是有利的。这样的机制 可以分类如下 审计:在一个审计日志里记录安全相关事件以便事后分析 入侵检测:在可疑事件发生时进行检测,然后通知系统管理员,比如,通过emai或者往控制台上发消息 自动报复(入侵反应):采取适当措施,立即对安全警报进行反应。比如,可疑用户可能被从系统中自动驱 逐。不过,因为误报的存在,自动报复是否是个好主意一直是个问题。在安全敏感的系统中,入侵检测是明 智的。不过它处于一个紧急时刻,这时用户必须采取可能被入侵检测系统采用的措施 把审计日志保存在一个安全的地方非常重要。能改变审计日志的攻击者可以轻松地隐藏他们的痕迹(这已经发生 了)。下面以安全程度的递增列出了保护审计日志的事项: 1在审计日志上设置逻辑保护,只有特权用户有写权。 2把审计日志发送到别的机器上,在这台机器上被审计机器上的root并无超级用户权力。这个方法提供了双重 保护。首先,现在对合法超级用户的行为有了更好的控制;第二,获得被审计机器上root的攻击者必须攻破 另一台机器以隐藏他们的踪迹。 3把审计日志发送到一台审计专用机器上,这台机器上诸如编译器、编辑器以及某些网络工具之类的多余工具 已经被删除了。现在,对攻击者来说,攻破审计机器变得更加困难了 4把审计日志发送到一台安全打印机上,物理安全措施必须保护审计日志的完整性。 就管理来说,我们必须确定什么样的安全相关事件是应当记录的以及在什么时间记录。当然,在不同的被记录事 件数目和对审计日志的扫描能力之间有一个折中(折衷选择, trade off)。设定为安全相关的事件越多,审计日志就越 繁杂,从而就越难以发现入侵企图;另一方面,如果记录的事件太少,当发现入侵的时候,确定攻击的实施过程就有 可能变得困难。而且,审计用户行为的社会认同也是有限的,它甚至可能是国家隐私法或者劳动法的组成部分。 些安全相关事件自动记录在Unx日志文件里,比如: og记录用户的最后登录:这个信息可以用 finger命令查看; /var/adm/utm p 记录由who命令使用的记帐信息 ar/adm/wtmp记录用户每一次的登录和注销;可以用last命令查看这个信息。为了防止此文件 占用所有内存,可以定期删减 /var/adm/acct 记录所有执行过的命令;这个信息可以用 lastcomm命令查看 这些文件准确的名字和位置在你的Unx系统中可能会有不同。,用 accton命令打开的记帐功能,也可以用来进 行审计。可供观察Umx系统状况的更多命令包括fnd,grep,ps, users. 从技术角度看,我们必须确定审计日志溢出时的策略 ●让审计日志覆盖自己,比如,从头开始 把审计日志写入原来并没有分配给它的空间: 系统停下来,等待管理员进一步的举措。 审计日志非常冗长,因此,人工扫描这样的日志可能会遗漏重要的事件。所以,建议使用专家系统检查审计日志, 寻找已知的违背安全的迹象,或者用人工智能技术识别可疑行为。入侵检测系统也使用类似的方法。 661登录用户标识UID 在刚才提到的日志文件里对安全相关事件进行检查,大多数事件和用户有关,所以,日志条目应该包括引起事件 的进程的用户标识苻UID(标识符, identifier)。那么,如果是SUID程序引起的事件,如何审计呢?这样的程序以它 的属主的UID,而不是运行程序的用户的UID运行。所以,当你使用当前登录进程的UD时,日志条目并没有给出 你实际需要的信息 为了增加准确性,Unix的一些安全版本维护有关初始登录用户的信息。比如, SCO Unix使用登录UID(LUID) (在HPUX中,有实际UID的概念)LUID在登录时确立,子进程从它的父进程继承LUD 用户标识(身份, identity)是一个安全属性,使用它有两个目的,访问控制和记帐(责任, accountability)。并 不是总有可能同时为了两个目的使用这个属性。只要UID对应于真实的用户,基于许可的访问制和审计就相互 旦你创建了特殊的用户标识,利用SUID或者SGID程序保护对资源的访问,你就同时拥有了一个在审计方正 作用有限的属性。 第9页共45页创建日期:2003-11
翻译:中国科学技术大学信息安全专业老师 第 9 页 共 45 页 创建日期:2003-11 陷的。在像 Unix 这么复杂的系统中,可能会为了保持系统运行而强制采用不合需要的安全设置。所以,采用进一步 的安全机制,在安全漏洞(违反,violation)或者其他可疑事件发生时或者发生后进行检测,是有利的。这样的机制 可以分类如下: ⚫ 审计:在一个审计日志里记录安全相关事件以便事后分析; ⚫ 入侵检测:在可疑事件发生时进行检测,然后通知系统管理员,比如,通过 e-mail 或者往控制台上发消息; ⚫ 自动报复(入侵反应):采取适当措施,立即对安全警报进行反应。比如,可疑用户可能被从系统中自动驱 逐。不过,因为误报的存在,自动报复是否是个好主意一直是个问题。在安全敏感的系统中,入侵检测是明 智的。不过它处于一个紧急时刻,这时用户必须采取可能被入侵检测系统采用的措施。 把审计日志保存在一个安全的地方非常重要。能改变审计日志的攻击者可以轻松地隐藏他们的痕迹(这已经发生 了)。下面以安全程度的递增列出了保护审计日志的事项: 1 在审计日志上设置逻辑保护,只有特权用户有写权。 2 把审计日志发送到别的机器上,在这台机器上被审计机器上的 root 并无超级用户权力。这个方法提供了双重 保护。首先,现在对合法超级用户的行为有了更好的控制;第二,获得被审计机器上 root 的攻击者必须攻破 另一台机器以隐藏他们的踪迹。 3 把审计日志发送到一台审计专用机器上,这台机器上诸如编译器、编辑器以及某些网络工具之类的多余工具 已经被删除了。现在,对攻击者来说,攻破审计机器变得更加困难了。 4 把审计日志发送到一台安全打印机上,物理安全措施必须保护审计日志的完整性。 就管理来说,我们必须确定什么样的安全相关事件是应当记录的以及在什么时间记录。当然,在不同的被记录事 件数目和对审计日志的扫描能力之间有一个折中(折衷选择,trade off)。设定为安全相关的事件越多,审计日志就越 繁杂,从而就越难以发现入侵企图;另一方面,如果记录的事件太少,当发现入侵的时候,确定攻击的实施过程就有 可能变得困难。而且,审计用户行为的社会认同也是有限的,它甚至可能是国家隐私法或者劳动法的组成部分。 一些安全相关事件自动记录在 Unix 日志文件里,比如 : /usr/adm/lastlog 记录用户的最后登录;这个信息可以用 finger 命令查看; /var/adm/utm p 记录由 who 命令使用的记帐信息; /var/adm/wtmp 记录用户每一次的登录和注销;可以用 last 命令查看这个信息。为了防止此文件 占用所有内存,可以定期删减; /var/adm/acct 记录所有执行过的命令;这个信息可以用 lastcomm 命令查看。 这些文件准确的名字和位置在你的 Unix 系统中可能会有不同。,用 accton 命令打开的记帐功能,也可以用来进 行审计。可供观察 Unix 系统状况的更多命令包括 find,grep,ps,users。 从技术角度看,我们必须确定审计日志溢出时的策略: ⚫ 让审计日志覆盖自己,比如,从头开始; ⚫ 把审计日志写入原来并没有分配给它的空间; ⚫ 系统停下来,等待管理员进一步的举措。 审计日志非常冗长,因此,人工扫描这样的日志可能会遗漏重要的事件。所以,建议使用专家系统检查审计日志, 寻找已知的违背安全的迹象,或者用人工智能技术识别可疑行为。入侵检测系统也使用类似的方法。 6.6.1 登录用户标识 UID 在刚才提到的日志文件里对安全相关事件进行检查,大多数事件和用户有关,所以,日志条目应该包括引起事件 的进程的用户标识苻 UID(标识符,identifier)。那么,如果是 SUID 程序引起的事件,如何审计呢?这样的程序以它 的属主的 UID,而不是运行程序的用户的 UID 运行。所以,当你使用当前登录进程的 UID 时,日志条目并没有给出 你实际需要的信息。 为了增加准确性,Unix 的一些安全版本维护有关初始登录用户的信息。比如,SCO Unix 使用登录 UID(LUID)。 (在 HP-UX 中,有实际 UID 的概念)LUID 在登录时确立,子进程从它的父进程继承 LUID。 用户标识(身份,identity)是一个安全属性,使用它有两个目的,访问控制和记帐(责任,accountability)。并 不是总有可能同时为了两个目的使用这个属性。只要 UID 对应于真实的用户,基于许可的访问控制和审计就相互依 存。一旦你创建了特殊的用户标识,利用 SUID 或者 SGID 程序保护对资源的访问,你就同时拥有了一个在审计方面 作用有限的属性
翻译:中国科学技术大学信息安全专业老师 67包裹层(包装壳, wrapper) 目前我们提到的访问控制和审计机制并不复杂。它们和操作系统安全的传统一致,集中在对资源访问的控制上 还有可能通过巧妙的使用基本的访问控制机制实现中间层的控制。除此之外,我们还可以修改Unx本身来实现这个 目标。这里的难点是找到一个Unx的组件,我们通过改变它来添加有用的安全控制,同时,操作系统的其余部分并 不受影响。考虑到Unⅸx系统的复杂性,这个任务并不轻松 传输控制协议(TCP)包裹层非常精彩地说明了这样的设计方法。Umx的网络服务,比如 telnet和fp,是以下面的 原则构建的。守护程序 inetd监听外来的网络连接请求。当连接建立后, inetd启动相应的服务程序,然后再转去监听 新的连接请求。这个守护程序被叫做超级服务器,因为它为许多服务程序工作。守护程序 inetd有一个配置文件将服 务(端口号)映射到程序上。这个配置文件条目的格式如下 sevice type protocol watiflag userid executable command-line 比如, telnet的条目是: telnet stream tcp nowait root /usr/bin/in telnetd in telnet 当 inetd接到一个服务请求,它查看配置文件,然后启动一个新进程以运行由 executable指定的可执行文件。这个新 进程的名字也被改为在命令行字段中给出的名字 般情况下,可执行文件的名字和命令行字段中给出的名字是相同的。这个冗余引来了一个有益的小花招。把 inetd 指向一个包裹程序,而不是原来的 executable可执行文件。使用进程的名字来记住原来的可执行文件,在包裹程序执 行完安全控制后,原来的可执行文件将被执行。在我们的例子里,配置文件中 telnet的条目可被替换为 telnet stream tcp nowait root/usr/bin/tcpd in telnet 执行的程序现在成了sr/ pin/tcpd,这就是包裹程序。运行包裹程序的进程仍然叫做 in telnet在包裹程序里,你 可以进行所有你想做的访问控制或者审计控制。在原来的应用中,包裹层被用来进行IP地址过滤(参看13章)。因 为包裹层知道它所在的目录,即/usr/bin,以及它自己的名字,即 in. telnet,于是它可以调用原始的服务程序,即 / usr/bin. in telnet o在用户看来没有任何差别,他们接受的服务和以前一样 机科学里增加间接层是一个强大的武器。在安全上,它可以用来攻击或者保护系统。通过在守护程序ied租 序之间插入TCP包裹层,你可以在不改变守护程序和服务程序源码的情况下增加安全控制。 这个例子的好处是它的通用性。同样的机制可以被用来保护一整套Unix网络服务。 TCP包裹层结合了一个基本的设计原则〔受控调用)和一个精彩的技巧,使在不改变调用这些服务程序的情况下增加 安全控制成为可能。在你更新已有的系统以加入安全特性的时候,这是非常理想的情况 68安装和配置 操作系统的生命周期中的一个关键点是安装。操作系统有许多安全特性( feature)和影响安全的特性,其中有 些没有被详尽地记载。缺省配置可能有利于顺利地安装和操作,但同时它给予维护工程师和系统管理员太多的特权 像限制每一个别的用户一样限制系统管理员,并分清系统管理员和安全管理员的角色是合适的。复杂的和并未完整披 露的特征可能会让系统的安装非常困难,所以,制定安全策略是很急迫的。Unⅸx本身并未给系统管理员的工作带来便 利 系统管理员必须熟知所有安全相关的文件和安装以后如何对危险的缺省配置作修改。 P10 系统安装后,安全相关的参数用标准的Unⅸx编辑命令定义。对资源访问的许可设置在更接近于操作系统的层次 而非应用。比如,通过编辑类似 etc/passwd的文件创建用户。用以下的命令保护 passwd程序: chmod 4750/bin/passwd chgrp staff /bin/passwd 当审计系统时,要使用Unⅸx搜索命令。比如用下面的指令扫描没有口令的帐号: awk-F: 'length(S2)<1(print S1)'</etc/passwd 搜索SUID和SGID的命令 find /-type f(-perm 2000-0-perm 4000 )-exec ls -ld 1; 可以通过简单的自主访问控制支持访问控制策略。结构化保护可以基于组成员关系和使用无登录的帐号而实现。 页共45页创建日期:2003-11
翻译:中国科学技术大学信息安全专业老师 第 10 页 共 45 页 创建日期:2003-11 6.7 包裹层(包装壳,wrapper) 目前我们提到的访问控制和审计机制并不复杂。它们和操作系统安全的传统一致,集中在对资源访问的控制上。 还有可能通过巧妙的使用基本的访问控制机制实现中间层的控制。除此之外,我们还可以修改 Unix 本身来实现这个 目标。这里的难点是找到一个 Unix 的组件,我们通过改变它来添加有用的安全控制,同时,操作系统的其余部分并 不受影响。考虑到 Unix 系统的复杂性,这个任务并不轻松。 传输控制协议(TCP)包裹层非常精彩地说明了这样的设计方法。Unix 的网络服务,比如 telnet 和 ftp,是以下面的 原则构建的。守护程序 inetd 监听外来的网络连接请求。当连接建立后,inetd 启动相应的服务程序,然后再转去监听 新的连接请求。这个守护程序被叫做超级服务器,因为它为许多服务程序工作。守护程序 inetd 有一个配置文件将服 务(端口号)映射到程序上。这个配置文件条目的格式如下: sevice type protocol watiflag userid executable command-line 比如,telnet 的条目是: telnet stream tcp nowait root /usr/bin/in.telnetd in.telnet 当 inetd 接到一个服务请求,它查看配置文件,然后启动一个新进程以运行由 executable 指定的可执行文件。这个新 进程的名字也被改为在命令行字段中给出的名字。 一般情况下,可执行文件的名字和命令行字段中给出的名字是相同的。这个冗余引来了一个有益的小花招。把 inetd 指向一个包裹程序,而不是原来的 executable 可执行文件。使用进程的名字来记住原来的可执行文件,在包裹程序执 行完安全控制后,原来的可执行文件将被执行。在我们的例子里,配置文件中 telnet 的条目可被替换为: telnet stream tcp nowait root /usr/bin/tcpd in.telnet 执行的程序现在成了/usr/bin/tcpd,这就是包裹程序。运行包裹程序的进程仍然叫做 in.telnet。在包裹程序里,你 可以进行所有你想做的访问控制或者审计控制。在原来的应用中,包裹层被用来进行 IP 地址过滤(参看 13 章)。因 为包裹层知道它所在的目录,即/usr/bin,以及它自己的名字,即 in.telnet,于是它可以调用原始的服务程序,即 /usr/bin.in.telnet。在用户看来没有任何差别,他们接受的服务和以前一样。 在计算机科学里增加间接层是一个强大的武器。在安全上,它可以用来攻击或者保护系统。通过在守护程序 inetd 和 服务程序之间插入 TCP 包裹层,你可以在不改变守护程序和服务程序源码的情况下增加安全控制。 这个例子的好处是它的通用性。同样的机制可以被用来保护一整套 Unix 网络服务。 TCP 包裹层结合了一个基本的设计原则(受控调用)和一个精彩的技巧,使在不改变调用这些服务程序的情况下增加 安全控制成为可能。在你更新已有的系统以加入安全特性的时候,这是非常理想的情况。 6.8 安装和配置 操作系统的生命周期中的一个关键点是安装。操作系统有许多安全特性(feature)和影响安全的特性,其中有一 些没有被详尽地记载。缺省配置可能有利于顺利地安装和操作,但同时它给予维护工程师和系统管理员太多的特权。 像限制每一个别的用户一样限制系统管理员,并分清系统管理员和安全管理员的角色是合适的。复杂的和并未完整披 露的特征可能会让系统的安装非常困难,所以,制定安全策略是很急迫的。Unix 本身并未给系统管理员的工作带来便 利。 系统管理员必须熟知所有安全相关的文件和安装以后如何对危险的缺省配置作修改。 P100 系统安装后,安全相关的参数用标准的 Unix 编辑命令定义。对资源访问的许可设置在更接近于操作系统的层次 而非应用。比如,通过编辑类似/etc/passwd 的文件创建用户。用以下的命令保护 passwd 程序: chmod 4750 /bin/passwd chgrp staff /bin/passwd 当审计系统时,要使用 Unix 搜索命令。比如用下面的指令扫描没有口令的帐号: awk –F: ‘length($2)<1 {print $1}’ </etc/passwd 搜索 SUID 和 SGID 的命令: find / -type f\(-perm 2000 –o –perm 4000\) –exec ls –ld {}\; 可以通过简单的自主访问控制支持访问控制策略。结构化保护可以基于组成员关系和使用无登录的帐号而实现