UNIX 计算安全/UNIX 文件系统
建议主题:卷管理程序,文件系统,文件,目录,ls,find,chown,chgrp,chmod,umask,setuid,setgid,设备文件,ACL。
计算机使用的大多数数据都存储在磁盘驱动器上。与物理内存相比,它们是具有相对较高的访问延迟的物理设备,但具有更大的存储容量。在服务器系统上,磁盘驱动器可以位于与CPU相同的机柜内,相邻的扩展机柜,作为设备连接到网络,或作为存储区域网络的一部分连接。一些站点也可能使用可移动磁盘介质,这些介质可以由操作员或机器人设备加载。
该文件系统是用于在设备(如磁盘驱动器)上布置数据的方法。它包含操作系统可以用来查找特定数据内容以及谁被允许访问该数据的信息。所有这些数据都组织成一系列文件,它们是管理计算机系统信息的基本手段。文件中的数据以应用程序可以理解的格式组织。文件在目录树上的位置称为其路径。
在 UNIX 中,与许多其他现代操作系统一样,文件存储在树状结构中,分支节点称为目录。目录是一种特殊类型的文件,它可以引用零个或多个其他文件和目录,从而允许组织数据并管理访问。目录树包含在一个或多个文件系统中。
在 UNIX 中,文件系统包含以下信息,可用于每个文件
- 唯一的 inode 号码
- 文件的长度(以字节为单位)
- 包含文件的设备的标识符
- 文件类型
- 一组权限位或模式
- 文件所有者的标识符或uid
- 文件组的标识符或gid
- 文件创建日期和时间
- 文件上次访问日期和时间
- 文件上次修改日期和时间
- 到 inode 的硬链接总数
典型的 UNIX 文件类型如下
- 块文件
- 原始文件
- 普通文件
- 目录
- 命名管道
- 符号链接
- 套接字
硬链接是一种引用同一设备和文件系统上的另一个文件的文件,它通过其 inode 号码来引用。符号链接是一种包含指向另一个文件的路径信息的文件。
有关文件统计信息的信息可以通过使用ls
命令结合-l
“长列表”选项来查看。以下是一个示例
$ ls -l /usr/bin/vi -r-xr-xr-t 6 bin bin 604880 Sep 3 2003 /usr/bin/vi
ls
输出的最左侧字段显示文件的模式。这是一个通常为 2 字节(16 位)的整数字段。模式中的每个位都是一个二进制标志,代表一种安全访问设置类型。
模式右边的数字显示到文件的硬链接总数,包括原始文件。因此,在本例中,该命令还有五个其他硬链接。接下来是文件所有者和组的名称,然后是文件大小(以字节为单位)、上次修改的日期或时间以及文件名或路径。
ls
将模式信息显示为一个十个字符的字段。第一个(最左侧)字符显示文件类型。常见类型如下
-
— 普通文件b
— 块特殊文件c
— 字符特殊文件d
— 目录D
— 门(Solaris)l
— 符号链接n
— 网络特殊文件(HP-UX)p
— 命名管道s
— 套接字
剩下的九个字符由三组三个字符组成。每组描述一组文件权限,这些权限决定是否可以读取、写入和作为程序执行文件。(它们还可以覆盖某些特殊执行模式。稍后将对此进行详细介绍。)
这些权限分别由r
、w
和x
表示。因此,组集中的rwx
表示文件组中的任何成员都可以读取、修改或作为程序(或脚本)运行该文件。上面的r-x
缺少写入标志,因此组成员可能无法修改该文件。
从左到右,前三组字符表示文件所有者的权限设置。中间三组是文件组的权限设置,最右侧的三组是所有其他人的权限(通常称为“世界”。)
模式还可以包含在执行文件时设置文件权限的特殊标志。也就是说,如果文件是程序或脚本,则设置权限位将确定它将在其下运行的所有者或组。通常,当运行作业时,它会使用执行文件的帐户的用户和组。这控制着作业获得的访问类型。
例如,假设命令myjob具有权限r-xr-x---
,并且由文件所有者、research组中的用户bill执行。执行myjob命令的进程被赋予所有者bill和组research。该作业可以访问任何也可以从帐户bill访问的文件。
现在假设myjob文件被赋予所有者root,并且系统管理员激活了用户的设置权限位。生成的权限位为r-sr-x---
,其中s表示已设置执行时设置用户 ID 标志。由于该文件仍然属于research组,因此用户bill可以运行它。但是,现在运行作业时,它可以访问任何可以由root访问的文件(通常是系统上的任何文件)。
当执行时设置组 ID 标志被设置时,也会发生类似的效果。生成的权限位现在可能显示为r-xr-s---
。当执行此文件时,作业运行时就像用户属于与文件组标识符相同的组一样。也就是说,如果组标识符被设置为sys
,当执行该文件时,它将可以访问任何可以由sys组访问的文件。
在此需要特别指出的是,设置 ID 功能可能会损害系统的安全性。由root拥有且具有设置用户 ID 标志的文件与系统管理员具有相同的访问权限。如果此文件还可以被任何用户修改,那么它可以被利用来提升该用户的权限或执行其他未经授权的活动。即使文件不能被用户修改,它可能仍然包含可以利用来获得未经授权权限的漏洞。
因此,系统管理员应仔细监控具有设置用户 ID 或设置组 ID 权限的文件的存在。选定的系统命令需要这些模式设置才能正常运行。但是,任何其他具有这些设置的文件,尤其是当它们可以被用户修改时,可能会对系统构成不可接受的风险水平。可以定期运行批处理作业来搜索这些文件的存在并将它们提请系统管理员注意。
注意:在 Linux 上,当执行 shell 脚本时,系统会故意忽略所有 setuid 和 setgid 权限。
目录的权限与其对文件的作用略有不同。目录上的r
ead 权限允许ls
命令在没有参数的情况下列出该目录的内容。但是,读取模式只允许读取文件名,而不是文件权限、所有者或大小。您也不能使用cd
命令更改到您只有读取权限的目录,也不能读取该目录中文件的內容。
如果目录允许您x
或执行权限,您就可以cd
到该目录,并读取该目录中您具有读取权限的任何文件的內容。您还可以使用ls -l
命令对目录执行“长列表”。如果目录允许您执行但没有读取权限,那么如果您尝试使用ls
列出该目录,就会收到错误。但是,如果您知道该目录中存在特定文件,并且该文件允许您读取权限,那么您可以对该文件执行“长列表”。
作为一个简单的例子
$ id uid=234(myacct) gid=100(mygrp) $ mkdir test $ touch test/test.txt $ chmod 100 test $ chmod 640 test/test.txt $ cd test $ ls . unreadable total 0 $ ls -l test.txt -rw-r----- 1 myacct mygrp 0 Dec 9 12:00 test.txt
有关这些命令的更多信息,请参见相应的联机帮助页。
- 设置用户 ID 或设置组 ID 权限
- 粘滞位。
正在建设中...
可以使用chown
、chgrp
和chmod
命令设置文件的权限。chown
命令需要一个有效的帐户名或数字标识符,用于设置文件或一组文件的所有者。类似地,chgrp
命令可以用来设置文件的组。 (在某些操作系统上,chown
命令可以用来设置文件的拥有者和组。最后,chmod
命令可以用来设置文件模式。
以下是一个将文件所有者设置为root,并将组设置为sys的组合chown
命令的示例:
$ chown root:sys /usr/local/bin/bigjob
权限 | 值 |
---|---|
执行 (x) | 1 |
写入 (w) | 2 |
读取 (r) | 4 |
chmod
命令的原始格式允许为文件或一组文件设置整个模式。这可以通过传递给命令一个三位或四位数来完成,该数字定义了模式设置。数字中的最后三位中的每一个代表一组权限标志,如上所述。1表示启用执行模式,2表示设置写入模式,4表示设置读取模式。可以通过将适当的值加起来来设置这些模式的任何组合。
例如:
$ chmod 550 /usr/local/bin/bigjob
用户权限为5,组权限为5,世界权限为0。5等于1加4,所以它为用户和组都启用了读(4)和执行(1)标志。世界对此文件没有权限。
最近,chmod
命令得到增强,允许使用逗号分隔的符号操作列表。这允许以更精确的方式修改文件的模式。符号操作确定其影响的对象、操作类型以及受影响的权限。例如:
$ chmod u+x,g-w,o=r /usr/local/bin/bigjob
这里u
、g
和o
分别代表用户、组和其他(世界)权限。+
、-
和=
分别通过添加、删除或设置由r
(红色)、w
(写入)或x
(执行)模式位指定的位来修改权限。此示例为用户提供了执行权限,删除了文件组的写入权限,并将其他(世界)权限限制为仅读取操作。
chown
、chgrp
和chmod
命令通常有一个递归选项,它作用于目录及其下的所有文件。此选项通常使用-R
激活,但请参阅特定操作系统的联机帮助页。与chmod
命令的符号操作结合使用时,这可以为管理目录权限提供一个强大的工具。例如:
$ chmod -R o-w /usr/bin
将递归地删除/usr/bin
目录或该目录树下的任何文件或目录上的任何世界权限位。
搜索文件权限
[edit | edit source]find
命令是一个强大的工具,可以用来搜索文件系统中具有特定权限设置、特定文件所有者和组的文件或目录。在下面的示例中(它是为 HP-UX 编写的),find
命令用于搜索/usr/bin
目录树中允许世界写入权限的任何文件。
$ /usr/bin/find /usr/bin -type f -perm -002 -exec ls -l {} \;
传递给find
命令的参数形成一个表达式,该表达式确定命令在目录树/usr/bin
中搜索什么。参数-type f
将搜索范围限制为文件,而不是目录、符号链接、设备文件等等。-perm -002
设置要查找的权限类型;数字前面的减号表示仅匹配数字中设置的值。在本例中,第三位中的2匹配世界写入位。最后,奇怪的-exec ls -al {} \;
会导致ls -l
命令在满足先前条件的任何文件上执行。(结尾的奇怪\;
子句是命令的终止符。)find
的一些变体具有-ls
选项,它可以替换-exec ls -al {} \;
。
下面的示例显示了对/home
目录树的搜索,以查找所有者不在密码数据库中的任何文件。
$ /usr/bin/find /home -nouser -exec ls -l {} \;
如果任何帐户已从密码数据库中删除,可以使用这样的命令来搜索孤立文件。
请注意,无论何时系统管理员执行对文件系统的长时间搜索,使用nice
命令以较低的优先级运行find
命令可能会让用户感到方便。否则,该作业可能会影响磁盘访问性能。此外,还需要注意避免搜索网络挂载的目录树,因为这会大大减慢搜索时间;这可以通过使用-xdev
选项来实现,该选项将find
限制为仅搜索当前文件系统。
umask
[edit | edit source]每个 UNIX 会话都有一个文件模式创建掩码,它定义了创建新文件时权限位的初始值。该掩码包含一系列位标志,这些标志决定特定权限设置是打开还是关闭。此值类似于传递给chmod
命令的数字,只是值在负意义上使用。也就是说,当掩码中设置了某个值时,创建文件时相应的权限位将被关闭。
umask
命令可以用来显示当前会话的掩码。
$ umask 027 $ touch testfile.txt $ ls -al testfile.txt -rw-r----- 1 bilbo users 0 Jan 18 07:41 testfile.txt
在这个示例中,第一个零影响文件的所有者权限。零表示所有权限位都将被设置,因此文件所有者可以对该文件具有读、写和执行权限。(请注意,在上面的示例中,系统创建的文件将关闭执行权限,而不管umask
的设置如何。)中间的数字2影响文件组的权限。'2'将关闭写入权限位,因此组成员只能读取或执行文件。最后,最后一个数字中的七将关闭世界的所有权限。
要更改会话的掩码,可以执行umask
命令,并将新的掩码作为参数传递。
$ umask 077 $ umask 077 $ touch testfile2.txt $ ls -al testfile2.txt -rw------- 1 bilbo users 0 Jan 18 07:47 testfile.txt
建议将umask
设置为077
,以获得最佳安全性。然后,用户需要手动修改文件或目录的权限,才能让其他人访问它们。相反,将umask
设置为000
会导致最弱的安全性设置,因为系统上的任何人都可以访问该文件,除非用户记得限制权限。为了应用基本umask
设置,系统管理员可以在 shell 启动文件(如/etc/profile
)中包含一个umask
命令。