Linux中文件权限控制7.1
文件权限
文件的权限主要针对三类对象进行定义
owner 属主, u
group 属组, g
other 其他, o
注意:
用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即生效,不再向
右查看其权限
r和w权限对root 用户无效
只要所有者,所属组或other三者之一有x权限,root就可以执行
每个文件针对每类访问者都定义了三种常用权限
每个文件针对每类访问者都定义了三种权限
r Readable 4
w Writable 2
x eXcutable 1
对文件的权限:
r 可使用文件查看类工具,比如:cat,可以获取其内容
w 可修改其内容,文件的是否被删除和文件的权限无关
x 可以把此文件提请内核启动为一个进程,即可以执行(运行)此文件(此文件的内容必须是可执行)
文件权限常见组合
X 只给目录x权限,不给无执行权限的文件x全歼。
--- 0 无任何权限
r 4
r-x 5
rw 6
rwx 7
对目录的权限:
r 可以使用ls查看此目录中文件名列表,但无法看到文件的属性meta信息,包括inode号,不能查看文件的
内容
w 可在此目录中创建文件,也可删除此目录中的文件,而和此被删除的文件的权限无关
x 可以cd进入此目录,可以使用ls -l file或stat file 查看此目录中指定文件的元数据,当预先知
道文件名称时,也可以查看文件的内容,属于目录的可访问的最小权限
X 分配给目录或有部分x权限的文件的x权限,对无任意x权限的文件则不会分配x权限
目录权限常见组合
- 不能访问目录
r-x 只读目录
rwx 可读也可写目录
面试题: Linux中的目录和文件的权限区别?分别说明读,写和执行权限的区别
修改文件权限chmod
格式
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
#参考RFILE文件的权限,将FILE的修改为同RFILE
chmod [OPTION]... --reference=RFILE FILE...
说明: 模式法格式
模式法
chmod who opt per file
who:u,g,o,a 所有者/组/其他人/所有人
opt:+,-,=
per:r,w,x
修改指定一类用户的所有权限
u= g= o= ug= a= u=,g=
修改指定一类用户某个或某个权限
u+ u- g+ g- o+ o- a+ a- + -
-R: 递归修改权限
数字法
r--
100 4
-W-
010 2
--x
001 1
rwxrw---- a.txt
111 110 000
7 6 0
chmod 760 a.txt
范例: 设置 X 权限
[root@centos8 data]#ll dir
total 8
-rw-r--r-- 1 root root 709 Dec 18 11:09 f1.txt
-rwxr--r-- 1 root root 709 Dec 18 11:09 f2.txt
drw-r--r-- 2 root root 6 Dec 18 11:15 subdir
[root@centos8 data]#ll -d dir
drwxr-xr-- 3 root root 48 Dec 18 11:15 dir
[root@centos8 data]#chmod -R a+X dir 将dir文件夹添加x执行权限,文件不添加。
[root@centos8 data]#ll -d dir
drwxr-xr-x 3 root root 48 Dec 18 11:15 dir
[root@centos8 data]#ll dir
total 8
-rw-r--r-- 1 root root 709 Dec 18 11:09 f1.txt
-rwxr-xr-x 1 root root 709 Dec 18 11:09 f2.txt
drwxr-xr-x 2 root root 6 Dec 18 11:15 subdir
4.3 新建文件和目录的默认权限
4.4 Linux文件系统上的物殊权限
4.4.1 特殊权限SUID
4.4.2 特殊权限SGID
4.4.3 特殊权限 Stick位
4.4.4 特殊权限数字法
4.5 设定文件特殊属性
4.6 访问控制列表 ACL
4.6.1 ACL权限功能
4.6.2 ACL相关命令
新建文件和目录的默认权限
umask 的值可以用来保留在创建文件权限
实现方式:
- 新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶 数不变
- 新建目录的默认权限: 777-umask
非特权用户umask默认是 002
root的umask 默认是 022
为什么root的umask要大一些?
umask越大意味着什么?权限就越小,意味着越安全!
相对root的文件更重要,所以权限要越小一些
查看umask
umask
#模式方式显示
umask –S
#输出可被调用
umask –p
修改umask
umask
范例:
umask 002
umask u=rw,g=r,o=
持久保存umask
- 全局设置: /etc/bashrc 影响所有用户
- 用户设置:~/.bashrc 只影响当前用户 范例:
[root@centos8 ~]#umask
0022
[root@centos8 ~]#umask -S
u=rwx,g=rx,o=rx
[root@centos8 ~]#umask -p
umask 0022
范例:
[root@centos8 ~]#umask
0022
[root@centos8 ~]#( umask 666; touch /data/f1.txt ) (一次性生效)
[root@centos8 ~]#umask
0022
[root@centos8 ~]#ll /data/f1.txt
---------- 1 root root 0 Mar 27 14:55 /data/f1.txt
其他方法:
只实现临时性的文件权限为000
1 touch a.txt ;chmod 000 a.txt
2umask 777 ;touch a.txt;umask 022;
练习
- 当用户docker对/testdir 目录无执行权限时,意味着无法做哪些操作?
- 当用户mongodb对/testdir 目录无读权限时,意味着无法做哪些操作?
- 当用户redis 对/testdir 目录无写权限时,该目录下的只读文件file1是否可修改和删除?
- 当用户zabbix对/testdir 目录有写和执行权限时,该目录下的只读文件file1是否可修改和删除?
- 复制/etc/fstab文件到/var/tmp下,设置文件所有者为tomcat读写权限,所属组为apps组有读写 权限,其他人无权限
- 误删除了用户git的家目录,请重建并恢复该用户家目录及相应的权限属性
文件的执行是危险的!
如果没有执行权限,root也无法直接执行
基于安全考虑,默认新建的文件不允许有执行权限!(这是为什么奇数要加1的原因)
Linux文件系统上的特殊权限
前面介绍了三种常见的权限:r, w, x 还有三种特殊权限:SUID, SGID, Sticky 特殊权限
- SUID 作用于二进制可执行文件上,用户执行此成勋时,将继承此程序所有者的权限
- SGID 作用于二进制可执行文件上,用户将继承此程序所有组的权限 作于于目录上, 此目录中新建的文件的所属组将自动从此目录继承
- STICKY 粘滞位 作用于目录上,此目录中的文件只能由所有者自已来删除
特殊权限SUID
前提:进程有属主和属组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者 二进制的可执行文件上SUID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为原程序文件的属主
- SUID只对二进制可执行程序有效
- SUID设置在目录上无意义
SUID权限设定
chmod u+s FILE...
chmod 4xxx FILE
chmod u-s FILE... (移除权限)
chmod u+s FILE…
- chmod:命令用于改变文件或目录的权限。
- u+s:设置Set UID位。当设置在可执行文件上时,意味着当任何用户运行这个文件时,它将以文件属主的权限运行。这对于需要特定权限才能运行的程序(如passwd命令)非常有用。
chmod 4xxx FILE - 4xxx:这里的4xxx是一个模式,其中4代表设置Set UID位,xxx代表其他权限设置。例如,4755表示设置Set UID位,并且文件属主有读(4)、写(2)和执行(1)权限,组和其他用户有读和执行权限。
chmod u-s FILE… - u-s:取消Set UID位。这意味着文件将不再以文件属主的权限运行,而是以运行它的用户的权限运行。
注意事项
Set UID位只能设置在可执行文件上,对目录无效。
设置Set UID位需要谨慎,因为它可能会带来安全风险,因为任何用户都可以以文件属主的权限运行该文件。
范例:
特殊权限SGID
二进制的可执行文件上SGID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属组为原程序文件的属组 SGID权限设定:
chmod g+s FILE...
chmod 2xxx FILE
chmod g-s FILE...
g+s:设置Set GID位。当设置在可执行文件上时,意味着当任何用户运行这个文件时,它将以文件属组的权限运行。这对于需要特定组权限才能运行的程序非常有用。当设置在目录上时,新创建的文件和目录将继承目录的组所有权,而不是创建者的默认组。
目录上的SGID权限功能:
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有
写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录
SGID权限设定:
chmod g+s DIR...
chmod 2xxx DIR
chmod g-s DIR...
g+s:设置Set GID位。当设置在目录上时,新创建的文件和目录将继承目录的组所有权,而不是创建者的默认组。这意味着,即使不同的用户在目录中创建文件,这些文件也会属于目录的组。
特殊权限 Sticky 位
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
Sticky权限设定:
chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...
o+t:设置粘滞位。当设置在目录上时,只有文件的所有者和root用户才能删除或重命名该目录中的文件,即使其他用户有写入权限。这对于公共目录(如/tmp)非常有用,可以防止用户删除或重命名其他用户的文件。
chmod 1xxx DIR
1xxx:这里的1xxx是一个模式,其中1代表设置粘滞位,xxx代表其他权限设置。例如,1777表示设置粘滞位,并且目录属主有读、写和执行权限,组和其他用户也有读、写和执行权限。
chmod o-t DIR…
o-t:取消粘滞位。这意味着任何有写入权限的用户都可以删除或重命名目录中的文件,而不仅仅是文件的所有者和root用户。
特殊权限数字法
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权限
设定文件特殊属性
设置文件的特殊属性,可以访问 root 用户误操作删除或修改文件 不能删除,改名,更改(取消:-i)
- +:添加指定的属性。
- -:移除指定的属性。
- =:设置指定的属性,移除其他所有属性。
常见属性选项 - i:设置不可变属性。文件不能被删除、重命名、链接或写入。
- a:设置只追加属性。只能在文件末尾追加数据,不能删除或修改。
- c:设置压缩属性。文件内容在写入磁盘时会被自动压缩。
- s:设置安全删除属性。文件被删除后,其内容会被随机数据覆盖。
- u:设置undelete属性。删除的文件实际上被移动到特殊的目录,可以恢复。
基本用法
chattr [选项] [属性] 文件或目录
chattr +i file
只能追加内容,不能删除,改名
chattr +a file
设置目录及其内容为只追加:
sudo chattr -R +a 目录名
显示特定属性
lsattr
范例:
[root@centos8 data]#chattr +i dir
[root@centos8 data]#lsattr dir
------------------ dir/fstab
------------------ dir/f1.txt
[root@centos8 data]#lsattr *
------------------ dir/fstab
------------------ dir/f1.txt
------------------ f11.txt
------------------ f22.txt
[root@centos8 data]#ll
total 8
drwxr-xr-x 2 root root 33 Dec 18 14:32 dir
-rw-r--r-- 1 root root 719 Dec 18 14:30 f11.txt
-rw-r--r-- 1 root root 6 Dec 18 14:30 f22.txt
[root@centos8 data]#rm -rf dir
rm: cannot remove 'dir/fstab': Operation not permitted
rm: cannot remove 'dir/f1.txt': Operation not permitted
[root@centos8 data]#lsattr
------------------ ./f11.txt
------------------ ./f22.txt
----i------------- ./dir
[root@centos8 data]#chattr -i dir
[root@centos8 data]#lsattr
------------------ ./f11.txt
------------------ ./f22.txt
------------------ ./dir
访问控制列表 ACL
ACL权限功能
ACL:Access Control List,实现灵活的权限管理
除了文件的所有者,所属组和其它人,可以对更多的用户设置权限,而不仅仅是修改文件或目录的属主和属组权限。
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test
ACL生效顺序:
所有者,自定义用户,所属组|自定义组,其他人
ACL相关命令
setfacl 命令使用
setfacl 可设置ACL权限
- -b, –remove-all: 移除文件或目录的所有ACL条目。
- -k, –remove-default: 移除默认的ACL条目。
- -n, –no-mask: 不自动重新计算有效权限掩码。
- -x, –remove: 移除指定的ACL条目。
- -m, –modify: 修改指定的ACL条目。
- -M, –modify-file: 从文件中读取ACL条目进行修改。
- -b, –set: 使用指定的ACL条目替换掉文件或目录的现有ACL。
- -B, –set-file: 从文件中读取ACL条目进行设置。
- -d, –default: 设置默认ACL条目(仅适用于目录)。
- -R, –recursive: 递归地设置ACL条目,应用于目录及其所有子项。
- -L, –logical: 在递归操作中遵循符号链接。
- -P, –physical: 在递归操作中不遵循符号链接(默认行为)。
- -s, –substitute: 用指定的ACL替换掉文件或目录的现有ACL,而不是与现有ACL合并。
- -R, –replace: 当设置或修改ACL时,替换掉现有的ACL条目而不是与它们合并。
- -v, –version: 显示 setfacl 的版本信息。
- -h, –help: 显示帮助信息。
为用户设置读权限:
setfacl -m u:username:r FILENAME
清除用户设置权限:
setfacl -m u:username:- FILENAME
为组设置读写权限:
setfacl -m g:groupname:rw FILENAME
删除用户的ACL权限:
setfacl -x u:username FILENAME
删除组的ACL权限:
setfacl -x g:groupname FILENAME
复制一个文件的ACL到另一个文件:
setfacl --set-file=aclfile.txt FILENAME
递归地设置目录及其内容的ACL:
setfacl -m u:username:rw -R DIRECTORY
#清除所有ACL权限
setfacl -b file1
#复制file1的acl权限给file2
getfacl file1 | setfacl --set-file=- file2
getfacl 命令使用
getfacl 可查看设置的ACL权限
getfacl 命令用于获取文件的ACL信息。以下是一些常用的 getfacl 命令示例:
获取文件的ACL信息:
getfacl FILENAME
获取目录及其内容的ACL信息:
getfacl -R DIRECTORY
将ACL信息输出到文件:
getfacl FILENAME > aclfile.txt
注意事项
- 使用 setfacl 和 getfacl 命令时,需要确保您的文件系统支持ACL,并且已经启用。
- ACL功能可能在某些文件系统上不可用,例如FAT32不支持ACL,而EXT3、EXT4等文件系统支持。
常见选项: - -a, –access:仅显示文件或目录的访问ACL信息,这是默认行为。
- -d, –default:仅显示目录的默认ACL信息,这些默认ACL适用于目录中新创建的文件和子目录。
- -c, –omit-header:不显示ACL的表头信息。
- -e, –all-effective:显示所有有效的权限,不仅仅是基本权限和ACL权限的组合。
- -E, –no-effective:不显示有效权限。
- -R, –recursive:递归地显示目录及其所有文件和子目录的ACL信息。
- -L, –logical:在递归模式下跟随符号链接,默认情况下不跟随。
- -P, –physical:在递归模式下不跟随符号链接,这是默认行为。
- -s, –skip-base:跳过显示基本权限,只显示ACL权限。
- -t, –tabular:以表格形式显示ACL信息。
- -n, –numeric:以数字形式显示用户和组ID,而不是名称。
- -v, –version:显示 getfacl 命令的版本信息。
- -h, –help:显示帮助信息 范例:
[root@centos8 data]#ll f1.txt
-rw-r--r-- 1 root root 709 Dec 18 14:37 f1.txt
[root@centos8 data]#setfacl -m u:wang:- f1.txt
[root@centos8 data]#ll
total 4
-rw-r--r--+ 1 root root 709 Dec 18 14:37 f1.txt
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:---
group::r--
mask::r--
other::r--
[root@centos8 data]#su wang
[wang@centos8 data]$cat f1.txt
cat: f1.txt: Permission denied
[wang@centos8 data]$echo xx >> f1.txt
bash: f1.txt: Permission denied
范例:
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@centos8 data]#setfacl -m u:wang:0 f1.txt 给wang添加000权限
[root@centos8 data]#setfacl -m g:admins:w f1.txt 给admins添加写权限。
[root@centos8 data]#ll f1.txt
-rw-rw-r--+ 1 root root 718 Dec 18 14:44 f1.txt (+ 代表有特殊权限。)
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:---
group::r--
group:admins:-w-
mask::rw-
other::r--
[root@centos8 data]#id wang
uid=1000(wang) gid=1000(wang) groups=1000(wang)
[root@centos8 data]#id mage
uid=1001(mage) gid=1001(mage) groups=1001(mage)
[root@centos8 data]#su mage
[mage@centos8 data]$cat f1.txt
范例:
mount -o acl /directory
getfacl file |directory
setfacl -m u:wang:rwx file|directory
setfacl -m g:admins:rw file| directory
setfacl -x u:wang file |directory
#清除所有ACL权限
setfacl -b file1
#复制file1的acl权限给file2
getfacl file1 | setfacl --set-file=- file2
备份和还原ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p参数。但是tar等常见的备份工具是不会保留目录 和文件的ACL信息 范例:
#备份ACL
getfacl -R /tmp/dir > acl.txt
#消除ACL杈限
setfacl -R -b /tmp/dir
-R:代表递归操作,意味着命令会应用到指定目录及其所有子目录和文件。
-b:代表“删除基本ACL条目之外的所有ACL条目”,实际上,这个选项会删除所有扩展的ACL条目,保留基本的文件权限(即传统的Unix权限位)。
/tmp/dir:这是要操作的目录路径。
执行这个命令后,/tmp/dir 目录及其内部所有文件和子目录的ACL设置都会被清除,只保留基本的文件权限。如果你想完全移除所有ACL条目,包括基本ACL,可以使用 -b 选项。
#还原ACL权限
setfacl -R --set-file=acl.txt /tmp/dir
--set-file=acl.txt:这个选项告诉 setfacl 使用文件 acl.txt 作为ACL设置的来源。这个文件应该包含一系列的ACL条目,每行一个条目,格式与 setfacl 命令输出的格式相同。
#还原ACL权限
setfacl --restore acl.txt
--restore:这个选项告诉 setfacl 从一个文件中读取ACL设置,并将这些设置应用到文件系统上。这个文件通常是通过 getfacl -R 命令生成的,它包含了目录树中所有文件和目录的ACL信息
#查看ACL权限
getfac1 -R /tmp/dir
mask 权限
- mask只影响除所有者和other的之外的人和组的最大权限
- mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
- 用户或组的设置必须存在于mask权限设定范围内才会生效 范例:
setfacl -m mask::rx file
范例:
[root@centos8 data]#ll f1.txt
-rw-rw-r--+ 1 root root 728 Dec 18 14:51 f1.txt
[root@centos8 data]#chmod g=r f1.txt
[root@centos8 data]#ll f1.txt
-rw-r--r--+ 1 root root 728 Dec 18 14:51 f1.txt
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:---
group::r--
group:admins:-w- #effective:---
mask::r--
other::r--
[root@centos8 data]#setfacl -m mask::rw f1.txt
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:---
group::r--
group:admins:-w-
mask::rw-
other::r--
[root@centos8 data]#setfacl -m u:wang:rwx f1.txt
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:rwx
group::r--
group:admins:-w-
mask::rwx
other::r--
[root@centos8 data]#setfacl -m mask::rw f1.txt
[root@centos8 data]#getfacl f1.txt
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:rwx #effective:rw-
group::r--
group:admins:-w-
mask::rw-
other::r--
–set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样 只是添加ACL就可以 范例:
setfacl --set u::rw,u:wang:rw,g::r,o::- file1
setfacl:这是命令本身,用于设置文件的访问控制列表。
–set:这是一个选项,用于指定要设置的ACL规则。这将替换文件现有的ACL规则。
u::rw:设置用户(user)类别中所有者的权限为读写(read-write)。这里的双冒号 :: 表示所有者(owner)的权限。
u:wang:rw:为用户(user)类别中的特定用户 “wang” 设置权限为读写(read-write)。
g::r:设置组(group)类别中的权限为只读(read-only)。这里的双冒号 :: 表示拥有文件的用户组(group owner)的权限。
o:::设置其他(others)类别中的权限。在这个例子中,后面没有指定任何权限,这意味着其他用户的权限将被设置为无权限(即没有任何权限,既不能读也不能写)。
file1:这是要设置ACL的文件名。
所以,这个命令的作用是:
设置文件 file1 的所有者拥有读写权限。
设置用户 “wang” 对文件 file1 拥有读写权限。
设置文件 file1 的所属组拥有只读权限。
移除其他所有用户对文件 file1 的所有权限。