aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/books/handbook/basics
diff options
context:
space:
mode:
Diffstat (limited to 'zh_CN.GB2312/books/handbook/basics')
-rw-r--r--zh_CN.GB2312/books/handbook/basics/chapter.sgml125
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">