Linux命令-sshd(SSH 服务器守护进程)
sshd(SSH Daemon)是 OpenSSH 的服务器端守护进程,负责监听 SSH 客户端连接请求并提供安全的加密 Shell 会话。它是 Linux 服务器远程管理的入口守护进程,其配置安全直接关系到整台服务器的安全防线。
快速参考
bash
sshd [选项]
sshd主配置文件为/etc/ssh/sshd_config,使用systemctl或service管理。修改配置后务必执行sshd -t进行语法检查,否则可能导致下次重启后无法远程连接。
服务管理
bash
# 查看 sshd 运行状态
systemctl status sshd
systemctl status ssh # Debian 系
# 启动/停止/重启
sudo systemctl start sshd
sudo systemctl stop sshd
sudo systemctl restart sshd
# 重载配置(不中断现有连接)
sudo systemctl reload sshd
# 设置开机自启
sudo systemctl enable sshd
# 查看 sshd 监听的端口
ss -tlnp | grep sshd
# 查看 sshd 进程
ps aux | grep sshd
配置文件详解
主配置文件 /etc/ssh/sshd_config:
apache
# === 端口与地址 ===
Port 22 # 监听端口(可多行指定多端口)
# Port 2222
ListenAddress 0.0.0.0 # 监听地址
# ListenAddress 192.168.1.1
# === 认证方式 ===
PermitRootLogin prohibit-password # 禁止 root 密码登录
# PermitRootLogin no # 完全禁止 root 登录
PubkeyAuthentication yes # 启用公钥认证
PasswordAuthentication no # 禁止密码认证(密钥部署后务必开启)
PermitEmptyPasswords no # 禁止空密码
ChallengeResponseAuthentication no # 禁止键盘交互
# === 密钥与算法 ===
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_rsa_key
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# === 连接限制 ===
MaxAuthTries 3 # 最大认证尝试次数
MaxSessions 10 # 每个连接最大会话数
MaxStartups 10:30:100 # 未认证连接限制
LoginGraceTime 30 # 认证超时(秒)
ClientAliveInterval 300 # 心跳检测间隔
ClientAliveCountMax 3 # 心跳检测失败次数上限
# === 访问控制 ===
AllowUsers deploy admin # 白名单(允许的用户)
# AllowGroups sshusers # 允许的用户组
# DenyUsers guest # 黑名单
# DenyGroups guests
# === 端口转发与隧道 ===
AllowTcpForwarding yes # 允许 TCP 转发
AllowStreamLocalForwarding yes
GatewayPorts no # 禁止远程转发绑定到 0.0.0.0
X11Forwarding no # 通常不需要 X11 转发
PermitTunnel no # 禁止 TUN 设备隧道
# === 日志与子系统 ===
SyslogFacility AUTH
LogLevel INFO
Subsystem sftp /usr/lib/openssh/sftp-server
# === 高性能调优 ===
UseDNS no # 禁用 DNS 反向解析(加速连接)
Compression yes # 启用压缩
TCPKeepAlive yes # TCP KeepAlive
安全加固清单
bash
# 1. 检查配置语法(任何修改后必须先执行!)
sshd -t
# 2. 测试运行(前台调试模式)
sudo /usr/sbin/sshd -d
# Ctrl+C 退出,不会影响现有连接
# 3. 测试特定用户的配置解析结果
sshd -T -C user=deploy,addr=192.168.1.100
# 显示该用户在该来源 IP 下实际生效的配置
# 4. 安全基线检查脚本
check_sshd_security() {
local config="/etc/ssh/sshd_config"
echo "=== SSHD 安全审计 ==="
# 检查密码登录
grep -q "^PasswordAuthentication no" "$config" && \
echo "✅ 密码登录已禁用" || \
echo "❌ 密码登录未禁用"
# 检查 root 登录
grep -q "^PermitRootLogin" "$config" && \
echo "✅ Root 登录已限制" || \
echo "⚠️ 应配置 PermitRootLogin"
# 检查空密码
grep -q "^PermitEmptyPasswords no" "$config" && \
echo "✅ 空密码已禁用" || \
echo "❌ 空密码未禁用"
# 检查协议版本
grep -q "^Protocol 2" "$config" && \
echo "✅ 仅使用 SSH 协议 2" || \
echo "⚠️ 检查协议版本"
# 检查 UseDNS
grep -q "^UseDNS no" "$config" && \
echo "✅ DNS 反向解析已禁用" || \
echo "⚠️ 建议禁用 UseDNS 加速登录"
}
check_sshd_security
访问控制高级配置
bash
# 按用户/组限制
# /etc/ssh/sshd_config 中添加:
AllowUsers deploy@192.168.1.* admin@10.0.0.*
# 只允许 deploy 从 192.168.1.* 登录
# 只允许 admin 从 10.0.0.* 登录
# 匹配块(Match Blocks)
cat >> /etc/ssh/sshd_config << 'EOF'
# 管理员组:允许密码和密钥
Match Group admins
PasswordAuthentication yes
PubkeyAuthentication yes
# SFTP 用户组:限制为 SFTP only
Match Group sftpusers
ForceCommand internal-sftp
ChrootDirectory /sftp/%u
X11Forwarding no
AllowTcpForwarding no
PermitTTY no
# 特定 IP 来源限制(从外网必须用密钥)
Match Address !192.168.0.0/16
PasswordAuthentication no
PubkeyAuthentication yes
EOF
日志与审计
bash
# 查看登录成功记录
sudo grep "Accepted" /var/log/auth.log | tail -20
# RHEL/CentOS 使用 /var/log/secure
# 查看登录失败记录
sudo grep "Failed password" /var/log/auth.log | tail -20
# 统计失败尝试 IP 排行
sudo grep "Failed password" /var/log/auth.log | \
grep -oP 'from \K\S+' | sort | uniq -c | sort -rn | head -10
# 实时监控登录
sudo tail -f /var/log/auth.log | grep sshd
# 查看当前在线 SSH 用户
who
w
ss -tnp state established '( sport = :22 )'
# 踢出特定用户
sudo pkill -u username sshd
fail2ban 集成
bash
# 安装 fail2ban 防止暴力破解
sudo apt-get install fail2ban
# 配置 SSH 保护
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600
EOF
sudo systemctl restart fail2ban
# 查看封禁列表
sudo fail2ban-client status sshd
# 手动封禁/解封
sudo fail2ban-client set sshd banip 192.168.1.100
sudo fail2ban-client set sshd unbanip 192.168.1.100
密钥轮换流程
bash
# 1. 生成新的主机密钥
sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
# 2. 更新配置
echo "HostKey /etc/ssh/ssh_host_ed25519_key" | sudo tee -a /etc/ssh/sshd_config
# 3. 测试配置
sudo sshd -t
# 4. 重载服务
sudo systemctl reload sshd
# 5. 清理旧密钥指纹
# 客户端执行:
ssh-keygen -R old-host.example.com
# 6. 通知客户端(或使用 SSHFP DNS 记录)
ssh-keyscan -H new-host.example.com >> ~/.ssh/known_hosts
致命警告:在进行 sshd 配置修改时,始终保留一个已有的活动 SSH 会话。在新会话测试连接成功之前,千万不要断开已有会话------一旦配置错误导致无法登录,现有会话是唯一的救生线。
sshd 的安全配置是 Linux 服务器安全的第一道防线。从禁用密码登录到配置 fail2ban,从限制 root 访问到启用密钥认证,每一步都是构建纵深防御体系的基石。