Unix 传统中的操作系统不同于那些 MS-DOS 传统中的系统,区别在于它们不仅是多任务
系统,而且也是多用户系统。这到底意味着什么?它意味着多个用户可以在同一时间使用同一
台计算机。然而一个典型的计算机可能只有一个键盘和一个监视器,但是它仍然可以被多个
用户使用。例如,如果一台计算机连接到一个网络或者因特网,那么远程用户通过 ssh(安全
shell)可以登录并操纵这台电脑。事实上,远程用户也能运行图形界面应用程序,并且图形化
的输出结果会出现在远端的显示器上。X 窗口系统把这个作为基本设计理念的一部分,并支持
这种功能。
Linux 系统的多用户性能,不是最近的“创新”,而是一种特性,它深深地嵌入到了 Linux
操作系统的设计过程中。想一下 Unix 系统的诞生环境,这会很有意义。多年前,在个人电脑
出现之前,计算机都是大型的,昂贵的,集中化的。一个典型的大学计算机系统,例如,是由
坐落在一座建筑中的一台大型中央计算机和许多散布在校园各处的终端机组成,每个终端都连
接到这台大型中央计算机。这台计算机可以同时支持很多用户。
为了使多用户特性付诸实践,那么必须发明一种方法来阻止用户彼此之间受到影响。毕竟,
一个用户的行为不能导致计算机崩溃,也不能乱动属于另一个用户的文件。
在这一章中,我们将看看这一系统安全的本质部分,会介绍以下命令:
• id –显示用户身份号
• chmod –更改文件模式
• umask –设置默认的文件权限
• su –以另一个用户的身份来运行 shell
• sudo –以另一个用户的身份来执行命令
• chown –更改文件所有者
• chgrp –更改文件组所有权
• passwd –更改用户密码
拥有者,组成员,和其他人
在 Unix 安全模型中,一个用户可能拥有文件和目录。当一个用户拥有一个文件或目录时,
用户对这个文件或目录的访问权限拥有控制权。用户,反过来,又属于一个由一个或多个用户
组成的用户组,用户组成员由文件和目录的所有者授予对文件和目录的访问权限。除了对一个
用户组授予权限之外,文件所有者可能会给每个人一些权限,在 Unix 术语中,每个人是指整
个世界。可以用 id 命令,来找到关于你自己身份的信息
正如我们能看到的,两个系统中用户的 uid 和 gid 号码是不同的。原因很简单,因为
Fedora 系统从 500 开始进行普通用户帐户的编号,而 Ubuntu 从 1000 开始。我们也能看到
Ubuntu 的用户属于更多的用户组。这和 Ubuntu 管理系统设备和服务权限的方式有关系。
那么这些信息来源于哪里呢?像 Linux 系统中的许多东西一样,来自一系列的文本文件。
用户帐户定义在/etc/passwd 文件里面,用户组定义在/etc/group 文件里面。当用户帐户和用
户组创建以后,这些文件随着文件/etc/shadow 的变动而修改,文件/etc/shadow 包含了关于
用户密码的信息。对于每个用户帐号,文件/etc/passwd 定义了用户(登录)名,uid,gid,帐
号的真实姓名,主目录,和登录 shell。如果你查看一下文件/etc/passwd 和文件/etc/group 的
内容,你会注意到除了普通用户帐号之外,还有超级用户(uid 0)帐号,和各种各样的系统用户。
在下一章中,当我们讨论进程时,你会知道这些其他的“用户”是谁,实际上,他们相当忙碌。
然而许多像 Unix 的系统会把普通用户分配到一个公共的用户组中,例如“users”,现在的
Linux 会创建一个独一无二的,只有一个成员的用户组,这个用户组与用户同名。这样使某种
类型的权限分配更容易些。
读取,写入,和执行
对于文件和目录的访问权力是根据读访问,写访问,和执行访问来定义的。如果我们看一
下 ls 命令的输出结果,我们能得到一些线索,这是怎样实现的:
列表的前十个字符是文件的属性。这十个字符的第一个字符表明文件类型。下表是你可能
经常看到的文件类型(还有其它的,不常见类型):
剩下的九个字符,叫做文件模式,代表着文件所有者,文件组所有者,和其他人的读,写,执行权限。
chmod -更改文件模式
更改文件或目录的模式(权限),可以利用 chmod 命令。注意只有文件的所有者或者超级
用户才能更改文件或目录的模式。chmod 命令支持两种不同的方法来改变文件模式:八进制数
字表示法,或符号表示法。首先我们讨论一下八进制数字表示法。
通过传递参数“600”,我们能够设置文件所有者的权限为读写权限,而删除用户组和其他
人的所有权限。虽然八进制到二进制的映射看起来不方便,但通常只会用到一些常见的映射关
系:7 (rwx),6 (rw-),5 (r-x),4 (r--),and 0 (-–)。
chmod 命令支持一种符号表示法,来指定文件模式。符号表示法分为三部分:更改会影响
谁,要执行哪个操作,要设置哪种权限。通过字符“u”,“g”,“o”,and “a”的组合来指定
要影响的对象,如下所示
一些人喜欢使用八进制表示法,而另些人真正地喜欢符号表示法。个人偏好八进制方式,简单快捷.
看一下 chmod 命令的手册页,可以得到更详尽的信息和 chmod 命令的各个选项。要注意
“--recursive”选项:它可以同时作用于文件和目录,所以它并不是如我们期望的那么有用处,
因为我们很少希望文件和目录拥有同样的权限。
umask -设置默认权限
当创建一个文件时,umask 命令控制着文件的默认权限。umask 命令使用八进制表示法来
表达从文件模式属性中删除一个位掩码。大家看下面的例子
当创建一个文件时,umask 命令控制着文件的默认权限。umask 命令使用八进制表示法来
表达从文件模式属性中删除一个位掩码。大家看下面的例子:
首先,删除文件 foo.txt,以此确定我们从新开始。下一步,运行不带参数的 umask 命令,
看一下当前的掩码值。响应的数值是 0002(0022 是另一个常用值),这个数值是掩码的八进制
表示形式。下一步,我们创建文件 foo.txt,并且保留它的权限。
我们可以看到文件所有者和用户组都得到读权限和写权限,而其他人只是得到读权限。其
他人没有得到写权限的原因是由掩码值决定的。重复我们的实验,这次自己设置掩码值
又一次,二进制中数字 1 出现的位置,相对应的属性被删除。再试一下其它的掩码值(一
些带数字 7 的),习惯于掩码的工作原理。当你实验完成之后,要记得清理现场:
大多数情况下,你不必修改掩码值,系统提供的默认掩码值就很好了。然而,在一些高安全级别下,你要能控制掩码值。
一些特殊权限
虽然我们通常看到一个八进制的权限掩码用三位数字来表示,但是从技术层面
上来讲,用四位数字来表示它更确切些。为什么呢?因为,除了读取,写入,和执
行权限之外,还有其它的,较少用到的权限设置。
其中之一是 setuid 位(八进制 4000)。当应用到一个可执行文件时,它把有效用
户 ID 从真正的用户(实际运行程序的用户)设置成程序所有者的 ID。这种操作通
常会应用到一些由超级用户所拥有的程序。当一个普通用户运行一个程序,这个程
序由根用户 (root) 所有,并且设置了 setuid 位,这个程序运行时具有超级用户的
特权,这样程序就可以访问普通用户禁止访问的文件和目录。很明显,因为这会引
起安全方面的问题,所有可以设置 setuid 位的程序个数,必须控制在绝对小的范围
内。
第二个是 setgid 位(八进制 2000),这个相似于 setuid 位,把有效用户组 ID 从
真正的用户组 ID 更改为文件所有者的组 ID。如果设置了一个目录的 setgid 位,则
目录中新创建的文件具有这个目录用户组的所有权,而不是文件创建者所属用户组
的所有权。对于共享目录来说,当一个普通用户组中的成员,需要访问共享目录中
的所有文件,而不管文件所有者的主用户组时,那么设置 setgid 位很有用处。
第三个是 sticky 位(八进制 1000)。这个继承于 Unix,在 Unix 中,它可能把
一个可执行文件标志为“不可交换的”。在 Linux 中,会忽略文件的 sticky 位,但
是如果一个目录设置了 sticky 位,那么它能阻止用户删除或重命名文件,除非用户
是这个目录的所有者,或者是文件所有者,或是超级用户。这个经常用来控制访问
共享目录,比方说/tmp。
这里有一些例子,使用 chmod 命令和符号表示法,来设置这些特殊的权限。首
先,授予一个程序 setuid 权限。
chmod u+s program
下一步,授予一个目录 setgid 权限:
chmod g+s dir
最后,授予一个目录 sticky 权限:
chmod +t dir
当浏览 ls 命令的输出结果时,你可以确认这些特殊权限。这里有一些例子。首
先,一个程序被设置为 setuid 属性:
-rwsr-xr-x
具有 setgid 属性的目录:
drwxrwsr-x
设置了 sticky 位的目录:
drwxrwxrwt
更改身份
在不同的时候,我们会发现很有必要具有另一个用户的身份。经常地,我们想要得到超级
用户特权,来执行一些管理任务,但是也有可能 “变为” 另一个普通用户,比如说测试一个帐
号。有三种方式,可以拥有多重身份:
1. 注销系统并以其他用户身份重新登录系统。
2. 使用 su 命令。
3. 使用 sudo 命令。
我们将跳过第一种方法,因为我们知道怎样使用它,并且它缺乏其它两种方法的方便性。
在我们自己的 shell 会话中,su 命令允许你,假定为另一个用户的身份,以这个用户的 ID 启
动一个新的 shell 会话,或者是以这个用户的身份来发布一个命令。sudo 命令允许一个管理员
设置一个叫做/etc/sudoers 的配置文件,并且定义了一些具体命令,在假定的身份下,特殊用
户可以执行这些命令。选择使用哪个命令,很大程度上是由你使用的 Linux 发行版来决定的。
你的发行版可能这两个命令都包含,但系统配置可能会偏袒其中之一。我们先介绍 su 命令。
su -以其他用户身份和组 ID 运行一个 shell
su 命令用来以另一个用户的身份来启动 shell。这个命令语法看起来像这样
su [-[l]] [user]
如果包含 “-l” 选项,那么会为指定用户启动一个需要登录的 shell。这意味着会加载此用户
的 shell 环境,并且工作目录会更改到这个用户的主目录。这通常是我们所需要的。如果不指
定用户,那么就假定是超级用户。注意(不可思议地),选项 “-l” 可以缩写为”-”,这是经常用
到的形式。启动超级用户的 shell,我们可以这样做:
[me@linuxbox ~]$ su -
Password:
[root@linuxbox ~]#
sudo -以另一个用户身份执行命令
sudo 命令在很多方面都相似于 su 命令,但是 sudo 还有一些非常重要的功能。管理员能够
配置 sudo 命令,从而允许一个普通用户以不同的身份(通常是超级用户),通过一种非常可控
的方式来执行命令。尤其是,只有一个用户可以执行一个或多个特殊命令时,(更体现了 sudo
命令的方便性)。另一个重要差异是 sudo 命令不要求超级用户的密码。使用 sudo 命令时,用
户使用他/她自己的密码来认证。比如说,例如,sudo 命令经过配置,允许我们运行一个虚构
的备份程序,叫做 “backup script”,这个程序要求超级用户权限。通过 sudo 命令,这个程序
会像这样运行
按下回车键之后,shell 提示我们输入我们的密码(不是超级用户的)。一旦认证完成,则执
行具体的命令。su 和 sudo 之间的一个重要区别是 sudo 不会重新启动一个 shell,也不会加载
另一个用户的 shell 运行环境。这意味者命令不必用单引号引起来。注意通过指定各种各样的
选项,这种行为可以被推翻。详细信息,阅读 sudo 手册页。
想知道 sudo 命令可以授予哪些权限,使用 “-l” 选项,列出所有权限:
Ubuntu 与 sudo
普通用户经常会遇到这样的问题,怎样完成某些需要超级用户权限的任务。这
些任务包括安装和更新软件,编辑系统配置文件,和访问设备。在 Windows 世界
里,这些任务是通过授予用户管理员权限来完成的。这允许用户执行这些任务。然
而,这也会导致用户所执行的程序拥有同样的能力。在大多数情况下,这是我们所
期望的,但是它也允许 malware (恶意软件),比方说电脑病毒,自由地支配计算
机。
在 Unix 世界中,由于 Unix 是多用户系统,所以在普通用户和管理员之间总是
存在很大的差别。Unix 采取的方法是只有在需要的时候,才授予普通用户超级用
户权限。这样,普遍会用到 su 和 sudo 命令。
几年前,大多数的 Linux 发行版都依赖于 su 命令,来达到目的。su 命令不需
要 sudo 命令所要求的配置,su 命令拥有一个 root 帐号,是 Unix 中的传统。但这
会引起问题。所有用户会企图以 root 用户帐号来操纵系统。事实上,一些用户专门
以 root 用户帐号来操作系统,因为这样做,的确消除了所有那些讨厌的“权限被拒
绝”的消息。相比于 Windows 系统安全性而言,这样做,你就削弱了 Linux 系统
安全性能。不是一个好主意。
当引进 Ubuntu 的时候,它的创作者们采取了不同的策略。默认情况下,Ubuntu
不允许用户登录到 root 帐号(因为不能为 root 帐号设置密码),而是使用 sudo 命
令授予普通用户超级用户权限。通过 sudo 命令,最初的用户可以拥有超级用户权
限,也可以授予随后的用户帐号相似的权力。乌班图中进入超级用户采用:sudo su 退出还是exit.
chown -更改文件所有者和用户组
chown 命令被用来更改文件或目录的所有者和用户组。使用这个命令需要超级用户权限。
chown 命令的语法看起来像这样:
比方说,我们有两个用户,janet,拥有超级用户访问权限,而 tony 没有。用户 jant 想要
从她的主目录复制一个文件到用户 tony 的主目录。因为用户 jant 想要 tony 能够编辑这个文
件,janet 把这个文件的所有者更改为 tony:
这里,我们看到用户 janet 把文件从她的目录复制到 tony 的主目录。下一步,janet 把文件
所有者从 root(使用 sudo 命令的原因)改到 tony。通过在第一个参数中使用末尾的 “:” 字符,
janet 同时把文件用户组改为 tony 登录系统时,所属的用户组,碰巧是用户组 tony。
注意,第一次使用 sudo 命令之后,为什么(shell)没有提示 janet 输入她的密码?这是因
为,在大多数的配置中,sudo 命令会相信你几分钟,直到计时结束。
chgrp -更改用户组所有权
在旧版 Unix 系统中,chown 命令只能更改文件所有权,而不是用户组所有权。为了达到目
的,使用一个独立的命令,chgrp 来完成。除了限制多一点之外,chgrp 命令与 chown 命令使
用起来很相似。
更改用户密码
这一章最后一个话题,我们将讨论自己帐号的密码(和其他人的密码,如果你具有超级用
户权限)。使用 passwd 命令,来设置或更改用户密码。命令语法如下所示