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的执行权限位时,ux权限时表示su没有x权限时表示S。
SGID占据所属组g的执行权限位时,gx权限时表示su没有x权限时表示S。
STICKY占据其他人o的执行权限位时,ox权限时表示to没有x权限时表示T。

5.访问控制列表

1.访问控制列表介绍

访问控制列表(Access Control List,ACL),又称存取控制串列,是使用以访问控制矩阵为基础的访问控制方法,每个对象对应一个串列主体。ACL描述每个对象各自的访问控制,并记录可对此对象进行访问的所有主体对象的权限。
ACL的主要功能:为了更好的管理用户权限,可以自由的设置用户的访问文件的权限,实行有效的管理。对某些组成或用户有特殊权限的设置。除了文件的所有者,所属组和其他人,可以对更多的用户设置权限。
CentOS7默认创建xfs和ext4文件系统具有ACL功能,而之前的版本,默认手工创建的ext4文件系统没有ACL功能,需要手动增加:tune2fs -o acl /dev/sd?

Linux权限管理详解

上面就是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:主要的文件操作命令cpmv都支持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

以上就是我所知道的有关权限管理的相关信息,这里就没有举多少例子,毕竟写再多也没有自己动手学的快。若发现有错误的地方,请大家帮忙提出纠正,谢谢!

相关推荐