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



Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐