Linux(Debian)-常见加固技巧(SSH)

就在前几天,我朋友托管在我这的 TeamSpeak 服务器突然无法访问了。简单分析后决定更新 TeamSpeak,但在打包文件到本地整理的时候卡巴斯基突然报毒

1
2
3
4
5
team.tar\team\.configrc\a\a;检测到恶意对象
检测到;team.tar\team\.configrc\a\
a文件;活动用户
Trojan.Shell.Agent.br;数据库;木马程序;高;确切
检测到;2022/11/1 23:08
突然意识到事情不对,检查 SSH 日志发现为 teamspeak 单独建立的普通账户有一次远程登录。显然,服务器被黑了。详细检查后基本确定为亡命徒(Outlaw)的变种。因此在这记录 SSH 常见的加固技巧。

SSH

ssh 作为服务器必备组件,公网上各种自动化工具针对 22 端口高强度扫描。而 ssh 的常见加固手段有: 1. 用高端口代替 22 端口 2. 使用密钥认证代替密码登录 3. 使用密码也用高强度密码

更改 SSH 端口,开启密钥登录

Debian 下 ssh 的配置文件分别是 /etc/ssh/sshd_config 和 /etc/ssh/sshd_config.d/*.conf。其中 /etc/ssh/sshd_config 为默认配置文件,不建议修改。我们自定义的文件位于 /etc/ssh/sshd_config.d/ 且以 .conf 结尾。 下面新建一个配置文件:

1
sudo touch /etc/ssh/sshd_config.d/my.conf

文件内容如下:

1
2
3
Port 4309
PubkeyAuthentication yes
PermitRootLogin yes

Port 4309 表示 SSH 换用 4309 端口。PubkeyAuthentication yes 表示开启密钥登录。PermitRootLogin yes 表示允许 root 登录,是否允许 root 登录见仁见智。

更换端口后使用 -p 指定登录的端口,例如

1
ssh root@192.168.43.2 -p 4309

生成密钥

使用密钥登录需要生成密钥对,先在本地机器运行以下命令

1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

如果你的机器比较新,也可以使用 ed25519 算法,命令如下

1
ssh-keygen -t ed25519 -C "your_email@example.com"

SSH 会询问你一些问题: 1. 密钥储存位置,默认为用户目录下的 .ssh 目录 2. 是否要为密钥添加密码,添加后每次使用要手动输入密码解锁密钥,如果不希望添加密码直接回车 3. 确认密码,希望无密码继续回车

下面是运行过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\king/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\king/.ssh/id_ed25519.
Your public key has been saved in C:\Users\king/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:zuN/3FgL12mtKYA3+deN4KA8UZmD7QrZSqouZv5HWDc your_email@example.com
The key's randomart image is:
+--[ED25519 256]--+
| |
| |
| o o |
| . E. * |
| o .oS+ o .o|
| . .+o+ B o ooo|
| .o ++= B B.*.|
|.o ....=. B B o|
|+++o. .o.. o |
+----[SHA256]-----+

完成后于用户的 .ssh 目录下生成以算法命名的两文件,本例中为 id_ed25519 和 id_ed25519.pub。其中 id_ed25519 为私钥,请妥善保管,不要泄露;id_ed25519.pub 为公钥,准备上传至服务器。俩文件其实就是文本,用文本编辑器可以直接查看内容。下面是我刚刚生成的公钥内容

1
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINnKAEj8kC3Uw5tizK5zgnPmQefx8XWPVBECHxsx4LhT your_email@example.com

上传密钥

SSH 要求将公钥保存在每个用户的 ~/.ssh/authorized_keys 中。比如准备将生成的密钥用以登录 test 用户,即将公钥内容粘贴进 test 的 ~/.ssh/authorized_keys 文件中即可。没有 authorized_keys 就手动创建。

注意,authorized_keys文件的权限要设为644,即只有文件所有者才能写。如果权限设置不对,SSH 服务器可能会拒绝读取该文件。

1
chmod 644 ~/.ssh/authorized_keys

完成后重启 sshd 服务

1
sudo systemctl restart sshd

登录服务器,应该会自动登录。也可以查看日志

1
cat /var/log/auth.log | grep 'Accepted'

应该出现类似内容

1
Nov  3 15:35:45 iZeio043iZ sshd[7356]: Accepted publickey for test from 193.104.113.211 port 56834 ssh2: RSA SHA256:eg5UsdfmWUDimck1ozg+KDoMwIZbwMtejUHILTyg

禁用密码登录

如果成功使用密钥登录了,下面可以禁用密码登录以提高安全性。编辑上文创建的 /etc/ssh/sshd_config.d/my.conf 文件,添加一行

1
PasswordAuthentication no

即可禁用密码登录。

Fail2Ban

Fail2Ban是一个入侵检测系统框架,它可以保护电脑服务器免受蛮力攻击。以Python程序设计语言编写,并能够在类Unix系统上运行,这些系统具有本地安装的数据包控制系统或防火墙的接口,例如Iptables或TCP Wrapper。 ——维基百科

Fail2Ban 通过检查日志确定黑名单,通过 Iptables 进行禁封一定时间。

安装与准备

首先是最简单的安装

1
2
sudo apt update
sudo apt install fail2ban

安装完成后检查是否启动

1
sudo systemctl status fail2ban

正常运行结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-11-02 00:26:47 CST; 1 day 11h ago
Docs: man:fail2ban(1)
Process: 10748 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
Main PID: 10749 (fail2ban-server)
Tasks: 5 (limit: 2335)
Memory: 15.5M
CPU: 36.352s
CGroup: /system.slice/fail2ban.service
└─10749 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Nov 02 00:26:47 VM-20-6-debian systemd[1]: Starting Fail2Ban Service...
Nov 02 00:26:47 VM-20-6-debian systemd[1]: Started Fail2Ban Service.
Nov 02 00:26:47 VM-20-6-debian fail2ban-server[10749]: Server ready

Fail2ban 在安装时会创建两个默认的配置文件 /etc/fail2ban/jail.d/defaults-debian.conf 和 /etc/fail2ban/jail.conf 。我不建议直接修改这些文件,因为更新 Fail2ban 时它们可能会被覆盖。

Fail2ban 将按以下顺序读取配置文件。每个 .local 文件都会覆盖 .conf 文件中的设置: 1. /etc/fail2ban/jail.conf 2. /etc/fail2ban/jail.d/.conf 3. /etc/fail2ban/jail.local 4. /etc/fail2ban/jail.d/.local

因此我们直接将默认配置复制到 /etc/fail2ban/jail.d/ 然后进行修改。

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

配置

白名单

首先是白名单配置,白名单里的 ip 永远不会被禁封。如果你有其他固定 ip 可以添加进来,没有也可以直接跳过这个步骤。

1
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

禁封条件与时间

bantime,findtime 和 maxretry 设置了禁止时间和禁止条件。bantime是禁止持续的时间。如果未指定后缀则默认为秒,要永久禁止IP,请使用负数。findtime 是设置失败次数之间的持续时间。例如,如果将 Fail2ban 设置为在尝试五次失败后禁止IP,则这些失败必须在 findtime 时间内发生。maxretry 是IP失败尝试次数。默认值设置为5。下面是设置为10分钟完成5次失败,禁封 1 天。

1
2
3
bantime  = 1d
findtime = 10m
maxretry = 5

Jail 描述如何检测服务的条件。其中服务是系统的任意服务,比如 sshd 服务。条件是包括过滤器和操作。计算符合搜索模式的日志记录,并在满足预定条件时执行相应的操作。

Fail2ban 附带许多 Jail 作为示例,系统每一项服务都可以找到对应Jail配置。我们还可以创建自己的 Jail 配置。默认情况下,在CentOS 8上没有启用Jail。要启用 Jail,您需要在添加 enabled = true。以下示例显示了如何为sshd服务启用Jail。

1
2
3
4
5
[sshd]
enabled = true
port = 4309
logpath = %(sshd_log)s
backend = %(sshd_backend)s

因为上文中将 ssh 的登录端口改为 4309,因此这里的端口同样修改为 4309。 重启 Fail2Ban 使配置生效。

参考

  1. https://wangdoc.com/ssh/key
  2. https://www.myfreax.com/install-configure-fail2ban-on-ubuntu-20-04/

Linux(Debian)-常见加固技巧(SSH)
https://blog.hydrogenroom.icu/post/4828448e.html
作者
Hydrogen
发布于
2022年11月3日
许可协议