zmuke-n-00001 安全基线(业务运维视角)
核实日期:2026-08-27。本文只覆盖业务运维单元的暴露面与密钥落点。 节点级加固(SSH、ufw、fail2ban、OpenVPN)属 fleet 模块,见 fleet 仓。
暴露面原则
- 业务服务端口只绑 loopback。
- 公网访问只经 Cloudflare Tunnel,不开放主机入站端口。
- 文档站发布到 Cloudflare Pages,全站在 Cloudflare Access 之后, 仅 owner 邮箱 One-time PIN 可通过,匿名默认拒绝。
端口实测
| 单元 | 绑定 | 评价 |
|---|---|---|
zmuke-gitea web | 127.0.0.1:3002 | 合规,仅 loopback |
zmuke-gitea ssh | 127.0.0.1:2223 | 合规,仅 loopback |
zmuke-pages | 127.0.0.1:3080 | 合规,仅 loopback |
zmuke-cloudflared | 无监听(host 网络,仅出站) | 合规 |
evebox | 192.168.5.200:5636,--no-tls | 局域网明文可达,依赖内网边界与防火墙 |
slaunchx-media-mysql | 0.0.0.0:3307 | 绑所有接口,跨组织负载,待处置 |
slaunchx-media-redis | 0.0.0.0:6380 | 绑所有接口,跨组织负载,待处置 |
后三项是当前主机上最宽的暴露面,已登记为待办,处置需 owner 决策。 本仓未对实机做任何变更。
Gitea 实例设置(2026-08-27 实测,非密钥)
| 设置 | 值 | 含义 |
|---|---|---|
ENABLE_PUSH_CREATE_ORG | false | 组织仓库不支持 push-to-create,必须先在 Web 建仓 |
ENABLE_PUSH_CREATE_USER | false | 个人仓库同样不支持 push-to-create |
DEFAULT_PRIVATE | private | 新建仓库默认私有 |
DISABLE_REGISTRATION | true | 关闭自助注册 |
Gitea 的 ROOT_URL 为 http://127.0.0.1:3002/,DOMAIN / SSH_DOMAIN 均为 127.0.0.1,即实例设计上就是 loopback-only,外部路径由隧道承担。
密钥落点
仓库内不存放任何密钥真值。 各单元的真值位置:
| 密钥 | 位置 | 说明 |
|---|---|---|
| Cloudflare Tunnel token | 主机 ~adminb84002/devops/docker/cloudflared/.env | 应为 0600(权限待复核) |
Gitea SECRET_KEY / INTERNAL_TOKEN / JWT | /opt/zmuke-gitea/data/gitea/conf/app.ini | Gitea 自生成,不读取、不外传 |
| Actions runner 注册 token | /opt/act-runner/(0750,gitea-runner 属主) | 对 adminb84002 不可读 |
| Pages 部署凭据 | Gitea Actions secrets:CLOUDFLARE_ACCOUNT_ID、CLOUDFLARE_API_TOKEN | 只存在 Gitea 内部 |
Grafana admin 口令、GITEA_TOKEN(logging) | 主机 ~adminb84002/devops/docker/logging/.env | 栈未运行 |
| 其它第三方凭据 | vault --business zmuke run <profile> -- <cmd> | 服务与 agent 不接触 vault 内容 |
仓库只提供 *.env.example(仅键名)。真实 Cloudflare Account / Zone / Tunnel / Access ID 一律不写入发布站文档;deploy/ README 用 <TUNNEL_ID> 之类占位符。
已发现的安全问题(未处置,待 owner 决策)
- Cloudflare Tunnel token 出现在容器命令行。
zmuke-cloudflared由docker run ... --token <值>启动,docker inspect的.Config.Cmd中可读到 完整 token,凡能访问 Docker 守护进程者均可读取。 建议:改为经TUNNEL_TOKEN环境变量或 credentials 文件注入,并轮换该 token。 - 运行中的业务容器均非 compose 创建。
zmuke-gitea、zmuke-pages、zmuke-cloudflared、evebox都缺com.docker.compose.*label,运行态与磁盘上 的 compose 未收敛,存在"文件改了但实机没变"的静默漂移风险。 - 浮动镜像标签。
cloudflare/cloudflared:latest、nginx:alpine、jasonish/evebox:latest均未按 digest 固定,无确定回滚点。zmuke-gitea已按 digest 固定,是正面样例。 - 跨组织负载端口绑
0.0.0.0。slaunchx-media的 MySQL / Redis 对所有接口 监听,且跑在 ZMUKE 主机上,同时违反端口收敛与组织边界两条原则。 - Hermes 试装残留。
~adminb84002/devops/docker/hermes/下有 root 属主的data/与secrets/(含.netrc挂载路径声明),无容器运行。secrets/.netrc可能含凭据,应由 owner 核查后清理。 - EveBox 局域网明文。
--no-tls且绑192.168.5.200:5636,无入库的认证配置。