目录

CentOS7云服务器安全加固

事情的起因是这样的,前几天我像往常一样用Putty登录公司的云服务器,突然有一行字引起了我的注意,如图:

/images/2022/09/21/login-failed.png

好家伙,37次登录失败,而且是root用户。一股凉气从心里升起,我特意查了一下这个IP。

/images/2022/09/21/ip-query.png

给我整不会了,啥?腾讯云?我用的不就是腾讯云的服务器吗?我猜也许是谁买了腾讯云服务器在这干坏事呢。无心细想,赶紧加固服务器防御要紧。

开启防火墙

之前为了调试方便,把防火墙给关了,实在不是明智之举,赶紧开启防火墙:

1
2
systemctl enable firewalld # 防火墙开机自启动
systemctl start firewalld # 启动防火墙

然后添加几个在用的端口:

1
2
3
4
firewall-cmd --permanent --add-port=22/tcp # ssh
firewall-cmd --permanent --add-port=80/tcp # http
firewall-cmd --permanent --add-port=443/tcp # https
firewall-cmd --permanent --add-port=222/tcp # gitlab ssh

SSH配置

更换root密码

先了解了一下到底有多少人在暴力尝试登录root用户:

1
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

结果如图:

/images/2022/09/21/violent-try.png

好家伙,第一个IP试了七千多次。赶紧给root换个更强的密码——长度64的包括数字、字母和符号的随机密码。

禁止root登录

虽然我们设置了一个比较健壮的root密码,但是万一密码泄露了,后果不堪设想。我们可以通过修改SSH配置来禁用root登录,降低root密码泄露的风险。禁用root用户后,我们需要创建一个新用户用来替代root登录系统。

创建新用户

创建一个新用户xxx

1
useradd xxx

修改xxx用户密码,设置一个随机密码:

1
passwd xxx

xxx加到wheel组里,这样xxx用户就可以通过sudo命令提权:

1
usermod -a -G wheel xxx

一般情况下,普通用户如果知道root用户密码,可以使用su - root切换为root用户。可以修改配置文件/etc/pam.d/su,使得wheel组的用户才可以切换为root用户:

1
2
# Uncomment the following line to require a user to be in the "wheel" group.
auth            required        pam_wheel.so use_uid

修改SSH配置

修改/etc/ssh/sshd_config文件的以下配置,禁用root用户登录且只允许xxx用户登录系统:

1
2
PermitRootLogin no # 禁止root登录
AllowUsers xxx # 允许xxx登录

然后重启SSH服务使配置生效:

1
systemctl restart sshd

这样root用户就被禁止登录系统了,不过我们可以通过xxx用户登录系统。

设置密钥登录

密码登录系统还是比较危险,一旦xxx用户密码泄露,无异于root用户泄露,使用SSH密钥登录是一个更好的方法。

生成密钥对

首先在自己的机器上生成一对密钥,不推荐使用rsa密钥对。

1
ssh-keygen -t ecdsa

生成的密钥对在$HOME/.ssh目录下,然后将公钥上传到云服务器上:

1
ssh-copy-id -i id_ecdsa.pub xxx@cloud_server_ip

修改SSH配置

修改/etc/ssh/sshd_config文件的以下配置,开启公钥认证并禁用密码登录:

1
2
3
PubkeyAuthentication yes # 开启公钥认证
PermitEmptyPasswords no
PasswordAuthentication no # 禁用密码登录

重启SSH服务使配置生效。

其他SSH配置

下面是几个跟安全有关的配置,最好也修改一下:

1
2
3
4
5
6
7
#HostKey /etc/ssh/ssh_host_rsa_key # 禁用
#HostKey /etc/ssh/ssh_host_dsa_key # 禁用
UsePAM no
X11Forwarding no
UseDNS no
MaxAuthTries 3
MaxSessions 3

IP黑名单

SSH配置修改后,的确能够很快拒绝这些尝试登录的请求。但是这些IP无休止地来登录系统也很烦,因此最好有一个黑名单机制,将重试次数较多的IP直接加入黑名单,让它们不再作妖。以下命令可以查看登录失败大于4次的IP:

1
lastb |awk '{print $3}'|sort |uniq -c|awk '{if ($1 > 4) print $2}'

将得到的IP添加到/etc/hosts.deny文件中,就可以屏蔽这些IP。写一个脚本实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#! /bin/bash
ip_list=$(cat /var/log/secure|awk '/Failed password/{print $(NF-3)}'|sort|uniq -c|awk '{if ($1 > 4) print $2}')
ip_list2=$(cat /var/log/secure|awk '/Invalid user/{print $(NF-2)}'|sort|uniq -c|awk '{if ($1 > 4) print $2}')
for ip in ${ip_list} ${ip_list2}
do
  grep ${ip} /etc/hosts.deny > /dev/null
  if [ $? -gt 0 ];then
    echo ALL: ${ip} >> /etc/hosts.deny
  fi
done

将脚本保存为block_ip.sh,然后执行命令crontab -e,设置定时任务每5分钟执行这个脚本:

1
*/5 * * * * /bin/bash /root/block_ip.sh

fail2ban

通过脚本自动添加IP到黑名单的做法可行,不过我们也可以借助第三方工具fail2ban来禁止IP登录。首先安装fail2ban

1
sudo yum install fail2ban

设置fail2ban自启动:

1
2
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

拷贝一个配置样例作为本地配置:

1
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

修改/etc/fail2ban/jail.d/sshd.conf文件,写入以下内容:

1
2
3
4
5
[sshd]
enabled   = true
maxretry  = 3
findtime  = 1d
bantime   = -1

重启fail2ban使配置生效:

1
sudo systemctl restart fail2ban

这样fail2ban就能够将登录SSH失败的IP加入黑名单。使用下面这个命令查看加入黑名单的IP:

1
fail2ban-client status sshd

至此云服务器安全加固告一段落了,后续有更好的方法再记录一下。