## 一、文件权限管理
### 1.设置文件的所有者 chown
chown OWNER #只修改所有者
chown OWNER:GROUP #同时修改所有者和属组
chown :GROUP #只修改属组,冒号也可用"."替换
### 2.设置文件的属组信息 chgrp
chgrp 命令可以只修改文件的属组
### 3.修改文件权限 chmod
权限字母表达式授权授权
文件属主授予权限(说明:权限信息可以随意组合 rw rwx rx wx)
添加权限信息 chmod u+[ r / w / x ]
删除权限信息 chmod u-[ r / w / x ]
设置权限信息 chmod u=[ r / w / x ]
文件属组授予权限
添加权限信息 chmod g+[ r / w / x ]
删除权限信息 chmod g-[ r / w / x ]
设置权限信息 chmod g=[ r / w / x ]
其他用户授予权限
添加权限信息 chmod o+[ r / w / x ]
删除权限信息 chmod o-[ r / w / x ]
设置权限信息 chmod o=[ r / w / x ]
所有用户授予权限
添加权限信息 chmod a+[ r / w / x ]
删除权限信息 chmod a-[ r / w / x ]
设置权限信息 chmod a=[ r / w / x ]
数字表达式授予权限
权限位表示:r 数字表示:4
权限位表示:w 数字表示:2
权限位表示:x 数字表示:1
权限位表示:- 数字表示:0
### 4.新建文件目录权限控制umask
对于root用户, umask数值默认是022
对于普通用户, umask数值默认是002
umask命令参数
umask -p 查看umask数值
umask -S 按照字母表达式显示
超管用户:root
文件的默认权限:
666 - 022 = 644
目录的默认权限:
777 - 022 = 755
umask数值如何控制新建文件目录权限
新建文件的默认权限: 666-umask , 如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
新建目录的默认权限: 777-umask
## 二、特殊权限
### 1.特殊权限SUID
SUID作用:其他用户执行命令,以命令文件的属主身份运行命令
(当文件其他用户无查看权限时,给予命令s权限,使用户以命令文件的属主身份运行)
- 必须是可执行(x)的二进制命令文件或者一些脚本文件设定setUID权限
- 命令执行者(当前用户)要对该命令文件拥有执行权限(x)
- 命令的执行者在执行该程序时会以该程序文件的属主身份(在执行程序的过程中灵魂附体为文件的属主)
- setUID权限只在该程序的执行过程中有效,也就是说身份改变只在程序执行过程中有效
SUID设置方法
方法一:chmod u+s 文件
方法二:chmod 4644 文件
suid权限与执行权限位共用, 执行权限位出现小写s表示文件属主有执行权限, 大写S表示文件文件属主没有执行权限
SUID权限执行流程
第一步:判断执行命令用户是否对命令文件拥有执行权限
第二步:判断是否有suid权限, 如果有, 会以命令属主身份执行操作
例:普通用户admin25查看shadow文件
```
[root@centos7 ~]#su - admin25
[admin25@centos7 ~]$ tail /etc/shadow
tail: 无法打开"/etc/shadow" 读取数据: 权限不够
[admin25@centos7 ~]$ ll /etc/shadow
---------- 1 root root 1617 8月 18 15:17 /etc/shadow
[root@centos7 ~]#which tail
/usr/bin/tail
[root@centos7 ~]#chmod u+s /usr/bin/tail
[root@centos7 ~]#ll /usr/bin/tail
-rwsr-xr-x. 1 root root 66824 8月 20 2019 /usr/bin/tail
```
### 2.特殊权限 SGID
SGID作用:其他用户执行命令,以命令文件的属组身份执行
sgid权限作用在文件
只有可执行的二进制程序才能设置SGID权限
命令执行者要对该程序拥有x(执行)权限
命令执行在执行程序的时候,组身份升级为该程序文件的属组
SUID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
sgid设置方法
方法一: chmod g+s 文件
方法二: chmod 2644 文件
guid权限与属组执行权限位共用, 执行权限位出现小写s表示文件属组有执行权限, 大写S表示文件文件属组没有执行权限
sgid权限作用在目录
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有
写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录
### 3.特殊权限 Sticky
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky权限位,只有文件的所有者或root可以删除该文件,sticky权限设置在文件上无意义
Sticky权限设置
方法一: chmod o+t 文件
方法二: chmod 1644 文件
sticky权限与其他用户执行权限位共用, 执行权限位出现小写s表示文件其他用户有执行权限, 大写T表示文件其他用户没有执行权限
## 三、隐藏权限
设置文件的特殊隐藏属性,可以访问 root 用户误操作删除或修改文件目录
chattr设置特殊权限
```
chattr -R 递归处理目录下的所有文件
chattr -v 设置文件或目录版本
chattr -V 显示指令执行过程
chattr + 开启文件或目录的该项属性
chattr - 关闭文件或目录的该项属性
chattr = 指定文件或目录的该项属性
```
lsattr查看特殊权限
```
-a 列出目录中的所有文件,包括隐藏文件
-d 只显示目录名称
-R 递归地处理指定目录下的所有文件及子目录
-v 显示文件或目录版本
-D 显示属性的名称、默认值
-E 显示从用户设备数据库中获得属性的当前值
```
隐藏权限模式
chattr +i root用户和所有用户不能删除,移动,重命名文件,修改文件内容
chatrr +a 只能追加内容, 不能删除,移动,重命名文件
## 四、访问控制列表
### 1.ACL功能
ACL:Access Control List,实现灵活的权限管理 除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
### 2.ACL相关操作
setfacl用于设置ACL权限
```
格式: setfacl -m [u / g]:user:[rwx] 文件
setfacl -m
设定 ACL 权限。如果是给予用户 ACL 权限,参数则使用 "u:用户名:权限" 的格式,
例如 setfacl -m u:st:rx /project 表示设定 st 用户对 project 目录具有 rx 权限
如果是给予组 ACL 权限,参数则使用 "g:组名:权限" 格式,
例如 setfacl -m g:tgroup:rx /project 表示设定群组 tgroup 对 project 目录具有 rx 权限。
setfacl -x
删除指定用户(参数使用 u:用户名)或群组(参数使用 g:群组名)的 ACL 权限,
例如 setfacl -x u:st /project 表示删除 st 用户对 project 目录的 ACL 权限。
setfacl -b
删除所有的 ACL 权限,例如 setfacl -b /project 表示删除有关 project 目录的所有 ACL 权限
setfacl -R
递归设定 ACL 权限,指设定的 ACL 权限会对目录下的所有子文件生效
命令格式为 "setfacl -m u:用户名:权限 -R 文件名"(群组使用 g:群组名:权限)
例如 setfacl -m u:st:rx -R /project 表示 st 用户对已存在于 project 目录中的子文件和子目录拥有 rx 权限。
===================================================================================================
setfacl -d
对目录下创建新文件默认 ACL 权限,命令格式为 "setfacl -m d:u:用户名:权限 文件名"(如果是群组,则使用 d:g:群组名:权限)
只对目录生效,指目录中新建立的文件拥有此默认权限
例如 setfacl -m d:u:st:rx /project 表示 st 用户对 project 目录中新建立的文件拥有 rx 权限。
setfacl -k
删除默认 ACL 权限
```
getfacl用于查看ACL权限
```sh
-a 显示文件的ACL
-d 显示默认的ACL
-c 不显示注释标题
-e 显示所有的有效权限
-E 显示没有的有效权限
-R 递归到子目录
```
### 3.mask权限
一旦设置了ACL权限,就会产生一个mask权限代替group所属组权限,默认权限是rw
mask只影响除所有者和other的之外的人和组的最大权限
用户或组的设置ACL权限必须是小于或者等于mask权限,否则mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
### 4.ACL备份与还原
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
```
#备份ACL
getfacl -R /tmp/dir > acl.txt
#消除ACL权限
setfacl -R -b /tmp/dir
#还原ACL权限,注意按照文件最后一个ACL权限进行还原
setfacl -R --set-file=acl.txt /tmp/dir
#还原ACL权限
setfacl --restore acl.txt
#查看ACL权限
getfacl -R /tmp/dir
```