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_keys 和 AllowUsers 中移除对应账号。


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

相关推荐
摸爬滚打的小李11 分钟前
Spring XML + WAR + Tomcat 项目启动
后端
IT_陈寒1 小时前
SpringBoot自动配置的坑,这次终于爬出来了
前端·人工智能·后端
RainbowFish1 小时前
# RAG 与智能体记忆:从原理到工程实践 > 一篇给学习者的总结。
后端
苏三说技术2 小时前
为什么越来越多人用Arthas 4 ?
后端
ServBay2 小时前
AI 开发平台出事后,API Key 泄露要怎么办
后端·aigc·ai编程
程序员老申2 小时前
解剖 PDF 底层二进制:一行代码如何抓出假薪资流水的 3 处破绽
后端
JuiceFS2 小时前
从 Meta 的工程实践看 EB 级 AI 存储架构
人工智能·后端
数据库小学妹2 小时前
MySQL NULL陷阱:NOT IN、三值逻辑与NOT EXISTS
数据库·后端·mysql
AI入职记2 小时前
10 万个会话吃掉 1.1G 内存:Spring AI 会话记忆的两个隐藏成本
后端
小兔子3 小时前
getenv 返回的是别人的内存,改一下会改变整个进程的环境
后端