1. 特殊权限概述
在査询系统文件权限时会发现除了三种普通权限 : r ( 读 ) 、w ( 写 ) 、 x ( 执行 )
外出现了一些其他权限字母 , 比如:s .
[ root@kid dir]
-rwsr-xr-x. 1 root root 27856 Apr 1 2020 /usr/bin/passwd
在属主本来应该是 x ( 执行 ) 权限的位置出现了一个小写s , 这是什么权限?
这种权限称作 SetUID 权限 , 也叫作 SUID的特殊权限 .
2. 特殊权限SUID
SUID = = > SetUID
2.1 问题引出
在 Linux 系统中 , 每个普通用户都可以更改自己的密码 , 这是合理的设置 .
问题是 , 普通用户的信息保存在 / etc / passwd 文件中 , 用户的密码在 / etc / shadow 文件中 ,
也就是说 , 普通用户在更改自己的密码时修改了 / etc / shadow文件中的加密密码 ,
但是文件权限显示 , 普通用户对这两个文件其实都是没有写权限的 , 那为什么普通用户可以修改密码呢?
[ root@kid dir]
-rw-r--r--. 1 root root 1279 Sep 1 17 :01 /etc/passwd
[ root@kid dir]
----------. 1 root root 1748 Sep 1 17 :01 /etc/shadow
2.2 谜底
其实 , 普通用户可以修改自己的密码在于 passwd 命令 .
该命令拥有特殊权限 SetUID , 也就是在属主的执行权限上显示是s .
可以这样来理解它:当一个具有执行权限的文件设置 SetUID 权限后 ,
用户在执行这个文件时将以文件所有者的身份来执行 .
PS : 当普通用户使用 passwd 命令更改自己的密码时 ,
实际上是在用 passwd 命令所有者 root 的身份在执行 passwd 命令 ,
root当然可以将密码写入 / etc / shadow 文件 , 所以普通用户也可以修改 / etc / shadow 文件 ,
命令执行完成后 , 该身份也随之消失 .
2.3 演示
举个例子 , 有一个普通用户 , 她可以修改自己的权限 , 因为 passwd 命令拥有 SetUID 权限 ,
但是她不能査看 / etc / shadow文件的内容 , 因为査看文件的命令 ( 如 cat ) 没有 SetUID 权限 .
[ root@kid ~]
[ root@kid ~]
Changing password for user lamp.
New password: 123
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 123
passwd: all authentication tokens updated successfully.
[ root@kid ~]
[ lamp@kid ~] $ passwd
Changing password for user lamp.
Changing password for lamp.
( current) UNIX password: 321
New password: 123
BAD PASSWORD: The password is too similar to the old one
New password: 321
BAD PASSWORD: The password is too similar to the old one
New password: 321
BAD PASSWORD: The password is too similar to the old one
passwd: Have exhausted maximum number of retries for service
[ lamp@kid ~] $ cat /etc/shadow
cat: /etc/shadow: Permission denied
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
用一张示意图来理解上述过程↓
lamp 用户对 passwd 命令拥有 x ( 执行 ) 权限 .
lamp 用户在执行 passwd 命令的过程中 , 会暂时切换为 root 身份 , 所以可以修改 / etc / shadow 文件 .
命令结束 , lamp 用户切换回自己的身份 .
PS : cat命令没有 SetUID权限 , 所以使用 lamp 用户身份去访问 / etc / shadow 文件 , 当然没有相应权限了 .
[ root@kid ~]
passwd is /bin/passwd
[ root@kid ~]
-rwsr-xr-x. 1 root root 27856 Apr 1 2020 /bin/passwd
[ root@kid ~]
cat is /bin/cat
[ root@kid ~]
-rwxr-xr-x. 1 root root 54080 Aug 20 2019 /bin/cat
2.4 SUID权限设置
SUID授权方法 :
权限字符s ( S ) , chmod 4755 directory
数字是 4000 chmod u + S directory
* 用户位置上的x位上设置 .
suid的作用 :
1. 让普通用户对可执行的二进制文件 , 临时拥有所属主的权限 .
2. 如果设置的二进制文件没有执行权限 , 那么suid的权限显示就是大S .
3. 特殊权限suid仅对二进制可执行程序有效 , 其他文件或目录则无效 .
注意 : suid极度危险 , 不信可以尝试对vim或rm进行设定SetUID .
[ root@kid ~]
[ root@kid ~]
total 4
-rw-r--r--. 1 root root 0 Sep 1 20 :33 1 .txt
-rw-------. 1 root root 1263 Aug 26 19 :24 anaconda-ks.cfg
[ root@kid ~]
[ root@kid ~]
total 4
-rwsrwxrwx. 1 root root 0 Sep 1 20 :33 1 .txt
.. .
[ root@kid ~]
[ root@kid ~]
[ root@kid ~]
-rwSr--r--. 1 root root 0 Sep 1 20 :34 2 .txt
.. .
3. 特殊权限SGID
SGID = = > SetUID
3.1 SGID的作用
SGID的作用
1. 针对用户组权限位修改 , 用户创建的目录或文件所属组和该目录的所属组一致 .
2. 当某个目录设置了sgid后 , 在该目录中新建的文件不在是创建该文件的默认所属组
3. 使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单 .
3.2 SGID授权设置
SGID授权方法 :
数字 2000 chmod 2755 directory
权限字符s ( S ) chmod g + s directory
* 用户属组位置上的x位上设置 .
3.3 演示
将目录设置为sgid后 , 如果在该目录下创建文件 , 都将与该目录的所属组保持一致 .
[ root@kid ~]
[ root@kid ~]
drwxr-sr-x. 2 root root 6 Sep 1 20 :47 dir3
.. .
[ root@kid ~]
[ root@kid ~]
drwxrwsrwx. 2 root root 6 Sep 1 20 :47 dir3
.. .
[ root@kid ~]
[ root@bgx ]
[ qq@kid ~] $ touch /root/dir3/a.txt
[ qq@kid ~] $ ll /root/dir3/a.txt
-rw-rw-r--. 1 qq root 0 Sep 1 21 :04 /root/dir3/a.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
4. 特殊权限SBIT
SBIT = Sticky ( SI TI KI )
4.1 Sticky作用
Sticky ( SI TI KI ) 粘滞位的作用: ( 只能作用于目录 )
1. 让多个用户都具有写权限的目录 , 并让每个用户只能删自己的文件 .
2. 特殊sticky目录表现在others的x位 , 用小t表示 , 如果没有执行权限是T
3. 一个目录即使它的权限为” 777 ”如果是设置了粘滞位 , 除了目录的属主和”root”用户有权限删除 ,
除此之外其他用户都不允许删除该目录 .
普通用户对该目录拥有 w 和 x 权限 , 即普通用户可以在此目录中拥有写入权限 .
如果没有粘滞位 , 那么普通用户拥有 w权限 , 就可以删除此目录下的所有文件 , 包括其他用户建立的文件 .
如果被赋予了粘滞位 , 除了 root 可以删除所有文件 , 普通用户就算拥有w权限 ,
也只能删除自己建立的文件 , 而不能删除其他用户建立的文件 .
* 设置目录 , 限制该目录的文件不能被其他用户删除 , 如果文件没有 , 是可以删除这个目录的 .
如果还有文件直接删除目录肯定是不运行 , rm删除命令先删了文件才删目录的 . . .
4.2 sticky授权设置
sticky授权方法 :
数字 2000 chmod 1755 directory
权限字符t ( T ) chmod o + t directory
* 其他用户位的x位上设置 .
4.3 演示
[ root@kid ~]
[ root@kid ~]
[ root@kid ~]
drwxrwxrwt. 2 root root 6 Sep 1 21 :45 dir4
.. .
[ root@kid ~]
[ root@kid ~]
-rw-r--r--. 1 root root 0 Sep 1 21 :45 1 .txt
.. .
[ root@kid ~]
[ root@kid ~]
[ qq@kid ~] $ rm -rf /root/dir4/1.txt
rm: cannot remove ‘/root/dir4/1.txt’: Operation not permitted
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
5. 权限属性chattr
chatrr 只有 root 用户可以使用 , 用来修改文件系统的权限属性 , 建立凌驾于 rwx 基础权限之上的授权 .
chatrr 命令格式:chattr [ +-= ] [ 选项 ] 文件或目录名
选项 :
+ 增加权限 -减少权限 = 等于某个权限
a:让文件或目录仅可追加内容
i:不得任意更动文件或目录
查看权限属性限制命令 : lsattr
[ root@kid ~]
[ root@kid ~]
---------------- file_a
---------------- file_i
[ root@kid ~]
[ root@kid ~]
[ root@kid ~]
-----a---------- file_a
----i----------- file_i
[ root@kid ~]
bash: file_a: Operation not permitted
[ root@kid ~]
rm: cannot remove ‘file_a’: Operation not permitted
[ root@kid ~]
[ root@kid ~]
bash: file_i: Permission denied
[ root@kid ~]
bash: file_i: Permission denied
[ root@kid ~]
rm: cannot remove ‘file_i’: Operation not permitted
[ root@tianyun ~]
[ root@tianyun ~]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
6. 进程掩码umask
6.1 umask是什么?
当我们登录系统之后创建一个文件总是有一个默认权限的 , 比如 :
目录 755 、文件 644 、那么这个权限是怎么来的呢?
这就是umask干的事情 , umask设置了用户创建文件的默认权限 .
6.2 umask是如何改变创建新文件的权限
系统默认umask为 022 , 那么当我们创建一个目录时 ,
目录起始权限 = 777 -当前系统umask的值 = 777 - 022 = 755.
文件起始权限 = 666 -当前系统umask的值 = 666 - 022 = 644.
6.3 umask涉及哪些配置文件
umask涉及到的相关文件
/ etc / bashrc
/ etc / profile
~ / . bashrc
~ / . bash_profile
shell ( vim , touch ) –umask– > 会影响创建的新文件或目录权限
vsftpd服务如果修改–umask– > 会影响ftp服务中新创建文件或创建目录权限
useradd如果修改umask– > 会影响用户HOME家目录权限
6.4 实例
# 假设umask值为: 045 ( 其他用户组位为奇数 )
6 6 6 - 0 4 5 = 6 2 1
# umask所有位全为偶数时 ( 044 )
命令 : mkdir d044 目录 ( 目录权限为 733 )
命令 : touch f044 文件 ( 文件权限为 622 )
# umask部分位为奇数时 ( 023 )
命令 : mkdir d023 目录 ( 目录权限为 754 )
命令 : touch f023 文件 ( 文件权限为 644 )
# umask值的所有位为奇数时 ( 035 )
命令 : mkdir d035 目录 ( 目录权限为 742 )
命令 : touch f035 文件 ( 文件权限为 642 )
[ root@kid ~]
0022
[ root@kid ~]
[ root@kid ~]
[ root@kid ~]
drwxr-xr-x. 2 root root 6 Sep 1 22 :34 dir1/
-rw-r--r--. 1 root root 0 Sep 1 22 :33 file1
6.5 修改umask值
[ root@kid ~]
[ root@kid ~]
[ root@kid ~]
[ root@kid ~]
drwxrwxrwx. 2 root root 6 Sep 1 23 :08 dir000
-rw-rw-rw-. 1 root root 0 Sep 1 23 :09 file000
通过 umask 决定新建用户 HOME 目录的权限 , 不同的配置文件中的配置作用的范围不一同 .
需要修改其他的创建目录或文件初始权限 , 需要找对对应的配置文件进行配置 .
[ root@kid ~]
UMASK 077
[ root@kid ~]
[ root@kid ~]
drwx------. 2 dba dba 62 Sep 1 23 :28 /home/dba/
[ root@tianyun ~]
UMASK 000
[ root@kid ~]
[ root@kid ~]
drwxrwxrwx. 2 dbc dbc 62 Sep 1 23 :30 /home/dbb/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19