diff options
Diffstat (limited to 'zh_CN.GB2312/books/handbook/basics')
-rw-r--r-- | zh_CN.GB2312/books/handbook/basics/chapter.sgml | 125 |
1 files changed, 124 insertions, 1 deletions
diff --git a/zh_CN.GB2312/books/handbook/basics/chapter.sgml b/zh_CN.GB2312/books/handbook/basics/chapter.sgml index ebf9e6a427..88bfc4d7ba 100644 --- a/zh_CN.GB2312/books/handbook/basics/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/basics/chapter.sgml @@ -2,7 +2,7 @@ The FreeBSD Documentation Project The FreeBSD Simplified Chinese Project - Original Revision: 1.153 + Original Revision: 1.154 $FreeBSD$ --> @@ -604,6 +604,129 @@ total 530 &man.chflags.1; 和 &man.chflags.2; 联机手册, 以对其加深理解。</para> </sect2> + + <sect2> + <sect2info> + <authorgroup> + <author> + <firstname>Tom</firstname> + <surname>Rhodes</surname> + <contrib>原作 </contrib> + </author> + </authorgroup> + </sect2info> + + <title>setuid、 setgid 和 sticky 权限</title> + + <para>除了前面已经讨论过的那些权限之外, 还有三个管理员应该知道的权限配置。 + 它们是 <literal>setuid</literal>、 + <literal>setgid</literal> 和 <literal>sticky</literal>。</para> + + <para>这些配置对于一些 &unix; 操作而言很重要, + 因为它们能提供一些一般情况下不会授予普通用户的功能。 + 为了便于理解, 我们首先介绍真实用户 ID (real + user ID) 和生效用户 ID (effective user ID)。</para> + + <para>真实用户 ID 是拥有或启动进程的用户 <acronym>UID</acronym>。 + 生效 <acronym>UID</acronym> + 是进程以其身份运行的用户 ID。 举例来说, + &man.passwd.1; 工具通常是以发起修改密码的用户身份启动, + 也就是说其进程的真实用户 ID 是那个用户的 ID; + 但是, 由于需要修改密码数据库, 它会以 + <username>root</username> 用户作为生效用户 ID 的身份运行。 + 这样, 普通的非特权用户就可以修改口令, 而不是看到 + <errorname>Permission Denied</errorname> 错误了。</para> + + <note> + <para>&man.mount.8; 的 <literal>nosuid</literal> + 选项可以令系统在不给出任何错误提示的情况下不执行这些程序。 + 另一方面, 这个选项并不是万无一失的, 正如 + &man.mount.8; 联机手册所提到的那样, + 如果系统中安装了绕过 <literal>nosuid</literal> + 的封装程序, 那么这种保护就可以被绕过了。</para> + </note> + + <para>setuid 权限可以通过在普通权限前面加上一个数字四 (4) + 来设置, 如下面的例子所示:</para> + + <screen>&prompt.root; <userinput>chmod 4755 suidexample.sh</userinput></screen> + + <para>这样一来, + <filename><replaceable>suidexample.sh</replaceable></filename> + 的权限应该如下面这样:</para> + + <programlisting>-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidexample.sh</programlisting> + + <para>您会注意到, 在原先的属主执行权限的位置变成了 + <literal>s</literal>。 这样, 需要提升特权的可执行文件, + 例如 <command>passwd</command> 就可以正常运行了。</para> + + <para>可以打开两个终端来观察这一情形。 在其中一个终端里面, + 以普通用户身份启动 <command>passwd</command> 进程。 + 在它等待输入新口令时, 在另一个终端中查看进程表中关于 + <command>passwd</command> 命令的信息。</para> + + <para>在终端 A 中:</para> + + <screen>Changing local password for trhodes +Old Password:</screen> + + <para>在终端 B 中:</para> + + <screen>&prompt.root; <userinput>ps aux | grep passwd</userinput></screen> + + <screen>trhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwd +root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01 passwd</screen> + + <para>正如前面所说的那样, <command>passwd</command> 是以普通用户的身份启动的, + 但其生效 + <acronym>UID</acronym> 是 <username>root</username>。</para> + + <para>与此对应, <literal>setgid</literal> 权限的作用, + 与 <literal>setuid</literal> 权限类似, + 只是当应用程序配合这一设定运行时, 它会被授予拥有文件的那个组的权限。</para> + + <para>如果需要在文件上配置 <literal>setgid</literal> 权限, + 可以在权限数值前面增加数字二 (2) 来运行 <command>chmod</command> 命令, + 如下面的例子所示:</para> + + <screen>&prompt.root; <userinput>chmod 2755 suidexample.sh</userinput></screen> + + <para>可以用与前面类似的方法来检视新设定的生效情况, 在组权限的地方的 + <literal>s</literal> 表示这一配置已经生效:<para> + + <screen>-rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 suidexample.sh</screen> + + <note> + <para>在这些例子中, 尽管 shell 脚本也属于可执行文件的一种, + 但它们不会以您配置的 <acronym>EUID</acronym> 或生效用户 ID 的身份运行。 + 这是因为 shell 脚本可能无法直接呼叫 + &man.setuid.2; 调用。</para> + </note> + + <para>我们已经讨论了两个特殊权限位 + (<literal>setuid</literal> 和 <literal>setgid</literal> + 权限位), 它们让用户在使用程序时能够用到更高的权限, + 有时这会削弱系统的安全性。 除了这两个之外, 还有第三个特殊权限位: + <literal>sticky bit</literal>, 它能够增强安全性。</para> + + <para>当在目录上设置了 <literal>sticky bit</literal> 之后, + 其下的文件就只能由文件的所有者删除了。 这个权限设置能够防止用户删除类似 + <filename class="directory">/tmp</filename> 这样的公共目录中不属于他们的文件。 + 要应用这种权限, 可以在权限设置前面加上数字一 (1)。 例如:</para> + + <screen>&prompt.root; <userinput>chmod 1777 /tmp</userinput></screen> + + <para>现在, 可以用 + <command>ls</command> 命令来查看效果:</para> + + <screen>&prompt.root; <userinput>ls -al / | grep tmp</userinput></screen> + + <screen>drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp</screen> + + <para>这里的结尾的 <literal>t</literal> 表示了 + <literal>sticky bit</literal> 权限。</para> + </sect2> </sect1> <sect1 id="dirstructure"> |