📖 知识点简介
SSH(Secure Shell)是运维操作的核心通道,服务器维护基本都通过 SSH 远程完成。掌握 SSH 配置优化与安全加固,能有效防止暴力破解、会话劫持等安全风险,是运维的基本功。
🛠️ 核心命令整理
1. SSH 连接基础
bash
# 默认端口连接
ssh user@host
# 指定端口(常见非默认端口)
ssh -p 2222 user@host
# 指定密钥文件
ssh -i ~/.ssh/id_ed25519 user@host
# 启用压缩(慢网络下提效)
ssh -C user@host
# 端口转发:本地转发(将远程服务的 3306 映射到本地 3307)
ssh -L 3307:localhost:3306 user@host
# 端口转发:远程转发(将本地 80 暴露到远程 8080)
ssh -R 8080:localhost:80 user@host
# SOCKS 代理(浏览器翻墙排查用)
ssh -D 1080 user@host
2. 密钥管理
bash
# 生成 ED25519 密钥(推荐,比 RSA 更安全且高效)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 生成 RSA 密钥(兼容旧系统)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 复制公钥到远程服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host
# 手动添加公钥(当 ssh-copy-id 不可用时)
cat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 查看密钥指纹
ssh-keygen -lf ~/.ssh/id_ed25519.pub
# 远程主机密钥指纹验证(初次连接时使用)
ssh-keyscan -t ed25519 host.example.com
3. 安全检测与审计
bash
# 查看当前登录用户
who
w
# 查看最近登录失败记录
lastb
# 查看成功登录记录
last
# 查看 SSH 服务日志(定位异常)
journalctl -u sshd --since "1 hour ago"
# 检查 SSH 服务状态
systemctl status sshd
# 查看当前所有 SSH 连接
ss -tnp | grep ':22'
📋 实操示例
场景:SSH 安全加固配置
编辑 /etc/ssh/sshd_config 进行安全加固:
bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo vim /etc/ssh/sshd_config
推荐配置项:
ini
# 修改默认端口(避开 22,减少扫描攻击)
Port 22222
# 禁止 root 直接登录(日常操作使用普通用户 + sudo)
PermitRootLogin no
# 仅允许密钥登录,禁止密码
PasswordAuthentication no
PubkeyAuthentication yes
# 指定允许登录的用户(白名单,强烈推荐)
AllowUsers alice bob
# 限制 SSH 协议版本(仅使用 SSHv2)
Protocol 2
# 无密码交互超时 & 最大认证尝试
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 10
# 空闲超时自动断开
ClientAliveInterval 300
ClientAliveCountMax 2
修改后重启服务:
bash
sudo sshd -t # 预检查配置语法
sudo systemctl restart sshd # 或 sshd
场景:配置免密 + SSH Config 简化操作
编辑 ~/.ssh/config:
ssh-config
Host prod-web
HostName 192.168.1.100
Port 22222
User deploy
IdentityFile ~/.ssh/id_ed25519_prod
Host dev-db
HostName 10.0.0.5
Port 22
User admin
IdentityFile ~/.ssh/id_ed25519_dev
LocalForward 3307 localhost:3306
Host *
ServerAliveInterval 60
StrictHostKeyChecking ask
之后直接 ssh prod-web 即可,无需每次输入完整参数。
场景:Fail2Ban 防御暴力破解
bash
# 安装
sudo apt install fail2ban # Debian/Ubuntu
sudo yum install fail2ban # CentOS/RHEL
# 配置 SSH 保护
sudo vim /etc/fail2ban/jail.local
ini
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 5
bantime = 3600 # 封禁 1 小时
findtime = 600 # 10 分钟内
bash
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd # 查看被封禁的 IP
⚠️ 常见坑点 & 注意事项
-
配置完 sshd_config 别忘跑
sshd -t检查语法 --- 写错参数会导致 SSH 服务无法重启,把自己锁在外面。养成习惯,改完就跑检查。 -
修改端口 / 禁止 root / 禁用密码时,保持一个备用连接 --- 建议开两个 SSH 窗口,一个测试配置,一个保留旧会话。改完先用测试窗口确认能连上,再退出旧窗口。
-
PermitRootLogin no+ 普通用户的sudo权限 --- 日常操作走普通用户,必要时sudo提权。同时建议在visudo中限制sudo无需密码的命令范围,而非直接给 NOPASSWD:ALL。 -
Ed25519 密钥优于 RSA 4096 --- 相同安全强度下 Ed25519 更短更快,生成和使用都更高效。不过老系统(如 CentOS 6)可能不支持,注意兼容性。
-
~/.ssh目录权限必须严格 ---700(目录本身),600(私钥),644(公钥)。权限过大 SSH 会直接拒绝使用该密钥。
bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/config
-
SSH 连接慢? --- 通常由 DNS 反向解析导致。在
sshd_config中设置UseDNS no关闭,同时减少GSSAPIAuthentication no即可大幅加速。 -
定期轮换密钥 --- 建议每 6-12 个月更新一次主机密钥和用户密钥。员工离职记得从
authorized_keys和AllowUsers中移除对应账号。
运维无小事,守门是关键。SSH 配置合理加固后,80% 的外网扫描攻击都会被挡在门外。