我所租用的云服务器操作系统为CentOS Linux,在使用云服务器的过程中为了保证服务器的安全,进行了一些简单的配置,这样能够增加服务器被破解的难度。

使用denyhosts防止暴力破解

登入服务器主要是使用用户名和密码,而且linux的root用户拥有最高权限。可以使用denyhosts,防止暴力破解用户名和密码。denyhosts的原理是在多次输入错误的用户名和密码时,屏蔽该登录ip,限制密码的尝试次数。

安装denyhosts

使用包管理器安装

可以使用自带的包管理器安装denyhost,这样是比较方便的,后续的配置工作也会简单一些。

yum install denyhosts

手动安装

update: 2020-6-5
在包管理器中没有找到denyhosts,于是按照官方文档进行手动安装,使用的denyhost版本为3.1.2beta。

目前CentOS7中自带的还是python2,所以下面的操作都仍然是基于python2的。但是需要注意的是python2已经从2020年开始就不再维护了,在以后的安装中使用python3可能更好。

安装依赖的python包(ipaddr)。我使用了pip进行安装,但是python2的pip需要安装 epel-release 之后才能通过包管理器安装。

yum install epel-release
yum install python-pip
pip install ipaddr

安装denyhosts,运行以下命令会将软件包安装到python2中的 site-package 目录中,,执行时需要root权限。

python setup.py install

修改守护进程脚本,在手动安装的时需要修改守护进程脚本,即 daemon-control-dist 文件,需要根据系统情况修改其中的配置项。以下是CentOS7对应的目录配置。

DENYHOSTS_BIN   = "/usr/bin/denyhosts.py"
DENYHOSTS_LOCK  = "/var/lock/subsys/denyhosts"
DENYHOSTS_CFG   = "/etc/denyhosts.conf"

编辑配置文件

安装好denyhosts之后,它的默认配置文件为 /etc/denyhosts.conf 。该配置文件有很好的注释,对于每个配置项的作用都有很好的说明。可能需要修改的相关配置项有如下几个。

可以分别配置root用户、普通用户、无效用户用户名的尝试次数。

DENY_THRESHOLD_INVALID = 5
DENY_THRESHOLD_VALID = 10
DENY_THRESHOLD_ROOT = 5

修改 SECURE_LOG 配置项,将其调整为如下配置。

SECURE_LOG = /var/log/secure

启动denyhosts

使用以下命令启动denyhosts,查看denyhosts的运行状态。

service denyhosts start
service denyhosts status

使用以下命令让denyhosts能够随系统自启动。

chkconfig denyhosts on

update: 2020-6-5
在手动安装时需要将守护进程脚本的软连接放在 /etc/init.d 目录中。

cd /etc/init.d
ln -s /usr/bin/daemon-control-dist denyhosts

如果系统中安装了 chkconfig ,可以用以下命令确保denyhosts会在开机时自动启动。

chkconfig --add denyhosts

使用fail2ban防止暴力破解

由于在默认的软件仓库中经常找不到denyhosts软件,所以我尝试切换到了fail2ban。fail2ban支持的功能更多,命令交互也更加友好。

安装fail2ban

使用自带的包管理器中安装fail2ban,命令行如下。

yum install fail2ban

编辑配置文件

安装包中自带的默认配置文件为 /etc/fail2ban/jail.conf ;为了防止由于软件更新导致配置文件被覆盖,推荐将用户配置保存在 /etc/fail2ban/jail.local 中;软件会先加载默认配置,再加载用户配置。

针对 ssh 登录服务的配置如下所示。需要注意的是如果修改了默认的ssh端口,则需要调整 port 对应的配置项;不同服务器的ssh登录记录的保存位置也可能不相同,需要根据实际情况修改 logpath 配置项。

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3
findtime = 10m
bantime = 1d
bantime.increment = true
bantime.factor = 1
ignoreip = 127.0.0.1

启动fail2ban

使用下面的命令启动fail2ban服务。

systemctl start fail2ban
service fail2ban start

使用下面的命令让fail2ban开机自动启动。

systemctl enable fail2ban

查看fail2ban的运行情况

查看系统服务的运行状态,命令如下:

systemctl status fail2ban
service fail2ban status

fail2ban提供了自带的命令工具,用于查看服务端的状态,命令如下:

fail2ban-client status

还可以插件具体某个规则的屏蔽情况,例如下面的命令就能够查看 sshd 的过滤情况。

fail2ban-client status sshd

加固sshd的配置

sshd的默认端口号为22,很多暴力破解程序会直接对该端口进行登录尝试,通过修改默认的sshd端口号,可以增加破解难度。

注意:在修改sshd端口号之后,自己使用shell工具登录服务器也需要对端口号进行修改。

由于所有Linux系统都必然有root用户,所以在暴力破解时最容易被攻击的就是root用户,可以通过禁用远程root用户登录的方式增加攻击难度。因为如果root用户可用,攻击者只需要对root用户的密码进行暴力破解;而禁用远程root登录后,攻击者需要同时猜测用户名和密码。

编辑配置文件

sshd的配置文件为 /etc/ssh/sshd_config

Port 22

这一行配置了端口号,将22改为需要的端口号。

PermitRootLogin yes

这一行配置了是否允许远程root用户登录,将配置由 yes 改为 no 即可。

重启sshd服务

更改配置文件后,需要重启服务使配置文件生效。

service sshd restart

注意:如果你正使用远程shell工具登录到服务器,重启sshd服务会使shell工具失去连接。

查看系统登录记录

last 指令能够查看登录成功的记录,记录保存位置为 /var/log/wtmp

lastb 指令能够查看登录失败的记录,记录保存位置为 /var/log/btmp

lastlog 指令能够查看用户的最近登录记录,记录保存位置为 /var/log/lastlog

通过查看登录失败的记录,能够判断出服务器是否有被暴力破解的记录。需要注意的是这两个命令均需要管理员权限才能够执行。

可以使用下列命令清除已经保存的登录记录。

  • 清除登录成功的记录 echo > /var/log/wtmp
  • 清除登录失败的记录 echo > /var/log/btmp
  • 清除用户登录记录 echo > /var/log/lastlog