我们做什么以及为什么
- 我们不以root身份工作,而是创建具有sudo权限的管理员。
- 连接仅通过SSH密钥实现,密码功能已禁用。
- 启用UFW:“除必要端口外全部关闭”。
- 安装Fail2Ban:在密码/密钥选择时封锁IP地址。
管理员用户与组
创建用户并将其添加至sudo权限组+限制性SSH组:
sudo adduser admin
sudo usermod -aG sudo admin
sudo groupadd -f sshusers
sudo usermod -aG sshusers admin
id admin
SSH密钥:生成与添加
在本地(Windows/macOS/Linux):
ssh-keygen -t ed25519 -C "key-for-admin"
在服务器上以root管理员或现有管理员身份:
sudo -u admin -H bash -lc 'mkdir -p ~/.ssh && chmod 700 ~/.ssh'
sudo -u admin -H bash -lc 'cat >> ~/.ssh/authorized_keys' # insert content *.pub, затем Ctrl+D
sudo -u admin -H bash -lc 'chmod 600 ~/.ssh/authorized_keys'
重要提示:仅将 .pub 公钥发送至服务器。私钥需本地存储。
强化 SSH 安全(禁用密码及 root 登录)
打开 /etc/ssh/sshd_config 文件,配置以下选项:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowGroups sshusers
重启SSH:
sudo systemctl restart sshd
在禁用密码之前,请确保密钥有效,否则您将失去访问权限。
UFW:默认关闭
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH # port 22
sudo ufw allow 80,443/tcp # if you need a website
sudo ufw enable
sudo ufw status numbered
需要额外的端口(例如8080)吗?请添加一条显式规则:sudo ufw allow 8080/tcp。
Fail2Ban:安装与自动启动
sudo apt -y install fail2ban
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban --no-pager
Fail2Ban配置:jail.local用于sshd
创建/修改
/etc/fail2ban/jail.local:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
bantime.increment = true
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
action = %(action_mwl)s
重启:
sudo systemctl restart fail2ban
%(action_mwl)s 发送一封电子邮件(如果电子邮件已配置)+ 记录日志,同时封禁该IP地址。
Fail2Ban 与 UFW 的集成(替代方案)
创建一个文件
/etc/fail2ban/jail.d/ufw-sshd.local:
[sshd]
enabled = true
action = ufw
maxretry = 5
findtime = 10m
bantime = 1h
申请:
sudo systemctl restart fail2ban
功能与协议验证
sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo tail -n 200 /var/log/fail2ban.log
sudo journalctl -u ssh --since "today"
sudo ufw status verbose
测试封锁效果:从其他节点进行5至6次失败的连接尝试,并检查sshd状态:该IP地址将出现在被封锁IP地址列表中。
安全加分项(可选)
- 更改SSH端口(非安全措施,但可减少扫描器干扰):在sshd_config中设置端口2222 + ufw allow 2222/tcp。
- 限制组级别的SFTP访问(chroot)。
- 为SSH启用双因素认证:libpam-google-authenticator + 配置/etc/pam.d/sshd和sshd_config(AuthenticationMethods publickey,keyboard-interactive)。
- 限制Sudo尝试次数:passwd -l root,sudo visudo设置timestamp_timeout=5。
安全检查清单
- 密钥连接正常工作,密码和root连接已禁用。
- UFW:拒绝入站连接/允许出站连接,仅开放必要端口。
- Fail2Ban保护sshd(可选保护nginx/postfix/…);协议已验证。
- 已执行阻断测试,规则和访问记录已存档。
