文章目录
- @[toc]
- 事出有因
- 干就完事了
- 创建用户
- 配置 sudo 权限
- sudo 验证
- 使用 bash 命令执行 chmod 命令
- 使用 bash 命令执行删根
文章目录
- @[toc]
- 事出有因
- 干就完事了
- 创建用户
- 配置 sudo 权限
- sudo 验证
- 使用 bash 命令执行 chmod 命令
- 使用 bash 命令执行删根
事出有因
使用普通用户安装 tidb 时,发现报错了,报错内容如下:
ERROR SSHCommand {"host": "172.17.133.182", "port": "22", "cmd": "export LANG=C; PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin; /usr/bin/sudo -H bash -c \"uname -m\"", "error": "Process exited with status 1", "stdout": "", "stderr": "We trust you have received the usual lecture from the local System\nAdministrator. It usually boils down to these three things:\n #1) Respect the privacy of others.\n #2) Think before you type.\n #3) With great power comes great responsibility.\nsudo: no tty present and no askpass program specified\n"}
发现,tidb 在自动安装时,会用到
sudo bash
命令,当前环境只开放了指定的命令,不包含 bash 命令,导致 tidb 在创建集群的时候报错了,于是,临时修改了 sudo 的权限配置,增加了 bash 命令的权限,于是乎,引发了思考,是不是给了 bash 的 sudo 权限,有这个命令权限的用户也能删根跑路
了?
干就完事了
为了图方便,我这边直接用 docker 的方式来验证,这个 docker 镜像并没有挂载任何目录,下面是 dockerfile,我需要安装一下 sudo 命令和一些方便自己习惯的工具,顺便拿 rockylinux 玩一玩
FROM rockylinux:8.9
ENV PS1='\[\e[7;34m\]\u@\h\[\e[0m\]\[\e[0;35m\]:$(pwd) \[\e[0m\]\[\e[0;35m\]\t\[\e[0m\]\n\[\e[0;32m\]> \[\e[0m\]'
ENV LANG=en_US.UTF-8
RUN yum install -y sudo vim && yum clean all && \
echo '/usr/bin/sleep 315360000' > start.sh && \
chmod +x start.sh
CMD ["/usr/bin/bash","start.sh"]
构建镜像
sudo docker build -t rockylinux:test-sudo .
镜像放后台启用
sudo docker run -d --name sudotest rockylinux:test-sudo
进入容器
sudo docker exec -it sudotest bash
创建用户
模拟一下,名字不重要
useradd testsudo
配置 sudo 权限
可以看到,这里我只给了一个 bash 命令的权限,看看后面可以有多么的无法无天
cat << EOF > /etc/sudoers.d/testbash
User_Alias SUDOMAN = testsudo
Cmnd_Alias SYSTEM = /usr/bin/bash
Defaults log_host, log_year, logfile = /root/.sudo_sudoman.log
SUDOMAN ALL=(ALL) NOPASSWD: SYSTEM
EOF
给文件变个权限,等会先拿这个文件赋权来验证
chmod 400 /etc/sudoers.d/testbash
可以确认一下是不是修改成功了
ls -l /etc/sudoers.d/
那当然必须成功
-r-------- 1 root root 165 Jun 23 07:58 testbash
sudo 验证
先切换到前面创建的 testsudo 用户
su - testsudo
使用 bash 命令执行 chmod 命令
前面,我们使用 root 用户把
/etc/sudoers.d/testbash
这个文件的权限改成400
,现在我们用sudo bash
命令改回来
sudo bash -c "chmod 644 /etc/sudoers.d/testbash"
验证一下结果(因为咱们只给了 bash 命令,所以直接执行
ls -l /etc/sudoers.d/
命令就会返回Permission denied
)
sudo bash -c "ls -l /etc/sudoers.d/"
可以看到,权限被改成 644 了
-rw-r--r-- 1 root root 165 Jun 23 07:58 testbash
使用 bash 命令执行删根
家人们,这一步是在容器环境执行的,只是为了告诉大家风险有多高,别去生产玩,会去提篮桥的
- 保险起见,我拆解解释一下
rm -rf /*
这个命令的含义,不要成为张三(法外狂徒)
rm
是 linux 删除文件的命令,类似于 windows 的 delete 键和删除这个选项(不过 windows 有回收站,删了还能找回,linux 就没有这么幸运了,回收站需要自己创建,可以看我之前的博客:linux 大工程 - 我要一个属于自己的回收站)-r
是 rm 命令的参数,用户删除目录和目录下的所有内容-f
是 rm 命令的参数,表示不需要用户同意,直接删除,类似于 windows 的 shift + delete 组合键,就不会进入回收站了(linux 如果按照上面的方法创建了回收站,还是会进入到回收站的,除非使用绝对路径的 rm 命令去删除的)/
是 linux 的根目录,也是所有目录和文件的起始目录,只要根删的够快,牢房就吃的越快*
是 linux 中的通配符,表示匹配所有,当然,这个命令下,这个通配符加不加都是一样的结果
sudo bash -c "rm -rf /*"
然后就会看到一堆的刷屏,就问你刺不刺激
愿大家都不会误删根目录,另外 tidb 你太狠了,普通用户创建完之后,直接给 tidb 用户加了所有命令的 sudo 免密配置,这真的不危险吗???