linux中的特殊权限一共包含了一下三种:
SUID(属主特殊权限)
SGID(属组特殊权限)
SBIT(粘滞位)
SUID
查看用户密码存放的文件我们可以看到是没有任何权限的
[root@localhost ~]# ll -d /etc/shadow
----------. 1 root root 2752 Jul 14 19:44 /etc/shadow
但是当我用户在更新或者密码的时候 是需要更新shadow的内容但是又没有权限写入,所以这时候SUID便有它的用处了
[root@localhost ~]# which passwd
/usr/bin/passwd
[root@localhost ~]# ll -d /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
此时能够看到属主的为权限为rws
切换到普通用户的身份查看passwd这个指令的属性属主位也有SUID的权限
[oldxie@localhost ~]$ ll -d /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
当我们将SUI的权限取消后切换用户执行paswd更改密码是没有权限的.
删除suid:chmod u-s file
[root@localhost ~]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
[root@localhost ~]# su - xxx
Last login: Thu Jul 15 17:20:44 CST 2021 on pts/0
i come to profile.d
i come to /etc/profile
i come to /etc/bashrc
[xxx@localhost ~]$ ll /usr/bin/passwd ; ll /etc/shadow
-rwxr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
----------. 1 root root 2970 Jul 15 17:21 /etc/shadow
此时你再去passwd 更该密码它会一直提示passwd is not match (密码不匹配) 不能够修改密码
重新加入suid: chmod u+s /usr/bin/passwd
或者 chmod 4755 /usr/bin/passwd
就能够更改密码
SGID
chmod g+s /dir
chmod 2770 /dir
chmod g-s /dir
设置二进制可执行文件命令在执行的过程中会以命令的属组身份运行该命令
设置在目录上,这时候在该目录下新建的文件/目录自动继承父级目录的属组
演示场景:
[root@localhost ~]# groupadd example
[root@localhost ~]# useradd ex1 -G example
[root@localhost ~]# useradd ex2 -G example
[root@localhost ~]# mkdir -p /data/code
[root@localhost ~]# chown .example /data/code/
[root@localhost ~]# chmod 2770 /data/code/
[root@localhost ~]# echo '1234' > /data/code/test.log
[root@localhost ~]# ll /data/code/test.log
-rw-r--r--. 1 root example 5 Jul 15 17:43 /data/code/test.log
[root@localhost ~]# chmod g-s /data/code/
[root@localhost ~]# echo '123'> /data/code/test2.log
[root@localhost ~]# ll /data/code/test2.log
-rw-r--r--. 1 root root 4 Jul 15 17:45 /data/code/test2.log
上面的示例可以看出目录再有SGID和没有SGID的情况下下新建文件属组继承的不同
SBIT
一旦目录被赋予粘滞位sticky(st ti ki ) 除了root 可以删除目录中的所以文件,普通用户就算对该目录拥有w权限,也只能删除自己建立的文件,而不能删除其他用户的文件
增加粘滞位:
chmod o+t /directory
chmoda 1755 /directory
chmod o-t /directory
演示:
后期当我们要初始化MYSQL服务时,服务会创建一些临时文件存储在/tmp目录下.当初始化完毕后,自己会清理里面的数据,别人无法清理(如果这个目录不是粘滞位,那么初始化MYSQL就会报错)
编写shell 脚本模拟此场景
1模拟mysql初始化创建文件至/tmp目录;
2然后登录普通用户删除mysql的初始化文件
3如果普通用户删除成功,则初始化失败(因为mysql服务创建的文件是需要自己销毁的)
4如果普通用户删除失败,则mysql服务器尝试删除,删除成功,则初始化失败
脚本如下
1 #!/usr/bin/bash
2 mysql_tmp_file=/tmp/mysq.init
3 user=oldxie
4 #初始化Mysql服务
5 touch ${mysql_tmp_file}
6 ##模拟用户删除文件
7 su - ${user} -c "rm -f ${mysql_tmp_file}&>/dev/null"
8 #检查是否删除成功
9
10 if [ $? -eq 0 ];then
11 echo "${mysql_tmp_file} 文件被+${user}删除,该目录不是sbit mysql服务初始化失败 "
12 else
13 echo "${mysql_tmp_file}文件被${user}删除失败,该目录是sbit,mysql服务初始化成功"
14
15 fi
另外一种写法:
1 #!/usr/bin/bash
2 touch /tmp/mysql_init
3 su - oldxie -c "rm -f /tmp/mysql_init"&>/dev/null
4 if [-f /tmp/mysql_init];then
5 rm -f /tmp/mysql_init
6 echo "mysql初始化成功,这个目录拥有sbit特殊权限"
7 else
8 echo "mysql初始化失败,这个目录没有sbit特殊权限"
9 fi
##目录有粘滞位的时候
[root@localhost ~]# chmod o+t /tmp/
[root@localhost ~]# ll -d /tmp/
drwxrwxrwt. 10 root root 4096 Jul 15 19:03 /tmp/
[root@localhost ~]# bash mysql_init.sh
i come to /etc/profile
i come to /etc/bashrc
/tmp/mysq.init文件被oldxie删除失败,该目录是sbit,mysql服务初始化成功
#目录没有粘滞位权限
[root@localhost ~]# chmod o-t /tmp/
[root@localhost ~]# bash mysql_init.sh
i come to /etc/profile
i come to /etc/bashrc
/tmp/mysq.init 文件被+oldxie删除,该目录不是sbit mysql服务初始化失败
SBIT总结:
1让所有普通用户对该目录具有写入的权限,并且能实现每个用户只能删除自己的文件
2粘滞位目录表现others的x位,用t表示如果没有执行权限则显示T(大写)
3粘滞位目录的属主以及root 用户有权限删除目录中 的内容,其他用户没有权限删除
特殊权限练习
假如你是一个员工的团队领导,为XTH公司工作
1公司要求你创建一个/tmp/dir_xth/的目录
2让ops组成员都能在该目录下创建或者访问文件
3但是除了文件创建者之外得其他人不能删除文件
创建目录,组和用户并且将用户加ops组
[root@localhost ~]# mkdir -p /tmp/dir_xth
[root@localhost ~]# chmod 770 /tmp/dir_xth/
[root@localhost ~]# groupadd ops
[root@localhost ~]# chown .ops /tmp/dir_xth/
[root@localhost ~]# useradd A -G ops
[root@localhost ~]# useradd B -G ops
[root@localhost ~]# chmod g+s /tmp/dir_xth/
[root@localhost ~]# chmod o+t /tmp/dir_xth/
[root@localhost ~]# su - A
i come to profile.d
i come to /etc/profile
i come to /etc/bashrc
[A@localhost ~]$ cd /tmp/dir_xth/
[A@localhost dir_xth]$ touch fileA
[root@localhost ~]# su - B
[B@localhost tmp]$ cd /tmp/dir_xth/
[B@localhost dir_xth]$ rm -f fileA
rm: cannot remove ‘fileA’: Operation not permitted
[B@localhost dir_xth]$ ^C