大家好,我是程序员鱼皮。
无论你是否学习过 Linux,一定都听说过这行命令:
rm -rf /*
这是一个能够 “让人快乐” 的命令,我称之为快乐命令~
据说,只要在自己的服务器上执行这行命令,就能让别人快乐。
我帮大家在同事的电脑上试过了,可以通过视频看看效果:https://bilibili.com/video/BV1xuDSYmECA
为什么 “快乐命令” 如此危险呢?
rm
是 Linux 和 Unix 系统中用来删除文件和目录的命令添加 -r
选项,表示递归删除某个目录和里面的所有文件再添加 -f
选项,表示强制删除,不会出现提示确认
在 Linux 操作系统中,一切皆文件,所有的文件都是放在根目录 /
下的,/*
就表示整个电脑的全部文件。
因此,当你将这些输入组合到一起,就相当于直接强制删除所有的文件,包括系统文件。后果就是,你的服务器再也打不开了。
如果你是 Windows 的用户,无法理解快乐命令的危害的话,你可以把 C 盘拖到回收站并清空试试 。(别试!!!!!!!)
如何防止快乐命令?
既然快乐命令这么危险,我们怎么防止服务器被它干崩呢?
有的小伙伴就要说了:很简单呐,自己不要输入它不就好了嘛!
拜托,应该没人会在自己的服务器上执行这个吧。我们要防止的是其他人登录我们服务器后执行快乐命令,可能是黑客,还有可能是因为种种原因心态崩掉想不开然后想要对自己团队内部的服务器进行破坏然后跑路的自己人!
下面教大家几个小妙招,可以保护你的小服务器不被快乐命令影响,还能学到不少小知识哦。
1、权限管理
Linux 的每个文件都有 3 种基本权限:读、写和执行,可以使用 chmod
命令,通过数字或符号的方式设置权限。
比如我们设置 某个文件 可以被文件的所有者执行:
chmod 100 重要文件.txt
或者让 所有用户 都无法向文件写入内容:
chmod 555 重要文件.txt
然后试着删除该文件。。。
rm -f 重要文件.txt
结果,文件还是被成功删除掉了!
这是因为 chmod 命令本身并不能直接防止文件被删除。不过我们可以曲线救国,确保用户没有对文件所在目录的写权限就可以了:
chmod 000 重要目录
不过,还有更简单的方式,可以使用 chattr
命令,为重要文件设置 不可修改 属性:
chattr +i 重要文件.txt
这样一来,用户将无法删除、重命名或写入该文件。
但是怎么保护所有的文件都不被删除呢?一个一个都设置为不可修改么?
当然不用,我们不妨换个思路,别忘了,rm 命令本身也是个文件!那直接修改该文件的权限为 所有用户都无法执行 ,不就行了么?
chmod 000 /bin/rm
测试一下,果然有用~
但是,前面讲的方法还有问题。虽然设置了文件权限,但是攻击者完全可以执行 Linux 的 sudo 命令,化身超级用户,把文件的权限再修改回来呀!
sudo chmod 777 /bin/rm
虽然部分 Linux 发行版(比如 CentOS 7)在默认情况下,其他用户(非 root 和 wheel 组)是无法执行 sudo 命令的。但保险起见,我们还可以修改 sudo 命令的权限。通过 visudo
命令编辑 /etc/sudoers
文件,输入下列代码,就可以禁止所有用户通过 sudo
执行 rm
命令:
# 禁止所有用户使用 rm 命令
# 第一个 ALL: 所有用户
# 第二个 ALL: 所有主机
# (ALL): 任何身份
# NOPASSWD: 不需要密码
# !/bin/rm: 不允许执行 /bin/rm 命令
ALL ALL=(ALL) NOPASSWD: !/bin/rm
此外,比起直接简单粗暴地修改系统配置,我们还可以利用 Lshell 之类的开源工具,更灵活地控制不同用户所具有的命令权限。比如禁止所有用户使用 rm
命令、禁止用户小坤使用任何命令,防止这家伙删文件跑路:
[default]
allowed = 'all' - ['rm']
[smallkun]
allowed = []
2、替代操作
除了修改权限外,下面分享一种更有意思的技巧来防止 “快乐命令”。
Linux 中有一个很神奇的命令 Alias,可以为其他命令设置别名:
比如将 rm
命令设置为在删除前先询问确认:
alias rm='rm -i'
有些云服务器就是这么干的,已经默认为我们设置了一些保护文件安全的别名:
# 某服务商的默认配置
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
当然你还可以设置为一些更有意思的命令,比如用 cat 命令给攻击者看一张有趣的字符画:
或者用 sl 命令跑一辆火车:
再或者直接退出他的登录等等。。
玩笑归玩笑,我给大家推荐 1 种使用 alias 防止快乐命令的方法。
跟我们平时用的电脑操作一样,不直接删除文件,而是先把要删除的文件放到一个回收站中,从而防止误删。
可以手动新建一个 .trash
目录表示回收站,然后手动编写脚本并设置别名,让 rm
命令变成将文件移动到回收站目录中。脚本如下:
# 创建一个.trash 隐藏目录
mkdir ~/.trash
# 将 rm 命令改为 mv
del()
{
mv $@ ~/.trash/
}
# 使用别名 del 代替 rm
alias rm=del
当然你也可以利用一些开源项目或工具更快速地实现回收站功能,比如 rip、trash 等等。这种工具一搜一大把,可以看出大家真的是很害怕 “快乐命令” 啊!
3、优秀实践
最后再给大家分享一些防止文件误删的好习惯吧~
1)手动备份:尽量避免在关键目录中直接使用删除命令,可以通过 cp 命令复制文件并添加 .bak
后缀来创建备份,方便后续恢复。
cp 重要文件.txt 重要文件.txt.bak
2)定期备份:为了防止服务器上的数据被误删除,建议定期将服务器上重要的文件下载到本地或同步到其他存储。实现方式就很多了,像 crontab 定时脚本、rsync 文件同步、使用文件系统的快照功能、以及各种专业的备份工具等等。
3)可视化管理:对于代码文件,我们一般会用 Git 版本控制系统再搭配个 GUI 界面软件来可视化管理维护,想什么时候找回被删的代码都可以。
那服务器上的文件也同样可以用类似的工具来管理,像宝塔面板、1Panel 都是可以的,也内置了回收站功能,让大家不需要输入任何命令也可以管理文件。
没事谁想记那些命令对吧?而且万一输错了,破坏效果可能不亚于对服务器进行攻击,我对自己的写 Bug 能力和破坏能力还是很有自信的。
分享了这么多方法,不仅仅是能够防止快乐命令,也都是提高服务器安全的有效手段,希望朋友们有所收获,学到的话记得点个赞哦!
👇🏻 点击下方阅读原文,获取鱼皮的编程学习路线、原创项目教程、求职面试宝典、编程交流圈子。
往期推荐
要是工作前就知道这个,该多好。
24 年最新项目,手把手教程
突击面试,看这个就够了!
我的新书,冲上了京东榜一!
不敢相信,Nginx 还能这么玩?
我做了个闯关游戏,竟难倒了无数程序员。。