运维必备技能
运维必备技能
linux中的特殊权限一共包含了以下三种:
1.SUID(属主特殊权限)。
2.SGID(属组特殊权限)。
3.SBIT(粘滞位)。
查看用户密码存放的文件我们可以看到是没有任何权限的[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 就能够更改密码
①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的情况下下新建文件属组继承的不同。
一旦目录被赋予粘滞位sticky(st ti ki)除了root可以删除目录中的所以文件,普通用户就算对该目录拥有w权限,也只能删除自己建立的文件,而不能删除其他用户的文件。
增加粘滞位:
1.chmod o+t/directory。
2.chmoda 1755/directory。
3.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
推荐阅读
>>>新手必备-Linux系统安装配置+Xshell远程连接
运维界升职加薪必备的云计算技术,你学了吗?
学完高级运维云计算课程之后,你可以:
跨越90%企业的招聘硬门槛
增加70%就业机会
拿下BAT全国TOP100大厂敲门砖
体系化得到运维技术硬实力
技术大佬年薪可达30w+