Linux 服务器 SSH 安全加固指南[端口修改|密钥登录等]

🌙
⬆️

Linux 服务器 SSH 安全加固指南[端口修改|密钥登录等]

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_config

2.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 yesSELinux 依赖
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 sshd

2.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 reload

CentOS 7(Firewalld)

sudo firewall-cmd --permanent --add-port=22443/tcp
sudo firewall-cmd --reload

Rocky / Alma / Fedora(Firewalld)

sudo firewall-cmd --permanent --add-port=22443/tcp
sudo firewall-cmd --reload

Arch(iptables)

sudo iptables -A INPUT -p tcp --dport 22443 -j ACCEPT
# 持久化:安装 iptables-persistent 或 nftables

3.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 ssh

3.5 重启 SSH 服务

# Debian/Ubuntu
sudo systemctl restart ssh

# 其余发行版
sudo systemctl restart sshd

3.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 root

5. 故障排查速查表

现象排查命令常见原因
连接超时telnet IP 22443防火墙/安全组未放行
权限拒绝journalctl -u sshdSELinux、文件夹权限
仍提示密码`sshd -Tgrep -i pass`配置未生效,需 reload
找不到 semanagednf provides /usr/sbin/semanage未安装 policycoreutils-python-utils

6. 参考与延伸阅读

PIGYun 服务器 Windows RDP 连接详细教程
防火墙入门:UFW、Firewalld 与 iptables 场景速查

✍️ 添加新评论

💨 由 PIGYun全球优质服务器 提供快速评论体验
🚀 评论由PIGYun高性能服务器处理