安全加固 OCI Linux 服务器

以保留恢复入口和逐步验证为前提,为 OCI Debian/Ubuntu 实例配置用户、更新、SSH、UFW、Fail2ban 和自动安全更新。

#type / howto #status / growing #tech / security #resource / oracle-cloud #resource / ssh #platform / server #platform / linux

[!warning] 最重要的规则 始终保留一个已连接的 SSH 会话;任何 SSH 或防火墙变更都先添加新入口并验证,再移除旧入口。修改前确认 OCI Console、MFA 和控制台连接可用。

安全加固 OCI Linux 服务器

目标

适用于 Debian 12、Ubuntu 22.04/24.04。完成后:

  • 日常使用非 root sudo 用户;
  • 系统安装安全更新;
  • SSH 仅允许密钥,禁止 root 和密码远程登录;
  • OCI 云侧与 UFW 同时执行最小端口策略;
  • Fail2ban 观察真实 SSH 端口;
  • 新会话和重启验证通过;
  • 所有修改都有备份和恢复路径。

0. 建立基线与恢复点

set -o pipefail
date -Is
cat /etc/os-release
uname -a
uname -m
whoami
sudo ss -lntup
sudo systemctl --failed
sudo ufw status verbose 2>/dev/null || true
sudo nft list ruleset 2>/dev/null | sed -n '1,160p'

在 OCI 控制台记录实例、VNIC、NSG 和引导卷 OCID。保持当前 SSH 会话打开。

1. 更新系统

sudo apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get -y upgrade
sudo apt-get install -y ca-certificates curl vim git jq ufw fail2ban unattended-upgrades

如果提示需要重启,先完成登录入口准备,再安排重启。

2. 创建日常管理员

operator 举例,实际选择不易猜但可识别的用户名:

sudo adduser operator
sudo usermod -aG sudo operator
sudo install -d -m 700 -o operator -g operator /home/operator/.ssh
sudo install -m 600 -o operator -g operator ~/.ssh/authorized_keys /home/operator/.ssh/authorized_keys

从本机新开会话验证:

ssh -i ~/.ssh/oci_a1 operator@SERVER_IP
sudo -v

只有新用户和 sudo 都成功后,才能继续禁止默认用户或 root。

3. 先配置 OCI 云侧规则

在 NSG/Security List 中保留当前 SSH 端口,并把来源收紧到可信 CIDR。计划改端口时,先额外添加新端口规则,不要删除旧端口。

4. 配置 UFW

变量示例:

ADMIN_CIDR='203.0.x.x/32'
SSH_PORT='22'

执行:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow from "$ADMIN_CIDR" to any port "$SSH_PORT" proto tcp comment 'trusted SSH'
sudo ufw limit "$SSH_PORT"/tcp
sudo ufw --force enable
sudo ufw status verbose

limit 不能代替来源限制和密钥认证。不要安装来源不明的 iptables 脚本,也不要为了保护 UFW 而长期 apt-mark hold ufw,这会阻碍安全更新。

5. 写入 SSH 加固 drop-in

先备份:

stamp=$(date +%Y%m%d-%H%M%S)
sudo cp -a /etc/ssh/sshd_config "/etc/ssh/sshd_config.$stamp.bak"
sudo install -d -m 755 /etc/ssh/sshd_config.d

创建 /etc/ssh/sshd_config.d/60-local-hardening.conf

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
X11Forwarding no
MaxAuthTries 4
LoginGraceTime 30
AllowUsers operator

检查有效配置:

sudo sshd -t
sudo sshd -T | grep -E '^(port|permitrootlogin|pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|allowusers)'
sudo systemctl reload ssh || sudo systemctl reload sshd

从本机新建 operator 密钥会话,并确认旧会话仍存在。

6. 是否修改 SSH 端口

修改端口只能减少日志噪声,不是主要安全措施。若仍要修改:

  1. OCI NSG 和 UFW 先允许新端口;
  2. 在 drop-in 添加 Port 2222
  3. sudo sshd -t
  4. reload SSH;
  5. sudo ss -lntp | grep 2222
  6. 从本机 ssh -p 2222 ... 新建会话;
  7. 重启后再次验证;
  8. 最后删除旧端口云规则和 UFW 规则。

[!warning] Ubuntu 24.04 的 socket activation Ubuntu 24.04 的 sshd 监听端口由 systemd ssh.socket 管理,generator 会自动从 sshd_config 的 Port 指令生成 socket 配置。切勿再手动创建 /etc/systemd/system/ssh.socket.d/override.conf,否则 ListenStream 重复导致 Address already in use、socket failed、新连接全断。详见 Ubuntu 24.04 改 SSH 端口的 socket activation 陷阱。改端口后务必同步 UFW 和云侧规则,否则新端口被防火墙挡住,见 OCI SSH 与端口连通性排查

7. 配置 Fail2ban

创建 /etc/fail2ban/jail.d/sshd.local

[sshd]
enabled = true
backend = systemd
port = 22
maxretry = 5
findtime = 10m
bantime = 1h

若改端口,必须同步修改 port。验证:

sudo fail2ban-client -t
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

8. 自动安全更新与时间

sudo dpkg-reconfigure -plow unattended-upgrades
timedatectl status
systemctl status systemd-timesyncd --no-pager 2>/dev/null || true

自动更新仍需观察失败和待重启状态:

test -f /var/run/reboot-required && cat /var/run/reboot-required || true
journalctl -u unattended-upgrades --since '7 days ago' --no-pager

9. 最终验证

sudo sshd -t
sudo systemctl is-active ssh || sudo systemctl is-active sshd
sudo systemctl is-active fail2ban
sudo ufw status verbose
sudo ss -lntup
sudo systemctl --failed

然后:

  • 新 SSH 会话使用管理员密钥成功
  • 密码登录失败
  • root SSH 登录失败
  • sudo 成功
  • OCI 与 UFW 仅开放预期端口
  • 重启后再次完成上述验证
  • 串行控制台或 Run Command 恢复路径可用

回滚

在旧会话中:

sudo rm -f /etc/ssh/sshd_config.d/60-local-hardening.conf
sudo cp -a /etc/ssh/sshd_config.TIMESTAMP.bak /etc/ssh/sshd_config
sudo sshd -t
sudo systemctl reload ssh || sudo systemctl reload sshd

TIMESTAMP 替换为实际备份。不要在配置语法未通过时 reload。

创建于 2026/7/20 更新于 2026/7/20