服务器安全—暴力破解和挖矿程序防范安全

第一次解决挖矿破解——ssh远程安全

苦逼运维刚进公司的时候
在这以前也有很多服务器被用来挖矿打工的情况,
当时初步判断是密码略微简单,被强行ssh远程暴力破解了密码,
而且查看/var/log/secure安全日志,发现服务器真的是时时刻刻在被人捅刀子ing

八嘎呀路 来吧那就碰一碰吧
服务器安全—暴力破解和挖矿程序防范安全_第1张图片

防暴力破解——解决方案:
当时差不多拟了这些解决方案
(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端口
大概是这样子:
服务器安全—暴力破解和挖矿程序防范安全_第2张图片

为什么选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

哟西,从这以后,集群服务器们度过了安安静静的一大段岁月
服务器安全—暴力破解和挖矿程序防范安全_第3张图片

差不多过了四五个月
本来是风和日丽,心情偷税的一天,结果突然发现好多服务器异常的不对
运维仔美好的一天,从服务器出现奇怪的异常结束

第二次解决挖矿破解——Redis漏洞

服务器安全—暴力破解和挖矿程序防范安全_第4张图片

这一次一大批机器发生奇怪的问题
每一台机器都完美的符合网上所说的挖矿破解的情况,
计划任务被清空;防火墙规则被清空;一些重要修复命令文件被修改;奇怪的Redis程序;被篡改了的秘钥文件等等
搞得我差不多一整个星期都在找挖矿机器,然后重装系统。。
服务器安全—暴力破解和挖矿程序防范安全_第5张图片
我他妈真的是奇了怪了
完全不知道这些是怎么被攻击的,远程端口和密码什么的应该都限制死了的

在网上查询一些帖子以后,都说是利用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过,所以一直是用的之前的启动命令,
即使用指定配置文件启动
服务器安全—暴力破解和挖矿程序防范安全_第6张图片

我就说这几个月都是好好地,这么突然出现这么多情况,
一开始还以为是公司秘钥文件泄露了
把那个拉胯的计划任务改动回去就可以了

我本想大声呵斥!这哪个傻卵瞎改的啥呀,本来都好好地,结果搞得这么多服务器出了问题!
必须要去查一下svn日志看看,
哦原来是我自己改的?。。。

emmm 其实人都会犯错的,重要的是敢于记录和总结,对吧
服务器安全—暴力破解和挖矿程序防范安全_第7张图片

最后为了安全,
在防火墙配置文件iptables_conf又增加了策略:
对于6379端口,屏蔽除跳板机以外的所有外网IP

双重保险,搞定

服务器安全—暴力破解和挖矿程序防范安全_第8张图片

防范

那么问题来了,读者们如何做好防范呢,
其实和上面我的一些处理思路差不多

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开放这些端口,比如跳板机
服务器安全—暴力破解和挖矿程序防范安全_第9张图片

3.ssh安全
除了端口限制,像ssh的端口最好不用默认端口,换成一些比如3022,9522等之内的自定义端口
然后就是最好别用root直接登录,弄一个专门远程机器的用户,然后给这个用户sudo的权限就行
再就是推荐使用秘钥登录

服务器安全—暴力破解和挖矿程序防范安全_第10张图片

你可能感兴趣的:(运维,linux,安全漏洞,redis,端口扫描)