PIGYun Docs
Linux 服务器 SSH 安全加固指南
适用场景:新购服务器、重装系统后首次加固,或定期安全审计
适用发行版:Ubuntu 18/20/22、Debian 10/11/12、CentOS 7/8、Rocky 9、Alma 9、Fedora 37+、Arch Linux
1. 生成 SSH 密钥对(推荐 ED25519)
以下命令在 本地电脑 执行,不要在服务器上生成密钥。
1.1 创建密钥
# 检查本地是否已有密钥
ls ~/.ssh/id_ed25519*
# 若不存在则生成
ssh-keygen -t ed25519 -C "admin@pigyun.com" -f ~/.ssh/id_pigyun_admin如需兼容旧系统,可改为 -t rsa -b 4096。1.2 设置密码(可选)
交互式提示输入 passphrase,可为空。
完成后得到:
~/.ssh/id_pigyun_admin # 私钥(**绝对保密**)
~/.ssh/id_pigyun_admin.pub # 公钥(上传服务器)1.3 一键上传公钥到服务器
# 假设服务器 IP 为 10.0.0.1,端口 22,用户 root
ssh-copy-id -i ~/.ssh/id_pigyun_admin.pub -p 22 root@10.0.0.1如果服务器已修改过端口,把 -p 22 换成实际端口。2. 关闭 SSH 密码登录
请先确保 密钥登录成功 再执行本节,防止被锁死。
2.1 修改 SSH 配置文件
sudo nano /etc/ssh/sshd_config2.2 推荐配置(仅保留关键项)
Port 22 # 先保持默认,改端口见第 3 节
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
PermitRootLogin prohibit-password # 若禁用 root 可改为 no
ChallengeResponseAuthentication no
UsePAM no # 某些发行版需保持 yes,见下文各发行版差异:
| 发行版 | UsePAM 建议 | 备注 |
|---|---|---|
| Ubuntu/Debian | 保持 UsePAM yes | 否则可能无法使用 system-auth |
| CentOS 7 | 保持 UsePAM yes | SELinux 依赖 |
| Rocky/Alma 9 | 保持 UsePAM yes | |
| Arch | 可改为 UsePAM no |
2.3 重载配置
# Debian/Ubuntu
sudo systemctl reload ssh
# RHEL/CentOS/Rocky/Alma/Fedora
sudo systemctl reload sshd
# Arch
sudo systemctl reload sshd2.4 验证
# 新开一个终端,**不要关闭当前会话**
ssh -i ~/.ssh/id_pigyun_admin root@10.0.0.1能登陆且 不提示输入密码 即成功。
3. 修改 SSH 端口(可选但强烈建议)
建议改为 1024–65535 之间未占用端口,如 22443。
3.1 检查端口占用
sudo ss -tulnp | grep ':22443'
# 无输出即可使用3.2 防火墙放行(按发行版)
Ubuntu / Debian(UFW)
sudo ufw allow 22443/tcp comment 'SSH-Alt'
sudo ufw reloadCentOS 7(Firewalld)
sudo firewall-cmd --permanent --add-port=22443/tcp
sudo firewall-cmd --reloadRocky / Alma / Fedora(Firewalld)
sudo firewall-cmd --permanent --add-port=22443/tcp
sudo firewall-cmd --reloadArch(iptables)
sudo iptables -A INPUT -p tcp --dport 22443 -j ACCEPT
# 持久化:安装 iptables-persistent 或 nftables3.3 修改 sshd 配置
sudo nano /etc/ssh/sshd_config将
Port 22改为
Port 22443
# 可同时保留 22 一行,测试成功后再删除3.4 SELinux 处理(RHEL 系)
# 安装策略工具
sudo dnf install -y policycoreutils-python-utils
# 添加新端口
sudo semanage port -a -t ssh_port_t -p tcp 22443
# 验证
sudo semanage port -l | grep ssh3.5 重启 SSH 服务
# Debian/Ubuntu
sudo systemctl restart ssh
# 其余发行版
sudo systemctl restart sshd3.6 测试新端口
ssh -i ~/.ssh/id_pigyun_admin -p 22443 root@10.0.0.1成功后,回到 旧会话 中删除 Port 22 行并再次重启,完成迁移。
4. 一键脚本(可选)
保存为 pigyun_ssh_harden.sh,执行前请阅读内容:
#!/usr/bin/env bash
set -euo pipefail
PORT=${1:-22443}
USER=${2:-root}
echo "== 1. 安装依赖 =="
if command -v apt &>/dev/null; then
sudo apt update && sudo apt install -y ufw
elif command -v dnf &>/dev/null; then
sudo dnf install -y firewalld policycoreutils-python-utils
sudo systemctl enable --now firewalld
elif command -v yum &>/dev/null; then
sudo yum install -y firewalld policycoreutils-python-utils
sudo systemctl enable --now firewalld
fi
echo "== 2. 防火墙放行 $PORT =="
if command -v ufw &>/dev/null; then
sudo ufw allow "$PORT/tcp" comment 'SSH-Alt'
elif command -v firewall-cmd &>/dev/null; then
sudo firewall-cmd --permanent --add-port="$PORT/tcp"
sudo firewall-cmd --reload
fi
echo "== 3. SELinux =="
if command -v semanage &>/dev/null; then
sudo semanage port -a -t ssh_port_t -p tcp "$PORT" || true
fi
echo "== 4. 修改 sshd =="
sudo sed -Ei "s/^#?Port.*/Port $PORT/" /etc/ssh/sshd_config
sudo sed -Ei 's/^#?PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
sudo sed -Ei 's/^#?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -Ei 's/^#?PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
echo "== 5. 重启服务 =="
sudo systemctl restart sshd || sudo systemctl restart ssh
echo "请使用新端口 $PORT 重新登录测试"用法:
chmod +x pigyun_ssh_harden.sh
./pigyun_ssh_harden.sh 22443 root5. 故障排查速查表
| 现象 | 排查命令 | 常见原因 | |
|---|---|---|---|
| 连接超时 | telnet IP 22443 | 防火墙/安全组未放行 | |
| 权限拒绝 | journalctl -u sshd | SELinux、文件夹权限 | |
| 仍提示密码 | `sshd -T | grep -i pass` | 配置未生效,需 reload |
| 找不到 semanage | dnf provides /usr/sbin/semanage | 未安装 policycoreutils-python-utils |
6. 参考与延伸阅读
- OpenSSH 官方手册:https://man.openbsd.org/sshd_config
- Ubuntu 社区 Wiki:https://help.ubuntu.com/community/SSH/OpenSSH/Configuring
- RHEL 9 安全指南:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/configuring_basic_system_settings/securing-the-openssh-server_configuring-basic-system-settings