上一篇 下一篇 分享链接 返回 返回顶部

韩国服务器上线前如何加固SSH与防火墙:端口、最小权限和审计怎么安排

发布人:Minchunlin 发布时间:1 天前 阅读量:6
韩国服务器上线前如何加固SSH与防火墙:端口、最小权限和审计怎么安排

韩国服务器上线后,最难处理的往往不是单次登录失败,而是管理端口被防火墙误封、密钥配置错误导致无人能够登录,或者为了“方便排障”开放了过多端口,最终扩大了攻击面。上线前的加固目标应当明确:只暴露业务确实需要的端口,只允许经过验证的管理身份进入,只授予必要权限,并确保配置变更后仍有可回退、可审计的路径。

实际操作时,先保留当前SSH会话,不要同时关闭所有远程入口;准备服务器控制台、带外管理或其他救援通道;记录当前管理账号、SSH端口、业务端口和管理员来源地址。之后按“端口盘点—SSH认证—防火墙—权限与补丁—审计—恢复验证”的顺序推进,每完成一项就从外部重新测试一次。

先确定资产范围和回退条件

韩国服务器上线前,至少要明确以下几类资产:

资产或入口需要确认的内容默认处理原则
SSH管理入口端口、账号、密钥、管理员来源地址仅允许指定账号和来源进入
Web业务入口实际使用的TCP端口和监听地址只开放业务需要的端口
数据库、缓存、内部接口是否需要公网访问优先绑定回环地址或内网地址
系统服务哪些服务随系统启动未确认用途前不要直接停用
日志与审计登录、提权、配置修改是否留痕保证时间、空间和留存策略可用

先核验操作系统和SSH服务名称,避免把不同发行版的命令混用:

cat /etc/os-release
systemctl list-unit-files | grep -E '^(ssh|sshd)\.service'
command -v sshd

修改前备份SSH配置、防火墙现状和关键业务配置。备份文件应保存到不会被后续编辑覆盖的位置,并确认确实可以读取。若服务器提供快照功能,也应在变更前建立可识别的快照,但快照不能替代配置备份和恢复测试。

预演失败:上线后最可能出现的几类故障

可以先假设加固已经失败,再检查触发条件和早期信号。这样比单纯堆叠安全参数更容易发现高风险步骤。

可能的失效场景常见触发条件早期信号预防与恢复
管理员被锁在服务器外新SSH端口未放行、来源IP填写错误、配置语法错误第二个终端无法建立连接,原会话仍正常保留原会话和控制台,先验证新入口,再关闭旧入口
密钥认证不可用公钥路径或权限错误,账号没有登录ShellPermission denied (publickey)先用第二个终端测试密钥;检查~/.ssh和authorized_keys权限
业务服务中断防火墙只放行了管理端口,遗漏业务端口端口连接超时,服务本机正常先建立端口清单,再从外部验证每个业务入口
数据库或内部接口暴露服务绑定在0.0.0.0,防火墙规则过宽ss -lntup显示公网监听改为回环或内网绑定,并从外部确认端口不可达
发生问题后无法追溯日志未持久化、磁盘已满、时间不一致查询不到登录或提权记录上线前检查日志空间、时间和关键事件,必要时转存到独立日志系统

这里的核心判断是:任何会改变远程访问路径的操作,都必须有“当前会话、第二个测试会话、控制台或带外入口”中的至少两种保障。没有恢复通道时,不应在唯一远程连接上直接关闭密码、变更端口或启用严格防火墙。

先盘点端口,再决定开放范围

端口号本身不是安全边界。把SSH从默认端口改到其他端口,可以减少一部分自动化扫描噪声,但不能替代密钥认证、来源限制和补丁管理。真正需要解决的是“哪些服务正在监听、谁应该访问、是否必须公网可达”。

在服务器上查看监听情况:

sudo ss -lntup

重点记录以下信息:

  • 0.0.0.0或::监听的服务,代表可能接受公网连接;
  • 绑定在127.0.0.1或::1的服务,通常只供本机使用;
  • 数据库、缓存、管理面板等非业务端口是否意外暴露;
  • 端口对应的进程和启动服务,避免只看端口号而不知道责任归属。

可以建立一份上线端口表:

用途监听地址是否公网访问防火墙策略
SSH管理指定地址或公网地址否,仅管理员来源限定来源IP和管理账号
Web业务公网地址是,如确有业务需要仅开放实际使用的业务端口
数据库127.0.0.1或内网地址通常否不开放公网,必要时限制内网来源
监控或运维接口内网地址通常否仅允许监控或管理网段

如果发现数据库或内部服务监听公网地址,应先确认业务依赖,再修改服务自身的监听配置。防火墙可以阻挡访问,但不能掩盖服务绑定过宽的问题。修改监听地址后,要同时检查应用配置、服务状态和本机连接,防止应用因为连接地址变化而中断。

SSH加固:先验证密钥,再收紧认证

最小风险的顺序是:先建立一个专用管理账号并验证密钥登录,再禁止直接使用root和密码登录。不要在密钥尚未成功验证前关闭密码认证。

创建或核验管理账号

如果已有个人管理账号,应避免多人共用同一个账号。账号应使用个人密钥登录,再通过受控的sudo权限执行必要操作。将账号加入专用管理组前,要确认当前账号已经加入,否则可能把自己排除在允许登录的组之外。

getent group sshusers || sudo groupadd sshusers
sudo usermod -aG sshusers ADMIN_USER
id ADMIN_USER

上面的ADMIN_USER需要替换为实际账号。不同发行版的管理员组可能是sudo或wheel,不要根据记忆直接修改,先检查现有权限:

sudo -l -U ADMIN_USER

为管理账号配置公钥时,使用该账号自己的家目录,并检查权限:

install -d -m 700 /home/ADMIN_USER/.ssh
install -m 600 /tmp/authorized_keys.checked /home/ADMIN_USER/.ssh/authorized_keys
chown -R ADMIN_USER:ADMIN_USER /home/ADMIN_USER/.ssh

/tmp/authorized_keys.checked只是示例路径,实际操作时应使用经过核对的公钥文件。不要把私钥上传到服务器,也不要把多个管理员长期共用同一套私钥。

从管理员电脑开启第二个终端测试:

ssh -o IdentitiesOnly=yes -p SSH_PORT ADMIN_USER@SERVER_IP

只有在第二个终端能够稳定登录、并且确认sudo权限符合预期后,才进入下一步。

收紧sshd配置

先备份配置。若系统支持/etc/ssh/sshd_config.d/,可以使用独立的加固文件;如果不支持,则编辑主配置文件。编辑前确认当前OpenSSH版本支持相应配置项:

sshd -V
sudo sshd -T | head

使用sudoedit创建或修改加固配置,示例内容如下:

PubkeyAuthentication yes
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
LoginGraceTime 30
AllowGroups sshusers
X11Forwarding no

这些设置需要结合实际环境使用:

  • PermitRootLogin no适合由普通管理账号配合sudo执行管理操作的环境;
  • PasswordAuthentication no只能在密钥登录已验证后启用;
  • AllowGroups sshusers要求实际管理员已经加入该组,否则会拒绝不在组内的账号;
  • X11Forwarding no适合不需要图形转发的服务器;
  • MaxAuthTries和LoginGraceTime用于减少反复认证和长时间占用,但不应替代来源地址限制;
  • 如果环境依赖多因素认证或PAM交互认证,不要未经验证就关闭KbdInteractiveAuthentication;
  • AllowTcpForwarding no、AllowAgentForwarding no等更严格选项可能影响既有运维流程,只有在确认业务和运维不依赖转发时再启用。

配置完成后,必须先做语法检查,再重新加载服务:

sudo sshd -t
sudo sshd -T | egrep 'port|permitrootlogin|passwordauthentication|pubkeyauthentication|maxauthtries|allowgroups'

确认无输出错误后,根据实际服务名执行重新加载:

sudo systemctl reload ssh

如果系统中只有sshd.service,则使用:

sudo systemctl reload sshd

重新加载后不要关闭原来的SSH会话,使用第二个终端再次验证新配置。如果失败,先查看日志而不是反复修改:

sudo journalctl -u ssh -u sshd -n 80 --no-pager

如果提示密钥被拒绝,优先检查账号、家目录所有者、.ssh目录权限、authorized_keys内容和SELinux等访问控制状态;如果提示配置项不识别,应根据sshd -t的结果删除或调整不兼容的配置,而不是猜测参数名称。

防火墙:只放行业务必需的流量

一台服务器只应使用一个主要防火墙管理工具。不要在不了解现有规则的情况下同时启用UFW、firewalld和手工规则,否则运行时规则与持久化规则可能不一致。

使用UFW的系统

先查看当前规则,保存一份文本记录:

sudo ufw status verbose
sudo ufw status numbered | tee ~/ufw-before-hardening.txt

下面是示例策略。ADMIN_PUBLIC_IP和SSH_PORT必须替换为实际值,业务端口只在确实使用时开放:

sudo ufw allow from ADMIN_PUBLIC_IP to any port SSH_PORT proto tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable

启用前要特别确认第一条规则已经覆盖当前管理员的公网出口地址。如果管理员使用动态地址、多个办公地点或移动网络,单一来源限制可能导致正常运维受阻,应先设计可用的管理网段或保留控制台恢复路径。

default allow outgoing对多数服务器更兼容,但并不代表出站流量不需要治理。若业务要求严格限制出站访问,应先列出DNS、时间同步、软件仓库、外部API和日志传输等依赖,再逐项放行,不能直接套用“全部拒绝出站”。

使用firewalld的系统

先确认活动区域和当前规则:

sudo firewall-cmd --get-active-zones
sudo firewall-cmd --zone=public --list-all

确认实际使用的区域后,再添加持久化规则。以下以public区域为例:

sudo firewall-cmd --permanent --zone=public --add-port=SSH_PORT/tcp
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-all

如果SSH管理来源固定,可以改用来源地址限制:

sudo firewall-cmd --permanent --zone=public \
  --add-rich-rule='rule family="ipv4" source address="ADMIN_PUBLIC_IP" port port="SSH_PORT" protocol="tcp" accept'
sudo firewall-cmd --reload

先添加新规则并验证连接,再考虑删除原有的宽泛SSH规则。删除规则前应确认该规则确实是本次加固新增或准备替换的规则,避免误删其他管理员或监控系统的访问权限。

无论使用哪种防火墙,都要注意三个边界:

  1. 只开放实际监听且确有业务需求的端口;
  2. 管理端口优先限制来源地址,不能只依赖“改端口”;
  3. 防火墙规则不能替代应用层认证、服务补丁和本机权限控制。

最小权限和补丁安排

SSH加固完成后,还要检查“登录后能做什么”。管理员不应长期直接使用root工作;应用进程、定时任务和后台服务也不应在没有必要时以root运行。

权限核对可以从以下几项开始:

  • 每名管理员使用独立账号和独立密钥;
  • sudo权限只授予必要的命令或管理范围;
  • 不在sudo规则中使用过宽的通配符;
  • 应用服务使用专用系统账号,通常不设置交互式登录;
  • 配置文件、私钥、数据库凭据和日志文件使用最小可读权限;
  • 删除或停用服务前先确认依赖、备份配置并安排回滚。

补丁操作要避开业务高峰,并提前确认是否可能重启服务或内核。Debian或Ubuntu类系统可以先查看待更新内容:

sudo apt update
apt list --upgradable

RHEL类系统可以先检查更新:

sudo dnf check-update

dnf check-update在发现可更新软件包时可能返回非零状态,这不一定代表命令失败。正式升级前,应查看变更包、备份应用和数据库、记录当前内核及服务状态,并准备维护窗口。内核或关键库更新后,可能需要重启;重启前要确认SSH、防火墙、业务服务和自动启动配置都已验证。

不要为了“清理攻击面”直接批量禁用服务。应先用端口、进程、服务依赖和业务文档确认用途,再逐个处理;每次只改一项,并在变更后检查端口、日志和业务请求。

审计:记录登录、提权和配置变化

至少要能回答以下问题:谁登录过、登录是否成功、谁执行过sudo、SSH配置何时变化、防火墙规则何时变化、软件包何时更新、关键服务是否重启。

先检查日志系统和磁盘空间:

sudo systemctl is-active systemd-journald
sudo journalctl --disk-usage
sudo journalctl -u ssh -u sshd --since "today" --no-pager

不同发行版可能把认证日志写入不同文件,也可能主要由journald管理。只有在文件存在且系统确实启用对应日志后,才检查类似/var/log/auth.log或/var/log/secure的路径,不要把某一个路径当成所有系统的固定位置。

常用核对命令包括:

last
sudo lastb
sudo journalctl --since "today" | grep -Ei 'sudo|sshd|authentication|firewall'

如果系统安装并启用了auditd,可以进一步检查登录和命令事件:

command -v ausearch
sudo systemctl is-active auditd
sudo ausearch -m USER_LOGIN --start today

审计日志应设置合理的留存和轮换策略,避免磁盘写满后反过来影响业务。仅保存在本机的日志无法覆盖磁盘损坏、误删或整机不可用场景;如果业务有更高的追溯要求,应将关键日志转存到独立且访问受控的日志系统,并验证确实能够检索,而不是只配置发送端。

上线前的恢复验证顺序

加固完成后,按由外到内、由低风险到高风险的顺序验证:

  1. 验证SSH新入口

从服务器外部网络使用管理账号和密钥登录。确认新端口可达、普通管理员能使用sudo,且root直接登录符合预期被拒绝。

  1. 验证端口暴露面

再次执行ss -lntup,将实际监听端口与上线清单逐项对照。确认数据库、缓存和内部管理接口没有意外公网监听。

  1. 验证防火墙结果

查看UFW或firewalld的生效规则,并从允许来源和非允许来源分别测试。测试失败时,要区分是服务未监听、路由不可达、来源限制不匹配,还是防火墙丢弃。

  1. 验证业务请求

对实际业务入口执行低风险请求,例如:

   curl -I http://SERVER_IP
   curl -k -I https://SERVER_IP

如果业务并非HTTP或使用了特定域名,应使用对应的健康检查方法,不要把端口连通误认为应用正常。

  1. 验证日志和时间

登录成功、登录失败、sudo操作、配置变更和防火墙调整都应能在日志中找到。日志时间明显错误时,先处理时间同步,否则后续审计记录难以对应。

  1. 验证回滚路径

对SSH配置恢复备份前,先在控制台或保留会话中执行语法检查。恢复后重新加载服务,并从外部验证。防火墙回滚时只撤销本次新增或修改的规则,不要无差别清空现有规则。

如果SSH配置导致无法建立新连接,优先通过仍然保留的旧会话或控制台恢复。恢复配置后执行:

sudo sshd -t

确认无误后,再按系统实际服务名重新加载SSH。若防火墙规则导致管理端口被封,应在控制台中依据保存的规则记录逐项恢复;紧急情况下临时关闭防火墙只能作为救援动作,恢复访问后必须重新整理并持久化最小规则,不能把临时放开状态直接带入生产。

上线后的定期复核重点

安全加固不是一次性改完就结束。每次新增业务、变更管理员出口、升级系统或调整应用监听地址,都应重新检查:

  • 监听端口是否仍与业务清单一致;
  • SSH是否仍只允许密钥和必要账号;
  • 管理员是否仍保有最小sudo权限;
  • 防火墙运行时规则与持久化规则是否一致;
  • 补丁是否按维护窗口完成,是否产生待重启状态;
  • 登录、提权和配置变更日志是否可检索;
  • 控制台、备份和配置回滚是否仍然可用。

恢复优先级应始终是:先保住可管理入口,再恢复防火墙规则和SSH配置,然后确认日志可用,最后验证业务端口和应用功能。每次重大变更前,至少演练一次“新SSH入口不可用”“业务端口被误封”和“配置需要回滚”这三类场景,确保韩国服务器在加固后不仅更难被误用,也能在误操作发生时快速恢复。

目录结构
全文