linux下档案的权限可分为基本权限隐藏的权限特殊权限三部份,而这些权限在不同的权限位置上表示对不同的用户群体赋予了相应的权限,用户群体又分为:档案的所属主、档案的所属群主、其他用户

  1. 基本权限

[root@zhaochj ~]# ls -l install.log-rw-r--r--. 1 root root 22459  8月 19 22:08 install.log

用“ls -l”长文件名的格式检索install.log这个档案后出现的“-rw-r--r--”就是表示此档案的权限。

这里一共有10个字符,这10个字符可以分为4组:

第一组为第一个字符“-”表示档案是一个普通的档案文件,当为“d”时表示为目录,当为“l”小写的L时,表示是一个链接档案,当为“b”时可供存储的设备档案,比如/dev/sda这样的文件,当为“c”时,表示是串行端口设备档案,如键盘、鼠标设备。

第二组是三个字符组成的一个组,此组是表示档案的属主,也就是档案的拥有者所具有的权限,第二组,第三组,第四组都是“rwx”的一个组合。这里的“rw-”表示档案拥有者对此档案具有可读,可写的权限,最后一位是可执行“x”的权限位,但这里为“-”,则表示属主对档案没有可执行的权限。

第三组表示档案的所属组拥有的权限,一个组中的成员可以有多个,linux下当创建一个用户时,会默认创建一个同用户名的基本组,而一个用户除了基本组外还可以附加在一个或多个组上,那这些组就成了这个用户的附加组。

第四组表示除了档案拥有者和所属组以外的用户对此档案的权限。

example:

[root@zhaochj tmp]# pwd/tmp[root@zhaochj tmp]# ll install.log-rw-r-----. 1 gentoo gentoo 22459 Aug 20 03:40 install.log[root@zhaochj tmp]#

/tmp/install.log档案的属主,属组都为gentoo,权限为“640”,在“其他人”的权限位上没有任何权限,所以不是用户gentoo,不是组gentoo中的用户对此档案没有查看此档案的权限

[openstack@zhaochj tmp]$ cat install.logcat: install.log: Permission denied[openstack@zhaochj tmp]$

2. 隐藏权限

隐藏权限是用在一些比较特殊的环境,例如:我们不希望有用户能修改系统的日志文件,对日志我们系统只能往里增加内容,用户不应该对日志文件进行修改,不能删除文件。再如:系统中有一个文件对安全性要求非常高,这个文件一旦建立后,不希望任何用户对此文件进行修改,删除此文件

设置隐藏权限用chattr命令,使用风格与chmod相似,都可以用“+”“-”对档案设备相应的权限。

常用格式:

]# chattr [+|-]a filename

]# chattr [+|-]i filename

]# chattr -R {+|-]a 目录名

]# chattr -R {+|-]i 目录名

[root@zhaochj ~]# ls -l install.log-rw-r--r--. 1 root root 22459 Aug 19 22:08 install.log[root@zhaochj ~]# chattr +a install.log[root@zhaochj ~]# lsattr install.log-----a-------e- install.log[root@zhaochj ~]# rm -rf install.logrm: cannot remove `install.log': Operation not permitted[root@zhaochj ~]#

对install.log档案给予了“a”(append)的权限后,用户只能追加内容到此档案,不能删除、修改此档案。

[root@zhaochj tmp]#[root@zhaochj tmp]# chattr +i install.log[root@zhaochj tmp]# echo "333" >> install.log-bash: install.log: 权限不够[root@zhaochj tmp]# rm -rf install.logrm: cannot remove `install.log': Operation not permitted[root@zhaochj tmp]#

给档案赋予“i”权限后,此档案不能被修改,重命名,做链接,删除等操作。

3.特殊权限

特殊权限有Set UID,Set GID,sTicky三种类型

当档案有特殊权限时,特殊权限会占用9位位组中相应的可执行位,把原应该是“x”的这个位强制占用,用相应的“s|S”或“t|T”来代替。赋予档案特殊权限的方法与赋予档案基本权限的命令一样,也是chmod这个命令。

  • SUID的功能:

    1、SUID权限只能对二进制程序有效

    2、执行此二进制档案的用户要对此二进制档案拥有执行权限

    3、SUID权限的有效时间是在执行一个二进制开始到命令执行结束

    4、二进制程序的执行者在执行时会暂时拥有此程序所有者的权权限

举例:

在rhel6.0中,/etc/shadow档案权限如下

[root@zhaochj tmp]# ll /etc/shadow----------. 1 root root 859 Aug 19 22:08 /etc/shadow

这表示除了root用户外其他的用户对此档案是没有任何权限的,但这个档案是管理我们用户密码的档案,当一个普通用户登陆系统后,用passwd这个命令来更改自己密码时,修改后的密码不也是要写入这个shadow档案吗?而明明这个档案没开放任何权限给普通用户,普通用户是怎么实现密码的更新呢?我们来看下passwd这个命令的权限

[root@zhaochj tmp]# ls -l /usr/bin/passwd-rwsr-xr-x. 1 root root 22632 Jan 29  2010 /usr/bin/passwd

看见了吧,passwd这个二进制程序是拥有SUID权限的,对于“其他用户”这个档案也是开放了“x”可执行权限,所以一个普通用户也能使用这个命令。当一个普通用户运行passwd这个命令时,这个修改自身密码的进程会暂时获得passwd这个档案的拥有都的权限,也就是root的权限,而root的权限是“rwx”,这里的“x”被“s”位占用,但可执行权限依然存在,此时,进行的身份切换到了root,这样当然能对/etc/shadow档案进行更新,这样普通用户也能更换自身的密码了。

  • SGID的功能:

    "s"位出现在属主的“x”位上时那档案就拥有了SUID的权限,当“s”位出现在档案属组的“x”位上时,那档案就拥有了SGID的权限。

    1、二进制档案和目录都可拥有SGID的权限

    2、程序的执行者对该档案要拥有可执行的权限

    3、在执行此程序时,进程会切换到此二进制文件所组拥有的权限

举例1:

/usr/bin/locate这个搜索档案的命令在执行时会去读取/var/lib/mlocate/mlocate.db这个数据库文件,我们先来看看这两个档案的权限

[root@zhaochj tmp]# ls -l /usr/bin/locate-rwx--s--x. 1 root slocate 31568 Mar 30  2010 /usr/bin/locate[root@zhaochj tmp]# ls -l /var/lib/mlocate/mlocate.db-rw-r-----. 1 root slocate 1195457 Aug 20 00:07 /var/lib/mlocate/mlocate.db

mlocate.db这个档案只有属主与属组才有读取的权限,当一个不是以slocate这个为组的普通用户使用locage这个命令时,发现在属组上拥有“s”位,那这个进程会切换到以组slocat的用户来运行,当这个进程去读取mlocate.db这个文件时,发现进程是以组slocate的权限运行的,具有对档案有读取的权限,所以命令locate命令能正常读取locate.db里的数据。

当一个目录具有SGID权限时,那此目录具有如下的功能:

1、用户对此目录具有rx权限时,用户可进入此目录

2、用户在此目录上的群组不再是用户的所属的组,群组被切换成了目录的群组

3、若用户对此目录具有可写入的权限,那用户在此目录下就可以新建档案,新建的档案的属主是用户本身,但属组就成了目录的所属群组

举例2

假设有这样一个需求:一个研发项目需要两个部门的人来共同完成,部门A与部门B之间的档案互相都可以修改,删除,但是其他部门的人没有访问这些档案的权限,那这样我们怎样来设置环境?

思路:1、新建共同的工作目录/project,2、设定此目录的访问权限为770,只给属主和属组开放权限,这样就拒绝了其他人访问此目录,这样只要两部门的用户在进入这个目录后能切换到属组拥有的权限,那不是就有了“rwx”的权限了,这不就是SGID的作用所在?

[root@zcj ~]# mkdir /project[root@zcj ~]# groupadd projectgroupadd: group project exists[root@zcj ~]# chgrp -R project /project/  \\改变目录的属组[root@zcj ~]# chmod -R 770 /project/       \\改变目录的权限[root@zcj ~]# useradd -G project gentoo    \\增加用户并加上附加组[root@zcj ~]# useradd -G project slackware[root@zcj ~]# cat /etc/group | grep gentooproject:x:506:gentoo,slackwaregentoo:x:500:[root@zcj ~]# cat /etc/group | grep slackwareproject:x:506:gentoo,slackwareslackware:x:501:[root@zcj ~]# chmod -R g+s /project/    \\给目录加上SGID的权限[root@zcj ~]# ll -d /project/drwxrws--- 2 root project 4096 Oct 22 10:54 /project/[root@zcj ~]# su - gentoo    \\切换到gentoo用户[gentoo@zcj ~]$ cd /project/[gentoo@zcj project]$ touch gentoo.txt[gentoo@zcj project]$ lltotal 4-rw-r--r-- 1 gentoo project 0 Oct 22 11:01 gentoo.txt  \\档案的属组是project了,是目录/project的属组,体现了SGID的作用[root@zcj ~]# su - slackware[slackware@zcj project]$ touch slackware.txt[slackware@zcj project]$ lltotal 8-rw-rw-r-- 1 gentoo    project 0 Oct 22 11:04 gentoo.txt-rw-rw-r-- 1 slackware project 0 Oct 22 11:04 slackware.txt[slackware@zcj project]$ echo "22" > gentoo.txt[slackware@zcj project]$ cat gentoo.txt22[slackware@zcj project]$ su - gentoo[gentoo@zcj ~]$ echo "5888" > /project/slackware.txt[gentoo@zcj ~]$ cat /project/slackware.txt5888[gentoo@zcj ~]$ rm -rf /project/slackware.txt[gentoo@zcj ~]$ ls /project/gentoo.txt[slackware@zcj ~]$ rm -rf /project/gentoo.txt[slackware@zcj ~]$ ls /project/[slackware@zcj ~]$ su - ubuntu   \\其他的用户没有权限进行/project目录Password:[ubuntu@zcj ~]$ iduid=502(ubuntu) gid=502(ubuntu) groups=502(ubuntu) context=root:system_r:unconfined_t:SystemLow-SystemHigh[ubuntu@zcj ~]$ cd /project/-bash: cd: /project/: Permission denied

那有没有这样一种思路一样可以实现以上的要求?目录/project同样属组为project组,我们在新建用户gentoo与用户slackware时把自己的基本组都指向project组,如果这样这两个用户不是现时都具有project组的权限了?把上面做的操作全部删除后再做这个实验。

[root@zcj ~]# groupadd project[root@zcj ~]# mkdir /project[root@zcj ~]# useradd -g project gentoo[root@zcj ~]# useradd -g project slackware[root@zcj ~]# id gentoouid=503(gentoo) gid=506(project) groups=506(project) context=root:system_r:unconfined_t:SystemLow-SystemHigh[root@zcj ~]# id slackwareuid=504(slackware) gid=506(project) groups=506(project) context=root:system_r:unconfined_t:SystemLow-SystemHigh[root@zcj ~]# chgrp -R project /project/[root@zcj ~]# chmod -R 770 /project/[root@zcj ~]# ll -d /project/drwxrwx--- 2 root project 4096 Oct 22 11:19 /project/[root@zcj ~]# su - gentoo[gentoo@zcj ~]$ cd /project/[gentoo@zcj project]$ touch gentoo.txt[gentoo@zcj project]$ lltotal 4-rw-r--r-- 1 gentoo project 0 Oct 22 11:21 gentoo.txt  \\没有了SGID后gentoo用户创建文件时采用了默认的权限,这样project组的成员对此档案就只有读权限,不符合我们的要求,只能改变默认档案的权限了。[gentoo@zcj project]$ umask0022[gentoo@zcj project]$ umask 0006[gentoo@zcj project]$ touch gentoo.txt1[gentoo@zcj project]$ lltotal 8-rw-r--r-- 1 gentoo project 0 Oct 22 11:21 gentoo.txt-rw-rw---- 1 gentoo project 0 Oct 22 11:26 gentoo.txt1  \\这样改变umask后创建的文件的属组也有了可写的权限[gentoo@zcj ~]$ su -Password:[root@zcj ~]# su - slackware[slackware@zcj ~]$ cd /project/[slackware@zcj project]$ umask 0002  \\这里的umask值与上边的不同,对“其他人”这个组上的权限其实可以不作限制,因为目录/project“其他人”是没有任何权限的。[slackware@zcj project]$ touch slackware.txt[slackware@zcj project]$ lltotal 12-rw-r--r-- 1 gentoo    project 0 Oct 22 11:21 gentoo.txt-rw-rw---- 1 gentoo    project 0 Oct 22 11:26 gentoo.txt1-rw-rw-r-- 1 slackware project 0 Oct 22 11:30 slackware.txt[slackware@zcj project]$ mkdir slac[slackware@zcj project]$ ll -d slacdrwxrwxr-x 2 slackware project 4096 Oct 22 11:30 slac[slackware@zcj project]$ echo "22" > gentoo.txt1[slackware@zcj project]$ cat gentoo.txt122[slackware@zcj project]$ su -Password:[root@zcj ~]# su - gentoo[gentoo@zcj ~]$ echo "888" > /project/slackware.txt[gentoo@zcj ~]$ cat /project/slackware.txt888[gentoo@zcj ~]$ su -Password:[root@zcj ~]# su - ubuntu[ubuntu@zcj ~]$ cd /project/-bash: cd: /project/: Permission denied

此种方法中然也能达到要求,但是改变了默认的umask值,还是建议采用SGID,有SGID这样好的工具为什么不用呢?这个实验颠覆了我以前一直有的想法,那就是一个基本组只能属于一个用户,但就是这样的,这里我不是把gentoo与slackware两个用户的基本组都指向了project组了吗?

  • sTicky的功能:

1、只对目录生效,当用户对此目录有rwx权限,也就是用户对在此目录下可新建,删除,修改档案

2、用户在此目录下创建的档案,只有用户本身与root用户才能对档案进行删除、修改操作。

看看/tmp这个目录吧

[root@zhaochj ~]# ll -d /tmp/drwxrwxrwt. 4 root root 4096  8月 20 01:50 /tmp/

最后整理一下SUID、SGID、STICKY的权限设置方法,既然是对档案赋予权限,当然是用chmod命令,在基本的9位位组上,那几个数字怎么来定义的呢,比如默认创建目录时,权限为“755”,第一个数字“7”代表属主的权限,第二个数字“5”代表属组的权限,第三个数字“5”代表其他人用户的权限,转换为相应的二进制后为

111 101 101 ----->755

rwx r-x r-x ----->有相应的权限就用“1”示,没有权限就用0来表示

那我们的特殊权限怎么表示呢,我们可以这样理解,特殊权限位也是单独的三位位组

111 -->7

sst -->表示属主加上s权限,属组加上s权限,其他用户拥有了t的权限

11o -->6

ss- -->表示档案拥有了SUID与SGID的权限

100 -->4

s-- -->表示档案拥有了SUID的权限

使用举例:

[root@zhaochj test]# ll总用量 0-rw-r--r--. 1 root root 0  8月 20 02:24 gentoo.txt[root@zhaochj test]# chmod 4655 gentoo.txt[root@zhaochj test]# ll总用量 0-rwSr-xr-x. 1 root root 0  8月 20 02:24 gentoo.txt

这里出现了大“S”表示档案在,因为特殊权限是占用“x”的位置,但这里原有档案没有可执行的权限,所以加上特殊权限后“S”就表示原档案没有执行权限,与“s”做区别。