预防账户破解——如何增强云服务器主机安全


购买云服务器之后,每天都要通过 SSH 远程登录,但是 22 端口暴露在公网是十分危险的,所以购买云服务器之后,第一件事通常就是更改 SSH 的端口号。但是我又是个懒人,不想每次登录的时候还要自定义 SSH 的端口号,所以决定在不更改 SSH 的端口号的情况下,增强主机安全性,避免有人恶意暴力破解密码。

一、 增强主机安全的方法

增强主机安全的方法主要有以下几种:

  • 使用强密码。密码尽量长,除了数字之外,最好还要有大写字母、小写字母、符号。
  • 定期更换密码,推荐每 3 个月更换一次。
  • 更改主机的 SSH 端口号,关闭不需要的入站端口。只打开 80,443,以及已经更改的 SSH 端口号。
  • SSH 证书登陆
  • 两步验证(Two-factor authentication,简称 2FA)
  • Fail2ban 。密码尝试错误多次,封禁 IP ,禁止连接。
  • Wireguard 。关闭 22 端口,通过 Wireguard 连接服务器登录。
  • 云服务器提供商提供的主机安全服务,利用这些服务来提供基础防护和告警通知。

都用上当然是最安全的,但是越安全就意味着越麻烦。而且我又是个懒人,所以只选择了强密码、两步验证(2FA)和 Fail2ban 提升我的服务器安全性。

二、 提高主机安全的操作

1. 两步验证(Two-factor authentication,简称2FA)

两步验证(Two-factor authentication,简称 2FA),又译为双重验证、双因子认证、双因素认证、二元认证,是多重要素验证(Multi-factor authentication,简称 MFA)中的一个特例。使用密码和两步验证码,合并在一起,来确认用户的身份[1]

两步验证是目前常见的一种安全验证机制,国外的很多网站都已经支持两步验证,比如谷歌、微软还有Github。在这些网站上,我均给我的账户启用了两步验证。

在云服务器中开启两步验证,你需要完成以下操作[2]

(1) 手机中下载安装“身份验证器”

通常你需要安装一个“身份验证器” APP,常见的有 Google Authenticator、Microsoft Authenticator、Authy。前两个验证器在国内都有些水土不服,主要问题是连接不上谷歌和微软的服务器,无法做云备份。Authy 是一个不错的选择,当然只有 iOS 版本的程序可以在国内完美运行,其安卓程序运行依赖 Google Play。在国内安卓应用商店里也有一些优秀的验证器程序,如夸克验证器、腾讯身份验证器。但是我更推荐直接使用云服务器提供商 APP 里面的虚拟 MFA,既安全又稳定。

腾讯云助手微信小程序中的MFA
图1 腾讯云助手微信小程序中的MFA

华为云助手APP中的MFA
图2 华为云助手APP中的MFA

(2) 云服务器中安装 Google Authenticator PAM 模块

在终端窗口输入:

1
sudo apt install libpam-google-authenticator

(3) 配置SSH

要让 SSH 使用 Google Authenticator PAM 模块,请将下面一行代码添加到 /etc/pam.d/sshd 文件中

1
auth required pam_google_authenticator.so

添加并保存 /etc/pam.d/sshd 文件后,在终端中输入指令来重启 SSH:

1
sudo systemctl restart sshd.service

打开并修改 sshd 的配置文件 /etc/ssh/sshd_config,在文件里找到 ChallengeResponseAuthentication no 这一行,将其修改为 ChallengeResponseAuthentication yes

文件中应该出现有以下几行内容:

1
2
3
4
5
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes

PasswordAuthentication yes

(4) 配置 Google Authenticator PAM 模块

Google Authenticator PAM 模块的配置非常简单,在终端中运行 google-authenticator 命令即可。

1
google-authenticator

屏幕中会显示一系列问题,你只需按照如下标准选择即可;

  1. Do you want authentication tokens to be time-based (y/n) : 输入 y 回车
  2. Do you want me to update your "~/.google_authenticator" file (y/n) :输入 y 回车
  3. Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) : 输入 y 回车
  4. By default, tokens are good for 30 seconds and in order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of 1:30min to about 4min. Do you want to do so (y/n) : 输入 n 回车
  5. If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting (y/n) : 输入 y 回车

你可能已经注意到在此过程中出现的巨型二维码。如果您在紧急情况下无法使用手机,你可以使用下面的备用令牌,记得将它们写在纸上并将它们保存在安全的地方。现在,你可以打开 Google 身份验证器或者其他的 MFA 验证器 APP 来添加我们的密钥以使其正常工作。


初始化过程中生成的两步验证二维码
图3 初始化过程中生成的两步验证二维码

千万不要使用未加密的服务来存储密钥和备用令牌,例如笔记同步服务等。

(5) 将密钥添加到 MFA 验证器

你可以使用任意 MFA 验证器添加密钥,添加密钥的操作都几乎相同,主要通过以下两种方法添加:

  • 扫描二维码添加
  • 手动输入密钥

添加后你可以自定义用户名和主机名,以便与其他的账号区分。


现在 Google Authenticator 已经为 SSH 配置了两步验证。重启主机,你(或一些使用密码登录的坏人...)尝试登录到您的 SSH 时,除了传统的密码外,你(或这个坏人)都会被要求提供身份验证口令。两步验证实际给主机提供了非常安全的等级,但是一些心怀鬼胎的人可能会通过轰炸的形式来暴力破解你的主机。所以我们还需要使用另一个神器。

2. Fail2ban

Fail2Ban 是一个入侵检测系统框架,它可以保护电脑服务器免受蛮力攻击。它可以阻挡有人恶意以字典暴力破解密码,通常应用于有开启 sshd、telnetd 跟 ftpd 的主机上。Fail2ban 的做法是将超过多次失败连线的 IP 用 iptables(给 IPv4 使用)或 ip6tables(给 IPv6 使用)禁止该 IP 之后的连线[3]

接下来介绍如何在安装 ubuntu 系统的主机上安装和配置 Fail2ban[4]

(1) 安装 Fail2ban

Fail2ban 软件包包含在默认的 ubuntu 20.04 软件包管理器中。输入以下命令来安装:

1
2
sudo apt update
sudo apt install fail2ban

安装完成后,Fail2ban 服务将自动启动。 您可以通过检查服务状态来验证它:

1
sudo systemctl status fail2ban

屏幕会显示以下信息:

1
2
3
4
5
6
7
8
9
10
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-03-07 23:31:32 CST; 19h ago
Docs: man:fail2ban(1)
Process: 6064 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
Main PID: 6080 (f2b/server)
Tasks: 5 (limit: 2274)
Memory: 13.0M
CGroup: /system.slice/fail2ban.service
└─6080 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

如果看到 Active: active (running),说明 Fail2ban 已经正常运行在你的 ubuntu 系统中了。

(2) 配置 Fail2ban

/etc/fail2ban/ 文件夹中,存在有 fail2ban.confjail.confpaths-arch.confpaths-common.confpaths-debian.confpaths-opensuse.conf 等配置文件。不建议直接修改这些文件,因为更新软件包时它们可能会被覆盖。

由于 Fail2ban 按以下顺序读取配置文件。 每个 .local 文件都会覆盖 .conf 文件中的设置:

  • /etc/fail2ban/jail.conf
  • /etc/fail2ban/jail.d/*.conf
  • /etc/fail2ban/jail.local
  • /etc/fail2ban/jail.d/*.local

所以推荐在 /etc/fail2ban/ 目录下新建一个 jail.local 文件,把 jail.conf 内容复制到 jail.local 中来配置 Fail2ban:

1
sudo cp /etc/fail2ban/jail.{conf,local}

要为 Fail2ban 服务配置,只需使用文本编辑器打开 jail.local 文件即可。文件中包含每个功能选项配置的注释。我们只需更改基本设置。

(3) 将 IP 地址列入白名单

打开 /etc/fail2ban/jail.local,将你需要列入白名单的 IP 地址、IP 范围或主机域名添加到 ignoreip 设置中,所设置的 IP 不会被 Fail2ban 封禁。推荐将本地 IP 地址和你经常远程登录的 IP 地址添加进去。你可以在文件中找到以下相关的内容:

1
2
3
4
# "ignoreip" can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban
# will not ban a host which matches an address in this list. Several addresses
# can be defined using space (and/or comma) separator.
#ignoreip = 127.0.0.1/8 ::1

移除 ignoreip 开头的注释 #,并添加以空格分隔的 IP 地址,例如:

1
ignoreip =  127.0.0.1/8 ::1 example.com

(4) 封禁 IP 的相关设置

打开 /etc/fail2ban/jail.local,设置 bantimefindtimemaxretry 能够定义封禁时间和封禁条件。你可以在文件中找到以下相关的内容:

1
2
3
4
5
6
7
8
9
# "bantime" is the number of seconds that a host is banned.
bantime = 10m

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 10m

# "maxretry" is the number of failures before a host get banned.
maxretry = 5

bantime 指封禁 IP 的持续时间。 如果未指定后缀,则默认为秒。 默认情况下,bantime 值设置为 10 分钟。 通常,大多数用户都希望设置更长的封禁时间。推荐设置为一个月,即 4w。当然如果你想要永久封禁,可以设置成负数。

findtime 指检测时间,在此时间内超过规定的次数会激活 Fail2ban,单位是秒。例如,如果将 Fail2ban 设置为在五次失败之后封禁 IP(maxretry = 5,参见下文),则必须在 findtime 持续时间内登录失败足够次数才会给予封禁。默认值为 10 分钟。推荐调整为一个小时,即 1h

maxretry 是封禁 IP 前允许失败的次数。 默认值设置为 5,对于大多数用户来说应该可以。

(5) Fail2ban 中 sshd 的相关设置

Fail2ban 使用 Jail(小黑屋)的概念。Jail 定义了针对某项服务(例如 sshd)的封禁设置,对该服务的日志进行读取和计数,在满足预定条件时执行相应的操作(例如封禁 IP)。

Fail2ban 附带了许多用于不同服务的 Jail。你也可以创建自己的 Jail 配置。

Fails2ban 可以通过全局设置打开所有服务的 Jail,但是没有必要,因为我们只需要针对 SSH 登录提供防护,防止暴力破解。因此不要更改在 [default] 标题下的 enabled = false

默认情况下,仅启用 SSH 服务的 Jail。要启用 Jail,只需要在 [sshd] 标题后添加 enabled = true 。下面的示例演示如何启用 sshd 的 Jail:

1
2
3
4
5
6
7
8
9
10
[sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
enabled = true ; 这里添加来启用SSH登录防护
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

每次编辑配置文件时,都需要重新启动 Fail2ban 服务才能使更改生效:

1
sudo systemctl restart fail2ban

(6) Fail2ban 客户端

Fail2ban 附带了一个名为 Fail2ban-client 的命令行工具,你可以使用该工具与 Fail2ban 服务进行交互。

可以使用 -h 选项查看所有可用选项

1
fail2ban-client -h

此工具可用于封禁或取消封禁指定的 IP 地址、更改设置、重新启动服务等。以下是一些示例:
检查 Jail 状态:

1
sudo fail2ban-client status sshd

取消封禁 IP:

1
sudo fail2ban-client set sshd unbanip 12.34.56.78

封禁 IP:

1
sudo fail2ban-client set sshd banip 12.34.56.78

3. 开启云服务器的告警通知

很多云服务器提供商都会给用户购买的云服务器提供基础的主机防护,以我所使用的华为云服务器为例,在“控制台”中选择“安全与合规—企业主机安全 HSS”,可以看到主机的防护信息。

华为云主机安全管理
图4 华为云主机安全管理

按照“使用指引”中显示的步骤操作,便可以开始设置告警通知。首先你可以在华为云文档中心查看如何安装 Agent?。安装好 Agent 后,点击右上角的“告警通知设置”,你会看到以下界面。

华为云告警通知设置
图5 华为云告警通知设置

全部勾选后,选择“消息主题”。如果选择“消息主题”后,下面的下拉选项框是空的。说明你还没有创建主题,需要新建一个,点击右边的“查看消息通知服务主题”,进入“消息通知服务”,点击右上角的“新建主题”。输入主题名称,确认即可。


华为云消息通知服务主题
图6 消息通知服务主题

在新建的主题里添加订阅,协议选择“短信”或者“邮件”,分别填入手机号或电子邮箱即可。成功设置后回到图 5 对应的“告警通知”,重新选择刚才创建的主题,点击应用。

成功设置告警通知后,华为云会通过短信或者邮箱的形式给你发送告警通知,有利于你随时知道自己服务器的安全状态。

三、总结

通过开启服务器的两步验证(或双因子认证),以及启用 Fail2ban 对 sshd 的暴力破解防护,黑客应该只会有极小的概率成功破解服务器。如果你定期更改密码,并更改了 SSH 端口,甚至关闭 22 端口使用 Wireguard 连接服务器,服务器被攻破的可能性几乎为零。

参考资料

  1. 多重要素验证 - 维基百科,自由的百科全书 (https://zh.wikipedia.org/wiki/多重要素驗證)
  2. Configure SSH to use two-factor authentication (https://ubuntu.com/tutorials/configure-ssh-2fa)
  3. Fail2ban - 维基百科,自由的百科全书 (https://zh.wikipedia.org/wiki/Fail2ban)
  4. How to Install and Configure Fail2ban on Ubuntu 20.04 (https://linuxize.com/post/install-configure-fail2ban-on-ubuntu-20-04/)

预防账户破解——如何增强云服务器主机安全
https://vickey.fun/2022/03/09/Increase-Security-on-ECS/
作者
饶玮琪
发布于
2022年3月9日
许可协议