在进行Linux权限管理时会需要一些特殊权限,这部分权限与基本权限一同构成了Linux完整的权限管理体制。注意,以上课程是2017年Tony老师的视频课程,随着Linux技术的进步,Linux权限管理也会面临着更大的安全性挑战,不要一味的认为权限管理课程能够保证不出任何问题。
三、ACL权限(弥补用户对文件管理权限不足的缺陷)

Linux特殊权限
三、ACL权限(弥补用户对文件管理权限不足的缺陷)
文件就三个管理身份:所有者、所属组、其他人,当有指定需要人员管理就没办法了
、ACL权限简介与开启
※、鉴于上述问题,ACL权限不考虑身份,直接赋予指定用户对文件的管理权限
※、查看分区ACL权限是否开启
dumpe2fs -h /dev/sda5 #查询指定分区详细文件系统信息命令
-h #仅显示超级块中信息,不显示磁盘块组的详细信息
※、临时开启分区ACL权限
mount -o remount,acl /
#重新挂载根分区,并挂载加入ACL权限,-o 特殊挂载 / 根分区
※、永久开启分区ACL权限(/etc/fstab文件修改出一点错,会影响系统启动)
vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 defaults,acl 11
#加入ACL,默认defaults是开启ACL权限的,万一不起作用按上面方法
mount -o remount /
#重新挂载文件系统或重启系统,使修改生效
、查看与设定ACL权限
※、查看ACL命令语法:getfacl 文件名
※、设定ACL权限命令语法:setfacl 选项 文件名
选项:m #设定ACL权限
x #删除指定的ACL权限
b #删除所有的ACL权限
d #设定默认ACL权限
k #删除默认ACL权限
R #递归设定ACL权限
例子:mkdir av #创建文件夹
useradd tony #创建tony用户
groupadd stu #创建stu组
chown tony:stu av #更改文件所有者和所属组
chmod 770 av #更改文件权限
useradd laowang #创建老王用户
passwd lw #老王的密码
mv av /home/ #更改文件路径,方便老王可以进入
setfacl -m u:laowang:rx /av #给老王赋予rx权限,使用"u:用户名:权限"格式;如果是给用户组设定ACL权限,使用"g:组名:权限"格式
输入ll命令可以查看到drwxrex---+ .变成了+,证明有ACL权限
getfacl av #查看具体的ACL权限
※、给用户组设定ACL权限
groupadd tgroup2 #创建用户组
setfacl -m g:tgroup2:rwx /av #为组分配ACL权限
、最大有效权限与删除ACL权限
※、最大有效权限mask:是给用户赋予ACL权限,是需要和mask的权限作逻辑“相与”运算才能得到的用户真正权限
关于逻辑与:假设有A和B,and是与出来的结果。r为读权限

Linux特殊权限
注释:比如上面的例子,老王的权限为r-x,mask 的权限为rwx,那么与出权限r-x就是老王的真正权限,因为mask目录默认为rwx最大值(文件的mask默认最大值是r-x),所以一般来说任何与mask相与的权限都是其自身,一般mask最大值,需要可自行更改。比如上述赋予老王权限以后,可以
setfacl -m m:rx av #getfacl查看即可看到后面会注释老王的真正权限
※、修改最大有效权限
setfacl -m m:rx 文件名 #设定mask权限为r-x,使用"m:权限"格式
※、删除ACL权限
setfacl -x u:用户名 文件名 #删除指定用户的ACL权限
setfacl -x g:组名 文件名 #删除指定用户组的ACL权限
setfacl -b 文件名 #删除文件的所有ACL权限
、默认ACL权限和递归ACL权限
※、递归ACL权限:设定目录ACL权限时,所有子文件子目录也有相同的ACL权限
语法:setfacl -m u:用户名:权限 -R 文件目录 #仅能赋予目录,不能是文件
注释:只要用递归ACL权限,就会导致权限溢出,即可以进入这个目录或者下级目录,但是目录下的文件也变成可执行的文件了,这就很危险,因此要注意使用。
※、默认ACL权限:设定了父目录的默认ACL权限,后续父目录中新建的子文件都会继承父目录的ACL权限。
语法:setfacl -m d:u:用户名:权限 -R 文件名 #赋予文件不会报错
注释:递归权限是对当前目录及已经存在的其子目录、子文件赋予ACL权限,而默认ACL权限是对当前目录及后续即将创建的子目录、子文件赋予ACL权限。递归权限赋予文件会报错,而默认权限赋予文件不会报错,但没有任何意义(文件下面不能创建子文件)
四、文件特殊权限
❶、sudo权限(root用户太忙,日常中需要普通用户执行系统命令操作)
root把本来只能超级用户执行的命令赋予普通用户执行;
sudo的操作对象是系统命令
❷、sudo使用(超级用户赋予普通用户)
visudo #实际修改的是 /etc/sudoers文件
root ALL = (ALL) ALL
#用户名 被管理主机的地址=(可使用的身份)授权命令(绝对路径)
#%wheel ALL = (ALL) ALL
#%组名 被管理主机的地址=(可使用的身份)授权命令(绝对路径)
例子1:授权普通用户重启服务器
visudo
user1 ALL=/sbin/shutdown -r now
:wq
(在文档中写入user1 ALL=(ALL) /sbin/shutdown -r now,绝对路径写的越详细,普通用户可执行的其他权限就越小,因为很多命令都带有选项)
授权的普通用户执行命令方法
sudu /sbin/shutdown -r now
在系统上切换用户 su - user1
sudo -l #查看可用的sudo命令
例子2:授权普通用户可以添加其他用户(查找命令路径whereis 命令名)
visudo
user1 ALL=/usr/sbin/useradd (没有加(ALL)详单与root)
user1 ALL=/usr/bin/passwd #授予用户设定密码权限
授权的普通用户执行命令方法
sudo /usr/sbin/useradd cangls
sudo /usr/bin/passwd cangls
注意:这样写是可以更改root的密码的,所以问题就大了。因此按照下面写:
user1 ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd " ", !/usr/bin/passwd root
同样不能赋予 user1 ALL=/bin/vi
sudo /bin/vi /etc/shadow #这样就打开了只有root才能打开修改密码的文件
五、文件特殊权限(危险权限,禁止使用,只使用系统默认的文件权限)
①、SETUID(简称SUID:u+s)(umask 出来的0022中的第一个数字就是特殊权限位)
、SetUID的功能(SUID权限格式:-rwsr-xr-x. u+s:用户+s权限,SUID只对文件)
※、条件:
只有可以执行的二进制程序才能设定SUID权限(小s权限能正常使用,而大S不行,即相当于s=S+x)
命令执行者要对该程序拥有x权限
※、命令执行者在执行该程序时获得程序文件属主身份
注释:ll /etc/shadow 这个文件权限0000,只有root用户才可以进行更改,而我们知道普通用户是可以更改自己的用户密码的,相对来说也是更改了这个文件。原因在于ll /usr/bin/passwd 这个文件上面:/usr/bin/passwd默认拥有s权限,而且拥有x权限,本身passwd就是可执行的正确命令,满足以上条件的普通用户在更改密码的时候会获得这个文件root的所有者属主身份;
※、SUID权限只在该程序执行过程中有效,即身份改变只在执行过程中有效
、设定SUDI的方法
4代表SUID:chmod 4755 文件名
chmod u+s 文件名
例如:chmod u+s abc chmod u-s abc
、取消SUID的方法
chmod 0755 文件名
chmod u-s 文件名
注意:危险的SUID
关键目录应严格控制权限。比如/ 根下、/usr 下
用户的密码设置要严格遵守密码三原则
对系统中默认应该具有的SUID权限的文件作一列表,定时检查
检查的shell编好的脚本文件如下
#!/bin/bash
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
#搜索系统中所有拥有SUID和SGID的文件,并保存到临时目录中
for i in $(cat /tmp/setuid.check)
#做循环,每次循环取出临时文件中的文件名
do
grep $i /root/suid.log > /dev/null
#比对这个文件名是否存在模板中
if [ "$?" != "0"]
#检测上一个命令返回值,如果不为0,证明上一个命令报错
then
echo "$i isn't in listfile!" >> /root/sui_log_$(date +%F)
#不存在模板中,报错并写入报错到日志中
fi
done
rm -rf /tmp/setuid.check
#删除临时文件
运行设置:vi suid_check.sh
将上述代码去除中文注释粘贴到文件中保存
chmod 755 suid_check.sh
chmod u+s abc #新建测试文件abc
./sudi_check.sh #执行脚本文件
ls #查看列表
cat suid_log_时间 #查看文件
rm -rf abc #查询测试文件不合法,删除该文件
危险例子:chmod 4755 /bin/vi
ll /bin/vi
/bin/vi /etc/shadow #就可以修改密码了
②、SETGID(简称SGID:g+s)
❶SGID对文件的作用(类似SUID,只是一个针对用户,一个针对组)
※、条件:只有可执行的二进制程序才能设置SGID权限
命令执行者要对该程序拥有x权限
※、命令执行程序时,组身份会升级为该程序文件的属组
※、SGID权限同样只在程序执行过程中有效,执行完成即失效
例子:touch abc
ll
chmod g+s abc
ll
例子:ll /usr/bin/locate #显示搜索命令权限
显示wx--s--x ,而实际locate搜索的是下面的数据库
ll /var/lib/mlocate/mlocate.db #显示这个数据库权限
显示w-r-----. SGID对文件的作用应用不广泛,locate是典型
❷SEGID针对目录的作用
※、条件:普通用户必须对此目录拥有r和x权限才能进入此目录
※、普通用户在此目录中的有效组会变成此目录的属组(就是下面的意思)
※、 若普通用户对此目录拥有w权限,新建文件的默认属组是这个目录的属组,而不是这个文件本身创立者的所属组
❸、设定SGID
2代表SGID:chmod 2755 文件名
chmod g+s 文件名
❹、取消SGID
CHMOD 0755 文件名
chmod g-s 文件名
③、sticky BIT(简称SBIT:o+s)(不建议手工建立拥有粘着位的目录)
⑴、SBIT粘着位作用
※、粘着位目前只对目录有效
※、普通用户对该目录拥有rwx权限,即普通用户可以在此目录拥有写入权限
※、如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一旦赋予粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
⑵、设置与取消粘着位(drwxrwxrwt)
※、设置粘着位 chmod 1755 目录名 或者 chmod o+t 目录名
※、取消粘着位 chmod 0777 目录名 或者 chmod o-t 目录名
⑶、例如: ll -d /tmp/ 就是一个具有粘着位权限的目录
注意:虽然不可以删除文件,但是可以更改删除文件里面的内容!!!
六、不可改变位权限(charttr)
⑴、chattr命令格式
chattr [+ - =] [选项] 文件或目录名 #+增加权限;-删除权限;= 等于某权限
a 等价于append(追加)
i 等价于insert(插入)
i:如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但是不允许建立和删除文件。
例如:root下文件:chattr +i abc
lsattr abc
显示:----i--------e- abc e代表ext4文件
注释:上述就想当于对文件进行锁定,文件是只读的,哪怕是root都不能修改、删除。但是可以chattr -i abc 解除锁定
例如:root下目录:chattr +i 123
lsattr 123 #显示-------------------e- 123/ABC
lsattr -d 123 #需要加-d才可以显示
显示:----i--------e- 123
注释:对目录进行锁定,不能删除、创建、改名目录下的文件
a:如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属性吗,那么只能允许在目录中建立和修改文件,但是不允许删除;
例如:root下文件:chattr +a dt
lsattr dt
显示:----a--------e- dt
注释:因为系统不能直接判断是对数据增加还是修改,因此vi dt命令执行修改后仍是不能保存的,只能通过echo 数据 >> dt 输出重定向方式保存
例如:root下目录:chattr +a lw
lsattr -d lw/
显示:----a--------e- lw/
注释:
⑵、查看文件系统属性
lsattr 选项 文件名
-a #显示所有文件和目录
-d #若目标是目录,仅列出目录本身的属性,而不是子文件
七、Pam和selinux(大多数用不到的权限)