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;

练习

  1. 当用户docker对/testdir 目录无执行权限时,意味着无法做哪些操作?
  2. 当用户mongodb对/testdir 目录无读权限时,意味着无法做哪些操作?
  3. 当用户redis 对/testdir 目录无写权限时,该目录下的只读文件file1是否可修改和删除?
  4. 当用户zabbix对/testdir 目录有写和执行权限时,该目录下的只读文件file1是否可修改和删除?
  5. 复制/etc/fstab文件到/var/tmp下,设置文件所有者为tomcat读写权限,所属组为apps组有读写 权限,其他人无权限
  6. 误删除了用户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 的所有权限。