# 命令--7.2.文件权限(高级)

李大毛:file1——>属主和属组是李大毛

王二狗:使用vim编辑器修改李大毛的文件file1

# 1、冒险位(SETUID)

  • 冒险位,指文件操作者(用户)临时拥有文件拥有者的权限

  • 冒险位,一般针对的是命令或者脚本文件

  • 冒险位,用字母表示是s或S;数字表示是4

  • 冒险位的设置:chmod u+s 文件名 或者 chmod 4xxx 文件名

    [root@xiaoshaozi zstest]# ll /usr/bin/vim
    -rwxr-xr-x 1 root root 2294216 628 2019 /usr/bin/vim
    
    [root@xiaoshaozi zstest]# chmod u+s /usr/bin/vim
    [root@xiaoshaozi zstest]# ll /usr/bin/vim
    -rwsr-xr-x 1 root root 2294216 628 2019 /usr/bin/vim
    
    [root@xiaoshaozi zstest]# chmod 0755 /usr/bin/vim
    [root@xiaoshaozi zstest]# ll /usr/bin/vim
    -rwxr-xr-x 1 root root 2294216 628 2019 /usr/bin/vim
    

# 2、强制位(SETGID)

  • 强制位,一般针对的是目录

    如果一个目录拥有强制位,那么任何用户在该目录里所创建的任何文件的属组都会继承该目录的属组。/dir1---->admin yunwei--->/dir1/file1

  • 强制位,用字母表示是s或S;数字表示是2

  • 强制位的设置: chmod g+s 文件名 或者 chmod 2xxx 文件名

    [root@xiaoshaozi zstest]# chmod 2755 dir1
    [root@xiaoshaozi zstest]# ll
    总用量 12
    drwxr-sr-x+ 2 root root 4096 15 10:44 dir1
    
    
    [root@xiaoshaozi zstest]# chmod g-s dir1
    [root@xiaoshaozi zstest]# ll
    总用量 12
    drwxr-xr-x+ 2 root root 4096 15 10:44 dir1
    

# 3、粘滞位(STICKY)

  • 粘滞位,一般针对的是公共目录

    如果一个公共目录拥有粘滞位,那么该目录下的文件,只有root文件的创建者可以删除,其他人只能自己管理自己。(A用户不能删除B用户创建的文件)

    控制删除!针对公共目录——》任何人都可以使用

  • 粘滞位,用字母表示是t或T;数字表示是1

  • 粘滞位的设置: chmod o+t 文件名 或者 chmod 1xxx 文件名

    [root@xiaoshaozi zstest]# ll -d /tmp/
    drwxrwxrwt. 10 root root 4096 15 10:27 /tmp/
    
    

# ㈡ 高级权限设置

# 1、冒险位举例

需求:
给一个vim命令设置冒险位,目的是任何人拿vim去修改文件可以临时获得文件拥有者的权限

[root@heima tmp]# which vim
/usr/bin/vim
[root@heima tmp]# ll /usr/bin/vim
-rwxr-xr-x. 1 root root 2324712 Dec 22 2016 /usr/bin/vim
[root@heima tmp]# chmod u+s /usr/bin/vim
或者
[root@heima tmp]# chmod 4755 /usr/bin/vim
[root@heima tmp]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 2324712 Dec 22 2016 /usr/bin/vim
测试验证,普通用户使用vim修改一个本没有权限修改的文件:
[root@heima tmp]# ll /etc/passwd
-rw-r--r--. 1 root root 1650 Mar 5 20:39 /etc/passwd
[root@heima tmp]# su - user01
[user01@localhost ~]$ vim /etc/passwd
验证是否可以修改成功,如果可以,说明user01用户临时拥有了/etc/passwd文件拥有者的权限

# 2、强制位举例

需求:
给目录dir2设置一个强制位,测试是否任何人在该目录里创建的文件属组都是该目录的属组

[root@heima tmp]# ll -d dir2
drwxr-xr-x. 2 root root 4096 Mar 6 13:42 dir2
给dir2增加强制位:
[root@heima tmp]# chmod g+s dir2
给dir2目录设置权限,让其他人可以写
[root@heima tmp]# chmod o+w dir2
[root@heima tmp]# ll -d dir2
drwxr-srwx. 2 root root 4096 Mar 6 13:42 dir2
测试普通用户user01在dir2目录里创建文件的属组是否是dir2的属组
[root@heima tmp]# su - user01
[user01@localhost ~]$ touch /tmp/dir2/file1
[user01@localhost ~]$ ll /tmp/dir2/file1
-rw-rw-r--. 1 user01 root 0 Mar 6 13:44 /tmp/dir2/file1

# 3、粘滞位举例

需求:
在创建一个公共目录/tmp/dir3,要求所有人都可以在该公共目录里创建、删除文件;但是只能自己管理自己,不能删除别人
的文件

[root@localhost ~]# mkdir /tmp/dir3
[root@localhost ~]# chmod 777 /tmp/dir3
[root@localhost ~]# chmod o+t /tmp/dir3
或者一步到位:
[root@localhost ~]# chmod 1777 /tmp/dir3
[root@localhost ~]# ll -d /tmp/dir3
drwxrwxrwt. 2 root root 4096 Mar 6 13:52 /tmp/dir3
测试验证:
自己完成

# ㈢ 总结

  • 高级权限分类

    • 冒险位——>针对命令 s/S 4 chmod u+s 命令文件

    • 强制位——>针对目录 s/S 2 chmod g+s 目录

    • 粘滞位——>针对公共目录 t/T 1 chmod o+t 公共目录

  • 高级权限设置

chmod 4xxx 文件名
chmod 2xxx 目录名
chmod 1777 公共目录

# 默认权限(了解)

㈠ 什么是文件的默认权限

所谓文件的默认权限(遮罩权限),是指用户创建文件后,文件天生就有的权限,不需要设置。

㈡ 文件默认权限由谁控制

文件默认权限由一个叫做**umask**的东西来控制。

umask如何控制文件默认权限

# 1、临时控制

  • 什么是临时控制?

    临时控制,指的是用命令 umask 临时设置,只在当前终端当前进程中生效。

查看当前用户的umask:
[root@localhost ~]# umask
0022

[root@localhost ~]# su - user01
[user01@localhost ~]$ umask
0002

注意:
1. 管理员和普通用户的umask不同,就表示管理员和普通用户创建的文件的默认权限不同!
2. 第1位数字表示高级权限;后面3位数字表示普通权限

普通用户:目录(775),文件(664)
管理员: 目录(755),文件(644)
  • 如何临时设置用户的umask?

    写在前面:

    Linux系统中,默认创建目录的最大权限是0777;文件的最大权限是0666

[root@localhost ~]# umask 0007 临时设置root用户的umask为0007

问:umask=0007,那么在当前终端上root用户所创建目录和普通文件的权限分别是什么呢?
计算过程如下:
umask=文件的最大权限-文件的默认权限

目录:
目录的默认权限=0777-umask=0777-0007=0770 rwxrwx---

普通文件:
文件的默认权限=0666-umask=0666-0007=0660 rw-rw----



说明:
1.权限用数字表示时没有负数,所以最小就是0
2.默认权限规则遵循Linux系统中权限最小化原则

$ stu1 umask 0003
目录:0777-0003=0774 rwxrwxr--
文件:0666-0003=0663 rw-rw--wx 实际权限:rw-rw-r--
$ user01 umask 0005
文件:0666-0005=0661 rw-rw---x 实际权限:rw-rw--w-

# 2、永久控制

  • 什么是永久设置?

    永久设置,指的是通过修改配置文件设置,对用户的所有终端所有进程生效

  • 修改哪个配置文件呢?

    1. 相关配置文件介绍
    # 全局配置文件(针对所有用户所有进程)
    /etc/profile
    系统和用户的环境变量信息,当用户第一次登录时,该文件被读取
    /etc/bashrc
    每个运行的bash信息(系统别名、函数及默认权限的定义),当bash被打开时,该文件被读取
    
    
    # 局部配置文件(针对某个特定用户以及用户的所有进程)
    ~/.bashrc
    当前用户的bash信息,当用户登录和每次打开新的shell时该文件被读取
    ~/.bash_profile
    当前用户的环境变量,当用户登录时,该文件被读取
    ~/.bash_history
    保存当前用户历史命令的文件
    ~/.bash_logout
    当用户退出bash或者终端时,会首先执行该文件里的代码,然后再退出
    
    1. 如何永久设置用户的umask?
    1.针对所有用户生效
    # vim /etc/bashrc
    在该文件的最后增加以下内容:
    umask 0007
    重新读取该配置文件让其立马生效
    # source /etc/bashrc
    或者
    # . /etc/bashrc
    
    
    2.针对某个用户生效
    比如,只针对user01用户生效
    [user01@localhost ~]$ vim ~/.bashrc
    在该文件的最后增加以下内容:
    umask 0007
    
    总结:
    1. 配置文件,分为全局配置和局部配置
    2. 全局和局部配置冲突,一般情况下以局部配置为准;二般情况,看情况
    

# 默认权限总结

  1. 什么是文件的默认权限?

    • 文件被(用户)创建出来后,天生自带的权限
  2. 文件的默认权限由谁来控制?

    • 由umask的值来控制文件的默认权限

    • umask值针对的用户

  3. 如何去更改或设置用户的umask呢?

    1)临时设置

    umask 007 只针对当前用户在当前终端生效
    

    2)永久设置

    • 针对所有人生效——>/etc/bashrc(重新读取生效)

    • 针对某个人生效——>~/.bashrc(重新读取生效)

# ACL

ACL能做什么

  1. ACL访问控制策略可以作为前面所讲权限的补充更加细的来控制文件的权限
  2. ACL策略可以只针对某个用户在文件上有相应权限
  3. ACL策略也可以只针对多个用户或者一个组里的所有用户在文件上有相应权限

image-20240108141509867

㈡ 如何设置文件的ACL策略

# 开启ACL

[root@localhost ~]# dumpe2fs -h /dev/sda3
#dumpe2fs命令是查询指定分区详细文件系统信息的命令
选项:
	-h	仅显示超级块中信息,而不显示磁盘块组的详细信息。
	
...省略部分输出...
Default mount options:	user_xattr acl
...省略部分输出...

如果没有开启,手工开启分区的ACL权限:

[root@localhost ~]# mount -o remount,acl /
# 重新挂载根分区,并挂载加入acl权限

也可以通过修改/etc/fstab文件,永久开启ACL权限:

[root@localhost ~]# vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2	/	ext4	defaults,acl	1	1
# 加入acl
[root@localhost ~]# mount -o remount /
# 重新挂载文件系统或重启动系统,使修改生效

# ACL基本命令

getfacl 文件名			 查询文件的ACL权限
setfacl 选项 文件名		设定ACL权限
	-m		设定ACL权限
	-b		删除ACL权限
	-x:用户  删除单个用户的ACL权限



setfacl -m u:用户名:权限 文件名
setfacl -m g:组名:权限 文件名

setfacl -m u:aa:rwx /test   给test目录赋予aa是读写执行的ACL权限
setfacl -m u:cc:rx -R soft/ 赋予递归ACL权限,只能赋予目录
	-R递归

setfacl -m d:u:aa:rwx -R /test	ACL默认权限。注意:默认权限只能赋予目录

注意:如果给目录赋予acl权限,两条命令都要输入
递归与默认的区别:
setfacl -m u:cc:rx -R soft/		只对已经存在的文件生效
setfacl -m d:u:aa:rwx -R /test	只对以后新建的文件生效

# 最大有效权限mask

[root@localhost /]# setfacl -m m:rx project/
#设定mask权限为r-x。使用“m:权限”格式
[root@localhost /]# getfacl project/
# file: project/
# owner: root
# group: tgroup
user::rwx
group::rwx			#effective:r-x
mask::r-x
#mask权限变为了r-x
other::---

# 删除ACL权限

[root@localhost /]# setfacl -x u:st /project/
#删除指定用户和用户组的ACL权限
[root@localhost /]# setfacl -b project/
#会删除文件的所有的ACL权限

# 设置ACL策略(setfacl)

常用选项:
-m 修改或者设置ACL策略
-R 递归授权,对目录下已存在的目录或文件有acl策略,但新建的文件没有
-x 去掉某个用户或者某个组的ACL策略
-b 删除所有的acl策略
-d 默认ACL策略,只针对目录,该目录下新建的目录和文件都会继承acl策略
mask: 定义除其他人和所有者外的最大权限

重点掌握:

setfacl -m u:用户:rwx /home/redhat/file1 给单个用户单独加权限
setfacl -m g:组名:rwx /home/redhat/file1 给单个组单独加权限

setfacl -x u:用户 /home/redhat/file1 去掉某个用户的权限
setfacl -x g:组名 /home/redhat/file1 去掉某个组的acl策略
setfacl -b /home/redhat/file1 删除文件上所有的acl策略
# setfacl -m u:user01:rw file1 针对于单个用户给可读可写权限
# setfacl -m g:sysadmin:rw file1 针对于单个组给可读可写权限
====》准备工作《====
[root@xiaoshaozi zstest]# touch file{1..3}
[root@xiaoshaozi zstest]# chmod 600 file*
[root@xiaoshaozi zstest]# ll
总用量 0
-rw------- 1 root root 0 15 10:20 file1
-rw------- 1 root root 0 15 10:20 file2
-rw------- 1 root root 0 15 10:20 file3

[root@xiaoshaozi zstest]# useradd user01
[root@xiaoshaozi zstest]# useradd user02

给单个用户、用户组 单独加权限

[root@xiaoshaozi zstest]# setfacl -m u:user01:rw file1
[root@xiaoshaozi zstest]# su user02
[user02@xiaoshaozi zstest]$ vim file1
[user02@xiaoshaozi zstest]$ cat file1
cat: file1: 权限不够

[root@xiaoshaozi zstest]# su user01
[user01@xiaoshaozi zstest]$ vim file1
[user01@xiaoshaozi zstest]$ cat file1
user01可以读写
[user01@xiaoshaozi zstest]$ getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:user01:rw-
group::---
mask::rw-
other::---

[user01@xiaoshaozi zstest]$ getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
group::---
other::---

[root@xiaoshaozi zstest]# groupadd usertest
[root@xiaoshaozi zstest]# setfacl -m g:usertest:rw file2
[root@xiaoshaozi zstest]# ll
总用量 4
-rw-rw----+ 1 root root 19 15 10:25 file1
-rw-rw----+ 1 root root  0 15 10:20 file2
-rw-------  1 root root  0 15 10:20 file3
[root@xiaoshaozi zstest]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
group::---
group:usertest:rw-
mask::rw-
other::---

单独删除ACL权限

[root@xiaoshaozi zstest]# setfacl -x u:user01 file1
[root@xiaoshaozi zstest]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::---
mask::---
other::---
[root@xiaoshaozi zstest]# ll
总用量 4
-rw-------+ 1 root root 19 15 10:25 file1
-rw-rw----+ 1 root root  0 15 10:20 file2
-rw-------  1 root root  0 15 10:20 file3
[root@xiaoshaozi zstest]# setfacl -x m: file1
[root@xiaoshaozi zstest]# ll
总用量 4
-rw-------  1 root root 19 15 10:25 file1
-rw-rw----+ 1 root root  0 15 10:20 file2
-rw-------  1 root root  0 15 10:20 file3

删除所有ACL权限

[root@xiaoshaozi zstest]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
group::---
group:usertest:rw-
mask::rw-
other::---
[root@xiaoshaozi zstest]# setfacl -b file2
[root@xiaoshaozi zstest]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
group::---
other::---
[root@xiaoshaozi zstest]# ll
总用量 4
-rw------- 1 root root 19 15 10:25 file1
-rw------- 1 root root  0 15 10:20 file2
-rw------- 1 root root  0 15 10:20 file3

mask设置other的最大权限

[root@xiaoshaozi zstest]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::---
other::---

[root@xiaoshaozi zstest]# setfacl -m m::r file1
[root@xiaoshaozi zstest]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::---
mask::r--
other::---

目录递归授权

root@xiaoshaozi zstest]# mkdir dir{1..2}
[root@xiaoshaozi zstest]# ll
总用量 12
drwxr-xr-x  2 root root 4096 15 10:37 dir1
drwxr-xr-x  2 root root 4096 15 10:37 dir2
-rw-r-----+ 1 root root   19 15 10:25 file1
-rw-------  1 root root    0 15 10:20 file2
-rw-------  1 root root    0 15 10:20 file3
[root@xiaoshaozi zstest]# setfacl -Rm u:user01:rwx dir1
[root@xiaoshaozi zstest]# getfacl dir1
# file: dir1
# owner: root
# group: root
user::rwx
user:user01:rwx
group::r-x
mask::rwx
other::r-x

[root@xiaoshaozi zstest]# cd dir1
[root@xiaoshaozi dir1]# touch dir1_file{1..3}
[root@xiaoshaozi dir1]# ll
总用量 0
-rw-r--r-- 1 root root 0 15 10:39 dir1_file1
-rw-r--r-- 1 root root 0 15 10:39 dir1_file2
-rw-r--r-- 1 root root 0 15 10:39 dir1_file3
[root@xiaoshaozi dir1]# cd ..
[root@xiaoshaozi zstest]# setfacl -Rm u:user01:rwx dir1
[root@xiaoshaozi zstest]# cd dir1
[root@xiaoshaozi dir1]# ll
总用量 0
-rw-rwxr--+ 1 root root 0 15 10:39 dir1_file1
-rw-rwxr--+ 1 root root 0 15 10:39 dir1_file2
-rw-rwxr--+ 1 root root 0 15 10:39 dir1_file3
[root@xiaoshaozi dir1]# getfacl *
# file: dir1_file1
# owner: root
# group: root
user::rw-
user:user01:rwx
group::r--
mask::rwx
other::r--

# file: dir1_file2
# owner: root
# group: root
user::rw-
user:user01:rwx
group::r--
mask::rwx
other::r--

# file: dir1_file3
# owner: root
# group: root
user::rw-
user:user01:rwx
group::r--
mask::rwx
other::r--


[root@xiaoshaozi dir1]# su user01
[user01@xiaoshaozi dir1]$ touch file1
[user01@xiaoshaozi dir1]$ ls
dir1_file1  dir1_file2  dir1_file3  file1
[user01@xiaoshaozi dir1]$ ll
总用量 0
-rw-rwxr--+ 1 root   root   0 15 10:39 dir1_file1
-rw-rwxr--+ 1 root   root   0 15 10:39 dir1_file2
-rw-rwxr--+ 1 root   root   0 15 10:39 dir1_file3
-rw-rw-r--  1 user01 user01 0 15 10:44 file1

新创建的文件授权

[root@xiaoshaozi zstest]# setfacl -dm u:user01:rwx dir2
[root@xiaoshaozi zstest]# getfacl dir2
# file: dir2
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:user01:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

[root@xiaoshaozi zstest]# setfacl -m u:user01:rwx dir2
[root@xiaoshaozi zstest]# getfacl dir2
# file: dir2
# owner: root
# group: root
user::rwx
user:user01:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:user01:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

[root@xiaoshaozi zstest]# su user01
[user01@xiaoshaozi zstest]$ cd dir2
[user01@xiaoshaozi dir2]$ touch file1
[user01@xiaoshaozi dir2]$ mkdir dir1
[user01@xiaoshaozi dir2]$ ll
总用量 4
drwxrwxr-x+ 2 user01 user01 4096 15 10:48 dir1
-rw-rw-r--+ 1 user01 user01    0 15 10:48 file1

[user01@xiaoshaozi dir2]$ getfacl dir1 file1
# file: dir1
# owner: user01
# group: user01
user::rwx
user:user01:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:user01:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

# file: file1
# owner: user01
# group: user01
user::rw-
user:user01:rwx                 #effective:rw-
group::r-x                      #effective:r--
mask::rw-
other::r--

# 查看ACL策略(getfacl)

# getfacl 文件名

# chattr

文件系统属性chattr权限

1、命令格式

[root@localhost ~]#chattr [+-=] [选项]文件或目录名
选项:
	+:	增加权限
	-:	删除权限
	=:	等于某权限
	i:	对文件,不允许对文件进行删除、改名,也不能添加和修改数据;
		对目录,只能修改目录下文件的数据,但不允许建立和删除文件。
	a:	对文件,只能在文件中增加数据,但是不能删除也不能修改数据;
		对目录,只允许在目录中建立和修改文件,但是不允许删除
	e:	Linux中绝大多数的文件都默认拥有e属性。
		表示该文件是使用ext文件系统进行存储的,而且不能使用“chattr -e”命令取消e属性。

2、查看文件系统属性lsattr

[root@localhost ~]# lsattr 选项 文件名
选项:
	-a	显示所有文件和目录
	-d	若目标是目录,仅列出目录本身的属性,而不是子文件的

3、举例

例1:
#给文件赋予i属性
[root@localhost ~]# touch ftest
#建立测试文件
[root@localhost ~]# chattr +i ftest
[root@localhost ~]# rm -rf ftest
rm:无法删除"ftest":不允许的操作
#赋予i属性后,root也不能删除
[root@localhost ~]# echo 111 >> ftes
-bash: ftest: 权限不够
#也不能修改文件的数据


#给目录赋予i属性
[root@localhost ~]# mkdir dtest
#建立测试目录
[root@localhost dtest]# touch dtest/abc
#再建立一个测试文件abc
[root@localhost ~]# chattr +i dtest/
#给目录赋予i属性
[root@localhost ~]# cd dtest/
[root@localhost dtest]# touch bcd
touch:无法创建"bcd":权限不够
#dtest目录不能新建文件
[root@localhost dtest]# echo 11 >> abc
[root@localhost dtest]# cat abc
11
#但是可以修改文件内容
[root@localhost dtest]# rm -rf abc
rm:无法删除"abc":权限不够
#不能删除
例2:
[root@localhost ~]# mkdir -p /back/log
#建立备份目录
[root@localhost ~]# chattr +a /back/log/
#赋予a属性
[root@localhost ~]# cp /var/log/messages /back/log/
#可以复制文件和新建文件到指定目录
[root@localhost ~]# rm -rf /back/log/messages
rm:无法删除"/back/log/messages":不允许的操作
#但是不允许删除

# 课后实战

# 作业1

  1. root用户新建目录 /tmp/dir1,要求目录的所属组是tom

  2. 创建tom用户,tom用户是否允许在/tmp/dir1下建立文件tomfile?如果不允许,如何让tom用户在/tmp/dir1目录里创建文件tomfile?

  3. 用户jack如果想修改tom用户创建的tomfile文件,怎么做?

# 作业2

以普通用户user01身份登录,新建公共目录/shared/sysadmin并且属于sysadmin组

  1. 要求组成员有读写访问的权限,其他成员没有任何权限;

  2. 要求任何人在/shared/sysadmin面创建的文件全部属于sysadmin组

  3. 要求harry可写,natasha不能读写

  4. 要求该目录下的文件只有root和文件创建者可以删,其他人不能删除别人的文件

# 综合练习

  1. 使用普通用户stu1登录系统,并在/u01/STU1目录下创建一个文件zhangsan,内容为:我是某某某,我要努力学习!我一定能行的!加油!(I am jack, I want to study hard,I can do it,come on)

  2. 使用stu2用户登录系统,并修改stu1用户刚刚创建的文件zhangsan,增加内容:我要和你挑战(I want to challenge you)!并在相同的目录下创建一个自己的文件lisi,内容同上

  3. stu3用户同时可以查看stu1和stu2两个用户的文件,但是不能做任何修改

更新时间: 2024年1月8日星期一下午2点46分