就在前几天,我朋友托管在我这的 TeamSpeak 服务器突然无法访问了。简单分析后决定更新 TeamSpeak,但在打包文件到本地整理的时候卡巴斯基突然报毒
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 的常见加固手段有:
- 用高端口代替 22 端口
- 使用密钥认证代替密码登录
- 使用密码也用高强度密码
更改 SSH 端口,开启密钥登录
Debian 下 ssh 的配置文件分别是 /etc/ssh/sshd_config 和 /etc/ssh/sshd_config.d/*.conf。其中 /etc/ssh/sshd_config 为默认配置文件,不建议修改。我们自定义的文件位于 /etc/ssh/sshd_config.d/ 且以 .conf 结尾。 下面新建一个配置文件:
|
|
文件内容如下:
Port 4309
PubkeyAuthentication yes
PermitRootLogin yes
Port 4309 表示 SSH 换用 4309 端口。PubkeyAuthentication yes 表示开启密钥登录。PermitRootLogin yes 表示允许 root 登录,是否允许 root 登录见仁见智。
更换端口后使用 -p 指定登录的端口,例如
|
|
生成密钥
使用密钥登录需要生成密钥对,先在本地机器运行以下命令
|
|
如果你的机器比较新,也可以使用 ed25519 算法,命令如下
|
|
SSH 会询问你一些问题:
- 密钥储存位置,默认为用户目录下的 .ssh 目录
- 是否要为密钥添加密码,添加后每次使用要手动输入密码解锁密钥,如果不希望添加密码直接回车
- 确认密码,希望无密码继续回车
下面是运行过程
|
|
完成后于用户的 .ssh 目录下生成以算法命名的两文件,本例中为 id_ed25519 和 id_ed25519.pub。其中 id_ed25519 为私钥,请妥善保管,不要泄露;id_ed25519.pub 为公钥,准备上传至服务器。俩文件其实就是文本,用文本编辑器可以直接查看内容。下面是我刚刚生成的公钥内容
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINnKAEj8kC3Uw5tizK5zgnPmQefx8XWPVBECHxsx4LhT your_email@example.com
上传密钥
SSH 要求将公钥保存在每个用户的 ~/.ssh/authorized_keys 中。比如准备将生成的密钥用以登录 test 用户,即将公钥内容粘贴进 test 的 ~/.ssh/authorized_keys 文件中即可。没有 authorized_keys 就手动创建。
注意,authorized_keys文件的权限要设为644,即只有文件所有者才能写。如果权限设置不对,SSH 服务器可能会拒绝读取该文件。
chmod 644 ~/.ssh/authorized_keys
完成后重启 sshd 服务
|
|
登录服务器,应该会自动登录。也可以查看日志
|
|
应该出现类似内容
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 文件,添加一行
PasswordAuthentication no
即可禁用密码登录。
Fail2Ban
Fail2Ban是一个入侵检测系统框架,它可以保护电脑服务器免受蛮力攻击。以Python程序设计语言编写,并能够在类Unix系统上运行,这些系统具有本地安装的数据包控制系统或防火墙的接口,例如Iptables或TCP Wrapper。 ——维基百科
Fail2Ban 通过检查日志确定黑名单,通过 Iptables 进行禁封一定时间。
安装与准备
首先是最简单的安装
|
|
安装完成后检查是否启动
|
|
正常运行结果如下
● 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 文件中的设置:
- /etc/fail2ban/jail.conf
- /etc/fail2ban/jail.d/*.conf
- /etc/fail2ban/jail.local
- /etc/fail2ban/jail.d/*.local
因此我们直接将默认配置复制到 /etc/fail2ban/jail.d/ 然后进行修改。
|
|
配置
白名单
首先是白名单配置,白名单里的 ip 永远不会被禁封。如果你有其他固定 ip 可以添加进来,没有也可以直接跳过这个步骤。
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 天。
bantime = 1d
findtime = 10m
maxretry = 5
Jail 描述如何检测服务的条件。其中服务是系统的任意服务,比如 sshd 服务。条件是包括过滤器和操作。计算符合搜索模式的日志记录,并在满足预定条件时执行相应的操作。
Fail2ban 附带许多 Jail 作为示例,系统每一项服务都可以找到对应Jail配置。我们还可以创建自己的 Jail 配置。默认情况下,在CentOS 8上没有启用Jail。要启用 Jail,您需要在添加 enabled = true。以下示例显示了如何为sshd服务启用Jail。
[sshd]
enabled = true
port = 4309
logpath = %(sshd_log)s
backend = %(sshd_backend)s
因为上文中将 ssh 的登录端口改为 4309,因此这里的端口同样修改为 4309。 重启 Fail2Ban 使配置生效。