今天发现自己的公有云服务器被攻击了
然后查看了登录日志,如上图
ls -sh /var/log/secure
vim /var/log/secure
然后增加了安全相关的设置
具体可以从以下方面增加安全性:
- 修改默认SSH端口
- 公有云修改安全组策略及防火墙端口
- 设置登录失败次数锁定用户及限制多久之后才能登录
- 限制IP登录
- 设置失败自动将IP加入SSH黑名单
- 禁用ROOT登录
- 禁止ROOT用户直接登录
- 禁止国外IP
考虑自己有时候要登陆,目前我采用了方法1、2。
先修改公有云的安全组策略,增加一个端口Port 54321
开放防火墙端口54321
firewall-cmd --zone=public --add-port=54321/tcp --permanent
firewall-cmd --reload
修改默认SSH端口22改为端口54321。
vim /etc/ssh/sshd_config
重启sshd
systemctl restart sshd
删掉公有云安全组中的22端口
移除防火墙22端口
firewall-cmd --zone=public --remove-port=22/tcp --permanent
改完之后,发现没有人攻击了。等下次被攻击再学着弄自动IP封锁。
改完之后,下午又有人攻击了,然后找了半天方案,找到一个脚本确实能把攻击的IP和攻击次数列出来,放到/etc/hosts.deny文件中。脚本如下:
cat /shell_script/hosts_deny.sh
#!/bin/bash
#Host.deny Shell Script
#2013-08-24
cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | awk '{print $2 "=" $1;}' > /tmp/black_ip.txt
DEFINE=10
for i in `cat /tmp/black_ip.txt`
doIP=`echo $i | awk -F= '{print $1}'`NUM=`echo $i | awk -F= '{print $2}'`if [ $NUM -gt $DEFINE ]thengrep $IP /etc/hosts.deny > /dev/nullif [ $? -gt 0 ]thenecho "sshd:$IP:deny" >> /etc/hosts.denyfifi
done
crontab -e
# 将下面脚本加进去, 定时检测.
# */1 * * * * sh /shell_script/hosts_deny.sh
但是该在centos7下一直报错如下:
提示是缺少模块,而且原本/etc/目录下也没有hosts.deny文件,因此干脆换种方案,即找了好久的fail2ban和denyhosts。这里denyhosts是0几年的,要下载文件并且安装python,所以直接就用fail2ban了。这个简直不要太好用。
使用fail2ban+firewalld防护
参考:Fail2ban + firewalld 防护doss攻击
安装fail2ban
fail2ban可以监控系统日志,并且根据一定规则匹配异常IP后使用Firewalld将其屏蔽,尤其是针对一些爆破/扫描等非常有效。
#CentOS内置源并未包含fail2ban,需要先安装epel源
yum -y install epel-release
#安装fial2ban
yum -y install fail2ban
安装成功后fail2ban配置文件位于/etc/fail2ban,其中jail.conf为主配置文件,相关的匹配规则位于filter.d目录,其它目录/文件一般很少用到,如果需要详细了解可自行搜索。
配置规则
新建jail.local来覆盖fail2ban的一些默认规则:
#新建配置
vi /etc/fail2ban/jail.local
#默认配置
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写
banaction = firewallcmd-ipset
action = %(action_mwl)s
参数说明:
ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔
bantime:屏蔽时间,单位为秒(s)
findtime:时间范围
maxretry:最大次数
banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽端口
防止SSH爆破
如果您还在使用默认SSH端口(22),可能每天都会被扫描,我们可以修改端口尽量避免被扫,参考: https://www.moerats.com/archives/394/ ,或者可以使用fail2ban将恶意IP屏蔽。
继续修改jail.local这个配置文件,在后面追加如下内容:
[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
logpath = /var/log/secure
参数说明:
[sshd]:名称,可以随便填写
filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则
port:对应的端口
action:采取的行动
logpath:需要监视的日志路径
完整版:
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
logpath = /var/log/secure
禁止ROOT用户登录
最近发现破解密码的人很猖獗,已经做了这么多限制,还是每天几百几千的穷举破解,于是我想直接禁止ROOT用户登录。注意,要提前配置好你自己的其他的用户有比较强的密码强度,并且给了sudo权限。
处理方式如下
# 增加用户
useradd myuser
# 配置密码. 注意尽量用高强度密码才不会被轻易破解
passwd myuser
# 输入密码确认密码# 这里配置你新增的用户有sodu权限
# 切换到root用户,
su - root
# 编辑/etc/sudoers
vim /etc/sudoers
# 找到## Allow root to run any commands anywhere
# 找到root ALL=(ALL)这一行, 然后加入你刚才新建的用户
myuser ALL=(ALL) ALL# 请先验证刚才新建的myuser用户是否具有登录权限及sudo操作权限, 如果有,才可以进行下一步
vim /etc/passwd
# 找到root那行, 修改后面的登录脚本/bin/bash为/sbin/nologin即可
# 至此, 配置禁用ROOT登录完毕.
禁止ROOT用户直接登录
# 跟上面一样, 要新建用户, 密码强度要高
useradd myuser
passwd myuser# 配置不允许root直接登录
vim /etc/ssh/sshd_config
# 禁止用户登录, 找到#PermitRootLogin yes,将末尾的yes改为no,去掉前面的#注释,wq!保存即可。PermitRootLogin no
# 重启sshd服务
systemctl restart sshd
# 再次登录尝试,发现不然ROOT直接登录,然后尝试先登录myuser用户,再登录root用户,可以~# 至此,centos账号相当稳妥啦~~
禁止ping
服务器攻击一般是从ping开始的,黑客攻击网站前会先ping下服务器看其是否在线,如果服务器禁止ping,可以一定程度的减少服务器被攻击次数。Centos系统默认是允许ping的,可使用root账户修改Centos系统内核参数永久禁止ping。
vim /etc/sysctl.conf
在文件末尾加上一行:
net.ipv4.icmp_echo_ignore_all=1
保存后执行使配置生效
sysctl -p
配置生效后,ping服务器收不到任何响应,ping被永久禁止。如果需要允许ping,修改该文件去掉net.ipv4.icmp_echo_ignore_all=1
这行或者修改为net.ipv4.icmp_echo_ignore_all=0
即可。
禁止国外IP(请不要使用这个方法,我测试后直接阿里云那台机器登不上了,仅供参考思路。慎用,用之前请自行测试,因为要排除掉自身IP和内网IP,但是公有云无法确定内网IP段是172.x.x.x还是10.x.x.x或者其他)
获取国内IP网段
wget -q --timeout=60 -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /root/china_ip.txt
编辑脚本/root/allcn.sh
,内容如下
mmode=$1
CNIP="/root/china_ip.txt"
gen_iplist() {cat <<-EOF$(cat ${CNIP:=/dev/null} 2>/dev/null)
EOF
}flush_r() {
iptables -F ALLCNRULE 2>/dev/null
iptables -D INPUT -p tcp -j ALLCNRULE 2>/dev/null
iptables -X ALLCNRULE 2>/dev/null
ipset -X allcn 2>/dev/null
}mstart() {
ipset create allcn hash:net 2>/dev/null
ipset -! -R <<-EOF
$(gen_iplist | sed -e "s/^/add allcn /")
EOFiptables -N ALLCNRULE
iptables -I INPUT -p tcp -j ALLCNRULE
iptables -A ALLCNRULE -s 127.0.0.0/8 -j RETURN
iptables -A ALLCNRULE -s 172.0.0.0/8 -j RETURN
iptables -A ALLCNRULE -s 192.0.0.0/8 -j RETURN
iptables -A ALLCNRULE -s 10.0.0.0/8 -j RETURN
iptables -A ALLCNRULE -s 169.254.0.0/16 -j RETURN
iptables -A ALLCNRULE -s 224.0.0.0/4 -j RETURN
iptables -A ALLCNRULE -s 255.255.255.255 -j RETURN
iptables -A ALLCNRULE -m set --match-set allcn src -j RETURN
iptables -A ALLCNRULE -p tcp -j DROP
}if [ "$mmode" == "stop" ] ;then
flush_r
exit 0
fiflush_r
sleep 1
mstart
修改脚本执行权限
chmod +x allcn.sh
屏蔽国外IP
/root/allcn.sh
停止屏蔽国外IP
/root/allcn.sh stop
这是几天后的效果,不仅来攻击我的人少了,而且攻击我的人直接自动被BAN了,哈哈哈~~
参考:
- 修改ssh默认的22端口号
- CentOS7设置ssh服务以及修改默认22端口
- linux防火墙常用命令
- Centos下限制SSH登录次数详解
- ssh 安全配置 锁定次数
- Centos下限制SSH登录次数详解
- 防止服务器被外网的IP地址ssh连接或扫描试探等
- centos7添加ip黑名单禁止某个ip访问
- Fail2ban + firewalld 防护doss攻击
- Centos7 安装fail2ban基于iptables
- CentOS 7 使用 denyhosts 防范暴力破解
- Centos禁止ping的设置方法
- 如何在Linux云服务器上屏蔽国外IP访问?
- 【开发日常】CentOS7添加超级用户权限
- CentOS配置禁止root用户直接登录