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% 的外网扫描攻击都会被挡在门外。

相关推荐
谭光志3 小时前
Vibe Coding 时代,程序员该何去何从
前端·后端·ai编程
GoGeekBaird3 小时前
我用 BeeWeave 跑完了一次完整写作闭环
后端·github
仿生狮子5 小时前
别再说“全栈”了,AI 时代团队只认这 5 种人
前端·人工智能·后端
Reart7 小时前
Leetcode 213.打家劫舍2(内含闲谈,打劫真是技术活,好题,716)
后端·算法
触底反弹7 小时前
🔥 RAG 到底是怎么工作的?掰开揉碎了给你讲明白!
javascript·人工智能·后端
techdashen8 小时前
Go 1.26 新增 `bytes.Buffer.Peek`:只看数据,不移动读取位置
开发语言·后端·golang
Reart8 小时前
Leetcode 198.打家劫舍(716)
后端·算法
Java编程爱好者8 小时前
Spring6.0+Boot3.0:秒级启动、万级并发的开发新姿势
后端
YYYing.9 小时前
【C++大型项目之高性能服务器框架 (七) 】Socket与ByteArray模块
服务器·c++·后端·框架·高性能·c/c++
青山木9 小时前
一把 Redis 分布式锁,踩透四个坑:锁争抢、僵尸锁、锁过期、锁丢失
java·数据库·redis·后端