不同的文件系统下,对于文件都会有文件有各种权限的分配机制,而Linux系统中的文件系统对于文件权限的管理机制也是有多种类划分的,权限属性为文件的元数据,及inode表中
简单解析一个文件的元数据
下面用ls -l命令来列出一个文件的常见元数据
[root@mzf ~]# ls -l install.log -rw-r--r--. 1 root root 44298 Jul 20 17:11 install.log
解析元数据:
如果把install.log列出的元数据用空格划分为列,那么分为以下几个部分
第一列 -rw-r--r--. :此处为文件的属性权限,大致划分读写执行,不过并非如此简单
第二列 root:这里显示的用户名为此文件的所有者,及属主(owner)
第三列 root:这里显示的是文件的的所属组(owgrp)
第四列Jul 20 17:11:这里显示为文件的创建时间
第五列 install.log:文件名
文件权限属性
文件的属性权限一般对应三类对象:
owner:文件所有者,及属主,用u表示
owngrp:文件所属组,用g表示
other:其他用户,用o表示
文件于每一类对象都定义了三种权限:
r:read 读权限
w:write 写权限
x:excute 执行权限
每种权限对目录文件和普通文件又有不同意义:
普通文件:
r(read):能利用文件查看工具查看文件内容
w(write):能修改文件内容
x(excute):针对二进制进程文件或者脚本文件有执行权限
X:只针对本身无x权限的文件,不会添加x权限,否则添加
目录文件:
r(read):是否可以查看目录中文件列表,但不能访问文件,不能cd和查看文件的元数据
w(write):是否可以在目录中创建文件或删除文件
x(excute):是否可以进入文件,并访问目录中的文件
X:针对本身指定目录下无x权限的目录文件,不会添加x权限,否则添加
文本权限属性的表现方式:
每对个文件的访问者都有3组权限(读写执行)
字符表示 r w x -
数值表示 4 2 1 0
设置文件所有者及的命令
chown chgrpchmod
chown 设置文件所有者(owner)及所属组(owgrp)
命令格式:
chown [option]... [OWNER][:GROIUP] /PATH/TO/FILE......
option:
-R 表示递归,及同时设置指定目录文件下的文件
--reference=/path/to/Rfile :表示参考指定文件的权限来设置
常见用法:
只设置所有者
chown USERNAME /path/to/file
同时设置所有者及所有组(owner和group之间加:或者.)
chown USERNAME:GROUPNAME /path/to/file
chown USERNAME.GROUPNAME /path/to/file
设置为所有者和属组名相同(owner后面加:或者.)
chown USERNAME: /path/to/file
只设置所属组(group前面加:或者.)
chown :GROUPNAME /path/to/file
递归设置目录及目录下文件 -R 选项
chown -R USERNAME /path/to/dir
设置权限将参考一个指定文件的属性
chown --reference=/path/to/reference_file /path/to/file
chgrp 设置文件所属组(owgrp)
命令格式:
chgrp [option]... [GROUP] /PATH/TO/FILE
option:
-R 递归,同时设置目录文件下的所有文件
--reference=/path/to/rfile 表示设置参考指定文件的权限
常见用法:
只能设置文件所属组
chgrp GROUPNAME /path/to/file
提示:选项的用法和chown类型,作用域相同
chmod 设置或分配文件的权限属性 (r w x)
命令设置和权限属性表示同样又有2中表示方式:
字符表示设置:
格式:chmod [option] [mode]... /path/to/file
-R 递归
mode:
修改一类用户所有权限:
u= g= o= ug= a= u= ,g=
修改一类用户某些权限或某位权限
u+ u- g+ g- o+ o- a+ a-
数值表示设置:
chmod [option] [NUM] /path/to/file
NUM:
4 读 2 写 1执行 0无任何权限
每类用户的的三种权限相加得到文件最终权限属性:
如:755 表示 rwxr-xr-x
新建文件和目录的默认权限
在linux自身的文件系统中,内核模块会自动分配一些权限配置模块,一般模块会读取特定的一些配置文件中的参数,然后来决定当前shell运行时对权限的支持度,并且不同身份用户的新建文件、目录时也会有所不同
文件默认权限与umask值
umask值的特性:
1、保留调整新建文件的权限
2、umask值并不是默认文件权限,而是需要去掉的权限值或位后的值
3、本质:从目录或文件上屏蔽最大权限相应的位,从而得出默认的权限
去掉usmask值:
新建FILE权限: mode=666-umask
如果所的结果某位存在奇数,则此位数权限加1
解析:1(x执行权限)、3(wx写加执行)、5(rx读加执行)、7(rwx读写执行),可以看出结合奇数为的只有1357四种情况,而这四种情况中都带了执行权限,这是linux系统为了安全起见防止进程文件恶意执行而默认不带x权限,所以1357都要减去1那么情况就成了0、2、4、6,所有usmask设置了如015,那么默认就是mode=666-015=651-->640
新建DIR权限:mode=777-umask
目录需要进入目录查看数据,所有,默认都会带上x(执行)权限
不同用户默认umask值也会不同:
root:
umask值=022
普通用户:
umask 值=002
使用命令设定或查看usmask和权限值
查当前shell进程中usmask值
umask
[root@mzf testdir]# umask 0022 [root@mzf testdir]# su wangcai [wangcai@mzf testdir]$ umask 0002
解析:这里发现为如果为文件,那么mode=666-022为644这里是因为root自身会不受基本权限的太大影响,root为linux整个系统进程的操控者和执行者,那么普通用户默认mode=666-002=664一般是对自身或其他非管理用户的文件进行访问,权限就会大些,而root在几乎不受限制的情况下,自己文件针对的就不是自己,而是对其他用户的访问做限制
设定umask值:
[wangcai@mzf testdir]$ umask 015
[wangcai@mzf testdir]$ umask
0015
解析:这里设置了默认权限对于文件会有所调整,mode=666-015=651,那么最后会奇数减1得到640,而且umask只对当前用户和当前shell进程有需要永久生效,就要修改配置文件,
可以在自身家目录的~/.bash_profile,~/.bashrc下加入umask ###(#表示要设置的值)即可,这些事对用户自身生效,全局可以在/etc/profile下添加
直接显示新建文件夹的默认权限
[wangcai@mzf testdir]$ umask -S u=rwx,g=rw,o=w
解析:因为我上步设定了umask值为015所以文件夹mode=777-015=762,正对上面得到到权限表示,而对于新建文件就把x权限去掉即为最后默认权限
直接设置新建文件的默认权限
[wangcai@mzf testdir]$ umask u=rw,g=r,o= [wangcai@mzf testdir]$ umask 0137 [wangcai@mzf testdir]$ umask -S u=rw,g=r,o=
解析:这里直接使用类型chmod命令的设置方式来直接设置,设置的不再是umask值,而是文件的最终默认权限
调用usmask输出
[wangcai@mzf testdir]$ umask -p
umask 0137
解析:这里显示的和默认显示的上面umask值一样,只是前面多了个umask,这里是为了方面将命令调用或写到配置文件中,如写入到用户配置中,此用户就会永久对此umask生效
[wangcai@mzf testdir]$ umask -p >> ~/.bashrc
解析:将这个命令字符追加到配置文件中,更方面配置文件的修改
案例:
1、当用户xiaoming对/testdir 目录无执行权限时,意味着无法做哪些操作? 无法读取目录下文件列表 2、当用户xiaoqiang对/testdir 目录无读权限时,意味着无法做哪些操作? 无法读取文件数据 3、当用户wangcai 对/testdir 目录无写权限时,该目录下的只读文件file1是否可修改和删除? 不可修改,不可删除 chmod 440 /testdir #如果wangcai为所有者 chmod 444 /testdir #如果wangcai为其他人 echo "xxx" >> file1 #失败 rm -f file1 #失败 4、复制/etc/fstab文件到/var/tmp下,设置文件所有者为wangcai读写权限,所属组为sysadmins组有读写权限,其他人无权限 cp /etc/fstab /var/tmp chown wangcai:sysadmins /var/tmp/fstab chmod 660 /var/tmp/fstab 5、误删除了用户wangcai的家目录,请重建并恢复该用户家目录及相应的权限属性 cp -r /etc/skel/. /home/wangcai chmod 750 /home/wangcai chown -R wangcai: /home/wangcai
文件的特殊权限:
linux中的基本权限设置过于简易,所以一般情况下,多人访问同一系统多为普通用户,例如一个项目组就建一个目录,而目录下的所有文件又需要再次授权,新的用户也要再次分配组,所有就需要访问文件的特殊权限
特殊权限分类:
suid:,数字4表示,作用为执行者在执行进程程序文件时会继承改程序文件本身的所有者(一般只对二进制进程文件有效)
sgid:数字2表示,对文件和目录文件有不同作用
作用于文件:类似suid,执行者在执行程序文件时会临时继承进程文件本身的属组
作用于目录:将使在该文件中新建文件或目录将自动继承此目录所属组
sticky:数字1表示,只针对目录有效
作用:对应作用目录下,普通用户只能删除所有者为自己的文件,及时为同组,也不能删除其他属主的文件
SUID 执行者调用进程文件所有者身份
格式:chmod u+s /path/to/psfile 添加
chmod u-s /path/to/psfile 删除
设置并查看作用:
[root@mzf testdir]# which cat #查看外部命令cat的路径 /bin/cat [root@mzf testdir]# ls -l /bin/cat #显示其默认权限位 -rwxr-xr-x. 1 root root 48568 May 11 16:59 /bin/cat [root@mzf testdir]# chmod u+s /bin/cat #添加SUID权限 [root@mzf testdir]# ls -l /bin/cat #查看多了s位表示成功 -rwsr-xr-x. 1 root root 48568 May 11 16:59 /bin/cat [wangcai@mzf testdir]$ ls -l /etc/shadow #密码文件属性 ----------. 1 root root 3119 Aug 3 14:08 /etc/shadow [wangcai@mzf testdir]$ cat /etc/shadow | grep "root" #列出root密码 root:$6$vTjvO/Ex$TnsqEvhX7Zeava1t4D.9fSJ1Yt.Nb1iAvUa97nK1Ch/WksYn74mhlFYQKPfMvNGpMpqgwuolXLUaLHukspcH0/:17014:0:99999:7::: [root@mzf testdir]# chmod u-s /bin/cat #减去刚才设置的suid权限 [root@mzf testdir]# ls -l /bin/cat #发现s变成了x -rwxr-xr-x. 1 root root 48568 May 11 16:59 /bin/cat [root@mzf testdir]# chmod u-x /bin/cat #减去x权限 [root@mzf testdir]# chmod u+s /bin/cat #再次加入suid权限 [root@mzf testdir]# ls -l /bin/cat #发现s变成了S -rwSr-xr-x. 1 root root 48568 May 11 16:59 /bin/cat
注意:这里是使用的普通用户来查看的,而密码文本本身却没有读权限,这是因为cat进程文件的所有者为root,而root为超级管理员会突破基本权限的设置,这时调用cat进程的角色就又原本的普通用户变为了root。最后的再次添加发现变成了大S代表SUID权限失效,是因为去掉了x执行权限,而程序文件本身没有执行权限将失去了意义
SGID
格式:chmod g+s /path/to/{file|dir} 添加
chmod g-s /path/to/{file|dir} 删除
设置并查看作用:
对于文件: 调用进程属组成员身份
[root@mzf testdir]# ls -l /etc/shadow #查看文件并没有读权限
----------. 1 root root 3119 Aug 3 14:08 /etc/shadow
[root@mzf testdir]# chmod g+r /etc/shadow #给文件属组加入读权限
[root@mzf testdir]# chmod g+s /bin/cat #给进程文件加入SGID权限
[root@mzf testdir]# su wangcai #切换到普通用户
[wangcai@mzf testdir]$ cat /etc/shadow | grep "wangcai" #成功查看密码文件
wangcai:!!:17016:0:99999:7:::
解析:这里进程的切换同理因为加了SGID,所以普通用户的所属组会被临时切换到root组成员的身份,但是root组成员的身份并不像root本身不受基本权限的限制,所以需要给要查看的文件属组加入读权限,而普通用户机会使用root组成员身份去读取密码文件
对于目录: 一组多用户继承
[root@mzf testdir]# mkdir project #创建文件夹作为公共目录 [root@mzf testdir]# groupmems -l -g it #将tom和wangcai加入同一组it中 tom wangcai [root@mzf testdir]# getent group it #查看it组成员 it:x:20007:tom,wangcai [root@mzf testdir]# ls -ld project/ #查看project目录默认权限 drwxr-xr-x. 2 root root 4096 Aug 3 20:45 project/ [root@mzf testdir]# chown :it project/ #调整project目录属组为it组 [root@mzf testdir]# ls -ld project/ #查看文件属组 drwxr-xr-x. 2 root it 4096 Aug 3 20:45 project/ [root@mzf testdir]# chmod g+w project/ #默认组无写权限,这里添加 [root@mzf testdir]# cd project/ #切换到此目录 [tom@mzf project]# su tom #切换到普通用户tom [tom@mzf project]$ touch tomfile #创建一个文件 [tom@mzf project]$ exit#退出 [root@mzf project]# su wangcai #切换值普通用户wangcai [wangcai@mzf project]$touch tomfile #也创建一个文件 [wangcai@mzf project]$ ls -l #查看两个文件的属组不同 total 0 -rw-rw-r--. 1 tom tom 0 Aug 3 20:57 tomfile -rw-rw-r--. 1 wangcai wangcai 0 Aug 3 20:52 wfile [wangcai@mzf project]$ echo "hello" >> tomfile #那么wangcai修改tom文件会失败 bash: tomfile: Permission denied#提示权限不够 [wangcai@mzf project]$ exit#退出
exit [root@mzf project]# chmod g+s . #给project目录加SGID [root@mzf project]# ls -ld . drwxrwsr-x. 2 root it 4096 Aug 3 20:57 . [root@mzf project]# su tom #切换到tom [tom@mzf project]$ touch tomfile2 #再次创建文件 [tom@mzf project]$ exit#退出 exit [root@mzf project]# su wangcai #切换到wangcai [wangcai@mzf project]$ echo "hello" >> tomfile2 #再次修改tom的文件发现写入成功 [wangcai@mzf project]$ touch wfile2 #再次创建文件 [wangcai@mzf project]$ ls -l #显示新创建文件发现文件属组继承了公共目录属组 total 4 -rw-rw-r--. 1 tom tom 0 Aug 3 20:57 tomfile -rw-rw-r--. 1 tom it 6 Aug 3 21:05 tomfile2 -rw-rw-r--. 1 wangcai wangcai 0 Aug 3 20:52 wfile -rw-rw-r--. 1 wangcai it 0 Aug 3 21:06 wfile2 [wangcai@mzf project]$ rm -f tomfile2 #但是双方互相修改文件,也能删除对方文件
解析:这里就是无论任何用户在此目录下创建文件都会继承此目录的所属组,这样就解决了以后多个用户加入到工作项目中来,就不用每个文件都设置授权了,但是修改数据也存在了隐患,因为project目录有wx权限,所以各自能删除对方的数据
STICKY 防止普通用户在特定目录删除其它用户文件
格式: chmod o+t /path/to/dir 添加sticky权限
chmod o-t /path/to/dir 删除sticky权限
[root@mzf project]# chmod o+t /testdir/project/ #给刚才的目录加t权限 [root@mzf project]# ls -ld #显示为小t表示成功 drwxrwsr-t. 2 root it 4096 Aug 3 21:07 . [root@mzf project]# su tom #切换至tom用户 [tom@mzf project]$ rm -f wfile2 #删除wangcai的文件发现权限不够 rm: cannot remove `wfile2‘: Operation not permitted
解析:这里解决了上面各自删除对方的文件,设置了t权限表示在此目录下,普通用户各自只能删除属主为自己的文件,而无法删除同组其他用户的文件,保护了了各种数据
本文出自 “神剑特兰克斯” 博客,请务必保留此出处http://mengzhaofu.blog.51cto.com/10085198/1834274
原文地址:http://mengzhaofu.blog.51cto.com/10085198/1834274