【运维】Linux 服务器实战(2):用户、sudo 与 SSH/fail2ban 安全
Linux 服务器实战 · 第 2 篇
第 1 篇完成初始化后,本篇锁定 账号、sudo、SSH 与暴力破解防护。
1. 用户与 sudo(推荐做法)
创建部署用户
sudo adduser deploy
sudo usermod -aG sudo deploy
用 drop-in 文件授权(不要直接改 /etc/sudoers)
echo 'deploy ALL=(ALL:ALL) ALL' | sudo tee /etc/sudoers.d/deploy
sudo chmod 440 /etc/sudoers.d/deploy
sudo visudo -c # 语法检查
查看 / 删除用户
getent passwd deploy
id deploy
sudo deluser --remove-home olduser
2. SSH 密钥登录(推荐)
本地 生成密钥(若还没有):
ssh-keygen -t ed25519 -C "your_email@example.com"
上传公钥到服务器:
ssh-copy-id deploy@YOUR_SERVER_IP
服务器 /etc/ssh/sshd_config 建议(改前先开第二个 SSH 会话测试):
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
生效:
sudo sshd -t && sudo systemctl reload sshd
3. 登录审计
# 成功登录
last -n 20
# 失败尝试(需 last 命令包)
sudo lastb -n 30
# 实时 SSH 日志
sudo journalctl -u ssh -f
# 或
sudo grep "Failed password" /var/log/auth.log | tail -20
统计失败 IP 次数:
sudo lastb | awk '{print $3}' | sort | uniq -c | sort -rn | head
4. fail2ban 防暴力破解
sudo apt update
sudo apt install -y fail2ban
最小 sshd 监狱(1 小时错 5 次 → 封 4 天,可按需改):
sudo tee /etc/fail2ban/jail.d/sshd.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
backend = systemd
maxretry = 5
findtime = 3600
bantime = 345600
EOF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
查看封禁 IP:
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip 1.2.3.4 # 误封解封
不推荐再用
hosts.deny+ cron 扫 auth.log 的老脚本——难维护,fail2ban 是主流方案。
5. 在线用户与会话
who -H
w
踢掉某终端(慎用):
sudo pkill -KILL -t pts/1
6. 改密码
passwd # 当前用户
sudo passwd deploy # root/sudo 改他人
常见坑
| 现象 | 处理 |
|---|---|
| 改 SSH 把自己锁外面 | 云控制台 VNC;改前保留 PasswordAuthentication yes 直到密钥测通 |
| fail2ban 封了自己 | 控制台登录 → fail2ban-client set sshd unbanip ... |
| sudo 报 syntax error | visudo -c 检查 /etc/sudoers.d/* |
系列导航
| 篇 | 主题 |
|---|---|
| 1 | 新服务器初始化 → /forum/13/ |
| 2 | 用户与 SSH 安全(本文) |
| 3 | 磁盘与 LVM |
| 4 | systemd 与 journal |
| 5 | 网络与 ufw |
| 6 | 性能监控 |
| 7 | 故障诊断 |
| 8 | 部署与 Cron |
本篇速查
sudo tee /etc/sudoers.d/deploy <<< 'deploy ALL=(ALL:ALL) ALL'
sudo apt install -y fail2ban && sudo systemctl enable --now fail2ban
last -n 10 && sudo lastb -n 10