文件权限管理
文件权限
通过针对不同的用户和组在文件上设置不同的权限,达到控制访问文件的目的
文件系统通过文件的所有者,所属组将访问文件的用户分为三类:文件所有者、文件所属组的成员用户、其他用户
[root@centos8 ~]#ls -l /root
total 4
-rw-------. 1 root root 1400 Aug 2 09:58 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 Aug 3 19:27 file
drwxr-xr-x 2 root root 6 Aug 3 19:27 workdir
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ViEw7S0G-1596506989726)(C:\Users\dawn\AppData\Roaming\Typora\typora-user-images\1596454148163.png)]
权限说明
权限这项中,是通过10个字符表示的。其中,
第一个字符代表文件类型(如,- 普通文件,d 目录文件),从第二个字符到第十个字符表示的是文件权限的描述信息。
第二个字符到第十个字符,每连续三个字符分为一组,分为三组,分别代表文件所有者具有的权限,文件所属组具有的权限以及其他用户拥有的权限。
每组的第一个字符代表可读权限,r 表示;第二个字符代表可写权限,w表示;第三个字符代表执行权限,x表示。总结如下
1 主要针对三类对象进行定义
owner 属主 u
group 属组 g
other 其他 o
all 全部对象 a
2 每个文件针对每类访问者都定义了三种权限
r Readable
w Writable
x eXcutable
可读可写可执行权限在目录文件中代表的具体含义和普通文件不一样,具体如下:
文件 | 目录 | |
---|---|---|
r | 可否读取内容 | 可使用ls 命令查看目录中的文件列表 |
w | 可否修改文件内容 | 可在目录中创建文件,删除文件,需x 权限且和被删除的文件的权限无关 |
x | 可否执行,文件的内容必须是可执行的 | 可切换至目录中,访问目录内的内容(须配合r 权限),属于目录的可访问的最小权限 |
X | 只给目录x权限,目录中没有x 权限的文件不给 |
数学法的权限
数字表示使用的是八进制表示法
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
范例
rw-r----- 640
rwxr-xr-x 755
ps:用户的最终权限,是从左往右进行顺序匹配。即所有者,所属组,其他人,一旦匹配权限立即生效,不再向右查看权限
文件的属主和属组属性操作
chown 设置文件的属主,即所有者
命令格式
chown [OPTION]... [OWNER][:[GROUP]] FILE...
#参考指定文件RFILE 的权限,给FILE 设置相同的权限
chown [OPTION]... --reference=RFILE FILE...
选项参数说明:
1 OWNER 只修改所有者
2 OWNER:GROUP 同时修改所有者和属主
3 :GROUP 只修改属组,冒号可用 . 替换
4 -R 递归,目录文件内所有的内容同时设置
5 --reference=RFILE 参考指定文件的属性来设置
范例
[root@centos8 data]#touch f1.txt
[root@centos8 data]#ll
total 0
-rw-r--r-- 1 root root 0 Aug 3 09:25 f1.txt
#修改属主
[root@centos8 data]#chown dawn f1.txt
[root@centos8 data]#ll
total 0
-rw-r--r-- 1 dawn root 0 Aug 3 09:25 f1.txt
#修改属组
[root@centos8 data]#chown :dawn f1.txt
[root@centos8 data]#ll
total 0
-rw-r--r-- 1 dawn dawn 0 Aug 3 09:25 f1.txt
#同时修改属主属组
[root@centos8 data]#chown root:root f1.txt
[root@centos8 data]#ll
total 0
-rw-r--r-- 1 root root 0 Aug 3 09:25 f1.txt
#递归修改目录及目录中文件的属主属组权限
[root@centos8 data]#touch /data/dir1/f2.txt
[root@centos8 data]#ll /data/dir1
total 0
drwxr-xr-x 2 root root 6 Aug 3 08:46 dira
drwxr-xr-x 2 root root 6 Aug 3 08:46 dirb
drwxr-xr-x 2 root root 6 Aug 3 08:46 dirc
-rw-r--r-- 1 root root 0 Aug 3 09:31 f2.txt
[root@centos8 data]#chown -R dawn:dawn dir1
[root@centos8 data]#ll /data/dir1
total 0
drwxr-xr-x 2 dawn dawn 6 Aug 3 08:46 dira
drwxr-xr-x 2 dawn dawn 6 Aug 3 08:46 dirb
drwxr-xr-x 2 dawn dawn 6 Aug 3 08:46 dirc
-rw-r--r-- 1 dawn dawn 0 Aug 3 09:31 f2.txt
chgrp 设置文件的属组信息
命令格式
chgrp [OPTION]...GROUP FILE...
chgrp [OPTION]...--reference=RFILE FILE...
选项参数说明:
-R 递归
注意: chgrp 命令只能修改文件的属组
范例
[root@centos8 data]#ll f1.txt
-rw-r--r-- 1 root root 0 Aug 3 19:51 f1.txt
[root@centos8 data]#chgrp dawn f1.txt
[root@centos8 data]#ll f1.txt
-rw-r--r-- 1 root dawn 0 Aug 3 19:51 f1.txt
chmod 修改文件权限
命令格式
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
参数选项说明
MODE: who opt permission
who:u,g,o,a
opt:+,-,=
permission:r,w,x
修改指定一类用户的所有权限
u= g= o= ug= a= u=,g=
修改指定一类用户的某个权限(+:给予;-:取消)
u+ u- g+ g- o+ o- a+ a-
-R 递归修改权限
有个坑:修改用户权限后,一定要重新登录该用户,否则设置的权限不生效
范例
#设置X 权限
[root@centos8 data]#ll dir
total 0
-rw-r--r-- 1 root root 0 Aug 3 20:18 file1.txt
-rw-r--r-x 1 root root 0 Aug 3 20:19 file2.txt
[root@centos8 data]#ll -d dir
drwxr-xr-x 2 root root 40 Aug 3 20:19 dir
[root@centos8 data]#chmod -R a+X dir
[root@centos8 data]#ll -d dir
drwxr-xr-x 2 root root 40 Aug 3 20:19 dir
[root@centos8 data]#ll dir
total 0
-rw-r--r-- 1 root root 0 Aug 3 20:18 file1.txt
-rw-r--r-x 1 root root 0 Aug 3 20:19 file2.txt
[root@centos8 data]#ll dir
total 0
-rw-r--r-- 1 root root 0 Aug 3 20:18 file1.txt
-rw-r--r-- 1 root root 0 Aug 3 20:19 file2.txt
[root@centos8 data]#chmod u+wx,g-r,o=rx dir/file1.txt
[root@centos8 data]#ll dir
total 0
-rwx---r-x 1 root root 0 Aug 3 20:18 file1.txt
#-R 递归用法
[root@centos8 data]#ll -d dir
drwxr-xr-x 2 root root 40 Aug 3 20:19 dir
root@centos8 data]#ll dir
total 0
-rwx---r-x 1 root root 0 Aug 3 20:18 file1.txt
-rw-r--r-- 1 root root 0 Aug 3 20:19 file2.txt
[root@centos8 data]#chmod -R g+rwX dir
[root@centos8 data]#ll -d dir
drwxrwxr-x 2 root root 40 Aug 3 20:19 dir
[root@centos8 data]#ll dir
total 0
-rwxrwxr-x 1 root root 0 Aug 3 20:18 file1.txt
-rw-rw-r-- 1 root root 0 Aug 3 20:19 file2.txt
数字法
[root@centos8 data]#chmod 600 f1.txt
[root@centos8 data]#ll f1.txt
-rw------- 1 dawn daemon 0 Aug 3 09:25 f1.txt
总结
1. 修改用户权限后,一定要重新登录该用户,否则设置的权限不生效。原因:用户登录后,访问相关文件(如/etc/passwd、/etc/group 等)后生成token 后,不再去重复访问
2. 读写权限的取消与否对于root 来说没有影响,只有执行权限有影响
3. x 是基础权限
新建文件和目录的默认权限
umask 保存权限初始值
可利用umask 设置实现用户新建文件的权限。umask 是内置命令
实现方式
- 新建文件的默认权限:666-umask,如果所的结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
- 新建目录的默认权限:777-umask
root 的umask 默认是022
非特权用户umask 默认是002
持久保存umask
- 全局设置:/etc/bashrc
- 用户设置:~/.bashrc
命令格式
umask [option][mode]
参数选项说明
-S 模式方式显示,非数字
-p 打印umask 的值,可做为输入
mode 可为模式形式,如u=rwx;也可为数字模式,如0022
范例
#获取默认值
[root@centos8 data]#umask
0022
#重置默认权限的值
[root@centos8 data]#umask 246
#创建文件和目录,查看文件权限
[root@centos8 data]#touch c.txt;ll c.txt
-r---w---- 1 root root 0 Aug 3 10:44 c.txt
[root@centos8 data]#mkdir dirc;ll -d dirc
dr-x-wx--x 2 root root 6 Aug 3 10:44 dirc
[root@centos8 data]#umask -S
u=rwx,g=rx,o=rx
[root@centos8 data]#umask -p
umask 0022
#由于安全风险,如果文件默认值666 减去umask 的值存在奇数,则+1
[root@centos8 data]#umask 123;touch d.txt;ll d.txt
-rw-r--r-- 1 root root 0 Aug 3 10:46 d.txt
[root@centos8 data]#umask
0123
[root@centos8 data]#mkdir dird;ll -d dird
drw-r-xr-- 2 root root 6 Aug 3 10:47 dird
#临时修改
[root@centos8 data]#umask 123
#常用方式,临时
[root@centos8 data]#(umask 077;touch f{1..10}.txt)
#永久修改(通常不用)
[root@centos8 data]#umask 123
[root@centos8 data]#umask -p >> .bashrc
Linux 文件系统的特殊权限
文件除了 r,w,x 这三种常见权限外,还有三种特殊权限:SUID,SGID,Sticky
SUID
前提:进程有属主和属组;文件有属主和属组
1 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
2 启动为进程之后,其进程的属主为发起者,进程的数组为发起者所属的组
3 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主;则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
© 应用文件“其他”权限
二进制的可执行文件上SUID 权限功能
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限,即执行者必须是root
- 启动为进程之后,其进程的属主为原程序文件的属主
- SUID 只对二进制可执行程序有效
- SUID 设置在目录上无意义
SUID权限设定
#mode 模式设置s 权限
chmod u+s FILE...
#数字模式 设置s 权限
chmod 6xxx FILE...
#取消s 权限
chmod u-s FILE...
范例
[root@centos8 data]#ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 33600 Apr 7 11:08 /usr/bin/passwd
SGID
二进制的可执行文件上SGID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属组为原程序文件的属组
目录上的SGID权限功能:
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,简单来说,作用在目录上,文件夹的所属组,在该目录新建文件的所属组将继承此目录的所属组。通常用于创建一个协作目录
SGID权限设定
chmod g+s FILE...
chmod 2xxx FILE...
chmod g-s FILE...
Sticky
具有写权限的目录通常用户可删除该目录中的任何文件,无论该文件的权限或拥有权限在目录设置Sticky位,只有文件的所有者或root可删除文件,不能删除其他人的文件。sticky 设置在文件上无意义
Sticky权限设定:
chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...
范例
[root@centos8 data]#ll -d /tmp
drwxrwxrwt. 14 root root 4096 Aug 3 20:43 /tmp
特殊权限数字法
SUID SGID STICKY
000 0 001 1 010 2 011 3
100 4 101 5 110 6 111 7
范例
chmod 4777 /tmp/a.txt
权限位映射
SUID: user,占据属主的执行权限位
s: 属主拥有x 权限
S: 属主没有x 权限
SGID: group,占据属组的执行权限位
s: group拥有x 权限
S: group没有x 权限
Sticky: other,占据other的执行权限位
t: other拥有x 权限
T: other没有x 权限
设置文件的特殊权限
chattr
设置文件的特殊属性,可防止root 用户误操作删除或修改文件
不能删除,改名,更改
lsattr passwd 查看文件特殊权限
chattr +i passwd 增加不允许删除的特殊属性
chattr -i passwd 减不允许删除特殊属性
注意:目录中如果有特殊属性的文件,该目录则不能删除
只能追加内容,不能删除,改名
chattr +a passwd 不允许修改,包含修改内容和更改文件路径
chattr -a passwd 移除特殊权限
范例
[root@centos8 data]#chattr +i dir
[root@centos8 data]#lsattr dir
------------------- dir/file1.txt
------------------- dir/file2.txt
[root@centos8 data]#lsattr *
------------------- dir/file1.txt
------------------- dir/file2.txt
------------------- f1.txt
[root@centos8 data]#ll
total 0
drwxrwxr-x 2 root root 40 Aug 3 20:19 dir
-rw-r--r-- 1 root dawn 0 Aug 3 19:51 f1.txt
[root@centos8 data]#rm -rf dir
rm: cannot remove 'dir/file1.txt': Operation not permitted
rm: cannot remove 'dir/file2.txt': Operation not permitted
[root@centos8 data]#lsattr
------------------- ./f1.txt
----i-------------- ./dir
[root@centos8 data]#chattr -i dir
[root@centos8 data]#lsattr
------------------- ./f1.txt
------------------- ./dir
访问控制列表ACL
ACL 权限功能
ACL:Access Control List,实现灵活的权限管理
除了文件的所有者,所属组和其他人,可对更多的用户设置权限
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
ACL相关命令
setfacl
可设置ACL权限
getfacl
可查看设置的ACL权限
范例
#查看文件的权限,acl 位上没有任何特殊权限
[root@centos8 data]#ll f1.txt
-rw-r--r-- 1 root dawn 0 Aug 3 19:51 f1.txt
#通过setfacl设置f1.txt的一个user为dawn,权限为---
[root@centos8 data]#setfacl -m u:dawn:- f1.txt
#查看文件权限,acl 位上增加了一个+
[root@centos8 data]#ll f1.txt
total 0
-rw-r--r--+ 1 root dawn 0 Aug 3 19:51 f1.txt
#getfacl查看acl权限,可查看文件的属主,属组,其他人以及其权限
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: dawn
user::rw-
user:dawn:---
group::r--
mask::r--
other::r--
[root@centos8 data]#su dawn
[dawn@centos8 data]$ cat f1.txt
cat: f1.txt: Permission denied
[dawn@centos8 data]$ echo aa >> f1.txt
bash: f1.txt: Permission denied
范例
#查看f1.txt 的权限
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
#设置f1.txt 的user为dawn,权限为0,即---
[root@centos8 data]#setfacl -m u:dawn:0 f1.txt
#设置f1.txt 的group为webs,权限为w
[root@centos8 data]#setfacl -m g:webs:w f1.txt
[root@centos8 data]#ll f1.txt
-rw-rw-r--+ 1 root root 0 Aug 3 22:15 f1.txt
#再次查看f1.txt 的权限,多有了user为dawn,权限为rw;
#多了group为webs,权限为x
#多了mask
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
user:dawn:---
group::r--
group:webs:-w-
mask::rw-
other::r--
范例
#取消acl 权限
#之前案例设置的acl 权限
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
user:dawn:---
group::r--
group:webs:-w-
mask::rw-
other::r--
#取消acl 权限中一个user 的权限
[root@centos8 data]#setfacl -x u:dawn f1.txt
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
group::r--
group:webs:-w-
mask::rw-
other::r--
#取消一个group 的权限
[root@centos8 data]#setfacl -x g:webs f1.txt
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
#虽然取消了acl 的权限,但是mask 依然存在,且文件的+标志还存在
[root@centos8 data]#ll f1.txt
-rw-r--r--+ 1 root root 0 Aug 3 22:15 f1.txt
#彻底取消acl 权限
[root@centos8 data]#setfacl -b f1.txt
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
ACL生效顺序
#创建文件file
[root@centos8 data]#touch file
#更改属主属组都为dawn
[root@centos8 data]#chown dawn:dawn file
[root@centos8 data]#ll
total 0
-rw-r--r-- 1 dawn dawn 0 Aug 4 09:18 file
#设置acl 权限,user为dawn,权限为rx,owner的权限设置为rw
[root@centos8 data]#setfacl -m u:dawn:rx file
#写入文件内容
[root@centos8 data]#cat > file
hello!
This is dawn
.
#查看acl 权限
[root@centos8 data]#getfacl file
# file: file
# owner: dawn
# group: dawn
user::rw-
user:dawn:r-x
group::r--
mask::r-x
other::r--
#切换到dawn 用户并切换到测试目录
[root@centos8 data]#su - dawn
Last login: Tue Aug 4 08:29:22 CST 2020 on tty1
[dawn@centos8 ~]$ cd /data
#尝试写入功能,可写
[dawn@centos8 data]$ echo "I am owner `hostname`" >> file
#尝试读取功能,可读
[dawn@centos8 data]$ cat file
hello!
This is dawn
.
I am owner centos8.dawn
#尝试执行功能,被拒绝
[dawn@centos8 data]$ ./file
-bash: ./file: Permission denied
推论:dawn 用户继承了owner 的权限
ACL 生效和判断顺序如下:
1 先判断访问者是否是文件所有者,如果是,所有者权限生效,不再往下继续
2 判断是否是ACL 中自定义用户,如果是,对应的ACL 生效,不再往下继续
3 判断是否属于ACL 自定义组,如果是,对应的ACL 生效,不再往下继续
4 其他人
总结:所有者 - > 自定义用户 - > 所属组|自定义组 - > 其他人
mask的作用
首先mask 和umask 没有任何关系,只是功能类似而已
如果对文件设置了许多ACL 权限,想将所有的ACL 权限不超过某个权限,可通过mask 实现。有点像生活中的“限高杆”
针对所有ACL 中的自定义用户和组不能超过mask 权限,但对owner 和other 的权限是没有影响的。可理解为影响中产最高权限
命令格式
setfacl -m mask::rx file
ps:
--set 选项会将原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGOd 的设置
不能像-m 一样只是添加ACL 就可以
setfacl --set u::rw,u:dawn:rw,g::r,o::- file
范例
#设置mask 之前的acl 权限
root@centos8 ~]#getfacl file
# file: file
# owner: root
# group: root
user::rw-
user:dawn:r-x
group::r--
mask::r-x
other::r--
#将mask 权限设置为r
[root@centos8 ~]#setfacl -m mask:r file
#再次查看acl 权限
[root@centos8 ~]#getfacl file
# file: file
# owner: root
# group: root
user::rw-
user:dawn:r-x #effective:r-- 最终dawn 的有效权限为r
group::r--
mask::r--
other::r--
备份和还原ACL
主要的文件操作命令cp 和mv 都支持ACL,只是cp 命令需加上-p 参数。但tar 等常见的备份工具是不会保留目录和文件的ACL信息
范例
#备份ACL
[root@centos8 data]#getfacl -R dir > acl.txt
[root@centos8 data]#cat acl.txt
# file: dir
# owner: root
# group: root
user::rwx
user:dawn:r-x
group::r-x
mask::r-x
other::r-x
#清除ACL 权限
[root@centos8 data]#setfacl -R -b dir
[root@centos8 data]#getfacl -R dir
# file: dir
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
#还原ACL 权限
[root@centos8 data]#setfacl -R --set-file=acl.txt dir
[root@centos8 data]#setfacl --restore acl.txt
[root@centos8 data]#getfacl -R dir
# file: dir
# owner: root
# group: root
user::rwx
user:dawn:r-x
group::r-x
mask::r-x
other::r-x