<p>出于安全的考虑,多用户操作系统需要具备保障个人隐私和系统安全的机制。在Linux中,无论是文档还是硬件设备都以文件的形式存在,相应地,安全机制也主要表现为对文件访问权限的控制。</p><p>除了本文所讨论的内容之外,SELinux(Security-Enhanced Linux)是另一种著名的安全机制,它是美国国家安全局(NAS)对于强制访问控制的实现,是一种更为可靠,也明显更为复杂的安全机制。在Fedora和Red Hat Enterprise Linux上默认安装了这一机制。</p><p>1 权限的定义</p><p>1.1 基础权限</p><p>1.2 特殊权限</p><p>2 权限的表示</p><p>2.1 符号表示</p><p>2.2 数值表示</p><p>3 修改权限</p><p>权限的定义</p><p>基础权限</p><p>要确定一个用户对某个文件或目录是否具有相应的权限,先要明确该用户与文件或目录之间的关系。在Linux系统中,定义了如下三种关系:</p><p>文件所有者(owner)</p><p>拥有文件的用户。创建文件时是创建文件的用户(可用whoami命令查看)。</p><p>组(group)</p><p>文件所属的组。创建文件时用户的组(可用id命令查看)。</p><p>其他人(other)</p><p>既不是文件所有者,也不是文件所属的组的成员的其他用户。</p><p>根据用户对文件或目录操作种类的不同,又定义了三种操作权限,并为每种权限赋予一个简写形式和数值(数值的用途后面讨论):</p><p>权限<span class="Apple-tab-span" > </span>简<span class="Apple-tab-span" > </span>值<span class="Apple-tab-span" > </span>对普通文件的作用<span class="Apple-tab-span" > </span>对文件夹的作用[4]</p><p>读取<span class="Apple-tab-span" > </span>r<span class="Apple-tab-span" > </span>4<span class="Apple-tab-span" > </span>查看文件内容<span class="Apple-tab-span" > </span>列出目录中的文件(ls)</p><p>写入<span class="Apple-tab-span" > </span>w<span class="Apple-tab-span" > </span>2<span class="Apple-tab-span" > </span>修改文件内容<span class="Apple-tab-span" > </span>在目录中删除、添加或重命名文件(夹)</p><p>执行<span class="Apple-tab-span" > </span>x<span class="Apple-tab-span" > </span>1<span class="Apple-tab-span" > </span>文件可以作为程序执行<span class="Apple-tab-span" > </span>访问子目录及文件及shell中cd到此目录</p><p>上面的三种关系与三种操作权限的组合,构成了一个含有9个二进制位的权限标识。</p><p>特殊权限</p><p>还有三种与用户身份无关的三个文件权限属性。即SUID、SGID和Sticky。</p><p>SUID(Set User ID, 4)</p><p>该属性只对有执行权限的文件有效,对目录无效。执行具有SUID权限的程序时,引发的进程的所有者是程序文件的所有者,而不是启动程序的用户(除非二者是同一个人)。比如,如果一个程序的所有者是root且具有SUID属性,一个普通用户执行此程序时,如同root执行此程序一样。[5](请注意该属性对Shell脚本程序无效。)该属性为一些特殊程序(如lpr)的启动带来了方便。但有时也带来了安全隐患:比如一个具有SUID属性的程序如果在执行时运行了一个shell,那么用户可以籍此得到系统的最高权限。SUID可用s表示。</p><p>Hint.gif提示:</p><p>consolehelper是一个更高级的用于提供用户权限的解决方案,见使用consolehelper获得root权限。</p><p>SGID(Set Group ID, 2)</p><p>对于可执行文件,SGID与SUID类似,引发的进程的所有组是程序文件所属的组。对于目录,SGID属性会使目录中新建文件的所属组与该目录相同。SGID也可以用s表示。</p><p>Sticky, 1</p><p>仅对目录有效。带sticky属性的目录下的文件或目录可以被其拥有者删除或改名。常利用sticky属性创建这样的目录:组用户可以在此目录中创建新文件、修改文件内容,但只有文件所有者才能对自己的文件进行删除或改名。如系统中的/tmp文件夹。在属性字符串中,通常用t表示。</p><p>Hint.gif提示:</p><p>最初sticky属性只可执行文件有效。正如其字面意思,它让具有sticky属性的可执行文件在执行结束后将程序代码仍滞留于内存中,以加快需要反复执行的大程序的装载速度。由于虚拟内存技术的引入,该功能已经没有意义。</p><p>权限的表示</p><p>符号表示</p><p>一个文件的权限可以用字符串直观的表示,使用ls -l命令可以看到表示权限的字符串。</p><p>下面来看几个例子:</p><p>-rw-r--r-- 1 gnixnehc gnixnehc 131 08-12 13:22 normal_text</p><p>-rwxr-xr-x 1 gnixnehc gnixnehc 6809 08-12 13:22 normal_exe</p><p>drwxr-xr-x 2 gnixnehc gnixnehc 4096 07-03 01:13 normal_dir</p><p>-rwsr-sr-x 1 gnixnehc gnixnehc 6809 08-12 13:22 suid_exe</p><p>drwxrwxrwt 12 root root 16384 08-12 21:07 tmp</p><p>蓝色的部分就是权限字符串,权限表示三个为一组,依次是所有者权限、组权限、其他人权限。每组的顺序均为rwx,如果有相应权限,则表示成相应字母,如果不具有相应权限,则用-表示。</p><p>上面的例子中,第一行是一个普通文本文件,第二行是个普通的可执行程序,第三行是个普通的文件夹。第四行是带SUID、SGID的程序,最后一行则是/tmp的权限。</p><p>数值表示</p><p>为了简化表述,也可使用八进制数来表示权限。即用一个四位八进制数来表示,其中最高位表示特殊权限,随后的三位依次是所有者权限、组权限和其他人权限。每一个八进制位的权限数值是文件具有的相应权限所对应的数值之后,如:</p><p>0755=rwxr-xr-x</p><p>而</p><p>rw---x-w-=0(4+2)(1)(2)=0612</p><p>Note.gif注意:</p><p>组权限覆盖其它人权限,如上例中,一个权限为0604的文件无法被其所属组的用户读取。</p><p>修改权限</p><p>文件所有者或超级用户可以修改一个文件或目录的权限。修改权限可以使用chmod命令,也可以使用桌面环境的文件管理程序。</p><p>如,chmod 700 foo 命令会将 foo 的权限更改为 700(见#数值表示)。</p><p>除了使用八进制数值权限,还可以用 [ugoa][[+-=][rwxst] 格式设置相应权限。[6]第一个字符是u、g、 o 或 a 中的一个(分别表示用户、组、其他人和所有人)。还可以选择添加(+)、删除(-)或设置(=)各种不同权限。如</p><p>chmod u+x foo</p><p>可设置 foo 的执行位,并保持其他位不变。</p><p>chmod g-rw something</p><p>则可以移除组的读和写权限。</p><p>另一种使用 chmod 的方法是使用 --reference 参数:</p><p>chmod --reference file1 file2</p><p>可以让 file2 的权限与 file1 一样。</p><p>要更改文件的所有者,可使用 chown 命令。如</p><p>chown sean foo</p><p>命令可将 foo 的所有者更改为 sean。只有根用户可以修改文件的所有者。</p><p>chgrp 命令可以更改文件的组。普通用户必须属于新的组。</p>