概述
Linux系统是一个多人多任务的操作系统,系统上同时可能有很多人登录,每个人都会利用系统上的各类资源完成一定的操作。那么如何合理的规范这些用户的行为,保证资源的合理分配,则就需要用到权限管理的相关内容了。权限管理是Linux系统上最基础,也是最重要的一部分内容,本章就简要说明下权限管理的相关内容。内容主要包含以下几个部分:
1、权限管理的一些基础概念理解
2、普通权限管理的相关命令详解
3、特殊权限管理SUID、SGID、STICKY
4、ACL相关内容
5、chattr特殊权限简介
本章涉及到的命令有:chmod、chown、chgrp、umask、setfacl、getfacl、chattr、lsattr
第一部分 权限管理的一些基础概念理解
1、权限位介绍
在Linux系统上,普通权限分为三类:读(r)、写(w)、执行(x)
文件的从属关系也分为三类:
属主(u):标明这个文件是谁的
属组(g):标明该文件属于哪个用户组
other(o):除开文件属主和属组之外的所有人
利用命令:ls -l /etc/passwd
可以看到:-rw-r–r– 1 root root 1701 8月 1 20:12 /etc/passwd
其中-rw-r–r–这部分就显示了该文件权限相关的定义
最前面一位,代表该文件的类型,主要有-、d、l、s、p、c、b等类型具体后期在进行说明。
剩下的9位,每3位分成一个组,共3组,其中:
左3位:代表文件的属主的权限,3位的顺序固定格式,rwx,分别代表读写执行,如果某位上为-,代表无该权限
中3位:代表文件的属组的权限
右3位:代表除开属主和属组之外的其他人对该文件的权限
针对上面提到的rw-r–r–这个权限表示文件的属主,也就是对该文件有读、写权限,属组对该文件具有读权限,其他人对该文件具有读权限
2、各权限位对文件和目录的意义
在Linux系统上,读写执行三个权限针对文件和目录是具有不同的效果的,具体的功能如下:
对文件而言:
r:表示可获取文件的数据;cat、nano文件内容
w:表示可修改文件的数据;可修改内容,不能删除文件本身,但文件内容可以删
x:表示可将此文件发起运行为进程;针对可执行程序文件或脚本,一般的文件不需要加x权限
对目录而言:
r:表示可使用ls命令获取其下的所有文件列表信息,但是获取不到ls -l的详细信息
w:表示可修改此目录下的文件列表,即创建或删除文件
x:表示可cd至目录中,且可使用ls -l来获取所有文件的详细属性信息
除了以上三种常见的权限表示外,还有一个权限表示:
X:功能是递归赋权时,会自动检测是目录还是文件,目录的话,会自动加上x权限,如果是文件,就看文件之前有没有x权限,有的话,就+x权限,如果文件之前没有x权限,就不加x权限
3、权限表示法
针对各个权限的表示,除了常规的r、w、x之外,还有一种方法进行表示(利用二进制数字)
001:代表执行x
010:代表写w
100:代表读r
换算成十进制就是:
r:4
w:2
x:1
0-7的数字可代表—、–x、-w-、-wx、r–、r-x、rw-、rwx
常见的权限:
664 rw-rw-r–
640 rw-r—–
600 rw——-
755 rwxr-xr-x
750 rwxr-x—
775 rwxrwxr-x
4、UMASK介绍
在我们创建文件或目录时,系统会自动为我们分配一些权限,这些权限是怎么得来的,这就是依赖于umask值了
umask:文件的权限反向掩码
能够实现在创建文件时的默认权限为:666-umask
能够实现在创建目录时的默认权限为:777-umask
注意:之所以文件用666去减,表示文件默认不能拥有执行权限;如果得到的结果中,仍然有执行权限,这需要将其+1
系统上默认的umask值为:
root:默认umask是022
普通用户:默认umask是002
查看umask值可以直接在命令行下:umask
指定umask值可以直接在命令行下:umask 数字 来指定umask值,值只能是3位数字,不大于777
umask -S 显示以权限直观方式显示创建目录时的umask,显示结果类似这种格式:u=rwx,g=rx,o=rx
umask -p 显示uamsk本身和其值,显示结果类似这种格式:umask 0022
注意:在命令行里设置的umask只对当前shell有效,退出登录后失效
想永久生效,对当前用户生效,可放在家目录的.bashrc里面
如果要对所有用户都生效,全局设置在/etc/profile和/etc/bashrc里面定义了关于默认umask的定义
5、安全上下文
安全上下文:
1、进程以某用户的身份运行,进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作;
2、权限匹配模型
a) 判断进程的属主(谁发起的进程谁就是该进程的属主),是否为被访问文件的属主;如果是,则应用属主的权限;否则进入第2步;
b) 判断进程的属主,是否属于被访问文件的属组;如果是,则应用属组权限;否则进入第3步;
c) 应用other的权限;
通俗的理解就是:
当A用户运行某个程序文件,例如cat,由于cat命令本身就是一个二进制程序文件,那么此时就对cat文件的权限进行判断,A属不属于cat文件的属主,如果属于,查看cat文件上关于属主的权限的定义,根据权限的定义来判断A能对cat文件进行哪些操作;然后如果A不属于cat的属主,就判断A是不是cat文件的属组,如果属于属组,那就根据属组权限定义的权限,对cat文件能执行哪些操作,如果既不属于cat的属主,又不属于文件的属组,那么就执行cat文件上关于其他用户的权限定义,根据定义的权限,执行相应的操作。那么通过查看,我们发现A既不属于cat文件的属主,也不属于文件的属组,就执行了关于其他人的权限,其他人的权限具有x权限,就是执行,故A可以运行cat命令。
当A执行cat命令时,如果cat程序需要调用一个文件,例如我们执行cat /etc/passwd 此时,一旦cat程序运行起来,那么A就是cat进程的属主,该进程是发起此进程的用户的代理,也就是说,cat进程调用的一些资源,当请求/etc/passwd时,请求的身份是cat进程的身份,此时,cat进程的身份是A,那么就判断A用户对/etc/passwd文件的权限是什么,就对应的可以进行哪些操作
第二部分 普通权限管理的相关命令详解
1、chmod命令
格式:
chmod [OPTION]… MODE[,MODE]… FILE…
chmod [OPTION]… OCTAL-MODE FILE…
chmod [OPTION]… –reference=RFILE FILE…
三类用户:
u:属主
g:属组
o:其他
a:所有
选项:
-R 表示递归修改目录及其子目录和文件的权限
用法一、chmod [OPTION]… MODE[,MODE]… FILE…
MODE表示法
赋权表示法(直接操作一类用户的所有权限位):u=、g=、o=、a=、ug=、uo=、…..
如:chmod g=rx /test/11.xx
chmod uo=rx /test/11.xx
chmod u=rx,g=w /test/11.xx
授权表示法:直接操作一类用户的一个权限位:u+、u-、g+…..
如:chmod u-x /test/11.xx
chmod o+r /test/11.xx
chmod ug+x /test/11.xx
chmod ug-rx /test/11.xx
chmod u-r,g+x /test/11.xx
用法二、chmod [OPTION]… OCTAL-MODE FILE…(八进制权限表示)
例如:chmod 660 /test/11.xx
用法三、chmod [OPTION]… –reference=RFILE FILE…(依照别的文件权限,给指定文件赋权)
例如:chmod –reference=/etc/issue /test/11.xx
注意:普通用户仅能够修改属主为自己的文件的权限
2、chown命令
语法:chown [OPTION]… [OWNER][:[GROUP]] FILE…
chown [OPTION]… –reference=RFILE FILE…
选项:
-R:表示递归修改
例如:chown -R nwc:newbee /test/
chown newbee /test/11.xx
chown nwc.newbee /test/11.xx
第二种用法:
chown –reference=/etc/issue /test/11.xx
3、chgrp命令
具体用法与chown类似,但是chgrp只能用来更改文件或目录的所属组
第三部分 特殊权限管理SUID、SGID、STICKY
1、SUID
功能:设置了SUID权限后,当用户运行某二进制程序文件时,该进程的属主不是进程发起者,而是进程二进制程序文件本身的属主
作用对象:二进制可执行程序文件
前提条件:执行二进制程序的用户必须要对该二进制程序具有执行权限
展示位置:属主的x位,如果属主有x,则显示为s,如果属主没有x,则显示为S
设置方法:
chmod u+s FILE
chmod 4XXX FILE
取消方法:
chmod u-s FLIE
2、SGID
功能:
针对二进制程序文件而言:
对二进制程序文件设置了SGID权限,则进程的属组不是发起进程的用户的主组,而是会变成程序文件本身的属组
针对目录而言:
当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的属组;
可理解为:一般是一个小组协同工作时,创建一个协同目录,让这个目录拥有SGID权限,然后小组内的人都在同一个属组内,让此属组对该目录有写权限,这样,小组内的人在这个目录下创建文件时,文件的属组就变成了该目录的属组,这样组内的其他人就对文件具有写权限了,实现了小组工作的协同,但此时组内的人也能删出其他人创建的文件,为了防止这种情况发生,就有了STICKY权限
作用对象:二进制程序文件和目录
前提条件:对二进制程序文件有x权限,对目录而言有w和x权限
展示位置:文件或目录的属组的执行权限位,如果属组有x,则显示为s,如果属组没有x,则显示为S
设置方法:
chmod g+s FILE|DIR
chmod 2XXX FILE|DIR
取消方法:
chmod g-s FILE|DIR
例如:在对二进制程序执行SGID权限时:
在对目录执行二进制权限时:
3、STICKY
功能:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户,在此目录中都能创建新文件或删除所有的已有文件;如果为此目录设置了Sticky权限,则每个用户能创建新文件,只能删除自己的文件,无法删除组内其他用户创建的文件
作用对象:目录
前提条件:属组或全局可写的目录,目录有执行权限
展示位置:other的执行权限位,如果other原本有执行权限,显示为小写t,否则,显示为大写T
设置方法:
chmod o+t DIR
chmod 1XXX DIR
取消方法:
chmod o-t DIR
第四部分 ACL相关内容
1、ACL基础介绍
假设一种情况,针对某文件,我们不希望个别人访问,这个问题如何解决。如果改掉原文件本身的权限,这样势必造成影响范围过大,原本只是不希望某一个人不能访问的,改掉文件本身的权限之后,可能造成大部分人都访问不了,这样,势必就不利于资源的合理规划和利用。那么为了解决这种情况,就有了ACL访问控制列表这种权限控制机制。
ACL提供了除了文件的属主、属组、其他人之外的另外一种灵活控制文件权限的机制。支持对个别的人,或组设置单独的策略。
但是ACL的实现,要基于文件系统支持,可以在文件系统创建的时候,利用-o acl指明默认支持acl挂载选项,如:
mke2fs -t ext4 -b 1024 -m 2 -L TEST -o acl /dev/sdb5
或者在挂载的时候利用-o acl 指明支持acl挂载选项
mount -o acl,remount /dev/sdb5
2、查看ACL
在设置了ACL权限的文件或目录上,能够通过查看文件的详细信息ls -l FILE来查看,权限位后面如果有+加号,则表示该文件有ACL权限
在知道该文件有ACL权限之后,可以利用getfacl FILENAME来获取相应ACL权限的详细信息。例如:
# file: scripts/ 标识了文件名
# owner: root 标识了文件属主
# group: root 标识了文件属组
user::rwx 标识了文件自身属主拥有的权限
user:nwc:rwx 标识了nwc用户对文件拥有的权限
group::r-x 标识了文件自身属组的权限
mask::rwx 标识了该文件的各个用户的最高权限基准
other::r-x 标识了文件自身other的权限
3、设置ACL
想要实现设置ACL规则,需要利用setfacl命令来实现,setfacl的用法如下:
语法:setfacl [选项] -m|-x 权限表达式 FILE…
setfacl [选项] -M|-X 权限表达式文件 FILE …
选项:
-b FILE|DIR:删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留
-k DIR:删除默认的acl规则
-R,–recursive:递归的对所有文件及目录进行操作
-m 表示设置ACL规则
-x 表示取消ACL规则
-M FILE 表示从指定的文件中读取规则,并以此为模板,设置指定文件中的规则
FILE格式为:u:username:mode
g:groupname:mode
……
-X FILE 表示从指定的文件中读取规则,并以此为模板,删除指定文件上的规则
FILE格式为:u:username
g:groupname
……
-n,–no-mask:不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。
–mask:重新计算有效权限,即使ACL mask被明确指定
–set 表示重新设置ACL的权限,用新的代替,需要注意的是,新的ACL规则中必须要包含文件自身的权限定义,也就是类似:
u::rwx g::r-x o:: 这三种,中间没有指明任何用户的规则
–set的用法:setfacl –set u::rwx,g::r,o::,u:nwc:rwx – FILE
–set-file 以文件为模板,创建指定文件的ACL。如:
getfacl FILE1 | setfacl –set-file=- FILE2表示复制FILE1的ACL权限给FILE2
权限表达式:
[d:] u:username:mode 指定用户的权限,如果username为空,表示设置文件所有者的权限。加d:表示设置的是默认规则
[d:] g:groupname:mode 指定群组的权限,如果groupname为空,表示设置文件所有群组的权限。加d:表示设置的是默认规则
[d:] m: :mode 指定mask权限, 加d:表示设置的是默认规则
加上d:设置了默认规则之后,表示在此之后在该目录下新建的文件或目录都默认具有的ACL权限,但现有文件和目录本身还是要另外单独设置ACL规则
示例:
环境Centos6.8,管理员为root,测试普通用户为nwc、nwc2;测试组为testgroup1(组内有普通用户test1user1、test1user2)、testdir2(组内有普通用户test2user1、test2user2);测试目录为/testdir/acl_dir,测试文件为/testdir/file
<1>在没有设置任何acl权限之前,所有的普通用户、组均不为目录或文件的属主或属组,且对文件和目录均没有任何访问权限
<2>对/testdir/file1设置acl权限,让nwc用户具有rwx权限,让testgroup1组具有rx权限
<3>通过-M FILE和-X FILE批量增加或删除acl权限
<4>通过 -R对/testdir/acl_dir设置递归权限,让该目录下已经存在的文件或目录自动按照递归acl设置的权限继承
<5>通过对/testdir/acl_dir设置目录的默认权限,让在该目录中的新建的文件或目录自动继承默认权限
4、ACL中mask
在getfacl获取详细acl权限列表中,我们可以看到有mask这个权限的相关信息,在linux系统里面大家都知道比如对于r–rw-r–来说, 中3位那个rw-是指文件属组的权限, 但是一旦该文件设置了ACL权限,那么当中那个rw-代表的就是mask值而不再是文件属组的权限了
可以看到初始尚未设置acl之前,属组的权限位就是代表属组本身的权限,当一旦设置了acl权限之后,在查看属组的权限位,就变成了跟mask一致的权限
接下来,我们设置testgroup1的acl权限为rwx,然后更改mask的设置,通过比对,我们查看文件权限发生的变化
可以发现,一旦设置设置了mask之后,发现之前设置的权限,如果权限超过mask权限,后方都会显示一个#effective的条目,代表真正生效的权限,其实,mask就是起到限定设置acl的最高权限的作用,如果此时查看该文件本身的权限信息,发现属组权限位的信息也随着mask的修改而改变了:
5、备份和恢复ACL
在日常备份文件目录时,通常的cp命令,通过-a或者-p选项都可以保留acl属性进行复制,但是如果要用tar等压缩文件就无法保留文件的acl属性信息了,这样就需要利用其它方式进行acl备份了
备份:
获取文件或目录的acl权限列表,然后保存到文件中:
getfacl -R /DIR >ACL_BAK_FILE
恢复:
将之前备份的权限文件恢复到文件中
setfacl -R –set-file=ACL_BAK_FILE /DIR
第五部分 chattr特殊权限管理(对管理员依然有效)
chattr +A FILE 可以禁止访问时更改访问时间atime
chattr +i FILE 表示只能读,不能删除,修改内容,改名
chattr +a FILE 表示只能读,能修改内容,不能删除,改名,移动
取消对应的权限可以将+改为-
查看附加的权限有哪些可以用lsattr
原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/28030
评论列表(1条)
文章整体思路清晰,每一个命令用法都有了详尽的总结与操作。