权限之高级权限
一、ACL权限简介与开启
1、是解决权限不足的问题。
2、[root@localhost~]# dumpe2fs  -h /dev/sda5
#dumpe2fs命令是查询指定分区详细文件系统信息的命令
选项:
-h  仅显示超级块中信息,而不显示磁盘块组的详细信息
挂载acl权限方法:
#mount  -o  remount,acl  /                  //临时的     
#重新挂载根分区,并挂载加入acl权限
#vi /etc/fstab
UUid=c2ca6f57-b15c-43ea-bca0-f239083dbd2 / ext4 defaults,acl 1 1  //加入acl,默认一般都有acl
#mount  -o  remount  /
#重新挂载文件系统或重启系统,使修改生效
注意:UUid是分区唯一识别符  ;defaults是挂载时候默认的权限;1 1 表示是否需要检测、是否需要备份;
2、查看与设定ACL权限
1、 #getfacl  [选项]  文件名              //查看acl权限
-m 设定ACL权限
-x  删除指定的ACL权限
-
b  删除所有的ACL权限
-d  设定默认的ACL权限
-k  删除默认ACL权限
-R  递归设定ACL权限
#uesradd  tony
#groupadd  stu
#cd /home
#mkdir  av
#chown tony:stu  /av
#chmod 770  /av
#useradd  lw
#getfacl -m u:lw:rx    av
#getfacl -m g:lw:rx    av
#ll            //会发现av的权限后边有个+号,标明是有acl权限的
#getfacl      //查看acl权限具体是什么,可以有rx权限了,里边还有个mask命令,后边章节会讲解
3、最大有效权限与删除ACL权限
1、最大有效权限
mask是用来指定最大有效权限的,如果我给用户赋予ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限
#getfacl  -m  m:rx  av          //给mask赋予权限 rx
2、删除ACL权限
#setfacl  -x  u:用户名    文件名  //删除指定用户ACL权限
#setfacl  -x  g:组名      文件名  //删除指定用户组的ACL权限
#setfacl  -b  文件名              //删除这个目录下的所有权限
3、默认权限和递归权限
递归式父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限
#setfacl  -m  u:用户名:权限  -R  /文件名
权限溢出:
用递归权限很难避免权限溢出的情况,一般目录有执行权限,递归到文件时文件也有了执行权限,但文件不一定就需要执行权限,递归仅能针对目录操作的
默认权限:
默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件
都会继承父目录的ACL权限
#setfacl  -m  d:u:用户名:权限  文件名
默认权限对文件不会报错,递归会报错;但都直接对文件不起作用,对象是目录
4、sudo权限:
root 把本来只能超级用户执行的命令赋予普通用户执行
sudo的操作对象是系统命令
# visudo
#实际修改的是/etc/sudoers文件
root  ALL=(ALL)  ALL
#用户名  被管理主机的地址=(可用的身份)授权的命令(绝对路径)
#%wheel  ALL=(ALL)  ALL
#%组名 被管理主机的地址=(可使用的身份)授权的命令(绝对路径)
#man  -5 sodoers 查看帮助
例子1
普通用户不能执行shutdown命令,接下来让普通用户能够执行这个命令
#suroot 
#visudo    进入后再最后一行添加:
user1  ALL= /sbin/shutdown -r now
#sudo  -l    输入user1的密码,就能看到刚才添加的 命令
#sudo  /sbin/shutdown  -r  now      //user1用户要这样执行命令,输入密码后执行
linux递归删除目录命令
也可以给用户组赋予ACL权限,在组名之前加%
#visudo  之后
  ##Allows people in group wheel to run all commands
# %wheel    ALL=(ALL)  ALL
例子2
授权普通用户可以添加其他用户
#visudo
user1  ALL=/usr/sbin/useradd
user1  ALL=/usr/sbin/passwd
#sudo  /usr/sbin/useradd
#sudo  /usr/sbin/passwd
#授予用户设定密码的权限,这样写身份是root,可以直接修改root密码
解决方案:将#sudo  /usr/sbin/passwd 删掉,换成以下不能修改root密码:
user1 ALL=/usr/bin/passwd[A-Za-z]*, !/usr/bin/passwd””, !/user/bin/passwd root
例子3:给所有用户赋予  vi命令
#visudo  后添加一行user1 ALL=/bin/vi
#sodo  -l          //已经获得root权限,查看一下
#sudo  /bin/vi  etc/shadow  //user用户可直接修改shadow,很可怕;
5、权限之文件特殊权限 
Linux里边也称为:SetUID    SetGID    Sticky BIT  命令
SetUID :
只有可以执行的二进制程序才能设定SetUID 权限
命令执行者要对该程序拥有x(执行权限)
命令执行者在执行改程序时获得改程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
SetUID 权限只在改程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
umask  输出的0022中的第一位 是设置特殊权限
例子:验证只有二进制才能设置SetUID权限
#chomd 4755
-rwsrwxr-x            //赋予了SetUID权限,在拥有者执行权限x 变为 s
#chomd 4644
-rwSrwxr-x            //赋予了SetUID权限,在拥有者执行权限x 变为 S
注意:S是不能被执行的权限,  s=S+x
例子:验证执行者要对程序有执行权限
#ll        //查看属组 和其他人有 有无执行权限
例子:验证属主的身份
-rwsrwxr-x    任何用户执行passwd 时候,自动赋予root权限修改自己的密码
cat等命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容
6、设定SetUID的方法
  4  代表SetUID 
chmod 4755 文件名  或  chmod  u + s 文件名
  取消SetUID的方法
chmod 0755 文件名  或  chmod  u - s 文件名
危险的SetUID
关键目录应严格控制写权限。比如//usr
用户密码设置要严格遵守密码三原则(复杂性、易记忆性、实效性)
对系统中默认应该具有SetUID权限的文件一列表,定时检查有没有这之外的文件设置了SetUID权限
例子:验证vi 改为SetUID权限
#ll  /bin/vi
-rwsr-xr-x        //普通用户可以以root身份修改重要文件,很可怕的。
怎么去检测  存在的 SetUID?
#!/bin/bash
find / -perm  -4000  -0  -perm -2000 > /tmp/setuid.check
#搜索系统中所有拥有SUID和SGID的文件,并保存在临时目录中