Skip to content

Require explicit authentication for the admin control plane - #507

Open
GOLDKUN wants to merge 2 commits into
chaitin:mainfrom
GOLDKUN:security/require-admin-auth-initialization
Open

Require explicit authentication for the admin control plane#507
GOLDKUN wants to merge 2 commits into
chaitin:mainfrom
GOLDKUN:security/require-admin-auth-initialization

Conversation

@GOLDKUN

@GOLDKUN GOLDKUN commented Sep 2, 2026

Copy link
Copy Markdown

问题

当数据库中没有 Admin Token 时,Admin API 会自动跳过鉴权。全新部署或所有 Token 被删除后,控制面因此匿名开放。

影响

未认证调用方可以创建 Admin Token、管理服务和实例,并触发服务导入及构建流程。若部署在可访问网络,可能导致控制面接管;结合远程导入还可能进一步执行不受信任代码。

修复内容

  • 守护进程显式启用 Admin Token 鉴权。
  • 增加 OCTOBUS_BOOTSTRAP_ADMIN_TOKEN,仅在数据库尚无 Admin Token 时初始化首个 Token。
  • 未设置 bootstrap token 且数据库为空时,除状态接口外的 Admin API 返回 401,不再匿名放行。
  • 增加初始化和鉴权拒绝测试。

验证

  • go test ./cmd/octobus 通过。
  • go test ./internal/admin 中与 protoc 相关的既有测试受本地缺失 protoc 阻塞;新增鉴权测试通过。

@monkeyscan

monkeyscan Bot commented Sep 2, 2026

Copy link
Copy Markdown

PR Title: Require explicit authentication for the admin cont...

Commit: c109282

本次变更将 daemon 的 admin 控制面默认改为强制要求管理员 token:

  1. cmd/octobus/main.go 新增 initializeAdminAuth:当 store 尚未要求 token 时,若设置了 OCTOBUS_BOOTSTRAP_ADMIN_TOKEN 则写入固定 ID 为 bootstrap-admin 的 token;serve() 中 admin.Server 固定设置 RequireAdminToken: true。
  2. internal/admin/admin.go 新增 RequireAdminToken 字段:为 true 时中间件跳过 store 的 AdminRequiresToken 查询,直接强制校验 Bearer token(/admin/v1/status 仍豁免)。
  3. 新增两个测试分别覆盖 initializeAdminAuth 快乐路径与 RequireAdminToken 中间件返回 401。

总体评估:改动意图是安全加固(默认关闭无认证 admin API),但存在一个关键缺口——daemon 无条件强制认证,而第一个 token 只在『store 为空 + 环境变量已设置』时才会创建。默认安装未设置环境变量时,daemon 会静默启动但所有 admin 端点(除 /status)全部 401,且 token 创建端点本身也被中间件保护,没有自服务恢复路径;既有无认证部署升级后也会被静默锁死。此外新增测试只覆盖了快乐路径,未覆盖负分支。

Comment thread cmd/octobus/main.go
Comment thread cmd/octobus/main_test.go
if !ok {
t.Fatal("bootstrap token was not usable")
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bootstrap 测试仅覆盖快乐路径,缺少对『已要求 token』与『未设置环境变量』负分支的覆盖

新增测试 TestInitializeAdminAuthBootstrapsOnlyWhenStoreIsEmpty 的命名声明了『仅当 store 为空时自举』,但实际只覆盖了『store 为空 + 环境变量已设置』的快乐路径,没有覆盖两个关键负分支:a) store 已要求 token(已有 token)时设置环境变量应被忽略且不应报错/重复创建同名 token;b) store 为空但环境变量未设置时应 no-op(而这一路径正是导致 admin API 被静默锁死的主因)。鉴于该逻辑的回归风险较高(错误的自举可能导致重复 token、启动失败或控制面锁死),建议补充这两个分支的用例以锁定预期行为。

Problem code:

Changed code at cmd/octobus/main_test.go:38-63

Recommendation:
为 initializeAdminAuth 补充『store 已有 token 且设置了环境变量』(验证不会重复创建、不会返回错误)与『store 为空且未设置环境变量』(验证 no-op 后 AdminRequiresToken 仍为 false)两个用例,并在 serve 集成层验证默认启动后非 status 的 admin 端点返回 401。

@monkeyscan

monkeyscan Bot commented Sep 2, 2026

Copy link
Copy Markdown

PR Title: Require explicit authentication for the admin cont...

Commit: f3eb1dc

变更评估(cmd/octobus 管理员认证 fail-closed 加固)

变更内容:

  1. cmd/octobus/main.go:initializeAdminAuth 在 store 尚未要求 token(AdminRequiresToken=false)且未设置 OCTOBUS_BOOTSTRAP_ADMIN_TOKEN 时,由原来的静默返回 nil 改为返回错误。serve() 将该错误包装后返回,main 打印到 stderr 并以退出码 1 结束,因此守护进程无法在未配置引导令牌的情况下以“无 token 但 RequireAdminToken=true”的静默锁死状态启动。
  2. main_test.go:TestMain 在环境变量缺失时预置测试令牌(使既有 serve 级测试在新增的 fail-closed 分支下仍能通过);新增 TestInitializeAdminAuthFailsClosedWithoutBootstrapToken 直接验证缺失令牌时返回含环境变量名的错误。
  3. README.md:补充引导令牌的使用与迁移说明。

评估结论:

  • 该变更正确修复了历史 finding(b0b99910)所描述的“全新/升级数据目录在无引导令牌时守护进程正常启动但控制面被静默锁死”的场景——现在改为启动期快速失败并给出明确错误,属于严格的安全改进。
  • fail-closed 校验虽位于 RecoverEnabled 之后,但 serve 在 RecoverEnabled 之后即注册 shutdownSupervisorOnce 的 defer,startupInventory 失败路径已由 TestServeShutsDownRecoveredInstancesWhenStartupInventoryFails 验证过“恢复的实例会被停掉”的语义,因此新增的 auth 失败路径不会泄漏已恢复实例。
  • 既有已引导(AdminRequiresToken=true)的数据目录在移除环境变量后重启仍走提前返回,不受影响;README 也说明了升级目录需首次设置令牌。该破坏性变更是有意设计并有文档/测试支撑。
  • 测试改动(TestMain 设置 + t.Setenv 局部覆盖/恢复)自洽,无并行测试冲突;TestMain 中 defer os.Unsetenv 因随后 os.Exit 而不会执行,属无害的无效代码。

未发现达到高置信度标准的、由本变更新引入的可操作缺陷,故不提交 finding。

@GOLDKUN

GOLDKUN commented Sep 2, 2026

Copy link
Copy Markdown
Author

Follow-up fixes after CI/code review:

  • Missing bootstrap authentication now fails startup explicitly instead of silently starting a locked control plane.
  • Added the required OCTOBUS_BOOTSTRAP_ADMIN_TOKEN setup and upgrade guidance to the README.
  • Test processes provision a test-only bootstrap token so existing serve lifecycle tests retain their intended coverage.

Verification: Admin authentication and serve lifecycle tests pass.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant