day14 Linux特殊权限介绍
第一章 特殊权限概述
1.什么是特殊权限
我们已经了解Linux系统9位基本权限位,但是通过查看一些系统关键的文件就可以发现有些没有见过的权限字符,比如/usr/bin/passwd文件
[root@centos7-100 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
可以发现,本该出现x的位置上出现了重来没有见过的s!这个就是传说中的特殊权限位suid。事实上除了我们已经学过的基本9位权限之外,实际上Linux权限位还有额外的3位权限位,总共是12位权限位。
他们分别是:
suid (setuid)
sgid (setgid)
sbit (sticky)
2.特殊权限位对比说明表
类别 | suid | sgid | sticky |
---|---|---|---|
字符表示 | S | S | T |
占据位置 | 基本权限位x | 基本权限位x | 基本权限位x |
基本权限位有x | s | s | t |
数字表示 | 4 | 2 | 1 |
八进制表示 | 4000 | 2000 | 1000 |
生效对象 | 针对用户位 | 针对用户组 | 其他用户 |
第二章 特殊权限suid
1.什么是suid特殊权限
suid(setuid)位通过s字符标识,存在于基本权限的用户权限位的x权限对应的设置。
如果用户权限位对应的x权限位上有x权限,则suid就用小写的s标识,如果没有x权限,就用大写的S表示。
suid的s对应的数字权限为4,完整权限用八进制4000表示
suid位也是通过chmod命令进行设置的,可以利用字符权限以及数字权限来实现。
实例代码如下:
[root@centos7-100 ~]# touch test.txt
[root@centos7-100 ~]# ll test.txt
-rw-r--r--. 1 root root 0 10月 3 20:38 test.txt
[root@centos7-100 ~]# chmod u+s test.txt #在用户位增加suid权限
[root@centos7-100 ~]# ll test.txt
-rwSr--r--. 1 root root 0 10月 3 20:38 test.txt #权限位为S,文件名背景为红色
2.为什么需要suid特殊权限
在Linux系统中,有时执行某个命令(例如普通用户使用passwd修改自身账号密码)时,需要对另外,一个文件(/etc/shadow)进行操作,而执行passwd修改的文件/etc/shadow又是普通用户没有权限进行操作的。
例如:修改用户密码命令是passwd,该命令文件的所有者和用户组都是root,但是/etc/shadow文件的权限极低。不允许普通用户及属主访问,具体信息如下:
[root@centos7-100 ~]# ll /etc/shadow
----------. 1 root root 707 10月 2 22:40 /etc/shadow
[root@centos7-100 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
3.suid的应用场景
简单的说:suid的作用就是让普通用户可以执行某个设置了suid位的命令或程序时,拥有与root管理员一样的身份和权限(默认情况)
以/etc/shadow文件举例:
基本的权限知识,oldboy用户无法修改shadow文件,但是因为passwd具有suid权限。因此,当oldboy用户执行passwd时,就可以取得root管理员的身份和权限(实际上是获取passwd对应用户的身份),所以就可以修改原本oldboy没权限修改的/etc/shadow了(修改过程中是以root身份操作的,这就是suid的作用)。
效果如下所示:
[root@centos7-100 ~]# su - oldboy
上一次登录:日 10月 3 17:56:26 CST 2021pts/0 上
[oldboy@centos7-100 ~]$ passwd root
passwd:只有根用户才能指定用户名。 #普通用户修改其他用户密码会提示passwd命令只有根用户才能指定用户名
3.suid核心知识
1.suid的功能是针对二进制命令或程序的,不能用在shell等类似脚本文件上。
2.用户或属主对应的前三位权限的x位上,如果有s(S)则表示具有suid权限。
3.suid的作用就是让普通用户可以执行某个设置suid位的命令或程序时,拥有与命令对应属主(一般为root管理员)一样的身份和权限(默认)。
4.二进制命令程序需要具有可执行权限x配合才能进行相关操作。
5.suid对应的身份和权限仅在程序命令的执行过程中才有效。
6.suid是一把双刃剑,是一个比较危险的功能,对系统安全存在一定的威胁,企业里用户授权可以使用sudo等替代suid功能。
7.在进行安全优化时,系统中默认设置了suid权限的命令要取消掉。
4.suid配置案例
如果没有配置sudo,普通用户是不能删除其他用户的文件的,
实例:
[root@centos7-100 ~]# touch /opt/root.txt
[root@centos7-100 ~]# su - oldboy
上一次登录:日 10月 3 21:53:14 CST 2021pts/0 上
[oldboy@centos7-100 ~]$ ll
总用量 0
[oldboy@centos7-100 ~]$ cd /opt/
[oldboy@centos7-100 opt]$ ls
others owner root.txt
[oldboy@centos7-100 opt]$ rm root.txt
rm:是否删除有写保护的普通空文件 "root.txt"?n
[oldboy@centos7-100 opt]$ ls
others owner root.txt
[oldboy@centos7-100 opt]$ ll
总用量 0
drwxr-xr-x. 2 root root 24 10月 3 10:23 others
drwxr-xrwx. 2 root root 23 10月 3 16:48 owner
-rw-r--r--. 1 root root 0 10月 3 22:04 root.txt
[oldboy@centos7-100 opt]$ cd ..
[oldboy@centos7-100 /]$ ll
总用量 20
lrwxrwxrwx. 1 root root 7 9月 15 19:33 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 9月 15 19:40 boot
drwxr-xr-x. 20 root root 3240 9月 24 17:14 dev
drwxr-xr-x. 75 root root 8192 10月 3 17:38 etc
drwxr-xr-x. 3 root root 20 10月 2 22:41 home
lrwxrwxrwx. 1 root root 7 9月 15 19:33 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 9月 15 19:33 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 4月 11 2018 media
drwxr-xr-x. 2 root root 6 4月 11 2018 mnt
drwxr-xr-x. 4 root root 49 10月 3 22:04 opt
dr-xr-xr-x. 119 root root 0 9月 24 17:14 proc
dr-xr-x---. 3 root root 143 10月 3 20:38 root
drwxr-xr-x. 25 root root 720 10月 3 10:13 run
lrwxrwxrwx. 1 root root 8 9月 15 19:33 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 4月 11 2018 srv
dr-xr-xr-x. 13 root root 0 9月 24 17:14 sys
drwxrwxrwt. 19 root root 4096 10月 3 16:49 tmp
drwxr-xr-x. 13 root root 155 9月 15 19:33 usr
drwxr-xr-x. 19 root root 267 9月 15 22:25 var
[oldboy@centos7-100 /]$ cd opt
[oldboy@centos7-100 opt]$ ls
others owner root.txt
[oldboy@centos7-100 opt]$ rm root.txt
rm:是否删除有写保护的普通空文件 "root.txt"?y
rm: 无法删除"root.txt": 权限不够
下面使用root账户给rm命令授权suid权限
[oldboy@centos7-100 opt]$ rm root.txt
rm:是否删除有写保护的普通空文件 "root.txt"?y
rm: 无法删除"root.txt": 权限不够
[oldboy@centos7-100 opt]$ which rm
/bin/rm
[oldboy@centos7-100 opt]$ chmod u+s /bin/rm
chmod: 更改"/bin/rm" 的权限: 不允许的操作
[oldboy@centos7-100 opt]$ su - root
密码:
上一次登录:日 10月 3 22:03:40 CST 2021pts/0 上
[root@centos7-100 ~]# chmod u+s /bin/rm
[root@centos7-100 ~]# ll /bin/rm
-rwsr-xr-x. 1 root root 62872 8月 20 2019 /bin/rm
[root@centos7-100 ~]# su - oldboy
上一次登录:日 10月 3 22:04:06 CST 2021pts/0 上
[oldboy@centos7-100 ~]$ rm /opt/root.txt
[oldboy@centos7-100 ~]$ ll /opt/
总用量 0
drwxr-xr-x. 2 root root 24 10月 3 10:23 others
drwxr-xrwx. 2 root root 23 10月 3 16:48 owner
总结:
1.对rm设置了suid位以后,任何用户执行rm都是以root的身份和权限进行的,由此可见这样的操作是很不安全的
2.所以,建议大家不要在企业中使用suid功能
5.拓展-如何查找Linux系统里具有suid权限的文件
find / -type f -perm -4000 -ls
第三章 特殊权限sgid
1.什么是sgid特殊权限
1.对于二进制命令或者程序来说,sgid的功能与suid基本相同,唯一的区别是,suid是获得命令所属用户的身份和权限,而sgid是获得命令所属用户组的身份和权限。
2.setgid位主要用于目录中,在为某个目录设置了setgid位以后,在该目录中新创建的文件具有该目录的所属组权限,而不是创建该文件的用户的默认所有者。这就使得在多个用户之间共享一个目录中的文件变得简单。
2.sgid作用
1.与suid不同的是,sgid既可以针对文件,也可以针对目录进行设置
2.sgid的权限是针对用户组权限位的。
对文件来说:
1.sgid仅对二进制命令及程序有效。
2.二进制命令或程序,也需要有可执行权限x的配合。
3.执行命令的任意用户可以获得该命令在程序执行期间所属组的身份和权限。
对目录来说:
1.Linux里默认情况下所有用户创建文件,默认用户和组都是自身的。
2.sgid可以让用户在此目录下创建的文件和目录具有与此相同的用户组设置。
3.sgid配置案例
下面来看一道RHCE认证考试题
题目需求:
1.创建共享目录/home/admins
2.要求属组为adminuser,adminuser组成员对admins目录有写入,读取和执行的权限
3.其他所有用户均没有任何权限
4.在/home/admins目录中创建的文件会自动继承adminuser组的权限
解答步骤:
[root@centos7-100 ~]# useradd adminuser -M
[root@centos7-100 ~]# groupadd adminuser
groupadd:“adminuser”组已存在
[root@centos7-100 ~]# chown adminuser.adminuser /home/admins
[root@centos7-100 ~]# ll /home/admins/
总用量 0
[root@centos7-100 ~]# ll /home/admins
总用量 0
[root@centos7-100 ~]# ll -d /home/admins
drwxr-xr-x. 2 adminuser adminuser 6 10月 3 22:39 /home/admins
[root@centos7-100 ~]# chmod g+w /home/admins
[root@centos7-100 ~]# ll -d /home/admins
drwxrwxr-x. 2 adminuser adminuser 6 10月 3 22:39 /home/admins
[root@centos7-100 ~]# chown root. /home/admins
[root@centos7-100 ~]# ll -d /home/admins
drwxrwxr-x. 2 root root 6 10月 3 22:39 /home/admins
[root@centos7-100 ~]# chown .adminuser /home/admins
[root@centos7-100 ~]# ll -d /home/admins
drwxrwxr-x. 2 root adminuser 6 10月 3 22:39 /home/admins
[root@centos7-100 ~]# chomd o= /home/admins
-bash: chomd: 未找到命令
[root@centos7-100 ~]# chmod o= /home/admins
[root@centos7-100 ~]# ll -d /home/admins
drwxrwx---. 2 root adminuser 6 10月 3 22:39 /home/admins
[root@centos7-100 ~]# chmod 2770 /home/admins
[root@centos7-100 ~]# ll -d /home/admins
drwxrws---. 2 root adminuser 6 10月 3 22:39 /home/admins
第四章 特殊权限sbit
1.sbit粘滞位作用
沾滞位sbit的功能现在已经很少用了,不过对于像/tmp目录这样的,因为其是整个系统用户的临时文件存放地,因此还是有点意义的。
如果查看/tmp的目录属性,就会发现这个目录权限大的离谱。
[root@centos7-100 html]# ll -d /tmp
drwxrwxrwt. 19 root root 4096 10月 4 12:29 /tmp
一旦给目录赋予了粘滞位,那么这个目录除了root用户可以删除所有文件,其他用户只能删除自己建立的文件,不能删除其他用户的文件。
总结如下:
1.只对目录生效
2.一个目录即使它的所有权限都开放了,即权限为rwxrwxrwx,但设置了粘滞位,那么除非目录的属主和root用户有权删除他,除此之外其他用户是不能删除这个目录的。
2.sbit粘滞位配置
chmod 1755 /tmp
chmod o+t /tmp
实例:
1.查看rm文件的权限suid 位有没有s
[oldboy@centos7-100 tmp]$ whereis rm
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz
[oldboy@centos7-100 tmp]$ su - root
密码:
上一次登录:一 10月 4 17:04:10 CST 2021pts/0 上
[root@centos7-100 ~]# whereis rm
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz
[root@centos7-100 ~]# ll /usr/bin/rm
-rwxr-xr-x. 1 root root 62872 8月 20 2019 /usr/bin/rm
2.查看cat sudoers 文件内有没有添加usr/bin/rm
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
oldboy ALL=(ALL) /usr/sbin/useradd
oldboy ALL=(ALL) /usr/sbin/usermod
oldboy ALL=(ALL) /usr/bin/whoami
3.登录普通用户,使用whoami查看是不是root用户登录
[root@centos7-100 ~]# su - oldboy
上一次登录:一 10月 4 17:05:10 CST 2021pts/0 上
[oldboy@centos7-100 ~]$ whoami
oldboy
第五章 文件特殊属性命令
1.更改文件特殊属性chattr
命令说明:
chattr 命令用于改变文件的扩展属性。与chmod命令相比,chmod 只是改变了文件的读 ,写,执行权限。更底层的属性控制是由chattr来改变的。
命令格式:
chattr [选项] [模式] [文件或目录]
选项:
-R 递归更改目录属性
-V 显示命令的执行过程
模式:
+ 增加参数
- 移除参数
= 更改为指定的参数
A 告诉系统不能修改这个文件的最后访问时间
a 只能向文件里追加数据,不能删除
i 设定的文件不能被删除,改名,写入或新增内容
+a 只能追加命令实践:
[root@centos7-100 ~]# touch test.txt
[root@centos7-100 ~]# ll
总用量 0
-rw-r--r--. 1 root root 0 10月 4 17:25 test.txt
[root@centos7-100 ~]# lsattr test.txt
---------------- test.txt
[root@centos7-100 ~]# ll
总用量 0
-rw-r--r--. 1 root root 0 10月 4 17:25 test.txt
[root@centos7-100 ~]# chattr +a test.txt
[root@centos7-100 ~]# ll
总用量 0
-rw-r--r--. 1 root root 0 10月 4 17:25 test.txt
[root@centos7-100 ~]# lsattr test.txt
-----a---------- test.txt
[root@centos7-100 ~]# rm test.txt
rm: 无法删除"test.txt": 不允许的操作
[root@centos7-100 ~]# echo 123 >test.txt
-bash: test.txt: 不允许的操作
[root@centos7-100 ~]# echo 123 >>test.txt
[root@centos7-100 ~]# cat test.txt
123 #但是可以查看文件内容
+i文件加锁命令实践
1.添加权限
[root@centos7-100 ~]# chattr +i test.txt
[root@centos7-100 ~]# lsattr test.txt
----ia---------- test.txt
[root@centos7-100 ~]# chattr +i test.txt
[root@centos7-100 ~]# lsattr test.txt
----ia---------- test.txt
[root@centos7-100 ~]# echo 123 >test.txt
-bash: test.txt: 权限不够
[root@centos7-100 ~]# rm test.txt
rm: 无法删除"test.txt": 不允许的操作
2.去除权限
[root@centos7-100 ~]# chattr -i test.txt
[root@centos7-100 ~]# chattr -a test.txt
[root@centos7-100 ~]# lsattr test.txt
---------------- test.txt
应用场景:
避免恶意删除.bash_history 历史记录文件或重定向到/dev/null,又因为系统需要向这个文件写人历史纪录,因此采用追加模式,只增不减。
chattr +a .bash_history
2.查看文件特殊属性lsattr
lsattr 命令可用于查看文件扩展属性。
命令格式:
lsattr[选项][文件或目录]
选项:
-R 递归查看目录的拓展属性
-a 显示所有文件包括隐藏文件的扩展属性
-d 显示目录的扩展属性
查看文件的扩展属性:
[root@centos7-100 ~]# lsattr test.txt
---------------- test.txt
查看目录的扩展属性:
[root@centos7-100 ~]# lsattr -d /tmp/
---------------- /tmp/
第6章 默认权限掩码umask
1.什么是umask
通过上一课的学习我们了解到Linux里创建目录的默认权限是755,创建文件的权限是644。
那么为什么目录是755,文件是644呢?实际上是因为有umask在控制默认创建的权限。
2.umask如何计算
umask是通过八进制的数值来定义用户创建文件或目录的默认权限的。
系统会根据预先设定的umask值计算出默认情况下创建的文件或目录权限。
umask默认是022权限,当我们创建一个目录时,正常情况下的权限应该是777,默认减去umask的值,所以默认创建的目的
权限是777-022=755.
同理,文件的默认权限应该是666,然后减去umask的值为666-022=644
3.基于文件的计算-有奇偶之分
创建文件默认最大的权限为666(-rw-rw-rw-),其默认创建的文件没有可执行权限x位。
对于文件来说,umask的设置是在假定文件拥有八进制666的权限上进行的,文件的权限就是666减umask的各个位数字也不能大于6,比如077就不符合条件)的掩码数值。如果得到的3位数字每一位都是偶数,那么这就是最终结果;如果有若干位的数字是奇数,那么这个奇数需要加1变成偶数,最后得到全是偶数的结果。
举例说明:
1.假设umask值为022(所以位均为偶数),那么文件的对应权限计算公司为:
666
-022
------
644
2.假设umask值为045(其他用户组为奇数),那么文件的对应权限计算式为:
666
- 045
------
621
+ 001
------
622
4.基于目录的计算-没有奇偶之分
1假如umask值为022(所以位均为偶数),那么目录的对应权限计算式为:
777
-022
-----
755