Linux权限管理详解
目录
1.文件权限介绍
2.修改权限:chmod
3.新建目录文件的默认权限
4.特殊权限
5.访问控制列表
1.文件权限介绍
文件的权限主要针对三类对象,分别是:owner:u:所属用户;group:g:所属组;other:o:其他人
每个文件针对每类访问者都定义了三种权限:r=4:可读,能否查看内容和确定文件类型;w=2:可写,能否添加修改删除内容;x=1:可执行,是否可运行
。
目录随说文件的一种,但目录是文件夹,所以这里目录和文件在权限方面还有些不同。
针对目录来说:r:可以查看目录内的文件列表;w:可创建删除目录内的文件,但必须有
x权限才可真正执行;x:可以进入目录内;X:只给目录x权限,不给文件x权限,但若文件本身就带x权限,则会给其他所有位加上x权限
。
针对文件来说:r:可查看内容和元数据;w:可修改内容;x:可以运行,对root也有效
。
注意:
文件是目录的内容,删除权限是文件所在目录的权限决定,若目录没有x权限,就不可删除文件。但修改权限是文件本身决定的,也就是即使删除不了,也可以使对文件进行修改破坏。
任何用户无执行权限将无法执行,而root用户在u、g、o上没有执行权限时也不例外,但一旦任何一个上有x权限那么root就可以有x权限。
时刻记住root为超级管理员,系统对root的约束力不大,很多规则都不能约束root。
文件目录的权限是按照顺序检查的:u,g,o。
2.修改权限:chmod
chmod - 修改文件权限
用法:chmod [option]... mode[,mode]... file...
chmod [option]... octal-mode file...
chmod [option]... --reference=rfile file...
[option]-f
:错误信息不显示-R
:递归修改权限-v
:显示详细修改权限过程-c
:和-v一样,但只有出现改变时才显示
[mode]和[octal-mode]{u|ug|ugo|go|uo}{=|-|+}{rwxX|421}
:任意组合的u,g,o可以直接=或-或+权限,权限也可以使用rwx,也可以使用对于的数字
[--reference=rfile]
这是可以参考rfile文件的权限,来将file的权限修改与rfile的权限相同
这里举些实例方便理解:chmod -R g+rwX /testdir
chmod 600 file
chmod u+wx,g-r,o=rx file
3.新建目录文件的默认权限
当我们创建一个目录或文件时,系统会自动给其分配一个权限,这个权限是怎么来的?实际上,新建目录或文件的权限是系统根据所设定的umask的值来计算出来的。
umask有个默认值放在/etc/profile文件中。当用户uid在0-199之内时,umask=022;当用户uid大于199时,umask=002。
默认权限是怎么来的呢?新建文件的默认权限为666-umask的值,且如果所得的结果某位存在执行权限也就是奇数是,则将其位上权限+1;新建目录的默认权限为777-umask的值所得。当然上面计算方法,本质上是对位将最大权限的umask的相应位权限去除,来得到默认权限;也就是说umask为0的位,不去除对位,umask为1的位,去除对位,对位是0还是0,对位是1就去为0。
umask还是个命令:
umask-显示和设定umask值
umask [-p] [-S] [mode]
-p
:输出umask值,可以作为标准输入用-S
:输入u=,g=,o=umask mode
:设定umask值,但只是暂时的,重启机器后就会失效。
要想永久保留自己设定的umask值可以保存在:~/.bashrc,这个用户自己用;/etc/bashrc,这个大家一起用。
4.特殊权限
文件除了一般权限外,还在执行位x上还有特殊权限。对于所有者u来说特殊权限称为SUID
,对于所属组来说特殊权限为SGID
,对于其他人来说特殊权限为STICKY
。
1.SUID
任何一个可执行程序文件能不能启动为进程,取决于发起者即所有者u对程序文件是否拥有执行权限;启动为进程后,其进程的所有者为原程序文件的所有者。
SUID作用在所有者u的可执行权限x上,就是用于继承程序所有者的权限,来使所有人都可以暂借这个执行权限来执行这个文件。SUID只对二进制可执行程序有效,而设置在目录上无意义。
权限的设定为:
chmod u{+|-}s file...
:给文件添加或去除suid权限
2.SGID
默认情况下,用户创建文件或目录时其所属组为此用户的所属组g。
SGID作用在二进制文件上时,会使属于这个组g的人都继承文件的执行权限。
SGID作用在目录上时,会使目录内新建的文件的所属组自动继续目录的所属组。
权限的设定为:
chmod g{+|-}s {dir|file}...
:给目录或文件添加或去掉sgid权限
3.STICKY
具有写权限的目录,用户可以删除该目录中的任何文件。
STICKY作用在目录上后,只有文件的所有者或root可以删除该文件。且STICKY设置在文件上无意义。
权限的设定为:chmod o{+|-}t dir...
:给目录添加或去掉sticky权限
4.特殊权限的数字法和权限位的映射
特殊权限位用数值表示就是:suid=4;sgid=2;sticky=1
。
特殊权限设置时,要放在普通权限的前面,如chmod 4777 /tmp/a.txt
。
SUID占据所有者u的执行权限位时,u
有x
权限时表示s
,u
没有x权限时表示S。
SGID占据所属组g的执行权限位时,g
有x
权限时表示s
,u
没有x权限时表示S。
STICKY占据其他人o的执行权限位时,o
有x
权限时表示t
,o
没有x权限时表示T。
5.访问控制列表
1.访问控制列表介绍
访问控制列表(Access Control List,ACL),又称存取控制串列,是使用以访问控制矩阵为基础的访问控制方法,每个对象对应一个串列主体。ACL描述每个对象各自的访问控制,并记录可对此对象进行访问的所有主体对象的权限。
ACL的主要功能:为了更好的管理用户权限,可以自由的设置用户的访问文件的权限,实行有效的管理。对某些组成或用户有特殊权限的设置。除了文件的所有者,所属组和其他人,可以对更多的用户设置权限。
CentOS7默认创建xfs和ext4文件系统具有ACL功能,而之前的版本,默认手工创建的ext4文件系统没有ACL功能,需要手动增加:tune2fs -o acl /dev/sd?
上面就是ACL生效的顺序,也就是权限优先级是从上往下的,所有者,自定义用户,所属主组,自定义组,其他人。且mask是个限定线,除了所有者和其他人,其余的都不能超过这个限定线。
2.getfacl
getfacl - 取得并显示文件的访问控制列表
getfacl [-aceEsRLPtpndvh] {file|-} ...
-a, --access
:显示文件的ACL-d, --default
:仅显示默认的ACL-c, --omit-header
:不显示带有#的信息-e, --all-effective
:显示所有有效的权限-E, --no-effective
:显示无效的权限-s, --skip-base
:跳过只有基础词目的文件-R, --recursive
:递归-L, --logical
:logical walk, follow symbolic links-P, --physical
:physical walk, do not follow symbolic links-t, --tabular
:使用列表输出格式-n, --numeric
:打印数值形式的用户或组身份-p, --absolute-names
:不要剥去“/”在路径上
getfacl得到的显示如下:
The output format of getfacl is as follows: 1: # file: somedir/ 2: # owner: lisa 3: # group: staff 4: # flags: -s- 5: user::rwx 6: user:joe:rwx #effective:r-x 7: group::rwx #effective:r-x 8: group:cool:r-x 9: mask::r-x 10: other::r-x 11: default:user::rwx 12: default:user:joe:rwx #effective:r-x 13: default:group::r-x 14: default:mask::r-x 15: default:other::---
3.setfacl
setfacl - 设置文件访问控制列表
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
-m, --modify=acl
:修改当前文件的ACL-M, --modify-file=file
:读取acl_file的ACL来修改file的ACL-x, --remove=acl
:移除ACL权限-X, --remove-file=file
:读取acl_file的ACL来移除file的ACL-b, --remove-all
:移除所有ACL-k, --remove-default
:移除默认的ACL--set=acl
:设置ACL来代替当前的ACL--set-file=file
:从文件上读取ACL来进行设置--mask
:重新计算有效的mask值-n, --no-mask
:不重新计算有效的mask值-d, --default
:对所有新建立的文件都设置ACL-R, --recursive
:只对已经存在的文件进行设置ACL-L, --logical
:logical walk, follow symbolic links-P, --physical
:physical walk, do not follow symbolic links--restore=file
:恢复 ACLs (inverse of getfacl -R')
--test:测试权限,ACL不被修改
acl_spec:[d:] [u|g|o|m]:[uid|gid|]:[权限] ,d为default,m为mask。
acl_file`:是带有ACL权限的文件
这里列些例子大家可以试试:
setfacl -{m|x} u:wang:rwx {filed|directory}
setfacl -Rm g:sales:rwX directory
setfacl -{M|X} file.acl {file|directory}
setfacl -m d:u:wang:rx directory == setfacl -m -d u:wang:rx directory
4.补充
ACL文件上的组权限位上是mask的值,而非传统的组权限。
通过ACL赋予目录默认的x权限时,目录内的文件也不会继承x权限的。
mask只影响除所用者和other之外的人和组的最大权限,用户或组的设置必须存在于mask权限设定的范围内才可生效。一旦设定了ACL,mask权限就是显示在组权限位上。mask需要与用户的权限进行逻辑与运行后,才能变成有效的权限。
备份ACL:主要的文件操作命令cp
和mv
都支持ACL,只是cp命令需要加上-p
选项,所以可以使用cp来备份。而tar
等常见备份工具是不会保留目录和文件的ACL信息的。使用重定向也可以把ACL权限备份下来用来恢复:getfacl -R /tmp/dir1 > acl.txt
恢复ACL:cp
的话是整个文件,复制到所需的地方就可。如上所写,/tmp/dir1的ACL权限丢失的话,怎么恢复?可以:setfacl -R --set-file=acl.txt /tmp/dir1 ; setfacl --restore=acl.txt ;getfacl -R /tmp/dir1
以上就是我所知道的有关权限管理的相关信息,这里就没有举多少例子,毕竟写再多也没有自己动手学的快。若发现有错误的地方,请大家帮忙提出纠正,谢谢!