Linux文件权限:特殊权限、权限属性、权限掩码

特殊权限

概述

Linux系统共12位权限位,基本权限位有9位,但还有3位特殊权限位,
基本权限:UGO上的读写执行权限

[root@cys ~]# ll test.txt 
-rwxrwxrwx. 1 root root 206 928 15:18 test.txt

特殊权限:UGO上的特殊权限

  1. 当UGO对文件具有执行权限时
[root@cys ~]# ll test.txt 
-rwsrwsrwt. 1 root root 206 928 15:18 test.txt
#UGO对象的执行权限位上分别为s、s、t
  1. 当UGO对文件具没有有执行权限时
[root@cys ~]# ll test.txt 
-rwSrwSrwT. 1 root root 206 928 15:18 test.txt
#UGO对象的执行权限位上分别为S、S、T

取值

  • r:读=4
  • w:写=2
  • x:执行=1
  • SUID:4000
  • SGID:2000
  • SBIT:1000

作用

SUID  用户设置位  	配置在u位
SGID  组设置位	 	配置在g位
SBIT  粘滞位      	配置在o位
  1. SUID
    主要是对命令,或者二进制文件,以该二进制文件的属主权限来执行该文件 命令:passwd

  2. SGID
    主要是针对目录进行授权,共享目录

  3. SBIT
    粘滞位,即便是该目录拥有w权限,但是除了root用户,其他用户只能对自己的文件进行删除、移动操作

SUID

概述

在Linux系统中,每个普通用户都可以更改自己的密码,这是合理的设置,问题是,普通用户的信息保存在 /etc/passwd文件中,用户的密码在 /etc/shadow 文件中,也就是说,普通用户在更改自己密码时,修改了 /etc/shadow 文件中的加密密码,但是文件权限显示。普通用户对这两个文件都没有写权限。

[root@cys ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1541 928 17:45 /etc/passwd
[root@cys ~]# ll /etc/shadow
----------. 1 root root 1705 928 17:45 /etc/shadow

问题:为什么普通用户对该文件没有却还能修改该文件的内容?

其实,普通用户可以修改自己的密码在于 passwd 命令。该命令拥有特殊权限 SetUID,也就是在属主的权限位的执行权限上是 s。
可以这样来理解它:当一个具有执行权限的文件设置 SetUID 权限后,用户在执行这个文件时将以文件所有者的身份来执行。

当普通用户使用 passwd 命令更改自己的密码时,实际上是在用 passwd 命令所有者 root 的身份在执行 passwd 命令,root 当然可以将密码写入 /etc/shadow 文件,所以普通用户也可以修改/etc/shadow 文件,命令执行完成后,该身份也随之消失

[root@cys ~]# which passwd
/usr/bin/passwd
[root@cys ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 41 2020 /usr/bin/passwd

授权方式

suid 4000 权限字符s(S),用户位置上的x位上设置。
用户位置上有x(执行权限)是s为小写,反之S为大写
授权方法:

chmod 4755 filename
chmod u+s filename

测试案例

#1.修改passwd文件权限,匿名用户没有权限查看
# chmod 640 /etc/passwd
# ll /etc/passwd
-rw-r-----. 1 root root 1548 Dec 9 18:45 /etc/passwd

#2.使用普通用户无法查看
# su - user
$ cat /etc/passwd
cat: /etc/passwd: Permission denied

#3.给cat命令赋予suid
# chmod u+s /usr/bin/cat
或 chmod 4755 /usr/bin/cat
# ll /usr/bin/cat
-rwsr-xr-x. 1 root root 48568 Mar 23 2017 /usr/bin/cat

#4.再次使用普通用户查看
# su - test
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

在这里插入图片描述

SUID总结

1.让普通用户对可执行的二进制文件,临时拥有二进制文件的所属主权限。
2.如果设置的二进制文件没有执行权限,那么SUID的权限显示就是大S。
3.特殊权限SUID仅对二进制可执行程序有效,其他文件或目录则无效。
注意: SUID极度危险,不信可以尝试对vim或rm进行设定SUID。

SGID

概述

与SGID类似
1.文件的有效执行组身份为文件的拥有组,而不是执行者的组身份
2…当目录拥有SGID权限,目录里新建的文件的拥有组会自动继承目录的拥有组身份

授权方式

suid 2000 权限字符s(S),用户位置上的x位上设置。
用户组位置上有x(执行权限)是s为小写,反之S为大写
授权方法:

chmod 2755 directory
chmod g+s directory

测试案例

#1.建立测试目录
# mkdir /test/

#2.给测试目录赋予SetGID权限,检查SetGID是否生效
# chmod 777 /test
# chmod g+s /test 
或 chmod 2777 /test
# ll -d /test/
drwxrwsrwx. 2 root root 6 Apr 13 05:21 /test/

#3.切换成普通用户user,并进入该目录,创建文件或目录,检查文件的信息
# su - user
$ cd /test/
$ touch guid_test
$ ll
-rw-rw-r--. 1 user root 0 Apr 13 05:21 guid_test
drw-rw-r--. 2 user root 0 Apr 13 05:21 guid_test_dir

SUID总结

1.针对用户组权限位修改,用户创建的目录或文件所属组和该目录的所属组一致。
2.当某个目录设置了SGID后,在该目录中新建的文件不再是创建该文件的默认所属组
3.使用SGID可以使得多个用户之间共享一个目录的所有文件变得简单。

SBIT(sticky)

概述

当用户对目录拥有w和x权限,即用户可以在此目录中拥有写入权限,如果没有粘滞位,那么普通用户拥有w权限,就可以删除此目录下的所有文件,包括其他用户建立的文件。但是一旦被赋予了粘滞位,除了root可以删除所有文件,普通用户就算有w权限也只能删除自己建立的文件,而不能删除其他用户建立的文件。
/tmp目录是经典的粘滞位目录,谁都有写权限,因此安全成问题,常常是木马第一手跳板。

授权方式

SBIT 1000 权限字符t(T),其他用户位的x位上设置。

其他人位置上有x(执行权限)是t为小写,反之T为大写
授权方法:
chmod 1755 directory
chmod o+t directory

测试案例

#1.直接使用/tmp作为测试目录,查看/tmp目录属性
# ll -d /tmp
drwxrwxrwt. 12 root root 4096 Apr 13 05:32 /tmp/

#2.分别切换普通用户user1和user2,在/tmp目录里创建测试文件
# su - user1
$ touch /tmp/user1.txt
# su - user2
$ touch /tmp/user2.txt

#3.使用user1和user2互相修改、删除对方在/tmp下创建的文件
结果,都无效

SUID总结

1.多个用户都具有写权限的目录,让每个用户只能删自己的文件。
2.特殊sticky目录表现在others的x位,用小t表示,如果没有执行权限是T
3.一个目录即使它的权限为"777"如果是设置了粘滞位,除了目录的属主和"root"用户有权限删除,除此之外其他用户都不允许删除该目录

权限属性

概述

只有root用户可以使用,用来修改文件系统的权限属性,凌驾于r、w、x、SUID、SGID、SBIT之上的权限
设置文件属性(权限),无法设置目录。针对所有用户,包括 root,无法设置目录

lsattr、chattr

lsattr:查看特殊权限
语法:lscattr 文件

chattr:设置特殊权限
i:锁定文件,不能编辑,不能修改,不能删除,不能移动,可以执行
a:仅可以追加文件,不能编辑,不能删除,不能移动,可以执行
语法: chattr [+-=][选项] 文件或目录名

//创建文件并设置属性
# touch file_a file_i
# lsattr file_a file_i
---------------- file_a
---------------- file_i

//设置属性
# chattr +a file_a
# chattr +i file_i
# lsattr file_a file_i
-----a---------- file_a
----i----------- file_i

//a权限, 无法覆盖写入和删除文件
# echo "aa" > file_a
bash: file_a: Operation not permitted
# rm -f file_a
rm: cannot remove ‘file_a’: Operation not permitted

//a权限, 只能追加, 适用于日志文件
# echo "aa" >> file_a

//i权限, 无法写入, 无法删除
# echo "i" > file_i
bash: file_i: Permission denied
# echo "i" >> file_i
bash: file_i: Permission denied
# rm -f file_i
rm: cannot remove ‘file_i’: Operation not permitted

//解除限制
# chattr -a file_a 
# chattr -i file_i

权限掩码umask

概述

  1. 什么是umask

当我们登录系统之后,创建一个文件总是有一个默认权限,比如:

目录默认权限:755
文件默认权限:644

是umask设置了用户创建文件的默认权限

  1. umask是如何改变新文件的权限

系统默认umask为022,那么当我们创建一个目录时,正常情况下目录的权限应该是777,但是umask表示要减去的值,
所以新目录文件的权限应该是777-022=755。

至于文件的权限也依次类推:666-022=644

  • umask涉及哪些配置文件

umask涉及到的相关文件/etc/bashrc,/etc/profile,~/.bashrc,~/.bash_profile
shell (vim,touch) :如果修改umask–> 会影响创建的新文件或目录权限
useradd:如果修改umask–> 会影响用户HOME家目录权限
vsftpd:服务如果修改–umask–> 会影响ftp服务中新创建文件或创建目录权限

umask计算

1.计算方式

  • 目录:777-umask
  • 文件分奇数和偶数
    • 奇数:用7减,当umask的值为奇数,用7减去这个位置的umask值
    • 偶数:用6减,当umask的值为偶数,用6减去这个位置的umask值
# umask 023   //临时修改umask,重启后会恢复为0022,第一个0为特殊权限
# mkdir d023  //此时目录权限为777-023=754
# touch f023  //此时文件权限为667-023=644
# ll -d d023
drwxr-xr--. 2 root root 6 37 10:43 d023
# ll f023 
-rw-r--r--. 1 root root 0 37 10:44 f023

修改umask值

  • 临时修改:使用umask命令
[root@cys ~]# umask
0022
[root@cys ~]# umask 023
[root@cys ~]# umask
0023
  • 永久修改:修改文件 /etc/bashrc,/etc/profile,~/.bashrc,~/.bash_profile(不建议)
# vim /etc/login.defs
UMASK 077
# useradd dba
# ll -d /home/dba/
drwx------. 4 dba dba 4096 311 19:50 /home/dba/

# vim /etc/login.defs
UMASK 000
# useradd sa
# ll -d /home/sa/
drwxrwxrwx. 4 sa sa 4096 311 19:53 /home/sa/