• sudo 权限之危险的 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 免密配置,这真的不危险吗???

  • 相关阅读:
    如何使用GPT-4o函数调用构建一个实时应用程序?
    spring框架源码十五、BeanFactory创建子流程
    谈谈Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用实现
    (附源码)spring boot大学生综合素质测评系统 毕业设计 162308
    Nacos源码安装
    时序预测 | MATLAB实现MLP多层感知机时间序列预测
    GitHub码云使用
    vue直接操作DOM——ref,动态组件,缓冲组件
    Linux下安装配置redis详细教程,并配置哨兵模式,redis中文详解
    在 Windows 中安装部署并启动连接 MongoDB 7.x(命令行方式启动、配置文件方式启动、将启动命令安装为系统服务实现开机自启)
  • 原文地址:https://blog.csdn.net/u010383467/article/details/139901991