苦逼运维刚进公司的时候
在这以前也有很多服务器被用来挖矿打工的情况,
当时初步判断是密码略微简单,被强行ssh远程暴力破解了密码,
而且查看/var/log/secure安全日志,发现服务器真的是时时刻刻在被人捅刀子ing
防暴力破解——解决方案:
当时差不多拟了这些解决方案
(1)创建专门远程用户
禁止root登录,不使用常见username如admin,test,linux,等
根据我看日志的情况,这种暴露在公网的外网IP会被套各种用户名和密码破解。
(2)禁止root密码登录,改为仅允许root秘钥登录
修改配置文件sshd_config,
PermitRootLogin forced-commands-only
(3)软件助力
fail2ban 一个日志检测软件,通过实时监测日志情况,调用防火墙实现安全功能
yum -y install epel-release
yum -y install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.bak
#修改/etc/fail2ban/jail.conf
配置文件如下
[DEFAULT]
ignoreip = 127.0.0.1/8
ignorecommand =
bantime = 86400
findtime = 600
maxretry = 3
backend = auto
usedns = warn
logencoding = auto
enabled = false
[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/secure
maxretry = 3
bantime#屏蔽时间,-1是永久屏蔽
maxretry = 3 #findtime时间内的最大尝试次数
enabled = true ## 是否开启防护,false 为关闭
logpath = /var/log/secure ## 检测系统登陆日志文件
[ssh-iptables]配置下没有的参数,会按照[DEFAULT]中的值来设置
但这些方案都不够好,因为服务器已经跑起来的有很多,
就算是有脚本可以一键处理好配置文件和登录账号,
也需要拷贝脚本传上去,并且一台一台执行,万一哪一台服务器抽风了
没上传好文件,运行的时候出现问题等…淦,
而且就算处理好了服务器还是在时时刻刻被人捅刀子
反正就是很麻烦
(4)最终方案
每一个服务器上有一个计划任务会一分钟执行一次,
SVN里传一个防火墙配置,并且在这个计划任务里添加一个“刷新防火墙配置”的命令
用防火墙直接DROP掉 除"办公室专用跳板机的外网Ip" 之外的所有外网IP
当然因为一些其他业务需要对外开放,所以只能drop掉远程的22端口
大概是这样子:
为什么选drop
DROP和reject的区别:
drop:收到情书直接扔掉的高冷做法,对方不知道你扔了信,会傻傻的等回信
reject:收到情书以后回一封信:“私密马赛 你是好人 哦咧哇阔拖挖路”,还要回信多麻烦
这样设置以后,安全日志里面连一个其他外网ip的影子都没有了,
舒服了,一刀斩的感觉真爽
防火墙配置文件iptables_conf大概是这样:
*filter
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 跳板机ip/32 -p tcp -m tcp --dport 22 -j ACCEPT #允许跳板机登录
-A INPUT -s 10.0.0.0/8 -p tcp -m tcp --dport 22 -j ACCEPT #允许内网登录
-A INPUT -s 172.16.0.0/12 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.0.0/16 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j DROP
COMMIT
顺序别搞乱了,iptables是按匹配规则来的,
对"跳板机ip开放22端口"的规则要在"封禁所有22端口"的规则之上
计划任务大概是这样
# 更新最新的防火墙策略
if [ -e /root/svndir/iptables_conf ];then
/usr/sbin/iptables-restore < /root/svndir/iptables_conf || /sbin/iptables-restore < /root/svndir/iptables_conf
fi
差不多过了四五个月
本来是风和日丽,心情偷税的一天,结果突然发现好多服务器异常的不对
运维仔美好的一天,从服务器出现奇怪的异常结束
这一次一大批机器发生奇怪的问题
每一台机器都完美的符合网上所说的挖矿破解的情况,
计划任务被清空;防火墙规则被清空;一些重要修复命令文件被修改;奇怪的Redis程序;被篡改了的秘钥文件等等
搞得我差不多一整个星期都在找挖矿机器,然后重装系统。。
我他妈真的是奇了怪了
完全不知道这些是怎么被攻击的,远程端口和密码什么的应该都限制死了的
在网上查询一些帖子以后,都说是利用Redis漏洞破解的
emmm?奇了怪了
每一台服务器都是用的自定义的配置文件,6379端口只允许127.0.0.1访问的啊
然后拿部分正常服务器的外网ip测了一下6379端口,也是不可以操作的
直到发现,服务器上一个进程监控的计划任务…
Redis进程拉起的部分,更换了Redis的启动方式。。
变成了
redis-server --daemonize yes
由这个命令拉起down掉的Redis
计划任务脚本重启Redis的部分如下:
# 检测Redis服务是否启动
PS_REDIS=`ps aux|grep 'redis-server' |grep '127.0.0.1:6379'`
PS_redis=`ps aux|grep 'redis-server' |grep -v 'grep' |awk '{print $2}'`
if [ -z "$PS_REDIS" ];then
kill -9 $PS_redis > /dev/null 2>&1
redis-server /etc/redis/redis.conf
#redis-server --daemonize yes #后台启动
echo "`date +'%Y-%m-%d %H:%M:%S'` - start redis ..."
fi
然后测试一下
用配置文件启动
redis-server /etc/redis/redis.conf
[root@server ~]# ps aux|grep redis root 4178 2.2 1.4 169596
6080 ? Ssl Mar17 94:51 redis-server 127.0.0.1:6379
再测试一下,用后台启动的方式启动
[root@server ~]# redis-server --daemonize yes
[root@server ~]# ps aux|grep redis
root 50532 0.0 0.4 140928 1980 ? Ssl 10:29 0:00 redis-server *:6379
淦,破案了,
用redis-server --daemonize yes的方式启动的时候,不是用的自定义的配置文件
访问权限是
*:6379
就是任何ip都可以访问Redis,
然后就可以注入他们的ssh秘钥文件,然后就可以蹂躏服务器了。。。淦
至于怎么在Redis里注入ssh秘钥文件,网上有现成教学
并且为什么自己测试的时候,6379不可以访问,
是因为测试的服务器Redis还没down过,所以一直是用的之前的启动命令,
即使用指定配置文件启动
我就说这几个月都是好好地,这么突然出现这么多情况,
一开始还以为是公司秘钥文件泄露了
把那个拉胯的计划任务改动回去就可以了
我本想大声呵斥!这哪个傻卵瞎改的啥呀,本来都好好地,结果搞得这么多服务器出了问题!
必须要去查一下svn日志看看,
哦原来是我自己改的?。。。
最后为了安全,
在防火墙配置文件iptables_conf又增加了策略:
对于6379端口,屏蔽除跳板机以外的所有外网IP
双重保险,搞定
那么问题来了,读者们如何做好防范呢,
其实和上面我的一些处理思路差不多
1.计划任务更新最新防火墙配置
首先推荐搞一个计划任务,每分钟刷新一次防火墙规则
防火墙的配置文件最好是svn或者git目录里的,
在计划任务里面导入防火墙配置文件的时候有一个大坑
就是iptables-restore命令要写好绝对路径
比如:
/usr/sbin/iptables-restore < /root/svndir/iptables_conf || /sbin/iptables-restore < /root/svndir/iptables_conf
这样方便更新以后,防火墙规则也自动更换了
2.端口安全
对于一些端口比如nginx,redis,http,ssh,如果不是对外提供服务的常见端口
直接用防火墙DROP掉外网ip,
当然要对公司内部的ip开放这些端口,比如跳板机
3.ssh安全
除了端口限制,像ssh的端口最好不用默认端口,换成一些比如3022,9522等之内的自定义端口
然后就是最好别用root直接登录,弄一个专门远程机器的用户,然后给这个用户sudo的权限就行
再就是推荐使用秘钥登录