暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

原创|NO.A.0009|——|Linux|基础知识|权限管理|ACL/sudo/SetUIDGID/SBIT/chattr|​

Java BBS 2021-04-21
279

第八章:权限管理

——>实验专题<——

#ACL权限:用于解决用户对文件身份不足的问题的。
#ACL权限:一旦递归之后,不可避免的出现权限溢出


#sudo:赋予的权限越详细,普通用户得到的权限越小
// 赋予的权限越简单,普通用户得到的权限越大


#SUID:
// 必须针对执行文件才可以赋予SUID权限
// 命令执行者要对该程序拥有x(执行)权限
// 命令执行者在执行该程序时获得该程序文件属主的身份
// SetUID权限旨在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效


#SUID建议:
// 关键目录应严格控制写权限,比如“/”“/usr”等
// 用户的密码设置要样遵守密码三原则
// 对系统中默认应该具有SUID权限的文件做一列表,定时检查这之外的文件被设置了SetUID权限


// 4表示:SUID:只能针对执行程序的;
// 2代表:SGID:既可以针对执行程序;也可以针对目录;命令本身没有风险,但是对应文件和目录需要777权限,带来风险
// 1代表:SBIT:只能针对目录的权限;命令本身没有风险,但是对应目录需要777权限,带来风险


# chattr
// +: 增加权限
// -: 删除权限
// =: 等于某权限
// i: 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。
// a: 如果对文件设置 a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删
// e: Linux 中绝大多数的文件都默认拥有 e 属性。表示该文件是使用 ext 文件系统进行存储的,而且不能使用“chattr -e”命令取消 e 属性。

一、ACL 权限

1、ACL 概述:

ACL 是用于解决用户对文件身份不足的问题的

2、开启 ACL

[root@localhost ~]# dumpe2fs -h /dev/sda3
// dumpe2fs 命令是查询指定分区详细文件系统信息的命令
// 选项:
// -h 仅显示超级块中信息,而不显示磁盘块组的详细信息。
// ...省略部分输出...
Default mount options: user_xattr acl
// ...省略部分输出...
// 如果没有开启,手工开启分区的 ACL 权限:
[root@localhost ~]# mount -o remount,acl /
// 重新挂载根分区,并挂载加入 acl 权限
// 也可以通过修改/etc/fstab 文件,永久开启 ACL 权限:
[root@localhost ~]# vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4
// 加入 acl
[root@localhost ~]# mount -o remount /
// 重新挂载文件系统或重启动系统,使修改生效

——>实验专题<——

#ACL权限没有开启,手动开启ACL权限
[root@server11 ~]# dumpe2fs -h /dev/sda3
Default mount options: user_xattr acl #默认挂载权限由acl权限

3、ACL 基本命令

// getfacl     文件名
// 查询文件的 ACL 权限
// setfacl 选项 文件名
// 设定 ACL 权限
// -m 设定 ACL 权限
// -b 删除 ACL 权限
// -x:用户      删除单个用户的 ACL 权限
// setfacl -m u:用户名:权限 文件名
// setfacl -m g:组名:权限 文件名
// setfacl -m u:aa:rwx /test 给 test 目录赋予 aa 是读写执行的 ACL 权限
// setfacl -m u:cc:rx -R soft/ 赋予递归 ACL 权限,只能赋予目录
//       -R                                递归
// setfacl -m d:u:aa:rwx -R /test ACL 默认权限。注意:默认权限只能赋予目录
// 注意:如果给目录赋予 acl 权限,两条命令都要输入
// 递归与默认的区别:
// setfacl -m u:cc:rx -R soft/ 只对已经存在的文件生效
// setfacl -m d:u:aa:rwx -R /test 只对以后新建的文件生效

——>实验专题<——

#1、设置ACL权限
#添加一个新的用户
[root@server21 ~]# useradd www3
[root@server21 ~]# passwd www3
#授予ACL权限
[root@server21 ~]# setfacl -m u:www3:5 /www/ #u:www3:5用户:用户名:权限数字或者权限数字也可以
#查看有个+好,
[root@server21 ~]# ll -d /www/
drwxrwx---+ 2 www1 www 4096 Feb 4 10:29 /www/
[root@server21 ~]# getfacl /www/
# file: www/ #文件名
# owner: www1 #所有者
# group: www #所属组
user::rwx #用户权限
user:www3:r-x #单独的用户拥有5权限
group::rwx #所属组权限
mask::rwx #最大权限
other::--- #其他人权限
#验证:他可以进入到该目录,但是不可以创建文件 #只能查看文件内容,但是没有操作权限
[root@server21 ~]# su - www3
[www3@server21 ~]$ cd /www/
[www3@server21 www]$ touch www
touch: cannot touch# `www': Permission denied
#2、递归创建子文件:针对已经存在子文件生效
[root@server21 ~]# touch /www/wwwtest1
[root@server21 ~]# touch /www/wwwtest2
[root@server21 ~]# setfacl -m u:www3:5 -R /www/
#查看www下的所有文件都有ACL权限
[root@server21 ~]# ll /www/
-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest1
-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest2
[root@server21 ~]# getfacl /www/wwwtest1
getfacl: Removing leading '/' from absolute path names
# file: www/wwwtest1
# owner: root
# group: root
user::rw-
user:www3:r-x
group::r--
mask::r-x
other::r--
#再创建一个文件,是没有ACL权限的
[root@server21 ~]# touch /www/wwwtest3
[root@server21 ~]# ll /www/
total 0
-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest1
-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest2
-rw-r--r--  1 root root 0 Feb  4 10:38 wwwtest3         #是没有ACL权限,递归只能对已经存在的文件生效
#对于新建的文件也会有ACL权限
[root@server21 ~]# setfacl -m d:u:www3:5 -R /www/       #加入d参数
[root@server21 ~]# getfacl /www/
default:user::rwx
default:user:www3:r-x
default:group::rwx
default:mask::rwx
default:other::---
[root@server21 ~]# touch /www/wwwtest4
[root@server21 ~]# ll /www/
total 0
-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest1
-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest2
-rw-r--r--  1 root root 0 Feb  4 10:38 wwwtest3          #这个文件还是没有ACL权限,刚好卡在这两个权限生效之间,所以不会生效
-rw-rw----+ 1 root root 0 Feb  4 10:40 wwwtest4          #新建的文件有ACL权限


#ACL权限最大的问题:一旦递归之后,不可避免权限溢出
# setfacl -m u:cc:rx -R soft/ 只对已经存在的文件生效
#  setfacl  -m d:u:aa:rwx -R /test                   只对以后新建的文件生效 

4、 最大有效权限 mask

[root@localhost /]# setfacl -m m:rx project/
// 设定 mask 权限为 r-x。使用“m:权限”格式
[root@localhost /]# getfacl project/
// file: project/
// owner: root
// group: tgroup
user::rwx
group::rwx #effective:r-x
mask::r-x
// mask 权限变为了 r-x
other::---

——>实验专题<——

[root@server21 ~]# getfacl /www/
mask::rwx #调整最大权限的
[root@server21 ~]# setfacl -m m:6 /www/
[root@server21 ~]# getfacl /www/
user::rwx
user:www3:r-x #effective:r-- #只读;建议使用默认的
group::rwx #effective:rw-
mask::rw-
other::---
default:user::rwx
default:user:www3:r-x
default:group::rwx
default:mask::rwx
default:other::---
[root@server21 ~]# setfacl -m m:7 /www/

5、删除 ACL 权限

[root@localhost /]# setfacl -x u:st /project/
// 删除指定用户和用户组的 ACL 权限
[root@localhost /]# setfacl -b project/
// 会删除文件的所有的 ACL 权限

——>实验专题<——

#再添加一个用户授予ACL权限
[root@server21 ~]# setfacl -m u:www2:5 /www/
[root@server21 ~]# getfacl /www/
user:www2:r-x
user:www3:r-x
#删除某一个用户的ACL权限
[root@server21 ~]# setfacl -x u:www2 /www/
[root@server21 ~]# getfacl /www/
user:www3:r-x #只能查看到www3用户的ACL权限
#删除所有的ACL权限
[root@server21 ~]# setfacl -b /www/
[root@server21 ~]# getfacl /www/

二、sudo 授权    给普通用户赋予部分管理员权限

// /sbin/    在此目录下命令只有超级用户才能使用
/usr/sbin/
// 1 root 身份
// visudo 赋予普通用户权限命令,命令执行后和 vi 一样使用
root ALL=(ALL) ALL
// 用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
// %wheel ALL=(ALL) ALL
// %组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
// 用户名/组名:代表 root 给哪个用户或用户组赋予命令,注意组名前加“%”
// 用户可以用指定的命令管理指定 IP 地址的服务器。如果写 ALL,代表可以管理任何主机,如果写固定 IP,代表用户可以管理指定的服务器。(这里真的很奇怪啊,超哥一直认为这里的
// IP 地址管理的是登录者来源的 IP 地址,查了很多资料也都是这样的。直到有一天超哥查看“man 5 sudoers”帮助,才发现大家原来都理解错误了,这里的 IP 指定的是用户可以管理
// 哪个 IP 地址的服务器。那么如果你是一台独立的服务器,这里写 ALL 和你服务器的 IP 地址,作用是一样的。而写入网段,只有对 NIS 服务这样用户和密码集中管理的服务器才有意义)。
// 如果我们这里写本机的 IP 地址,不代表只允许本机的用户使用指定命令,而代表指定的用户可以从任何 IP 地址来管理当前服务器。
// 可使用身份:就是把来源用户切换成什么身份使用,(ALL)代表可以切换成任意身份。这个字段可以省略
// 授权命令:代表 root 把什么命令授权给普通用户。默认是 ALL,代表任何命令,这个当然不行。如果需要给那个命令授权,写入命令名即可,不过需要注意一定要命令写成绝对路径
// 2、举例
// 1)举个例子,比如授权用户 user1 可以重启服务器,则由 root 用户添加如下行:
[root@localhost ~]# visudo
user1 ALL= /sbin/shutdown –r now
[user1@localhost ~]$ sudo -l
// 查看可用的授权
// 2)再举个例子,授权一个用户管理你的 Web 服务器,不用自己插手是不是很爽,以后修改设置更新
// 网页什么都不用管,一定 Happy 死了,Look:
// 首先要分析授权用户管理 Apache 至少要实现哪些基本授权:
// 1、可以使用 Apache 管理脚本
// 2、可以修改 Apache 配置文件
// 3、可以更新网页内容
// 假设 Aapche 管理脚本程序为/etc/rc.d/init.d/httpd 。
// 为满足条件一,用 visudo 进行授权:
[root@localhost ~]# visudo
user1 192.168.0.156=/etc/rc.d/init.d/httpd reload,\
/etc/rc.d/init.d/httpd configtest
// 授权用户 user1 可以连接 192.168.0.156 上的 Apache 服务器,通过 Apache 管理脚本重新读取配
// 置文件让更改的设置生效(reload)和可以检测 Apache 配置文件语法错误(configtest),但不允
// 许其执行关闭(stop)、重启(restart)等操作。(“\”的意思是一行没有完成,下面的内容和上一行是同一行。)
// 为满足条件二,同样使用 visudo 授权:
[root@localhost ~]# visudo
user1 192.168.0.156=/binvi /etc/httpd/conf/httpd.conf
// 授权用户 user1 可以用 root 身份使用 vi 编辑 Apache 配置文件。
// 以上两种 sudo 的设置,要特别注意,很多朋友使用 sudo 会犯两个错误:第一,授权命令没有细化到选项和参数;第二,认为只能授权管理员执行的命令。
// 条件三则比较简单,假设网页存放目录为/var/www/html ,则只需要授权 user1 对此目录具有写权限
// 或者索性更改目录所有者为 user1 即可。如果需要,还可以设置 user1 可以通过 FTP 等文件共享服务更新网页。
// 3)授权 aa 用户可以添加其他普通用户
aa ALL=/usr/sbin/useradd // 赋予 aa 添加用户权限.命令必须写入绝对路径
aa ALL=/usr/bin/passwd // 赋予改密码权限,取消对 root 的密码修改
aa ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
// aa 身份
sudo /usr/sbin/useradd ee // 普通用户使用 sudo 命令执行超级用户命令

——>实验专题<——

#sudo赋予权限的原则
#sudo:赋予的权限越详细,普通用户得到的权限越小
# 赋予的权限越简单,普通用户得到的权限越大
#1、被管理主机的地址定义:
[root@server11 ~]# man 5 sudoers
Host_Alias CSNETS = 128,.138.243.0, 128.138.204.0/24, 128.138.242.0 #CSNETS定义的别名
jack  CSNETS = ALL                                 #给jack用户赋权限,赋centos这个权限
#sudo执行文件
[root@server11 ~]# visudo
root ALL=(ALL) ALL #给root赋予了所有权限,例子
#2、切换到普通用户并授予重启权限
[root@server11 ~]# su yanqi
[yanqi@server11 ~]$ shutdown -r now
User root is logged in on sshd.
User root is logged in on sshd.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.
[root@server11 ~]# visudo #给yanqi用户授予重启命令
yanqi ALL=/sbin/shutdown
#查看yanqi用户可以执行的命令
[yanqi@server11 ~]$ sudo -l
[sudo] password for yanqi:                       #输入密码
(root) /sbin/shutdown #可以执行的命令
[root@server11 ~]# visudo
yanqi ALL=/sbin/shutdown -r now
[yanqi@server11 ~]$ sudo -l
    (root) /sbin/shutdown -r now                 #普通用户执行的命令发生变化
[yanqi@server11 ~]$ sudo /sbin/shutdown -h now #必须执行特定命令,若是不一致会失败
Sorry, user yanqi is not allowed to execute '/sbin/shutdown -h now' as root on server11.
[yanqi@server11 ~]$ sudo /sbin/shutdown -r now #重启生效
#3、授予普通用户的特定权限:
//1、可以使用Apache管理脚本
[root@server21 ~]# /etc/rc.d/init.d/httpd configtest
Syntax OK
[root@server21 ~]# visudo
yanqi ALL=/etc/rc.d/init.d/httpd configtest
[yanqi@server21 ~]$ sudo /etc/rc.d/init.d/httpd configtest #普通用户就可以执行apache的脚本
Syntax OK
//2、可以修改Apache配置文件
[root@server21 ~]# visudo
yanqi ALL=/usr/bin/vim /etc/httpd/conf/httpd.conf          #只能打开文件,但是不能更改
[root@server21 yanqi]# visudo
yanqi ALL=/usr/bin/vim
[yanqi@server21 ~]$ vim /etc/httpd/conf/httpd.conf         #可以更改文件内容
//3、可以更新网页内容
[root@server21 ~]# visudo
#4、授权添加用户
[root@server21 ~]# visudo
yanqi ALL=/usr/sbin/useradd
yanqi ALL=/usr/bin/passwd
yanqi ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root #限制普通用户不可以修改root的密码
[yanqi@server21 ~]$ sudo useradd yanqitest
[yanqi@server21 ~]$ sudo passwd yanqitest
[yanqi@server21 ~]$ sudo passwd root #限制普通用户不可以修改root密码
Sorry, user yanqi is not allowed to execute '/usr/bin/passwd root' as root on server21.
#5、查看加入了那些sudo命令权限
[yanqi@server21 ~]$ sudo -l


(root) /etc/rc.d/init.d/httpd configtest
(root) /usr/bin/vim
(root) /usr/sbin/useradd
(root) /usr/bin/passwd
(root) /usr/bin/passwd [A-Za-z]*, (root) !/usr/bin/passwd \"\", (root) !/usr/bin/passwd root

三、文件特殊权限 SetUID、SetGID、Sticky BIT

1、SetUID

// 1)SetUID 是什么
// SetUID 的功能可以这样理解:
// 只有可以执行的二进制程序才能设定 SUID 权限
// 命令执行者要对该程序拥有 x(执行)权限
// 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
// SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
// 2)举例
[root@localhost ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1728 1 月 19 04:20 /etc/passwd
[root@localhost ~]# ll /etc/shadow
---------- 1 root root 1373 1 月 19 04:21 /etc/shadow
// 因为
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x 1 root root 25980 2 月 22 2012 /usr/bin/passwd
// /usr/bin/passwd 命令拥有特殊权限 SetUID ,也就是在属主的权限位的执行权限上是 s。可以这样来理解它:当一个具有执行权限的文件设置 SetUID 权限后,用户执行这个文件时将以文件所有者的
// 身份执行。/usr/bin/passwd 命令具有 SetUID 权限,所有者为 root(Linux 中的命令默认所有者都是 root),
// 也就是说当普通用户使用 passwd 更改自己密码的时候,那一瞬间突然灵魂附体了,实际是在用 passwd
// 命令所有者 root 的身份在执行 passwd 命令,root 当然可以将密码写入/etc/shadow 文件(不要忘记 root
// 这个家伙是 superman 什么事都可以干),所以普通用户也可以修改/etc/shadow 文件,命令执行完成后该身份也随之消失

如果取消 SetUID 权限,则普通用户就不能修改自己的密码了

// 3)危险的 SetUID
[root@localhost ~]# chmod u+s /usr/bin/vim
[root@localhost ~]# ll /usr/bin/vim
-rwsr-xr-x 1 root root 1847752 4 月
// 4)有几点建议:
// 5 2012 /usr/bin/vim
// 关键目录应严格控制写权限。比如“/”、“/usr”等;
// 用户的密码设置要严格遵守密码三原则;
// 对系统中默认应该具有 SetUID 权限的文件作一列表,定时检查有没有这之外的文件被设置了 SetUID 权限。
// 5)检测 SetUID 的脚本
[root@localhost ~]# vi suidcheck.sh
#!/bin/bash
# Author: shenchao (E-mail: shenchao@atguigu.com)
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
// 搜索系统中所有拥有 SUID 和 SGID 的文件,并保存到临时目录中。
for i in $(cat /tmp/setuid.check)
// 做循环,每次循环取出临时文件中的文件名
do
grep $i /root/suid.list > /dev/null
// 比对这个文件名是否在模板文件中
if [ "$?" != "0" ]
// 如果在,不报错
then
echo "$i isn't in listfile! " >> /root/suid_log_$(date +%F)
// 如果文件名不再模板文件中,则报错。并把报错报错到日志中
fi
done
rm -rf /tmp/setuid.check
// 删除临时文件
[root@localhost ~]# chmod u+s /bin/vi
// 手工给 vi 加入 SUID 权限
[root@localhost ~]# ./suidcheck.sh
// 执行检测脚本
[root@localhost ~]# cat suid_log_2013-01-20
/bin/vi isn't in listfile!
// 报错了,vi 不再模板文件中。代表 vi 被修改了 SUID 权限

——>实验专题<——

[root@server11 ~]# ll -d /etc/shadow
---------- 1 root root 1888 Mar 11 22:15 /etc/shadow #用户对于这个文件是没有任何权限的
#没有任何权限,是通过/usr/bin/passwd文件中授予的
[root@server11 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd #红色字体显示,权限所有者多出一个s权限,也就是SUID权限,所以shadow文件没有任何权限,但是创建用户是可以读写shadow文件


#SetUID授权:给不是执行文件授予SUID权限,查看效果
[root@server11 ~]# chmod u+s yanqi
[root@server11 ~]# ll
-rwSr--r-- 1 root root 0 Mar 12 00:03 yanqi #显示S为大写;其实是报错,说明该文件没有作用
#若是想给文件授予SUID权限,必须是执行文件
#若是小写s:说明该文件是执行文件+SUID权限
[root@server11 ~]# chmod 755 yanqi #把之前的S权限覆盖掉,因为是没有效果的大S权限。
[root@server11 ~]# ll
-rwxr-xr-x 1 root root 0 Mar 12 00:03 yanqi
[root@server11 ~]# chmod 4755 yanqi #4表示为SUID权限
[root@server11 ~]# ll
total 0
-rwsr-xr-x 1 root root 0 Mar 12 00:03 yanqi
#命令执行者要对该程序拥有x(执行)权限
[root@server11 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd #其他人也是有执行权限的
[root@server11 ~]# ll /etc/shadow
---------- 1 root root 1888 Mar 11 22:15 /etc/shadow
[yanqi@server11 ~]$ cat /etc/shadow #普通该用户不可以执行
cat: /etc/shadow: Permission denied
//所以普通用户只能修改自己密码,root密码是不可以修改的


#危险的SetUID
[root@server11 ~]# chmod u+s /usr/bin/vim
[root@server11 ~]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 2337208 Dec 16 00:44 /usr/bin/vim
#任何人在执行vim时,权限都变为root权限,所以不可以修改
[root@server11 ~]# chmod u-s /usr/bin/vim
[root@server11 ~]# ll /usr/bin/vim
-rwxr-xr-x. 1 root root 2337208 Dec 16 00:44 /usr/bin/vim
#建议修改方案
//关键目录应严格控制写权限,比如“/”“/usr”等
//用户的密码设置要样遵守密码三原则
//对系统中默认应该具有SUID权限的文件做一列表,定时检查这之外的文件被设置了SetUID权限


#检查系统默认SUID文件是否发生变化,若是有;则处理不可控因素
[root@server11 ~]# vim suidcheck.sh
#!/bin/bash
# Author: shenchao (E-mail: shenchao@atguigu.com)


find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
# 搜索系统中所有拥有 SUID 和 SGID 的文件,并保存到临时目录中。
for i in $(cat /tmp/setuid.check)
#做循环,每次循环取出临时文件中的文件名
do


grep $i /root/suid.list > /dev/null
#比对这个文件名是否在模板文件中
if [ "$?" != "0" ]
#如果在,不报错
then
echo "$i isn't in listfile! " >> /root/suid_log_$(date +%F)
#如果文件名不再模板文件中,则报错。并把报错报错到日志中
fi
done
rm -rf /tmp/setuid.check
#删除临时文件


[root@server11 ~]# chmod u+x suidcheck.sh
[root@localhost ~]# chmod u+s /bin/vi
// 手工给 vi 加入 SUID 权限
[root@localhost ~]# ./suidcheck.sh
// 执行检测脚本
[root@localhost ~]# cat suid_log_2013-01-20
/bin/vi isn't in listfile!
// 报错了,vi 不再模板文件中。代表 vi 被修改了 SUID 权限

2、SetGID

// 1)针对文件的作用
// SGID 即可以针对文件生效,也可以针对目录生效,这和 SUID 明显不同。如果针对文件,SGID 的含义如下:
// 只有可执行的二进制程序才能设置 SGID 权限
// 命令执行者要对该程序拥有 x(执行)权限
// 命令执行在执行程序的时候,组身份升级为该程序文件的属组
// SetGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 1838850 1 月 20 04:29 /var/lib/mlocate/mlocate.db
// 大家发现属主权限是 r、w,属组权限是 r,但是其他人权限是 0:
[root@localhost ~]# ll /usr/bin/locate
-rwx--s--x 1 root slocate 35612 8 月 24 2010 /usr/bin/locate
// 当普通用户 user1 执行 locate 命令时,会发生如下事情:
/usr/bin/locate 是可执行二进制程序,可以赋予 SGID
// 执行用户 user1 对/usr/bin/locate 命令拥有执行权限
// 执 行 /usr/bin/locate 命 令 时 , 组 身 份 会 升 级 为 slocate 组 , 而 slocate 组 对
// /var/lib/mlocate/mlocate.db 数据库拥有 r 权限,所以普通用户可以使用 locate 命令查询mlocate.db 数据库
// 命令结束,user1 用户的组身份返回为 user1 组
// 2)针对目录的作用
// 如果 SGID 针对目录设置,含义如下:
// 普通用户必须对此目录拥有 r 和 x 权限,才能进入此目录
// 普通用户在此目录中的有效组会变成此目录的属组
// 若普通用户对此目录拥有 w 权限时,新建的文件的默认属组是这个目录的属组
// 这样写的实在太难看明白了,举个例子:
[root@localhost ~]# cd /tmp/
// 进入临时目录做此实验。因为临时目录才允许普通用户修改
[root@localhost tmp]# mkdir dtest
// 建立测试目录
[root@localhost tmp]# chmod g+s dtest
// 给测试目录赋予 SGID
[root@localhost tmp]# ll -d dtest/
drwxr-sr-x 2 root root 4096 1 月 20 06:04 dtest/
// SGID 已经生效
[root@localhost tmp]# chmod 777 dtest/
// 给测试目录权限,让普通用户可以写
[root@localhost tmp]# su – user1
// 切换成普通用户 user1
[user1@localhost ~]$ cd /tmp/dtest/
// 普通用户进入测试目录
[user1@localhost dtest]$ touch abc
// 普通用户建立 abc 文件
[user1@localhost dtest]$ ll
// 总用量 0
-rw-rw-r-- 1 user1 root 0 1 月
20 06:07 abc
// abc 文件的默认属组不再是 user1 用户组,而变成了 dtest 组的属组 root

——>实验专题<——

#针对文件的作用
[root@server11 ~]# locate httpd.conf
[root@server11 ~]# ll /usr/bin/locate #locate所属组是s权限的
-rwx--s--x. 1 root slocate 40520 Apr 11 2018 /usr/bin/locate
[yanqi@server11 ~]$ mkdir yanqi
[yanqi@server11 ~]$ cd yanqi/
[yanqi@server11 yanqi]$ touch yanqi1
[root@server11 ~]# chmod g+s /home/yanqi/yanqi/
[root@server11 ~]# ll -d /home/yanqi/yanqi/
drwxrwsr-x 2 yanqi yanqi 34 Mar 12 00:46 /home/yanqi/yanqi/
[yanqi@server11 yanqi]$ ll
-rw-rw-r-- 1 yanqi yanqi 0 Mar 12 00:44 yanqi1
-rw-rw-r-- 1 yanqi root 0 Mar 12 00:47 yanqi2 #所属组为root组

3、文件特殊权限之 Sticky BIT

// Sticky BIT 粘着位,也简称为 SBIT。SBIT 目前仅针对目录有效,它的作用如下:粘着位目前只对目录有效
// 普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限
// 如果没有粘着位,因为普通用户拥有 w 权限,所以可以删除此目录下所有文件,包括其他用
// 户建立的文件。一但赋予了粘着位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。
// 4、设定文件特殊权限
// 特殊权限这样来表示:
// 4 代表 SUID
// 2 代表 SGID
// 1 代表 SBIT
[root@localhost ~]# chmod 4755 ftest
// 赋予 SUID 权限
[root@localhost ~]# chmod 2755 ftest
// 赋予 SGID 权限
[root@localhost ~]# mkdir dtest
[root@localhost ~]# chmod 1755 dtest/
// SBIT 只对目录有效,所以建立测试目录,并赋予 SBIT

——>实验专题<——

#tmp本身是有SBIT权限
[root@server11 ~]# ll -d /tmp/
drwxrwxrwt. 10 root root 285 Mar 12 00:50 /tmp/
[root@server11 ~]# touch /tmp/yanqi1
[yanqi@server11 ~]$ touch /tmp/yanqi2
[root@server11 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Mar 12 00:51 yanqi1
-rw-rw-r-- 1 yanqi yanqi 0 Mar 12 00:51 yanqi2
[yanqi@server11 ~]$ rm -rf /tmp/yanqi1 #root的文件是不可以删除的
rm: cannot remove ‘/tmp/yanqi1’: Operation not permitted
#权限想要起作用,需要给目录授予777权限

四、文件系统属性 chattr 权限

1、命令格式

[root@localhost ~]# chattr [+-=] [选项] 文件或目录名
// 选项:
// +: 增加权限
// -: 删除权限
// =: 等于某权限
// i: 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。
// a: 如果对文件设置 a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删
// e: Linux 中绝大多数的文件都默认拥有 e 属性。表示该文件是使用 ext 文件系统进行存储的,而且不能使用“chattr -e”命令取消 e 属性。

2、查看文件系统属性 lsattr

[root@localhost ~]# lsattr 选项 文件名
// 选项:
// -a 显示所有文件和目录
// -d 若目标是目录,仅列出目录本身的属性,而不是子文件的

3、举例

// 例 1:
// 给文件赋予 i 属性
[root@localhost ~]# touch ftest
// 建立测试文件
[root@localhost ~]# chattr +i ftest
[root@localhost ~]# rm -rf ftest
// rm: 无法删除"ftest": 不允许的操作
// 赋予 i 属性后,root 也不能删除
[root@localhost ~]# echo 111 >> ftest
// -bash: ftest: 权限不够
// 也不能修改文件的数据
// 给目录赋予 i 属性
[root@localhost ~]# mkdir dtest
// 建立测试目录
[root@localhost dtest]# touch dtest/abc
// 再建立一个测试文件 abc
[root@localhost ~]# chattr +i dtest/
// 给目录赋予 i 属性
[root@localhost ~]# cd dtest/
[root@localhost dtest]# touch bcd
// touch: 无法创建"bcd": 权限不够
// dtest 目录不能新建文件
[root@localhost dtest]# echo 11 >> abc
[root@localhost dtest]# cat abc
11
// 但是可以修改文件内容
[root@localhost dtest]# rm -rf abc
// rm: 无法删除"abc": 权限不够
// 不能删除
// 例 2:
[root@localhost ~]# mkdir -p /back/log
// 建立备份目录
[root@localhost ~]# chattr +a /back/log/
// 赋予 a 属性
[root@localhost ~]# cp /var/log/messages /back/log/
// 可以复制文件和新建文件到指定目录
[root@localhost ~]# rm -rf /back/log/messages
// rm: 无法删除"/back/log/messages": 不允许的操作
// 但是不允许删除

——>实验专题<——

#给文件添加chattr权限
[root@server11 ~]# touch yanqi
[root@server11 ~]# chattr +i yanqi
#查看文件的隐藏属性
[root@server11 ~]# lsattr yanqi
----i----------- yanqi
[root@server11 ~]# vim yanqi                         #修改文件保存和修改都不可以操作,把文件权限锁起来。所有用户都不可以不执行的。
[root@server11 ~]# ls #但会生成一个临时文件,防止后期使用
yanqi yanqi~
[root@server11 ~]# rm -rf yanqi
rm: cannot remove ‘yanqi’: Operation not permitted
#若是想操作,需要取消-i权限
[root@server11 ~]# chattr -i yanqi
[root@server11 ~]# rm -rf yanqi


#给目录添加Chattr权限
[root@server11 ~]# mkdir yanqi
[root@server11 ~]# touch yanqi/yanqi1
[root@server11 ~]# chattr +i yanqi
[root@server11 ~]# lsattr yanqi/
---------------- yanqi/yanqi1
#查看目录是否添加不可改变权限
[root@server11 ~]# lsattr -d yanqi/
----i----------- yanqi/
[root@server11 ~]# rm -rf yanqi/yanqi1
rm: cannot remove ‘yanqi/yanqi1’: Permission denied
[root@server11 ~]# touch yanqi/yanqi2
touch: cannot touch ‘yanqi/yanqi2’: Permission denied
[root@server11 ~]# vim yanqi/yanqi1 #是可以修改的,因为我们只是对目录做了不可修改权限
aaaaaaa


#若是对文件设置a属性,只能在文件中增加数据,但是不能删除或者修改数据
[root@server11 ~]# touch yanqi
[root@server11 ~]# chattr +a yanqi
[root@server11 ~]# lsattr yanqi
-----a---------- yanqi
[root@server11 ~]# vim yanqi #依然写入数据;不能用vi来编辑;使用echo
[root@server11 ~]# echo "aaaaaaaaaaaaa" >> yanqi
[root@server11 ~]# cat yanqi
aaaaaaaaaaaaa
#若是对目录设置a属性,只能在文件中增加数据,但是不能删除或者修改数据
[root@server11 ~]# mkdir yanqi
[root@server11 ~]# chattr +a yanqi
[root@server11 ~]# lsattr -d yanqi/
-----a---------- yanqi/
[root@server11 ~]# touch yanqi/yanqi1
[root@server11 ~]# mkdir yanqi/yanqi2
[root@server11 ~]# rm -rf yanqi/yanqi1
rm: cannot remove ‘yanqi/yanqi1’: Operation not permitted
[root@server11 ~]# rm -rf yanqi/yanqi2
rm: cannot remove ‘yanqi/yanqi2’: Operation not permitted
//只可以对目录下的文件只有增加文件和目录的权限,但是没有删除权限

END





声明:JavaBBS论坛主要用于IT技术专题的交流学习,为开源技术爱好者提供广泛、权威的技术资料。若您在技术专题有更好的想法或者建议,欢迎交流!!!



推荐阅读

Recommended reading

 







JavaBBS



Git











  






https://www.javabbs.cn/git






  JavaBBS大数据






→ 






https://www.javabbs.cn





/dsj





  JavaBBS云存储






→  https://www.javabbs.cn






/ycc







  JavaBBS数据库













  https://www.javabbs.cn






/sjk







  JavaBBS云计算













  https://www.javabbs.cn






/yjs







  JavaBBSIT.Log













https://www.javabbs.cn






/itl






  JavaBBSNginx













  https://www.javabbs.cn






/ngx






  JavaBBSzabbix













https://www.javabbs.cn






/zbx






  JavaBBSJavaSE













https://www.javabbs.cn






/jse







  JavaBBS社区文章













https://www.javabbs.cn






/bwz






  JavaBBS社区资料













https://www.javabbs.cn






/bzl






文章转载自Java BBS,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论