SSH安全为什么是服务器加固的起点
服务器运维中,SSH是管理Linux服务器的核心通道,也是攻击者最常利用的入口。暴露在公网的SSH服务平均每分钟遭受数十次暴力破解尝试。密码认证方式下,即便设置了复杂密码,面对分布式字典攻击也难以幸免。SSH密钥认证从根本上解决了这个问题——私钥不通过网络传输,暴力破解在计算上不可行。服务器安全加固的第一步,就是把SSH从密码认证切换到密钥认证。
密钥对生成与分发规范
生成密钥对时,ed25519是当前推荐的选择,相比RSA在安全性和性能上均有优势:
ssh-keygen -t ed25519 -C "admin@prod-cluster-01" -f ~/.ssh/id_ed25519_prod
密钥文件命名规范建议包含用途标识,避免不同环境的密钥混用。生成后,私钥权限必须设为600:
chmod 600 ~/.ssh/id_ed25519_prod
chmod 644 ~/.ssh/id_ed25519_prod.pub
将公钥分发到目标服务器:
ssh-copy-id -i ~/.ssh/id_ed25519_prod.pub -p 22 root@192.168.1.100
批量分发场景下,使用sshpass配合循环脚本效率更高:
for host in $(cat server_list.txt); do
ssh-copy-id -i ~/.ssh/id_ed25519_prod.pub root@$host
done
SSHD配置加固参数详解
公钥部署完成后,修改/etc/ssh/sshd_config禁用密码认证:
# 认证方式
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 安全参数
PermitRootLogin prohibit-password
PermitEmptyPasswords no
MaxAuthTries 3
LoginGraceTime 30
# 网络层加固
Port 2222
ListenAddress 0.0.0.0
AllowTcpForwarding no
X11Forwarding no
# 日志审计
LogLevel VERBOSE
AuthLogFile /var/log/sshd_auth.log
修改后重启SSH服务,注意保持当前会话不断开,另开终端验证新配置:
systemctl restart sshd
# 新终端测试
ssh -i ~/.ssh/id_ed25519_prod -p 2222 root@192.168.1.100
密钥轮换与撤销机制
密钥不是一次配置终身安全,定期轮换是运维规范中的必要环节。建议每90天执行一次密钥轮换,离职人员密钥24小时内撤销。轮换流程:
# 1. 生成新密钥对
ssh-keygen -t ed25519 -C "admin@prod-cluster-01-$(date +%Y%m%d)" -f ~/.ssh/id_ed25519_prod_new
# 2. 并行部署新公钥,不删除旧公钥
for host in $(cat server_list.txt); do
ssh -i ~/.ssh/id_ed25519_prod -p 2222 root@$host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_ed25519_prod_new.pub
done
# 3. 验证新密钥可登录
ssh -i ~/.ssh/id_ed25519_prod_new -p 2222 root@192.168.1.100 echo "OK"
# 4. 确认无误后,删除旧公钥
for host in $(cat server_list.txt); do
ssh -i ~/.ssh/id_ed25519_prod_new -p 2222 root@$host "sed -i '/admin@prod-cluster-01/d' ~/.ssh/authorized_keys"
done
紧急撤销场景——某台服务器密钥泄露时,直接清空authorized_keys并重新部署可信公钥集合:
# 在堡垒机上维护可信公钥清单
cat /etc/ssh/trusted_keys/*.pub > /tmp/authorized_keys_new
for host in $(cat compromised_hosts.txt); do
scp /tmp/authorized_keys_new root@$host:/root/.ssh/authorized_keys
ssh root@$host "chmod 600 /root/.ssh/authorized_keys"
done
JumpServer堡垒机部署实践
密钥管理到一定规模后,分散在各运维人员本地的密钥文件成为新的安全盲区。堡垒机将所有SSH访问收口到统一入口,实现审计、授权、阻断三重控制。JumpServer是目前使用最广泛的开源堡垒机方案。部署JumpServer推荐使用官方All-in-One方式,最低配置4核8GB:
# 安装Docker
curl -fsSL https://get.docker.com | sh
systemctl enable docker && systemctl start docker
# 部署JumpServer
curl -sSL https://github.com/jumpserver/jumpserver/releases/download/v3.10.12/quick_start.sh -o quick_start.sh
bash quick_start.sh
安装完成后访问http://server-ip:80进入Web管理界面。初始账号admin/admin,首次登录必须修改密码。
JumpServer资产与授权配置
堡垒机上线的核心工作是资产导入和权限分配。在系统设置中先创建管理用户(用于堡垒机连接后端服务器的凭证),建议使用密钥认证。然后导入资产节点,按生产环境、测试环境、Web集群等维度组织节点树。授权策略遵循最小权限原则,web-team用户组仅授予生产环境/Web集群节点的访问权,系统用户区分只读和操作权限。高危命令过滤是安全线:禁止rm -rf /、dd if=/dev/zero、mkfs、fork bomb等破坏性命令,reboot等命令设置为告警加审批模式。
会话审计与异常告警
堡垒机的核心价值之一是全量会话录像。JumpServer默认录制所有SSH会话,可在审计模块回放。配置命令审计规则,对高危操作实时告警。配合JumpServer的API,将告警事件推送到企业IM:
import requests
JUMPSERVER_URL = "https://jumpserver.example.com"
API_TOKEN = "your-api-token"
def check_risk_commands():
url = f"{JUMPSERVER_URL}/api/v1/audits/commands/"
headers = {"Authorization": f"Bearer {API_TOKEN}"}
resp = requests.get(url, headers=headers, params={"risk": "3"}, timeout=10)
risky_cmds = resp.json()
for cmd in risky_cmds:
send_alert(cmd["user"], cmd["asset"], cmd["input"])
return risky_cmds
定期检查审计日志,将异常登录模式纳入运维看板,构建从密钥管理到行为审计的完整安全闭环。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/fu-wu-qi-an-quan-jia-gu-ssh-mi-yao-guan-li-yu-bao-lei-ji-bu/