首先,我们都知道Linux是一个多用户操作系统,那么问题就来了,假设我有一个文件叫file1,这个文件是用户user1的,user1有一个项目组g1,他希望他项目组里的同事可以查看修改这个文件,但是不希望其他人看到文件中的内容当然也不能编辑。那怎么解决这个问题靠的就是我们下面要说的权限。通过对文件权限的配置我们就可以实现不同的用户或用户组在访问相同资源时不同的访问权限。
UGO模型
所谓UGO就是把对于文件所有的用户的三种身份,所属主user即文件主人,所属组group即文件所属群组,其他other即不是user也不在所属组。
用户已经分好了类别,那么一个文件需要什么属性的权限呢,在linux下一个文件的权限包括rwx,即read(读取)、write(写入)、excute(执行)对于一个普通文件(不包括目录)来说拥有read权限代表用户只可以查看文件中的内容,拥有write权限用户就可以修改文件中的内容(不需要read权限就可以修改),excute权限对于文件比较敏感,对于普通文件没有意义,但是一旦文件内容可以执行,也就意味着用户可以执行此文件(仅拥有执行权限即可执行不需要read权限),除非必要执行权限不应该配给任何人。
有了以上的内容上面的例子就很容易解决了,给file的所属主rw权限,把file的所属组改为g1并赋予rw权限,其他人权限为空。然后我们看一下文件信息中的权限位代表的含义。使用ll命令可以查看文件的详细信息。
-rw-r--r--. 1 root root 0 Apr 3 21:17 file1
-rw-r--r--. 这其中,第一位是文件类型-代表是普通文件
后面9位,3位一组代表ugo的权限-表示没有对应权限
最后一位是acl权限,此位为+表示该文件设置了acl权限
chown修改所有者
chown命令可以用来修改文件的所有者,包括所属主和所属组(处文件所属主和root其他用户不可使用此命令)
chown user1.g1 file1 \\把file所属主所属组改为user1,g1
chown可以使用-R选项对目录进行递归处理
chown -R username dir \\把dir目录及其目录下文件递归处理
chgrp修改所属组
chgrp使用方法和chown类似,通常很少使用同样支持-R进行递归
chgrp -R grpname dir \\把敌人目录及其目录下文件一并处理
chmod修改文件权限
chmod使用比较灵活也很常用,可以通过不同的方法指定文件权限
chmod u=rw,g=rw,o= file1 \\指定file1针对ugo的权限分别为rw,rw和空
上面的示例中,等号前面的u,g,o代表权限修改范围,可以分开指定也可以一次指定,也可以使用a表示全部修改,如下
chmod ug=rw,o= file1 \\和上条命令效果相同
chmod a=rw file1 \\所有用户权限设置为rw
同时还可以使用‘-’‘+’运算符如下
chmod u-w,g+r,o+r file1 \\去掉u的w权限,g和o加上r权限
chmod a-x file1 \\去掉file1文件所有用户的x权限
除了这种的方法,使用数字方法直接指定是我们更常用的方法。使用数字方法的时候我们用4,2,1分别表示rwx,在是使用的时候把ugo对应权限的对应数字相加就可以直接给文件设定对应的权限例如:
chmod 660 file1 \\指定file1针对ugo的权限分别为rw,rw,和空
chmod同样支持-R递归,不在示例。
扩展:目录权限
目录本质是一种特殊的文件,所以rwx对应的权限在目录上表现出来的和文件上不太一样,简单总结了一下,供参考
r | 只能列出文件夹下文件名,不包括详细信息 | rw | 和只给r一样 |
---|---|---|---|
w | 没用 | rx | 对于一般 |
x | 可进,可以执行目录下程序 | wx | 无法列出目录下文件,可以进入,可删除目录下文件 |
可以看出和文件不同的是,对于目录x权限属于基础权限,如果只给rw没有意义,但是需要注意的是,目录的w权限不能随便给,因为一般目录都会给rx权限,而wx权限的组合意味着用户可以删除目录下文件,所以对于目录来说,wx的权限组合是相当危险的。
默认权限和umask
我们在新建文件或者目录的时候都是有权限设定的,这个权限就叫做默认权限,对于文件来说这个权限是644,对于目录来说是755,那这个权限就是由umask决定的。可以使umask查看当前设定的umask值,umask值是四位数,第一位是特殊权限位(suid,sgid,sticky)。可以通过修改~/.bashrc文件修改当前用户umask也可以通过修改/etc/bashrc文件改变全局umask设定。和网上很多对umask的解释不同,下面介绍的umask和默认权限的计算应该更为精确。
首先,文件的最大默认权限为666,目录为777,通常我们用最大权限减去umask认为是默认权限,这种计算方法对目录来说并无问题,不过有些值这样算可能结果和实际并不相同。如umask为125,上面的方法默认文件权限应该为541,但实际创建会发现是642。
先给结论:umask代表取消对应的权限。具体是这样运算的
666
125
转换为二进制,这9位分别对应ugo权限组合中的9个权限位,1代表有对应权限,0表示没有对应权限
110110110
001010101
然后取消最大权限里umask中对应的权限解释如下
取消第一位和第二位的0权限,也就是不做更改,取消第三位的1权限也就是还是0,第四位取消0不变,第五位取消1为0……以此计算最后得出的二进制权限为
110100010也就是642
可以看一下下面的示例:
[[email protected] ~]# umask 125
[[email protected] ~]# umask
0125
[[email protected] ~]# touch file
[[email protected] ~]# mkdir dir
[[email protected] ~]# ll
total 4
drw-r-x-w-. 2 root root 4096 Apr 4 18:06 dir
-rw-r---w-. 1 root root 0 Apr 4 18:06 file
不过上面的计算方法太过繁杂,我们依然可以直接使用666减去umask值进行运算,不过需要在运算结果的奇数位加1还是以上为例,666-125=541,奇数位分别+1也就是642
特殊权限SUID,SGID,sticky
还是先说结论,SUID通常用来提权,SGID用来继承组权限,sticky用来防止非所属主用户删除文件。
SUID
举个例子,一个普通用户想要修改密码,但是修改密码必然需要更改/etc/shadow文件中的内容,那我们来看一下shadow文件的权限
----------. 1 root root 1077 Apr 3 23:33 /etc/shadow
全部为空,也就是说除了root,其他用户并没有权限修改此文件,但很显然所有用户都可以修改自己的密码,这就是suid权限在起作用,但在shadow文件上并没有看到任何权限信息,实际上,这个权限加在了/usr/bin/passwd文件上。原理是,当用户执行passwd命令的时候,系统会以root身份执行这个程序,这就是suid的作用。当一个程序配置了suid权限,普通用户在执行时程序时会以此程序所有者身份进行执行。
suid权限可以使用chmod命令进行配置,如下
chmod u+s file \\给指定文件添加suid权限
chmod 4777 file \\suid对应的权限位数字为4
suid权限信息表现在权限位中所有者中的x位如:
-rwsr-xr-x. 1 root root 30768 Nov 24 2015 /usr/bin/passwd
由于suid的特性,对于普通文件和目录,suid没有意义,只在二进制程序上生效
!!注:程序的权限继承自程序的发起者
SGID
sgid权限和suid类似,只是suid继承所属主的权限,sgid继承所属组的权限,不同的是对于目录设置sgid会让目录下所有新建文件属于目录所属组如下:
[[email protected] tmp]$ mkdir dir
[[email protected] tmp]$ ll -d /tmp/dir
drwxrwxr-x. 2 mrhan mrhan 4096 Apr 4 19:01 /tmp/dir
[[email protected] tmp]$ touch dir/file
[[email protected] tmp]# touch dir/file1
[[email protected] tmp]# ll dir
total 0
-rw-rw-r--. 1 mrhan mrhan 0 Apr 4 19:01 file
-rw-r---w-. 1 root root 0 Apr 4 19:01 file1
上面的示例中,我先用普通用户在/tmp创建了目录dir,并且在dir目录下创建文件file,同时用root在/tmp/dir/下创建file1,但是我们可以看到虽然dir目录属于普通用户mrhan但是目录下新建的文件依然属于root(实际上是属于创建者的主组)那么我如果想让dir目录下所有新建的文件全部属于mrhan,就需要用到sgid权限
sgid的指定和suid类似。sgid权限信息表现在所属组权限位的x权限位,同样也可以使用数字方式指定,suid对应权限数字为2,和suid指定方法相同。
[[email protected] tmp]$ chmod g+s dir
[[email protected] tmp]$ ll -d /tmp/dir
drwxrwsr-x. 2 mrhan mrhan 4096 Apr 4 19:01 /tmp/dir
[[email protected] tmp]# touch dir/file2
[[email protected] tmp]# ll dir
total 0
-rw-rw-r--. 1 mrhan mrhan 0 Apr 4 19:01 file
-rw-r---w-. 1 root root 0 Apr 4 19:01 file1
-rw-r---w-. 1 root mrhan 0 Apr 4 19:11 file2
上面例子中,dir目录在配置sgid之后新建文件file2所属组默认继承dir所属组
sticky
也叫粘滞位,公共目录下配置sticky权限,可以防止用户对目录下文件随意删除,只能删除所属主的文件,sticky权限只针对目录生效,对应权限数字为1,设置方法和suid类似。如对一个目录配置了777权限又不希望目录下的文件被随便删除的时候就可以使用sicky权限,配置之后将只能删除自己的文件。
ACL权限控制列表
还是上面的例子,出于工作需要user1想让另一个项目g2里的同事可以看file1里面的内容,但是并不希望他们修改,还有一位同事user2他不在任何一个项目里,但是要查看这个文件必要的时候还会修改一下,显然对于这种需求,UGO这种简单的配置已经无法解决了,这时候就需要acl权限了。
acl访问控制列表,也就是说当用户不满足ugo中的任何一个时或者无法通过配置ugo解决时直接指定对应用户或对应组的权限,使用也很简单。
setfacl -m g:g2:r file1 \\指定g2组对file1的权限为r
setfacl -m u:user2:rw file1 \\指定user2对file1的权限为rw
setfacl -x g:grpname file 删除file文件中组的acl权限
setfacl -x u:username file 删除file文件中用户的acl权限
setfacl -b file1 \\清除file1的acl规则
-d \\-d参数用来对目录设置acl,目录下新建文件默认设置acl
-M \\从文件读取权限列表批量设置acl
\\文件内容格式同设置参数
使用getfacl file命令可以查看指定文件的acl权限列表
一旦启用acl权限,ugo权限位g部分权限会变为mask权限,使用chmod修改此部分权限等同于设置mask权限,mask权限控制acl权限的最大权限
小技巧:当权限包含奇数时,必然有x权限
原文地址:http://blog.51cto.com/13672361/2095038