韩国服务器上线前如何加固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填写错误、配置语法错误 | 第二个终端无法建立连接,原会话仍正常 | 保留原会话和控制台,先验证新入口,再关闭旧入口 |
| 密钥认证不可用 | 公钥路径或权限错误,账号没有登录Shell | Permission 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规则。删除规则前应确认该规则确实是本次加固新增或准备替换的规则,避免误删其他管理员或监控系统的访问权限。
无论使用哪种防火墙,都要注意三个边界:
- 只开放实际监听且确有业务需求的端口;
- 管理端口优先限制来源地址,不能只依赖“改端口”;
- 防火墙规则不能替代应用层认证、服务补丁和本机权限控制。
最小权限和补丁安排
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
审计日志应设置合理的留存和轮换策略,避免磁盘写满后反过来影响业务。仅保存在本机的日志无法覆盖磁盘损坏、误删或整机不可用场景;如果业务有更高的追溯要求,应将关键日志转存到独立且访问受控的日志系统,并验证确实能够检索,而不是只配置发送端。
上线前的恢复验证顺序
加固完成后,按由外到内、由低风险到高风险的顺序验证:
- 验证SSH新入口
从服务器外部网络使用管理账号和密钥登录。确认新端口可达、普通管理员能使用sudo,且root直接登录符合预期被拒绝。
- 验证端口暴露面
再次执行ss -lntup,将实际监听端口与上线清单逐项对照。确认数据库、缓存和内部管理接口没有意外公网监听。
- 验证防火墙结果
查看UFW或firewalld的生效规则,并从允许来源和非允许来源分别测试。测试失败时,要区分是服务未监听、路由不可达、来源限制不匹配,还是防火墙丢弃。
- 验证业务请求
对实际业务入口执行低风险请求,例如:
curl -I http://SERVER_IP
curl -k -I https://SERVER_IP
如果业务并非HTTP或使用了特定域名,应使用对应的健康检查方法,不要把端口连通误认为应用正常。
- 验证日志和时间
登录成功、登录失败、sudo操作、配置变更和防火墙调整都应能在日志中找到。日志时间明显错误时,先处理时间同步,否则后续审计记录难以对应。
- 验证回滚路径
对SSH配置恢复备份前,先在控制台或保留会话中执行语法检查。恢复后重新加载服务,并从外部验证。防火墙回滚时只撤销本次新增或修改的规则,不要无差别清空现有规则。
如果SSH配置导致无法建立新连接,优先通过仍然保留的旧会话或控制台恢复。恢复配置后执行:
sudo sshd -t
确认无误后,再按系统实际服务名重新加载SSH。若防火墙规则导致管理端口被封,应在控制台中依据保存的规则记录逐项恢复;紧急情况下临时关闭防火墙只能作为救援动作,恢复访问后必须重新整理并持久化最小规则,不能把临时放开状态直接带入生产。
上线后的定期复核重点
安全加固不是一次性改完就结束。每次新增业务、变更管理员出口、升级系统或调整应用监听地址,都应重新检查:
- 监听端口是否仍与业务清单一致;
- SSH是否仍只允许密钥和必要账号;
- 管理员是否仍保有最小sudo权限;
- 防火墙运行时规则与持久化规则是否一致;
- 补丁是否按维护窗口完成,是否产生待重启状态;
- 登录、提权和配置变更日志是否可检索;
- 控制台、备份和配置回滚是否仍然可用。
恢复优先级应始终是:先保住可管理入口,再恢复防火墙规则和SSH配置,然后确认日志可用,最后验证业务端口和应用功能。每次重大变更前,至少演练一次“新SSH入口不可用”“业务端口被误封”和“配置需要回滚”这三类场景,确保韩国服务器在加固后不仅更难被误用,也能在误操作发生时快速恢复。