返回文章列表
网络安全

Linux服务器安全防御攻略

匿名
2025-12-05
3小时前
Linux服务器安全防御攻略

SSH 作为服务器管理的关键入口,其安全是基础设施的首要任务。默认的 TCP 22 端口持续遭受自动化扫描和暴力破解的威胁。这种攻击模式将消耗系统资源,并极可能导致 Root 权限失陷,引发严重的业务中断及数据泄露。

本文旨在想要分享一套高标准的安全强化流程,应对不必要的安全威胁。


1.服务端口迁移:将 SSH 监听端口迁移至随机高位端口(建议5位随机端口,0<N<5535),显著降低被扫描器发现的概率,实现隐蔽性防御。

2.强制公钥认证:彻底禁用密码认证,采用安全强度最高的非对称密钥对机制作为唯一认证方式,从根本上杜绝暴力破解。


请严格遵循本文的每一步骤,以确保您的服务器环境得到可靠的加固。

第一部分:基础配置 — 密钥认证

使用非对称密钥认证是抵御暴力破解最有效的手段。我们首先进行密钥对的生成和授权。

1.1 本地 SSH 密钥生成 (客户端操作)

我们推荐使用安全性领先的 ED25519 算法生成密钥对。

示例路径D:/ssh_key/Server_SSH_ed25119


# 假设您在 Windows/PowerShell 环境下执行此操作# 检查并创建密钥对存储目录mkdir -Force "D:/ssh_key"
# 执行密钥生成命令(-t 指定算法,-f 指定路径和名称)ssh-keygen -t ed25519 -C "Server_SSH_ed25119 Key" -f "D:/ssh_key/Server_SSH_ed25119"
这里可以使用我自己搭建的强密码生成器

(点击推文底部"阅读原文")https://lilyxuan.online/tools/password-generator/


# 提示输入密钥密码(passphrase):强烈建议设置,用于加密存储私钥文件,提供二次保护。Enter passphrase (empty for no passphrase): [输入密码]Enter same passphrase again: [再次输入密码]
# 成功后将生成两个文件:# 1. Server_SSH_ed25119         (私钥文件,需严格保管,不得泄露)# 2. Server_SSH_ed25119.pub     (公钥文件,用于上传至服务器)

1.2 公钥上传与授权 (服务器端操作)

将公钥内容部署到目标用户的授权文件 (authorized_keys) 中,以完成授权。

  1. 登录服务器(使用现有密码或旧密钥)。
  2. 切换到目标用户(如果当前是 root):su - LinuxDB13
  3. 创建并配置 .ssh 目录权限:
mkdir -p ~/.sshchmod 700 ~/.ssh
  1. 上传公钥内容:
  2. 设置授权文件权限 (核心安全步骤):正确的权限设置(仅限用户读写)是 SSH 密钥认证机制生效的前提,并防止非授权访问。
chmod 600 ~/.ssh/authorized_keys

1.3 验证 SSH 密钥连接

在客户端使用新密钥连接服务器,确认认证机制工作正常。


# 请将 [服务器公网IP] 替换为您的实际 IPssh -i "D:/ssh_key/Server_SSH_ed25119" LinuxDB13@[服务器公网IP] -p 54321

第二部分:服务强化 — 端口迁移与配置文件加固

⚠️⚠️⚠️ 风险提示: 在执行端口封禁和禁用密码操作前,请务必确认您已成功使用新密钥和自定义端口建立连接。任何配置失误可能导致远程连接中断。

上述操作前置条件已满足: 密钥连接验证成功后,即可开始进行配置文件加固。

2.1 配置 SSH 多端口监听

编辑 SSH 服务的主配置文件 /etc/ssh/sshd_config,进行端口迁移和安全策略配置。

(我的服务器系统为 Debian-12.0_x64 默认不安装vim,为了便捷使用,这边先使用nano编辑器)


sudo nano /etc/ssh/sshd_config

配置更改示例(Hajimi 服务器):

建议不要直接禁用Root登录,先测试连接


# /etc/ssh/sshd_config# ===== 基本配置:配置多端口监听 =====Port 54321                  # 主 SSH 监听端口 (已迁移至高位端口)Port 43210                  # 备用 SSH 监听端口 (提供冗余连接通道)# ===== 认证安全配置:禁用不安全方式 (密钥配置成功后才能进行) =====PermitRootLogin yes         # 禁止 root 用户直接登录 (强制使用普通用户登录后提权)PasswordAuthentication no   # 禁用密码登录 (强制公钥认证)PubkeyAuthentication yes    # 启用密钥认证MaxAuthTries 3              # 最大认证尝试次数 (限制暴力破解尝试)LoginGraceTime 30s          # 登录宽限时间# ===== 其他安全设置 =====StrictModes yes             # 检查用户家目录和文件权限UsePrivilegeSeparation yes  # 启用权限分离 (维持默认安全配置)

2.2 重启服务并检查监听状态

应用配置并验证服务状态,确保新端口已处于监听状态。


# 1. 检查配置文件语法 (关键步骤:确认无语法错误)sudo sshd -t# 2. 重启 SSH 服务sudo systemctl restart sshd# 3. 检查服务状态(确认监听自定义端口)sudo systemctl status ssh.service

2.3 防火墙与 Fail2Ban 保护

防火墙规则 (UFW 强化步骤): 务必在系统防火墙(如 UFW)中开放自定义端口 (54321, 43210),并设置严格的默认策略。

设置默认策略(默认拒绝所有传入连接)


# 默认拒绝所有传入连接(所有流量默认被丢弃)ufw default deny incoming# 默认允许所有传出连接(您的服务器可以访问外部服务)ufw default allow outgoing 

开放自定义 SSH 端口


# 开放主 SSH 端口 (54321)ufw allow 54321/tcp# 开放备用 SSH 端口 (43210)ufw allow 43210/tcp

提示:如果您的服务器运行网站服务,请务必开放 HTTP/HTTPS 端口:


ufw allow httpufw allow https
  1. 启用防火墙ufw enable# 确认提示:Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
  2. 验证规则ufw status numbered

Fail2Ban 保护: 配置 Fail2Ban 扩展保护范围至所有监听端口,以应对扫描和连接尝试。


# /etc/fail2ban/jail.local[sshd]enabled = true# 保护默认端口 (22) 和自定义端口port    = ssh,54321,43210logpath = /var/log/auth.logmaxretry = 3bantime = 3600

第三部分:SSH 服务故障排除与诊断

若服务重启失败,请按以下专业步骤诊断和修复问题。

3.1 诊断核心工具:sshd -t

使用 sshd -t 进行配置文件语法和环境的快速检查。无输出表示配置正确。

常见问题一:配置文件语法错误

  • 现象:sshd -t 报错 keyword XXXXX extra arguments at end of line。
  • 修复: 检查 /etc/ssh/sshd_config 中,配置项与行尾注释 # 之间是否缺少空格或存在非法字符。

常见问题二:权限分离目录缺失

  • 现象:sshd -t 报错 Missing privilege separation directory: /run/sshd。这通常是系统环境或目录权限问题。
  • 修复步骤(以 Hajimi 服务器为例): 手动创建并修复目录权限。
# 1. 创建缺失的目录root@Hajimi:~# sudo mkdir /run/sshd# 2. 设置正确的权限 (755)root@Hajimi:~# sudo chmod 0755 /run/sshd# 3. 设置正确的用户和组所有权 (root:root)root@Hajimi:~# sudo chown root:root /run/sshd# 4. 再次验证,确保无输出root@Hajimi:~# sudo sshd -troot@Hajimi:~# 

3.2 最终确认服务状态

在任何修复操作后,请再次执行以下命令确认服务状态:


sudo systemctl restart sshdsudo systemctl systemctl status ssh.service
# 预期输出将显示服务 active (running),并确认监听正确的自定义端口root@Hajimi:~# systemctl status ssh.service● ssh.service - OpenBSD Secure Shell server     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; preset: enabled)     Active: active (running) since Fri 2025-12-05 10:52:55 CST; 2h 1min ago       Docs: man:sshd(8)             man:sshd_config(5)    Process: 131467 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)   Main PID: 131468 (sshd)      Tasks: 1 (limit: 2306)     Memory: 4.7M        CPU: 192ms     CGroup: /system.slice/ssh.service             └─131468 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"Dec 05 10:53:23 ser1424392755 sshd[133249]: pam_unix(sshd:session): session closed for user rootDec 05 12:39:12 ser1424392755 sshd[136033]: Accepted password for root from **** port 9721 ssh2Dec 05 12:39:12 ser1424392755 sshd[136033]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)Dec 05 12:39:12 ser1424392755 sshd[136033]: pam_env(sshd:session): deprecated reading of user environment enabledDec 05 12:44:12 ser1424392755 sshd[136056]: Accepted password for root from **** port 9342 ssh2Dec 05 12:44:12 ser1424392755 sshd[136054]: Accepted password for root from **** port 9340 ssh2Dec 05 12:44:12 ser1424392755 sshd[136054]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)Dec 05 12:44:12 ser1424392755 sshd[136056]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)Dec 05 12:44:13 ser1424392755 sshd[136054]: pam_env(sshd:session): deprecated reading of user environment enabledDec 05 12:44:13 ser1424392755 sshd[136056]: pam_env(sshd:session): deprecated reading of user environment enabledroot@Hajimi:~#


本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。

分享文章
合作伙伴

本站所有广告均是第三方投放,详情请查询本站用户协议