在Linux中,一般使用chmod
命令对属主、用户组、其它用户为类别对文件权限进行控制,这种方式较为粗略,但也能满足日常需求。在一些特殊的场景中,如只允许某些用户能访问文件的场景,如果使用chmod
命令进行配置,一般是将这部分用户加入到组中,然后配置组的权限。
在Linux中,还提供了一种精细化的文件权限控制方式,那就是ACL(Access Control List)
在没有ACL技术之前,Linux系统对文件的权限控制仅可划分文件的属主、用户组、其他用户三类,随着技术的发展,传统的文件权限控制已经无法适应复杂场景下的权限控制需求,比如说一个部门(即一个用户组group)存在有多名员工(即用户,user01、user02…),针对于部门内不同职责的员工,会为其赋予不同的权限,如为user01赋予可读写权限,为user02赋予只读权限,不为user03赋予任何权限,此时由于这些员工属于同一部门,就无法为这些不同的员工进行权限的细化。为此ACL(Access Control List)访问控制列表技术应运而生,使用ACL权限控制可以提供常见权限(如rwx、ugo)权限之外的权限设,置,可以针对单一用户或组来设置特定的权限。
使用ACL必须要有文件系统的支持,目前ext3/ext4/xfs/zfs都支持文件ACL。
相关命令
-
setfacl:设置文件的acl
-
getfacl:获取文件的acl
-
chacl:更改文件或目录的ACL
操作实验
用户权限配置
-
user01创建文件并配置600权限
1 | [root@txy201-51 data]# su user01 |
-
测试user02有没有访问权限(无)
1 | [root@txy201-51 data]# su user02 |
-
使用setfacl给user02配置权限
1 | [user01@txy201-51 data]$ setfacl -m user02:r acltest |
-
user02测试是否能读(可以)、写文件(不可以)
1 | [root@txy201-51 data]# su user02 |
-
修改user02的权限为读写
1 | [root@txy201-51 data]# setfacl -m user02:rw acltest |
-
删除权限
1 | [root@txy201-51 data]# setfacl -x user02 acltest |
组权限
setfacl默认对用户acl进行管理,如果要为组设置acl,只需要加上一个组的标识g:
即可。
-
当前user03没有访问权限
1 | [root@txy201-51 data]# id user03 |
-
给user01组设置权限后,user03就能访问文件了(user03也在user01组)
1 | [root@txy201-51 data]# setfacl -m g:user01:r acltest |
系统文件权限的备份与恢复
在运维过程中,最怕误操作将全局的文件权限给修改了,比如执行了chmod 777 -R /
或chown -R user01:user01 /
,那如果真的遇到了这种情况我们应该怎么做呢?在日常运维中,我们可以把系统权限信息进行备份,在必要时进行恢复。
-
备份文件权限
1 | getfacl -p > 备份文件 |
-
恢复文件权限
1 | setfacl --restore=备份的文件 |
实战篇
-
实验目录
/tmp/data
,文件结构如下
1 | [root@txy201-51 data]# ls -lR |
-
将目录的权限备份到
tmp_data_acl.bak下
1 | [root@txy201-51 data]# getfacl -R -p /tmp/data > tmp_data_acl.bak |
-
模拟误操作,修改目录下的所有权限和属主
1 | [root@txy201-51 data]# chown user01:user01 -R /tmp/data |
-
恢复权限,可以看到权限已恢复正常。
1 | [root@txy201-51 data]# setfacl --restore=tmp_data_acl.bak |
如果没有提前备份的话,可以同其它相同系统做一次备份,将文件拷贝过来做恢复,对于没在备份中的文件,权限不会被修改。