SSH 远程管理与安全加固 — 运维的守门之道

📖 知识点简介

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

⚠️ 常见坑点 & 注意事项

  1. 配置完 sshd_config 别忘跑 sshd -t 检查语法 --- 写错参数会导致 SSH 服务无法重启,把自己锁在外面。养成习惯,改完就跑检查。

  2. 修改端口 / 禁止 root / 禁用密码时,保持一个备用连接 --- 建议开两个 SSH 窗口,一个测试配置,一个保留旧会话。改完先用测试窗口确认能连上,再退出旧窗口。

  3. PermitRootLogin no + 普通用户的 sudo 权限 --- 日常操作走普通用户,必要时 sudo 提权。同时建议在 visudo 中限制 sudo 无需密码的命令范围,而非直接给 NOPASSWD:ALL。

  4. Ed25519 密钥优于 RSA 4096 --- 相同安全强度下 Ed25519 更短更快,生成和使用都更高效。不过老系统(如 CentOS 6)可能不支持,注意兼容性。

  5. ~/.ssh 目录权限必须严格 --- 700(目录本身),600(私钥),644(公钥)。权限过大 SSH 会直接拒绝使用该密钥。

bash 复制代码
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/config
  1. SSH 连接慢? --- 通常由 DNS 反向解析导致。在 sshd_config 中设置 UseDNS no 关闭,同时减少 GSSAPIAuthentication no 即可大幅加速。

  2. 定期轮换密钥 --- 建议每 6-12 个月更新一次主机密钥和用户密钥。员工离职记得从 authorized_keysAllowUsers 中移除对应账号。


运维无小事,守门是关键。SSH 配置合理加固后,80% 的外网扫描攻击都会被挡在门外。

相关推荐
IT_陈寒1 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
菜鸟谢3 小时前
Rust 智能指针完整详解
后端
菜鸟谢3 小时前
Rust 函数完整知识点详解
后端
爱勇宝3 小时前
淡泊名利之前,先承认我们都很焦虑
前端·后端·程序员
菜鸟谢3 小时前
Rust 闭包(Closure)完整详解
后端
ServBay3 小时前
如何利用本地技术栈构建 0 成本 AI SaaS 雏形
后端·aigc·ai编程
菜鸟谢3 小时前
Rust 集合 + 迭代器完整详解
后端
杨利杰YJlio3 小时前
Codex桌面客户端上手:项目、插件与自动化实战
前端·后端
常铭4 小时前
【Java基础】01-HashMap的底层原理
后端·面试