完成实例加固后的 OCI 控制台配置

为一台代理机和一台开发机完成 OCI 云侧网络、恢复入口、通知、预算、监控、备份与审计配置的一次性勾选清单。

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

[!abstract] 这篇笔记解决什么 两台实例已创建、SSH 已加固之后,仍要在 OCI 控制台完成云侧防火墙、固定公网地址、失联恢复、费用告警、监控和备份。本清单按依赖顺序执行,适合一次性做完;涉及改变公网 IP 或移除访问入口的步骤必须逐项验证。

完成实例加固后的 OCI 控制台配置

目标拓扑

本文按当前两台服务器设计:

SSH 别名配置与架构定位公网暴露原则
oracle11 OCPU / 1 GB,AMD64代理、反向代理、入口节点最终只公开 SSH、HTTP、HTTPS;SSH 后续收紧
oracle22 OCPU / 12 GB,ARM64DailyUse、MemoFlow、BodySense 等项目的开发服务器暂时只公开 SSH;建立跳板或 VPN 后可移除公网 IP

当前已知私网地址为 oracle1 = 10.0.x.xoracle2 = 10.0.x.x。执行前仍应在各实例的 Attached VNICs / Primary VNIC 页面复核,不能把笔记中的旧地址直接当作事实。

最终流量关系应当是:

Internet

   ├── 22/tcp(可信管理来源,过渡期可放宽)
   ├── 80/tcp(部署 Caddy 后)
   └── 443/tcp(部署 Caddy 后)

        oracle1 / nsg-proxy
            │  仅按需访问应用端口

        oracle2 / nsg-development

            └── 数据库、Redis、开发预览端口不直接暴露公网

[!important] 两层防火墙必须同时放行 OCI NSG/安全列表是云侧虚拟防火墙,UFW 是实例内防火墙。外部连接只有在两层都允许、服务也确实监听时才会成功。NSG 的规则不会自动覆盖或同步到 UFW。

开始前的前置条件

  • ssh oracle1ssh oracle2 都能使用密钥登录。
  • 两台机器已完成 安全加固 OCI Linux 服务器
  • 保留至少一个已连接的 SSH 会话;修改网络规则时不要提前关闭。
  • 两台机器都没有系统更新残留、失败服务或意外监听端口。
  • OCI 账号能通过 MFA 登录,且当前操作区域是实例所在区域。
  • 知道自己的公网出口 IP;可在本机搜索“what is my IP”确认。家庭宽带 IP 会变化时,不要长期依赖 /32 白名单作为唯一入口。
  • 暂不删除实例、VNIC、引导卷、默认安全列表中的最后一条 SSH 规则。

一次性执行总表

优先级项目本次建议
立即完成MFA 与恢复材料确认 MFA、离线恢复材料和 Home Region
立即完成资源清单与标签记录实例、VNIC、卷和网络对象;不记录私钥
立即完成oracle1 保留公网 IP为稳定代理入口准备 Reserved Public IP
立即完成两个 NSG代理机与开发机使用不同权限模型
立即完成Oracle Cloud Agent启用 Monitoring;仅在 Ubuntu 实例实际提供 Run Command 时测试
立即完成Notifications建立 ops-alerts 主题并确认邮件订阅
立即完成Budget建立实际支出与预测支出告警
立即完成Monitoring Alarms建立无数据、CPU 和内存告警
立即完成手工引导卷备份两台加固完成后的初始恢复点
部署服务时DNS、80/443只指向 oracle1,部署 Caddy 后再开放
验证跳板/VPN 后移除 oracle2 公网 IP先证明替代访问路径可用
按需评估自动备份策略、Cloud Guard、Bastion、IPv6先检查免费额度、成本和运维复杂度
不要盲目启用跨区域复制、负载均衡器、公共数据库、大范围端口可能收费或扩大攻击面

1. 保护账号并确认救援入口

1.1 确认 MFA 与账号恢复

控制台路径可能随界面更新而变化,可从右上角个人资料进入 My profile / Security / Multi-factor authentication

  • 至少一个 MFA 因子处于可用状态。
  • 恢复码或备用验证方式已离线保存,不放在 VPS 或代码仓库中。
  • 记录 Tenancy Name 和 Home Region;Home Region 不是随意切换的运行区域。
  • 日常不使用时不创建 API Signing Key、Auth Token 或 Customer Secret Key。

MFA 保护的是控制台身份;SSH 私钥保护的是 Linux 登录。两者不能互相替代。参见 Oracle 官方 MFA 文档

1.2 检查三层恢复路径

在两台实例详情页分别确认:

  1. Console connection / Serial console 页面能够打开;
  2. Oracle Cloud Agent 能显示插件状态;
  3. 引导卷能在 Boot volume 页面被找到。

恢复顺序是普通 SSH → Run Command → 串行控制台 → 挂载引导卷修复。具体决策见 OCI 服务器生命周期与恢复阶梯

[!note] Agent 不是“另一种 SSH” Oracle Cloud Agent 是实例内代理和插件管理器。Run Command 可在没有 SSH 会话时执行脚本,串行控制台则更接近机器终端。两者都是恢复补充手段,但仍依赖权限、Agent 状态或控制台配置,不能代替备份。

2. 建立资源清单与稳定命名

在本地密码管理器或不公开的运维清单中记录以下信息:

  • Tenancy、Home Region、实例所在 Region 和 Compartment;
  • oracle1oracle2 的 Instance OCID;
  • Primary VNIC OCID、私网 IP、当前公网 IP;
  • VCN、Subnet、Route Table、Security List、NSG;
  • Boot Volume 名称、OCID、大小和性能配置;
  • SSH 别名与对应用户;不要复制私钥正文。

可给实例、VNIC 或卷添加 Free-form Tags:

owner=personal
role=proxy          # oracle1
role=development    # oracle2
environment=dev

标签用于筛选和费用归因,不要在标签中写密码、Token、域名注册凭据或个人敏感信息。

3. 给 oracle1 准备稳定公网地址

代理节点将承载 DNS、Caddy 和公网入口,公网 IP 变化会导致域名失效。OCI 的 Reserved Public IP 可以在实例生命周期之外保留并重新分配;Ephemeral Public IP 通常随实例或分配关系消失。参见 Oracle 公网 IP 管理文档

3.1 先辨认当前 IP 类型

进入:

Compute → Instances → oracle1 → Attached VNICs
→ Primary VNIC → IPv4 Addresses

查看当前公网 IP 是 Ephemeral 还是 Reserved

3.2 优先把现有地址原地保留

若当前是 Ephemeral:

  1. 先记录旧公网 IP 和本机 ~/.ssh/configoracle1 的配置。
  2. 在 IPv4 地址右侧的 Actions 菜单选择 Reserve IP address
  3. 命名为 oracle1-public-ip 并确认。
  4. 刷新页面,确认类型已变为 Reserved,数值与旧公网 IP 相同。
  5. 新开终端执行 ssh oracle1,确认原 SSH 配置仍可用。

Oracle 目前提供保留现有 IPv4 地址的控制台操作,优先使用它可以避免为换 IP 而修改 SSH 和 DNS。若当前界面没有此动作,才按公网 IP 管理页的创建与重新分配流程操作;该流程可能改变地址并中断连接。

[!warning] Reserved 代表生命周期可控,不等于永久免费 创建前查看控制台的价格提示和当期 OCI Price List。尤其不要长期保留未分配、没有用途的地址;预算和 Cost Analysis 仍要覆盖它。

oracle2 目前保留现有公网 IP,等第 10 节的跳板或 VPN 方案通过验证后再考虑移除。开发机不需要为了“整齐”立即更换 Reserved IP。

4. 用两个 NSG 分离代理机与开发机

NSG 直接作用于一组 VNIC,适合表达应用角色;Security List 作用于整个子网。NSG 还可以把另一个 NSG 作为来源,从而避免把实例私网 IP 硬编码到每条规则中。参见 Oracle NSG 文档

4.1 创建 NSG

进入:

Networking → Virtual Cloud Networks → 当前 VCN
→ Network Security Groups → Create Network Security Group

创建:

  • nsg-proxy:关联 oracle1 的 Primary VNIC;
  • nsg-development:关联 oracle2 的 Primary VNIC。

新建 NSG 默认没有规则。应先添加规则,再把默认 Security List 收紧。

4.2 nsg-proxy 入站规则

是否现在添加来源协议与端口用途
可信公网 ADMIN_IP/32TCP 22管理 SSH
仅过渡0.0.x.x/0TCP 22出口 IP 经常变化且尚无 VPN 时临时保留
部署 Caddy 时0.0.x.x/0TCP 80ACME HTTP 验证与 HTTP 跳转
部署 Caddy 时0.0.x.x/0TCP 443HTTPS 入口

如果启用 IPv6,需要为 ::/0 单独规划对应规则,并同步检查 UFW。不要假设 IPv4 规则会自动覆盖 IPv6。

4.3 nsg-development 入站规则

先保持当前可用的 SSH 来源,之后逐步收紧:

来源协议与端口用途
可信公网 ADMIN_IP/32TCP 22当前直接管理入口
nsg-proxy10.0.x.x/32TCP 22建立并验证 oracle1 跳板后使用
nsg-proxy具体应用端口仅当 oracle1 要反代 oracle2 的应用

不要添加以下公网入站规则:

  • 数据库端口,如 PostgreSQL 5432、MySQL 3306
  • Redis 6379
  • 任意开发服务器端口范围;
  • Docker daemon 2375/2376
  • 0-65535 全端口。

开发服务若只供自己使用,优先通过 SSH 端口转发、Tailscale/WireGuard 或 oracle1 的认证反代访问。

4.4 出站与默认 Security List

初期保留 stateful 全出站,便于系统更新、Git、容器镜像和 OCI Agent 工作。等实际服务稳定后再评估按目的地收紧;过早限制 DNS、HTTPS 或 OCI 服务端点会造成难排查故障。

验证顺序:

  1. 两个 NSG 都已关联正确 VNIC;
  2. 新开终端验证 ssh oracle1ssh oracle2
  3. 验证预期端口,确认意外端口仍不可达;
  4. 再检查子网默认 Security List,删除重复的宽泛入站规则;
  5. 每删一条规则都重新验证,最后才删除旧的宽泛 SSH 规则。

5. 检查 Oracle Cloud Agent 的监控与可选恢复插件

分别进入:

Compute → Instances → 实例 → Oracle Cloud Agent

确认:

  • Agent 状态正常;
  • Compute Instance Monitoring 为 Enabled/Running;
  • 如果页面列出 Compute Instance Run Command,确认其为 Enabled/Running;
  • 修改插件后等待最多约 10 分钟再刷新状态。

Oracle 官方说明插件状态变更可能需要最多约 10 分钟生效,详见 Oracle Cloud Agent 插件管理。Ampere A1 上 Custom Logs Monitoring 若显示不支持,不影响 Compute Instance Monitoring;Run Command 是否可用仍以 Ubuntu 的官方支持范围和实例页面为准。

[!warning] 不要把 Ubuntu 上的 Run Command 当作既定能力 Oracle 当前的 Run Command 支持镜像列表没有列出 Ubuntu。你的两台机器是 Ubuntu 24.04,因此控制台不显示插件、插件无法运行或出现不支持状态时,应视为平台边界,不要为了追求这个选项反复重装 Agent。恢复设计必须以 SSH、串行控制台和引导卷为主。

5.1 做一次无害 Run Command 验收

只有插件确实显示 Running 时,才在实例的 Run Command / Create command 中执行:

id
uptime
uname -m

预期:命令成功返回普通系统信息,不修改任何配置。Linux 上插件以 ocarun 用户执行;不要授予它无限制 sudo,也不要通过明文命令传递 Secret。Run Command 的能力、IAM 与实例权限要求见 Oracle Run Command 文档

如果 Ubuntu 实例的插件不存在或不运行:

  1. 不要立即删除实例;
  2. 先确认官方支持范围,不要假设缺少插件等于 Agent 安装损坏;
  3. 保留 SSH、串行控制台和引导卷恢复路径;
  4. Compute Instance Monitoring 若正常,就不因 Run Command 缺失而重装整个 Agent。

6. 建立统一通知通道

进入:

Developer Services → Application Integration → Notifications
→ Topics → Create Topic
  1. 创建 Topic:ops-alerts
  2. 创建 Email Subscription,填写长期可用邮箱。
  3. 打开确认邮件,点击 Confirm subscription
  4. 回到控制台确认状态为 Active,而不是 Pending。
  5. 若控制台提供 Publish Message/Test,发送一条测试通知并确认收到。

监控告警只有绑定 Topic,并且订阅者确认订阅之后,邮件才会真正送达。参见 为告警创建通知 Topic

7. 建立费用预算与告警

进入:

Billing & Cost Management → Budgets → Create Budget

建议给承载两台实例的 Compartment 或 Root Compartment 建立月度预算:

  1. Scope 选择实际资源所在 Compartment;
  2. Budget Amount 设置成自己能接受的低额非零金额;
  3. 建立 Actual Spend 告警,例如达到预算的 50%
  4. 再建立 Forecast Spend 告警,例如预测达到 80%
  5. 收件人使用已验证的长期邮箱;
  6. 保存后在 Cost Analysis 中确认 Scope 和币种。

[!warning] Budget 不是断路器 OCI Budget 是软性提醒,不会阻止创建资源,也不会在达到阈值时自动停止消费;告警也不是实时账单。仍需定期查看 Cost Analysis。参见 OCI Budgets 概览创建预算

8. 为两台机器创建最小监控告警

先进入每台实例的:

Compute → Instances → 实例 → Metrics
→ Metric namespace: oci_computeagent

确认至少能看到 CpuUtilizationMemoryUtilizationLoadAverage 数据。Oracle Cloud Agent 的 Compute Instance Monitoring 插件负责产生 oci_computeagent 指标;实例还需要能访问 Monitoring 服务。参见 Compute Instance Metrics

然后从图表创建 Alarm,或进入:

Observability & Management → Monitoring → Alarm Definitions
→ Create Alarm

推荐最小集合:

告警初始条件适用实例说明
CPU 持续高CpuUtilization > 85% 持续 15 分钟两台避免瞬时构建峰值反复报警
内存持续高MemoryUtilization > 85% 持续 15 分钟两台oracle1 1 GB,尤其重要
指标缺失5 至 10 分钟无数据时报警两台可能是关机、Agent 或网络异常
网络流量异常先观察一周基线,再定阈值oracle1避免拍脑袋填写固定字节数

所有告警的 Destination 选择 ops-alerts。先使用 Console 从现有 Metrics 图表创建告警,能减少 Metric Namespace、维度或查询语法写错的概率。创建后检查 Alarm 已 Enabled,并做一次通知链路测试。参见 创建基本告警

[!note] 磁盘剩余空间不是同一回事 DiskBytesRead/Written 表示 I/O 流量,不表示文件系统还剩多少空间。文件系统使用率仍应由主机侧监控或自定义指标采集,不能用磁盘吞吐告警代替。

9. 创建“加固完成”引导卷恢复点

分别进入实例的 Boot Volume 页面,为两台机器各做一次手工备份:

oracle1-hardened-2026-07-20
oracle2-hardened-2026-07-20

操作后:

  • 两个备份的 Lifecycle State 都变为 Available
  • 记录备份所在 Region 和创建时间;
  • 在 Cost Analysis 与 Limits/Quotas 中检查备份存储占用;
  • 恢复点不包含“应用一致性已验证”的承诺。

引导卷备份是某一时点的 crash-consistent 副本,可手工创建或由策略创建。手工备份默认不会像策略备份那样自动过期,因此也需要主动管理容量。参见 Boot Volume Backups

不要立刻套用 Bronze/Silver/Gold 自动策略,也不要默认启用跨区域复制。先根据 OCI 免费额度与计费边界核对当期免费范围、当前引导卷总量和备份保留成本。

对于 oracle2 上的代码、数据库和用户数据,引导卷备份不能代替:

  • Git 远程仓库;
  • 数据库原生备份;
  • 配置与 Secret 的独立保管;
  • 异地副本和恢复演练。

10. 建立 oracle1 → oracle2 管理路径后再隐藏开发机

oracle2 作为开发机可以暂时保留公网 SSH。只有满足以下所有条件后,才考虑移除其公网 IP:

  • oracle1oracle2 的私网地址复核无误;
  • oracle1 能通过私网 SSH 连接 oracle2
  • 本机 ProxyJump、Tailscale、WireGuard 或 OCI Bastion 中至少一种已验证;
  • 重启两台机器后替代路径仍可用;
  • Run Command 或串行控制台也已验证;
  • 保留一个当前已连接到 oracle2 的会话。

OpenSSH ProxyJump 示例:

Host oracle2
  HostName 10.0.x.x
  User ubuntu
  ProxyJump oracle1

实际用户名与私钥设置沿用本机当前 SSH 配置。先运行 ssh -vv oracle2 验证,再移除开发机公网 IP。若 oracle1 仅 1 GB 内存,不建议在同一时间堆叠大量代理、监控和构建任务。

11. 部署公网服务时再做 DNS 与 80/443

不要为了“以后会用”提前开放全部服务端口。准备部署 Caddy 时:

  1. 确认 oracle1 的 Reserved Public IP;
  2. 域名 A 记录只指向 oracle1
  3. nsg-proxyoracle1 的 UFW 同时允许 TCP 80/443;
  4. 应用服务在 oracle2 上只监听私网或 localhost;
  5. oracle1 通过私网反代到 oracle2 的具体端口;
  6. HTTPS 成功后再做公网端口扫描与访问日志检查。

oracle2 不需要公开 DNS A 记录,也不应直接公开数据库或开发调试端口。

12. 查看 Audit,暂缓不必要的高级服务

进入:

Identity & Security → Audit

筛选最近的实例、VNIC、NSG、Public IP 和备份操作,确认资源变更能被查到。OCI Audit 会记录支持服务的 API 活动,可用于回答“谁在什么时候改了什么”;它不是主机命令审计。参见 OCI Audit 文档

以下项目不是本轮加固的完成条件:

  • Cloud Guard:Agent 插件 Enabled 不等于 Cloud Guard 已完成 Target、Detector、通知和响应配置;需要单独评估。
  • Vulnerability Scanning:需要理解扫描目标、Agent 支持和结果处置流程后再启用。
  • OCI Bastion:若当前 SSH 和未来 VPN 已满足需求,可暂缓。
  • IPv6:只有明确需要时再按 为 OCI 计算实例启用 IPv6完成整条链路。
  • Load Balancer / NAT Gateway / 跨区域复制:先核对费用,不为个人双机架构盲目增加。
  • ZPR:如果给端点添加 Zero Trust Packet Routing 安全属性,流量还必须满足 ZPR policy;不了解策略前不要开启,避免全断。

最终一次性验收

身份与恢复

  • OCI MFA 登录成功,恢复材料已离线保存。
  • 两台实例的 Agent 页面可见。
  • Compute Instance Monitoring 正常。
  • 若 Ubuntu 实例实际提供 Compute Instance Run Command,其无害测试成功;否则已明确记录不支持或不可用。
  • 串行控制台入口和引导卷页面都能找到。

网络

  • oracle1 使用 Reserved Public IP,ssh oracle1 已更新并验证。
  • nsg-proxy 只允许当前需要的 SSH,80/443 尚未部署则不开放。
  • nsg-development 不公开数据库、Redis、Docker daemon 和开发端口。
  • 两台 VNIC 关联了正确 NSG。
  • 默认 Security List 不再保留重复的宽泛入站规则。
  • ssh oracle1ssh oracle2 新会话仍成功。

费用、监控与备份

  • ops-alerts 邮件订阅为 Active,测试邮件收到。
  • Budget 的 Actual Spend 和 Forecast Spend 告警都已保存。
  • 两台机器的 CPU、内存和指标缺失告警已 Enabled。
  • 两个 *-hardened-2026-07-20 引导卷备份均为 Available。
  • Cost Analysis 没有未知收费项。
  • Audit 能找到本次 NSG、Public IP 或备份变更。

回滚原则

如果修改 NSG、Security List 或公网 IP 后失联:

  1. 不要重启或删除实例;
  2. 在 OCI 控制台检查实例状态、VNIC 私网/公网地址和 NSG 关联;
  3. 临时恢复最后一个已知可用的 SSH 入站规则;
  4. 使用 Run Command 检查 ss -lntp、UFW 和 SSH 服务;
  5. Run Command 不可用时使用串行控制台;
  6. 系统无法启动时按 挂载引导卷修复 OCI 实例处理。

恢复访问后先保存证据和当前配置,再收紧临时规则。不要用“删机重建”代替第一次诊断,因为引导卷、IP、密钥和应用数据可能一起丢失。

本次完成记录模板

日期:
操作者:
Region / Compartment:
oracle1 Reserved Public IP:仅记录到私密运维清单
oracle1 NSG:
oracle2 NSG:
Run Command 验收:pass / fail
通知测试:pass / fail
Budget:active / pending
Alarm 数量:
引导卷备份:available / pending
Audit 复核:pass / fail
待办:

不要把 OCID、公网 IP、邮箱、私钥、恢复码或 Token 提交到公开仓库。

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