翻译:中国科学技术大学信息安全专业老师 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 {}\; 可以通过简单的自主访问控制支持访问控制策略。结构化保护可以基于组成员关系和使用无登录的帐号而实现