权限 第一篇
概念
了解权限的重要性
相关资源:
man chmod
man chown
LIGS, 3.1
Revision / Modified: April 21, 2002
Author: Tom Berger
Translator: Wu XiaoGuang
概念
Linux 通过帐号(account)来识别不同的用户。为了使用系统,您得告诉 Linux ,您是以什么身份(即您想要使用哪个帐号)登入的。完成这些后,您就被带到该帐号的 home 目录(/home/account),然后您就可以做很多事情了。
每个 UNIX 系统已经内置了一个帐号,这就是‘root’(超级用户)。这个帐号有些特别:home 目录是‘/root’,并且‘root’对系统有绝对的控制权。
这种方案的基本理念就是:将日常应用与系统管理分离。这样在常规使用系统时即使出错,也不至于对操作系统造成较大破坏。
这样也使得同一系统中可以有多位用户。这些增加的用户不一定是人——系统服务经常就有自己的帐号,所以他们也就不一定非要由‘root’来运行。这样如果系统服务的配置出了问题,也不会对操作系统产生恶劣影响。
那么,操作系统如何决定谁可以做什么呢?这就要引入权限(permission)的概念。
UNIX 系统中的每个文件都有权限的设定,由文件列出中的前十个字符及所由者来表示:
ls -l file
-rw-rw-r-- (...) owner group (...) file
UNIX 中的所有东东都要通过文件来管理,甚至对设备(通过‘/dev’下的设备文件),比如打印机、猫、声卡等等。如果您对某个代表设备的文件没有足够的权限,那您也就无法使用该设备。
权限的第一个概念是所有权。您对自己创建的文件或目录就有所有权,也可以通过‘chown’命令(改变所有者:‘change owner’的缩写)将所有权传给您。如果您拥有一个文件,通常就能对其进行任何操作。
但经常是多个帐号都需要获取某个文件或设备。如果每次某个人需要,就要改变这个文件的所由者,就太麻烦了。其实所有权不仅可针对单个帐号,还可用于 groups(组)。不同的组别由‘/etc/group’提供,这个文件中的条目类似于:
group_name:x:group_ID:group_members
要看看您当前帐号属于哪些组,可以用命令
groups
如果您属于对某个文件有一定权限的那个组,您就可以对该文件进行相应的操作,尽管您可能不是该文件的所有者。
通常一个 UNIX 系统中含有 60.000 个以上文件,其中的大多数对系统中的所有用户来说,都是可访问的。一种实现的办法是,创建一个大组,包含系统中的所有帐号,然后将文件都赋给这个大组。但由于权限不仅仅决定谁可以访问某个文件,还决定了何种程度的获取,这样的大组将破坏系统设计的最初意图:导致部分组员对某些文件缺少必要的权限,而另一些组员对该文件的权利又需要加以限制。这就是‘others’组产生的原因。这个特别的组对某文件的权限将赋给系统中的所有帐号。再看一下这个例子:
ls -l file
-rw-rw-r-- (...) owner group (...) file
其中 2-4 (rw-)字符描述了所有者的权限,5-7 (rw-)字符描述了组员拥有的权限,而 8-10 (r--)字符描述了其他帐号对这个文件的权限。
让我们从文件的归属转移到具体的权限类型。对于一个文件,您有多种处理方式:可以读取、编辑、删除,在一些情况下,还可以执行。权限限制的也正是这些动作,这就引入了 accessibility (获取程度)的概念。
被赋予的获取权限有三种:可读权(read ,以‘r’标识)、可写可删权(write ,以‘w’标识)、可执行权(execute ,以‘x’标识)。在上面的例子中,所有者和组员对文件有读、写/删的权利,而其他人只能读,不能改变文件的内容。
上面的这个文件还不能被运行。与 Windows 系统不同,文件要想被运行,不仅要包含可执行的内容(二进制或脚本文件),还必须设置成可执行( execution bit)。这样可以限制一些帐号运行某些文件或程序,当然,这一般是出于安全考虑。如果没有设成可执行,那即使‘root’也不能运行那个文件,但‘root’可以将任何文件设成可执行。但如果文件中没有可执行的内容,即便设成可执行,仍然无法真正地被运行。
目录的权限类似。由于目录的特点,有些权限的含义存在细小差别:‘r-x’指可以列出目录内容,并且可以进入该目录。‘rwx’指可以在目录中创建或删除文件。除了这两种权限,用其他任何权限组合,您都无法进入该目录。
(请注意,根据 Mandrake Linux 7 中 Mandrake Security Tools 的介绍,对于安装时选的或在‘DrakConf’设定的不同的安全级别,文件的默认权限也有所不同。)
section index top
了解权限的重要性
Unix/Linux 有一个显著的不同是所有输入/输出操作都通过文件来实现。例如,您将一个文件传送到打印机,可能实际上就送到了文件‘/dev/lp0’。如果您通过猫来上网,那所有数据的读写都要通过‘/dev/ttyS0’(或 S1/S2/S3)。
结果是您或者执行的程序必须对相应文件由读写权,否则的话,将无法工作。对于目录也是如此:如果程序在您无法访问的目录中,您也就没有办法运行这个程序。许多配置问题都源于错误的权限设置,所以检查权限在纠错中是很重要的一步。
现在,您可能会问,反正这机器只有我一个人用,为什么还要有这些繁琐的权限?如果我一直用‘root’,不就可以做任何事了吗?
您不应该这样做的原因之一: ‘root’只要错误地运行一个命令,就可以导致您的系统彻底完蛋;而普通用户则根本无法对系统造成大的伤害。特别是当您还是 Linux 初学者时,这种机制将保护系统不至于意外被破坏。
还有其他理由:
大多数程序都赋予普通用户运行的权限。所以当您以普通用户身份来执行这些程序时,如果发现这个程序运行失控,可以将其正常地杀掉,当然由于您运行的程序没有更多权限,也就无法对您的系统造成真正的破坏。但是,您想想,如果您是以‘root’来运行这个程序的话 …… 我相信您可以认识到这一点。
正是文件的运行权限使得这个文件可以被执行。许多脚本,如用 Perl 写的程序,甚至是简单的 shell 脚本都要依靠这个。如果您下载了一个脚本,但发现其无法运行,请检查一下,看其是否被设成可执行(详见下篇)。
程序的运行需要不同的 user id (UID)。一些程序尽管由普通用户启动,但仍需要‘root’特权(如在‘/usr/X11R6/bin’下通过 Xwrapper 的 X 服务器),这类程序以‘s’标识:
-rws--x--x 1 root root [...] /usr/X11R6/bin/Xwrapper*
(星号‘*’告诉您这是个可执行文件)。
但是这样的程序也造成了安全隐患,因为骇客(crackers)可以利用这个来获得对机器的‘root’特权。所以,建议尽量减少这类程序的数量,并且要警惕这方面的安全警报。请注意:Linux 不会执行 SUID shell 脚本。
section index top
有些弄不清楚吗?;-) 看一些实例吧 ……
权限 第二篇
实例
改变权限
常用技巧
相关资源:
man chmod
man chown
LIGS, 3.1
RUTE, 16.1
Revision / Modified: April 21, 2002
Author: Tom Berger
Translator: Wu XiaoGuang
实例
有些糊涂吗?;-) 没关系,看看下面的例子就清楚了。
文件
‘slocate’包是一个很好的例子。如果您已经安装了这个包,那就打开一个终端并输入:
ls -l /usr/bin/updatedb
这是更新‘(s)locate’资料库的程序。您得到的结果类似于:
-rwxr-xr-x 1 root slocate [...] /usr/bin/updatedb*
前九个字符描述了存取权限(第一个‘-’标识了文件类型):
所有者(Owner) | 组(Group) | 其他人 (Others)= rwx | r-x | r-x
您应该还记得:‘r’表示读(read),‘w’表示写(write),而‘x’则表示执行(execute)。‘-’指未设置,也就是没有这个权限。权限的顺序一般是‘rwx’。所以,上述字符串的含义是:
文件可以被所有者读/写 - 或删除 - 和执行 (rwx) ,
文件可被组员读和执行(r-x),
文件可被其他人读和执行(r-x)。
现在您需要知道文件属于谁、属于哪个组。您可以在 inode 号(1)后找到这些信息:
root slocate
所有者是‘root’,组名是‘slocate’。
目录
目前为止很顺利,但如果您以普通用户执行上面的命令,将得到:
slocate: You are not authorized to create a default slocate database!
slocate 资料库在‘/var/lib/slocate’,让我们来看一看:
ls -l /var/lib/
drwxr-x--- 2 root slocate [...] slocate/
这个目录的权限看起来有些不同:
所有者(这里是‘root’)可以进入这个目录(rx),可以添加或删除里面的内容 (w) ,
‘slocate’组中的成员可以进入这个目录读取内容 (rx) ,
其他人没有任何权利 (---) 。
(请记住:对于目录,读和执行的权限必须成对出现,也就是如果想进入某个目录,您必须有这两个权利!)。
由于您不是‘root’,也就不能运行‘updatedb’:您缺少改变‘/var/lib/slocate’内容的权利。
现在您可能会想:“我没有权利获取 slocate 资料库,但为什么就可以用普通用户的身份来运行‘locate’呢?这当然也需要从资料库中获取!” 没错。
setUID, setGID
如果您运行 ls -l /usr/bin/locate ,得到的结果类似于:
-rwxr-sr-x 1 root slocate [...] /usr/bin/locate*
请注意:在组权限的行中,‘s’已经替代了‘x’。这就是您先前听说过的另一重要机制: setUID/setGID 。这种机制允许用户以另一 User 或 Group ID 来运行程序。
由于操作系统更喜欢与数字而不是名称打交道,每个帐号和组都有唯一的 ID 号。您使用名称,而系统将其转换成数字。对此您不必担忧,我在这里提到这些只是为了说明‘setUID’和‘setGID’的由来。如果您真的感到好奇,试着运行
id
但如果您运行‘locate’,由于‘setGID’(set Group ID)使得对于‘slocate’组员可执行,系统将认为您是‘slocate’的组员,因此您也就可以读取‘/var/lib/slocate’的资料库。
对于‘setUID’(set User ID)的程序也是如此,经常是‘setuid root’,比如前面提到的‘Xwrapper’:
-rws--x--x 1 root root [...] /usr/X11R6/bin/Xwrapper*
当您启动 X 时,由于‘Xwrapper’的权限设置,操作系统误以为您是‘root’。这样的优点是,您不必是‘root’就可以运行 X ,及 X 下的程序 (请看 进程介绍)。
section index top
改变权限
请记住:权限包括了两个概念:所有权和 accessibility (获取程度)。因此您可以通过两种方式影响权限:用命令‘chown’(CHange OWNer)改变所有者,或用‘chmod’’(CHange MODus)改变获取程度。
用‘chown’改变所有者
‘chown’是个比较简单的命令:
chown tom:users test.txt
将文件‘test.txt’改为归用户‘tom’、组‘users’所有。您只能改变属于您的文件的所有权(只有‘root’可以改变不属于自己的目录或文件的权限)。如果您只想改变文件属于的组别可以用‘chgrp’。添上‘-R’可选项后,您可以递归地来执行这个命令(也就是改变目录下所有文件、目录的权限):
chown -R tom:users docs
将目录‘docs’下的所有文件和目录设成属于‘tom’、组‘users’。
用‘chmod’改变获取程度
‘chmod’就有些复杂了。这里有三个部分:用户(user)、组(group)及其他(others),分别取头一个字母:u 、g 、o 。有三种权利:读(read)、写(write)、执行(execute),也就是‘rwx’。简化的‘chmod’语法如下所示:
chmod [ugo] [+-] [rwx] file
我们假设您想授给(+)其他人(others,o)对文件‘test.txt’有读(read,r)的权利。命令就是:
chmod o+r file.txt
您如果想除去组员(group,g)对程序‘/usr/bin/runme’执行(execute,x)的权利,就用:
chmod g-x /usr/bin/runme
(很多情况下,您得用‘root’身份来完成这些……)。
您希望拒绝除了所有者以外任何人对‘secure’目录的访问:
chmod go-rwx secure
‘chmod’还有一些实用的变通,如‘a’(对于所有,all),因此
chmod a+r test.txt
将允许所有者、组员及其他人读取该文件。
另一个是设置 UID 或 GID 用的‘s’:
chmod a+x,u+s file
将‘file’设成‘setUID root’,对所有人都可执行。
和‘chown’类似,您可以用‘-R’(大写的‘R’!)可选项使‘chmod’递归执行。但要注意下面的警告!
‘chmod’也接受由三个八进制数定义的权限:‘4’指‘可读’,‘2’指‘可写’、‘1’指‘可执行’。如果哪个没有被赋值,就设成‘0’。对应的表示是有,‘setuid’(4)、‘setgid’(2) 或‘sticky bit’(1):
chmod 750 file
将赋予所有者读+写+执行(4+2+1=7)‘file’的权利,组员有权读+执行 (4+0+1=5),其他人不能进行任何操作 (0+0+0=0)。
这两种方法有区别吗?有区别,第一种是设置相对的权限,而第二种是绝对的权限。
例子:
ls -l some.txt
-rw-r----- (...) some.txt
现在假设您想赋给其他人(others)读这个文件的权利,用第一个方法,就需要命令:
chmod o+r some.txt
得到的结果是:
-rw-r--r-- (...) some.txt
用第二个方法的话,同样可以满足要求,但结果可以不同:
chmod 444 some.txt
-r--r--r-- (...) some.txt
第一种方法保留了所有者写的权利,但用了第二种方法后,您还得确认所有者、组员及其他人的绝对权限,以使得符合最初的愿望,在这里是:
chmod 644 some.txt
您最好熟悉其中的一种,以免混淆。
section index top
常用技巧
处理权限时要小心了!由于这关系到 Linux 的安全,轻率的举动可能导致一些问题,下面就有些例子:
chmod -R a-x text 这是很常见的一种。您从 MS Windows 分区中复制了一个名为‘text’的目录,由于在文件处理上的差异,这个目录下的所有文件都被设成了可执行(x)。您觉得上面的命令没有问题,但下次您想进入这个目录时,将得到:
bash: cd: text: Permission denied
您用‘su’切换到‘root’帐号,再运行:
bash: cd: text: Permission denied
这是怎么回事?您不仅除去了‘text’目录下文件的可执行权,而且还影响了目录本身!这意味着即使是‘root’也不能进入这个目录!只能再将目录设成可执行:
chmod ug+x test
如果您希望除去目录结构下文件的可执行权限,而又想不影响目录,您可以用:
find . -type f -exec chmod a-x {} \;
这将寻找所有文本文件(-type f),然后对这些文件运行(-exec)‘chmod a-x’。
chmod a+rw /dev/... 这是为绕过设备文件的权限冲突的常见小办法。一般来讲,将权限赋给‘others’组时要特别小心。如果这个组包含任何人,那对方可能是您系统的合法用户,但也可能是无聊的入侵者。如果程序配置要求这么做,那这样的程序一定存在某些问题。如果实在没有其他办法,最好用下面的办法:
1) ‘su’为‘root’,然后对那个设备文件运行 chmod g+rw,o-rwx 。
2) 对那个文件运行 chgrp group 。
3) 通过‘/etc/group’,将用户加到对应的组中。
对于要求 setUID root 的程序,方法类似。如果您觉得一定要将某个程序设为‘uid root’,那就可以用我在 关于 PPP 的文章 中介绍的办法。
请注意:将设备文件改变权限可能没有效果,或只有短期作用,这要取决于 devfs 或 PAM 。
在‘chmod’前执行‘chown’,这是个坏主意,因为‘chmod’将使先前运行的‘chown’多余。‘chmod’根据运行这个命令的用户的 GID 和 UID ,来设置文件所有者和组员的权限。所以请先运行‘chmod’,然后在执行‘chown’!
section index top
别紧张,这里讲的其实比实际应用要复杂些。如果您感到疑惑,没关系,因为我也有些弄不清楚(而且不是一点半点 ;-) )。