# Harbor 容器镜像仓库测评

> Harbor 2.x 容器镜像仓库三级等保现场测评取证命令单：按 GB/T 22239-2019 安全计算环境控制点组织 docker compose ps、harbor.yml、API v2.0 等只读取证命令，覆盖管理员默认口令与认证模式身份鉴别、项目角色与机器人账号访问控制、审计日志留存与外送、Trivy 漏洞扫描与拉取拦截入侵防范、HTTPS 与内容信任数据完整性、配置目录与数据库保密性、备份恢复演练、垃圾回收与退役账号清理剩余信息保护、审计日志个人信息各环节，附判定要点、高风险提示、示例输出与版本差异核验说明。

---

LLMS index: [llms.txt](/wikis/llms.txt)

---

> 定位：Harbor 容器镜像仓库三级等保现场测评**取证命令单**，按 GB/T 22239-2019 安全计算环境控制点分节组织核查命令、判定要点与取证要求。
> 适用范围：Harbor 2.x 安装器部署（docker compose 形态，覆盖现行 v2.10~v2.12；本文以官方 v2.12.0 文档与安装器源码为核验基准，官方最新已至 v2.15.x）；Helm/K8s 部署形态的命令需按 Helm Chart 取证；1.x 默认扫描器为 Clair、内置 Notary，判定口径差异大，需按旧版材料单独取证。
> 配套文章：[22、高风险判定指引与加固对照表](../../../reinforce/其他系统或设备/22高风险判定指引与加固对照表/)、[16、安全评估加固记录表3.0](../../../reinforce/其他系统或设备/16安全评估加固记录表3.0/)、[17、网络设备、安全设备、服务器、数据库和应用系统的加固方案](../../../reinforce/其他系统或设备/17网络设备安全设备服务器数据库和应用系统的加固方案/)。
>
> 使用说明：
>
> - 本文所有命令均为**只读取证**命令，不修改配置、不重启服务、不执行清除类操作；确需变更由被测单位运维方在授权下实施。
> - 每个控制点小节按「对应控制点 → 判定要点 → 取证要求 → 核查命令 → 备注 → 预期证据」编排；命令回显本身即证据，须连同命令行一起截图。
> - Harbor 为多容器组合系统：宿主机证据（`docker compose ps`、`harbor.yml`、数据目录）与 REST API 证据（`GET /api/v2.0/...`）互为印证；API 核查以系统管理员身份在管理网发起，`curl -u` 中的口令须脱敏后截图。
> - 命令不存在或输出与示例差异较大时，先确认 Harbor 版本与部署形态（安装器/Helm、docker compose v1/v2、是否外置数据库与对象存储），再换用等效命令或转入 Web 控制台取证，**不得据命令缺失直接判不符合**。
> - 示例输出中的地址、账户、路径均为演示值，现场须替换为真实取证结果并对涉及个人信息与内网管理地址的内容脱敏后再入报告。
>
> 不适用标识说明：
>
> - 使用 `【不适用】` 明确标记现场可判定为不适用的控制点。
> - 判定依据采用 GB/T 28448-2019"按测评对象实际功能、是否直接处理数据、是否具备该类安全机制判定"的原则；Harbor 本体承载的是容器镜像与 Helm 制品等研发内部数据，业务数据与个人信息一般不经过镜像仓库，相关控制点多需按对象边界转由上层平台或容器内应用测评。

## 基础信息

> **对应控制点**：非独立控制点（测评对象与资产确认）；部署形态与冗余情况佐证 8.1.2.1 网络架构 e) 关键设备硬件冗余
>
> **判定要点**：版本、组件容器状态、harbor.yml 关键字段、数据目录、API 健康检查五项均可取证且与实际架构一致 → 符合；版本或配置路径无法确认、依赖口头说明 → 部分符合。
>
> **取证要求**：版本与组件容器截图、harbor.yml 关键字段截图（口令脱敏）、数据目录截图、`GET /api/v2.0/health` 回显截图、Web 控制台版本页截图。

**核查命令**：

```bash
cd /opt/harbor && docker compose ps        # docker compose v2 语法；旧版 v1 安装脚本对应 docker-compose ps
docker images | grep goharbor
grep -nE "^hostname|^harbor_admin_password|^_version" harbor.yml | sed "s/harbor_admin_password:.*/harbor_admin_password: ***/"
grep -n -A4 "^https:" harbor.yml
ls -ld /data /data/registry /data/database /data/secret
curl -s https://registry.demo.local/api/v2.0/health
```

- 备注：官方前置条件要求 Docker 20.10.10-ce+，容器编排为 docker-compose v1.18.0+ 或 docker compose v2 插件二选一，宿主机两种语法并存时优先 `docker compose ps`、报错再回退 `docker-compose ps`；`_version` 记录安装器版本；`docker images | grep goharbor` 可见 harbor-core、harbor-jobservice、harbor-db、harbor-registryctl、registry-photon、redis-photon、nginx-photon、trivy-adapter-photon、harbor-portal、harbor-exporter、harbor-log 等组件镜像，镜像 tag 即 Harbor 版本；官方 API 文档声明 `/health` "This path does not require authentication"，回显各组件健康状态；Web 控制台「关于」/页脚版本号应与 `_version`、镜像 tag 三方一致。
- 预期证据：版本截图、组件容器截图、镜像清单截图、harbor.yml 关键字段截图、健康检查回显截图。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose ps（节选）
</span></span><span class="line"><span class="cl">NAME               IMAGE                                   STATUS
</span></span><span class="line"><span class="cl">nginx              goharbor/nginx-photon:v2.12.0           Up <span class="m">45</span> days <span class="o">(</span>healthy<span class="o">)</span>
</span></span><span class="line"><span class="cl">harbor-core        goharbor/harbor-core:v2.12.0            Up <span class="m">45</span> days <span class="o">(</span>healthy<span class="o">)</span>
</span></span><span class="line"><span class="cl">harbor-jobservice  goharbor/harbor-jobservice:v2.12.0      Up <span class="m">45</span> days <span class="o">(</span>healthy<span class="o">)</span>
</span></span><span class="line"><span class="cl">harbor-db          goharbor/harbor-db:v2.12.0              Up <span class="m">45</span> days <span class="o">(</span>healthy<span class="o">)</span>
</span></span><span class="line"><span class="cl">trivy-adapter      goharbor/trivy-adapter-photon:v2.12.0   Up <span class="m">45</span> days <span class="o">(</span>healthy<span class="o">)</span>
</span></span><span class="line"><span class="cl">docker images <span class="p">|</span> grep goharbor（节选）
</span></span><span class="line"><span class="cl">goharbor/harbor-core       v2.12.0
</span></span><span class="line"><span class="cl">goharbor/redis-photon      v2.12.0
</span></span><span class="line"><span class="cl">grep -nE <span class="s2">&#34;^hostname|^harbor_admin_password|^_version&#34;</span> harbor.yml
</span></span><span class="line"><span class="cl">hostname: registry.demo.local
</span></span><span class="line"><span class="cl">harbor_admin_password: ***
</span></span><span class="line"><span class="cl">_version: 2.12.0
</span></span><span class="line"><span class="cl">curl -s https://registry.demo.local/api/v2.0/health
</span></span><span class="line"><span class="cl"><span class="o">{</span><span class="s2">&#34;status&#34;</span>:<span class="s2">&#34;healthy&#34;</span>,<span class="s2">&#34;components&#34;</span>:<span class="o">[{</span><span class="s2">&#34;name&#34;</span>:<span class="s2">&#34;core&#34;</span>,<span class="s2">&#34;status&#34;</span>:<span class="s2">&#34;healthy&#34;</span><span class="o">}</span>,<span class="o">{</span><span class="s2">&#34;name&#34;</span>:<span class="s2">&#34;registry&#34;</span>,<span class="s2">&#34;status&#34;</span>:<span class="s2">&#34;healthy&#34;</span><span class="o">}</span>,...<span class="o">]}</span>
</span></span></code></pre></div>
</details>


## 身份鉴别

> **对应控制点**：GB/T 22239-2019 8.1.4.1 身份鉴别 a)~d)
>
> **判定要点**：admin 初始口令已修改且未沿用默认 Harbor12345、会话超时已按需配置、管理通道走 HTTPS、统一接入 LDAP/OIDC 且有对接证据 → 符合；口令已改但未接统一认证、会话超时未配置 → 部分符合；管理入口沿用默认口令或 HTTP 明文暴露 → 不符合（高风险）。
>
> **取证要求**：harbor_admin_password 行截图（脱敏）、默认口令登录实测回显（401 为阴性证据）、configurations 回显截图（auth_mode/self_registration/session_timeout）、LDAP/OIDC 对接配置截图、HTTPS 证书截图。

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">高风险提示</div>


管理端沿用默认口令 admin/Harbor12345 且 443 端口跨安全域可达，等同向所有可达者开放镜像仓库最高权限（可删库、可投毒镜像、可窃取私有构建物），按《高风险判定指引》互联网设备弱口令/未授权访问同类口径判高风险。注意官方口径：harbor_admin_password 仅在 Harbor **首次启动时**从 harbor.yml 读取，后续改密以控制台为准，配置文件与实际口令可能不一致，判定必须以登录实测为准。

判定口径详见 [22、高风险判定指引与加固对照表](../../../reinforce/其他系统或设备/22高风险判定指引与加固对照表/)。
</div>


### A. 管理员口令与默认口令双证据

**核查命令**：

```bash
grep -n "harbor_admin_password" /opt/harbor/harbor.yml
# 登录实测：默认口令应返回 401（阴性证据），实际口令脱敏
curl -sk -o /dev/null -w "%{http_code}\n" -u "admin:Harbor12345" https://registry.demo.local/api/v2.0/users/current
curl -sk -o /dev/null -w "%{http_code}\n" -u "admin:********"    https://registry.demo.local/api/v2.0/users/current
```

- 备注：官方 configure-yml 文档原文：harbor_admin_password "This password is only used on the first time that Harbor starts. On subsequent logins, this setting is ignored and the administrator's password is set in the Harbor Portal."，即后续改密后配置文件不再生效，**不能仅凭配置文件已改判符合**；官方 harbor.yml.tmpl 中该字段默认值即 Harbor12345（数据库口令模板默认 root123，见数据保密性）。配置行与实测 401/200 双证据齐备方可判"默认口令已改"。
- 预期证据：配置行截图（脱敏）、默认口令 401 回显截图、实际口令 200 回显截图（口令脱敏）。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">grep -n <span class="s2">&#34;harbor_admin_password&#34;</span> /opt/harbor/harbor.yml
</span></span><span class="line"><span class="cl">47:harbor_admin_password: ********
</span></span><span class="line"><span class="cl">curl -sk -o /dev/null -w <span class="s2">&#34;%{http_code}\n&#34;</span> -u <span class="s2">&#34;admin:Harbor12345&#34;</span> https://registry.demo.local/api/v2.0/users/current
</span></span><span class="line"><span class="cl"><span class="m">401</span>
</span></span><span class="line"><span class="cl">curl -sk -o /dev/null -w <span class="s2">&#34;%{http_code}\n&#34;</span> -u <span class="s2">&#34;admin:********&#34;</span> https://registry.demo.local/api/v2.0/users/current
</span></span><span class="line"><span class="cl"><span class="m">200</span>
</span></span><span class="line"><span class="cl">（默认口令已失效，实际口令登录正常，双证据一致）
</span></span></code></pre></div>
</details>


### B. 认证模式与自助注册

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/configurations" \
  | grep -oE '"(auth_mode|self_registration|project_creation_restriction)":[^,}]+'
```

- 备注：官方身份认证文档支持数据库认证、LDAP/AD、OIDC 三种模式（UAA 仍在界面可见但官方声明 "not recommended and is not documented"）；`auth_mode` **不是** harbor.yml 字段，认证模式存于数据库，经本接口或控制台「身份管理」页核验；self_registration 官方字段描述 "Whether the Harbor instance supports self-registration. If it's set to false, admin need to add user to the instance."，生产环境应置 false；另注意官方锁定限制 "You cannot change to a different authentication mode after creating local users"（本地建库后锁定 db_auth），切换统一认证须在启用本地账号前规划。
- 预期证据：configurations 回显截图、控制台身份管理页截图、统一认证方案说明。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;auth_mode&#34;</span>:<span class="s2">&#34;db_auth&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;self_registration&#34;</span>:false
</span></span><span class="line"><span class="cl"><span class="s2">&#34;project_creation_restriction&#34;</span>:<span class="s2">&#34;adminonly&#34;</span>
</span></span><span class="line"><span class="cl">（数据库本地认证、自助注册已关闭、仅管理员可建项目；接入 LDAP/OIDC 的现场回显对应模式名）
</span></span></code></pre></div>
</details>


### C. 会话超时与登录失败处理

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/configurations" | grep -oE '"session_timeout":[^,}]+'
```

- 备注：控制台路径为「系统设置 → Session Timeout (Minutes)」，官方前端语言文件原文 "Set the session timeout for Harbor UI. The default is 60 minutes."（默认 60 分钟），现场按管理要求核对取值；harbor.yml 与 configurations 字段集中均无登录失败锁定配置项（已对照官方 harbor.yml 模板与 v2.12.0 API 定义核验），失败处理依托管理网隔离、反向代理限流与审计追溯，登录失败实测与审计日志（见安全审计 A）可作补充证据。
- 【不适用】"登录失败锁定"无内置配置项，对 Harbor 本体可判定为不适用，由网络与主机层补偿。依据：GB/T 28448-2019 身份鉴别控制点按对象实际鉴别机制判定。
- 预期证据：session_timeout 回显截图、控制台系统设置截图、超时/失败实测记录。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;session_timeout&#34;</span>:60
</span></span><span class="line"><span class="cl">（默认 <span class="m">60</span> 分钟未调整，控制台闲置超时后需重新登录；按管理要求记录整改建议或确认满足制度）
</span></span></code></pre></div>
</details>


### D. 统一认证对接证据

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/configurations" \
  | grep -oE '"(ldap_url|ldap_verify_cert|oidc_endpoint|oidc_verify_cert|oidc_scope|oidc_admin_group)":[^,}]+'
```

- 备注：接入 LDAP/OIDC 时逐项核对：服务端地址（ldap_url/oidc_endpoint）、证书校验开关（ldap_verify_cert/oidc_verify_cert 自签证书环境置 false 时须记录补偿措施）、范围与组映射（oidc_scope、oidc_admin_group 为管理员组）；对接证据还应包含认证平台侧的应用注册截图与账号映射说明，控制台登录实测走统一认证入口截图。
- 预期证据：configurations 回显截图、认证平台应用注册截图、账号映射与对接说明。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;oidc_endpoint&#34;</span>:<span class="s2">&#34;https://sso.demo.local/realms/demo&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;oidc_verify_cert&#34;</span>:true
</span></span><span class="line"><span class="cl"><span class="s2">&#34;oidc_scope&#34;</span>:<span class="s2">&#34;openid,profile,email,groups&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;oidc_admin_group&#34;</span>:<span class="s2">&#34;harbor-admins&#34;</span>
</span></span><span class="line"><span class="cl">（OIDC 统一认证已对接，证书校验开启，管理员组收敛）
</span></span></code></pre></div>
</details>


## 访问控制

> **对应控制点**：GB/T 22239-2019 8.1.4.2 访问控制 a)~f)
>
> **判定要点**：项目角色按 Limited Guest/Guest/Developer/Maintainer/ProjectAdmin 最小化分配、公开项目经审批且无内部镜像误置公开、机器人账号限期且最小权限、配额与只读模式受控、443 管理来源受限 → 符合；角色齐备但公开项目/机器人账号失控 → 部分符合；内部镜像存于公开项目、全员共用 admin、机器人账号永不过期且全项目写权限 → 不符合（高风险）。
>
> **取证要求**：项目清单与 public 字段截图、成员角色截图、机器人账号清单与 expires_at 截图、配额与只读模式设置截图、防火墙/安全组策略截图。

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">高风险提示</div>


公开项目（public=true）承载未脱敏内部镜像且 443 对更大范围开放，任何可达者可匿名拉取（Anonymous 角色对公开项目只读），按未授权访问口径判高风险；机器人账号选择 "Never Expired" 且 "Cover all projects"、赋予 Push 权限，长期有效凭据外泄即写权限失控；多人共用 admin 账号导致行为无法定责。三者任一出现且无补偿措施，判高风险/不符合。

判定口径详见 [22、高风险判定指引与加固对照表](../../../reinforce/其他系统或设备/22高风险判定指引与加固对照表/)。
</div>


### A. 项目角色与公开项目

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/projects?page_size=15" | grep -oE '"name":"[^"]+"|"public":"(true|false)"'
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/projects/demo-app/members"
```

- 备注：角色以官方用户管理文档命名为准：Limited Guest（仅拉取）、Guest（项目内只读）、Developer（读写）、Maintainer（读写+扫描/删除制品）、ProjectAdmin（成员与项目管理，项目创建者自动获得），另有 Harbor system administrator 与 Anonymous（未登录用户，对公开项目只读）；public 字段官方定义 "The public status of the project. The valid values are \"true\", \"false\""，成员接口回显用户与角色，抽样核对与立项/授权文档一致；官方默认公共项目 library 归系统管理员所有，业务项目应为 private。
- 预期证据：项目 public 清单截图、成员角色截图、公开项目评审记录。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;name&#34;</span>:<span class="s2">&#34;library&#34;</span>   <span class="s2">&#34;public&#34;</span>:<span class="s2">&#34;true&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;name&#34;</span>:<span class="s2">&#34;demo-app&#34;</span>  <span class="s2">&#34;public&#34;</span>:<span class="s2">&#34;false&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;name&#34;</span>:<span class="s2">&#34;demo-cicd&#34;</span> <span class="s2">&#34;public&#34;</span>:<span class="s2">&#34;false&#34;</span>
</span></span><span class="line"><span class="cl">/projects/demo-app/members（节选）
</span></span><span class="line"><span class="cl"><span class="s2">&#34;entity_name&#34;</span>:<span class="s2">&#34;zhangsan&#34;</span> <span class="s2">&#34;role_name&#34;</span>:<span class="s2">&#34;developer&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;entity_name&#34;</span>:<span class="s2">&#34;ci-puller&#34;</span> <span class="s2">&#34;role_name&#34;</span>:<span class="s2">&#34;guest&#34;</span>
</span></span><span class="line"><span class="cl">（公开项目仅官方默认 library，业务项目均私有，角色与授权台账一致）
</span></span></code></pre></div>
</details>


### B. 机器人账号

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/robots?page_size=10"
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/configurations" | grep -oE '"robot_name_prefix":[^,}]+|"robot_token_duration":[^,}]+'
```

- 备注：官方机器人账号文档原文 "By default, robot accounts expire after 30 days."，创建时可选 "Never Expired"；全局有效期由控制台「系统设置 → Robot Token Expiration (Days)」调整（API 字段 robot_token_duration）；账号名默认带 robot$ 前缀（robot_name_prefix 可配）；官方明确 "Harbor does not store robot account secrets"，secret 仅创建时展示一次、之后仅可 Refresh Secret，因此**明文令牌只存在于使用方**，核对各机器人 expires_at 与用途台账，跨年不过期（Never Expired）的账号须说明审批依据；机器人账号不能登录控制台，泄露影响限于镜像拉推。
- 预期证据：机器人清单与 expires_at 截图、全局有效期设置截图、机器人用途与审批台账。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;name&#34;</span>:<span class="s2">&#34;robot</span><span class="nv">$ci</span><span class="s2">-puller&#34;</span>  <span class="s2">&#34;expires_at&#34;</span>:1789401600  <span class="s2">&#34;creation_time&#34;</span>:<span class="s2">&#34;2026-08-10T02:00:00.000Z&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;name&#34;</span>:<span class="s2">&#34;robot</span><span class="nv">$demo</span><span class="s2">-pull&#34;</span>  <span class="s2">&#34;expires_at&#34;</span>:1786723200
</span></span><span class="line"><span class="cl"><span class="s2">&#34;robot_name_prefix&#34;</span>:<span class="s2">&#34;robot</span>$<span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;robot_token_duration&#34;</span>:30
</span></span><span class="line"><span class="cl">（CI 拉取机器人按 <span class="m">30</span> 天有效期；台账中另有 <span class="m">1</span> 个 Never Expired 账号 robot<span class="nv">$legacy</span>-sync，需评估收敛）
</span></span></code></pre></div>
</details>


### C. 项目配额与只读模式

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/configurations" | grep -oE '"(quota_per_project_enable|storage_per_project|read_only)":[^,}]+'
```

- 备注：官方项目配额文档：UI 字段名 "Default storage consumption"，单位 MiB/GiB/TiB，默认 "By default, all projects have unlimited quotas for storage use."（不限制），全局默认仅影响其后新建项目、可按项目覆盖，-1 为不限；read_only 只读模式（控制台可切换）用于应急冻结推送，官方描述 "Harbor allows docker pull but prevents docker push and the deletion of repositories and tags"；注意官方说明配额超限的推送"might not be immediately rejected"（manifest 后到被按序接受），**不能以"推不进去"作为配额生效的判定依据**，须核对设置本身。
- 预期证据：配额设置截图、只读模式状态截图、配额分配台账。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;quota_per_project_enable&#34;</span>:true
</span></span><span class="line"><span class="cl"><span class="s2">&#34;storage_per_project&#34;</span>:107374182400
</span></span><span class="line"><span class="cl"><span class="s2">&#34;read_only&#34;</span>:false
</span></span><span class="line"><span class="cl">（按项目 <span class="m">100</span> GiB 配额已启用，只读模式未启用，与容量规划一致）
</span></span></code></pre></div>
</details>


### D. 管理来源限制

**核查命令**：

```bash
ss -lntp | grep -E ":443 |:80 "
firewall-cmd --list-all 2>/dev/null
iptables -L INPUT -n -v --line-numbers 2>/dev/null | head -n 20
```

- 备注：443（管理端与镜像拉推）应仅对研发网段、CI 节点与堡垒机放行；harbor.yml 模板注释明确 http 端口 "If https enabled, this port will redirect to https port"，保留 80 仅作跳转时同样须限源；云环境同步核查安全组截图；与入侵防范 A 的暴露面核查互为印证。
- 预期证据：监听地址截图、防火墙/安全组策略截图、网络架构图。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ss -lntp <span class="p">|</span> grep -E <span class="s2">&#34;:443 |:80 &#34;</span>
</span></span><span class="line"><span class="cl">LISTEN <span class="m">0</span> <span class="m">511</span> 192.168.10.5:443 ...
</span></span><span class="line"><span class="cl">iptables -L INPUT（节选）
</span></span><span class="line"><span class="cl"><span class="m">1</span>  ACCEPT tcp -- 192.168.30.0/24  0.0.0.0/0  tcp dpt:443
</span></span><span class="line"><span class="cl"><span class="m">2</span>  DROP  tcp -- 0.0.0.0/0         0.0.0.0/0  tcp dpt:443
</span></span><span class="line"><span class="cl">（443 仅对研发/CI 网段 192.168.30.0/24 放行）
</span></span></code></pre></div>
</details>


## 安全审计

> **对应控制点**：GB/T 22239-2019 8.1.4.3 安全审计 a)~d)
>
> **判定要点**：审计日志覆盖登录、推拉、项目/成员/配置变更等操作且字段含用户/资源/操作/时间、留存不少于 6 个月（本体留存+外送日志平台）、普通用户不可删改审计记录 → 符合；仅本地留存且清理策略短于 6 个月、无外送 → 部分符合/不符合；完全无日志可追溯 → 不符合（高风险）。
>
> **取证要求**：GET /audit-logs 回显截图、Log Rotation/清理调度配置截图、审计外送与日志平台留存（含 6 个月前记录）截图、组件日志样例。

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">高风险提示</div>


审计留存不足 6 个月且未外送集中日志平台判高风险：Harbor 本体审计经「日志轮转 Log Rotation」策略清理，官方示例参数即 168 小时（7 天），远短于等保 6 个月要求；另注意 "Skip Audit Log Database" 开启后又未配置外送端点，等于不留操作审计，谁删了镜像、谁改了权限完全无法追溯，按《高风险判定指引》审计类口径判高风险。

判定口径详见 [22、高风险判定指引与加固对照表](../../../reinforce/其他系统或设备/22高风险判定指引与加固对照表/)。
</div>


### A. 审计日志（操作日志）核查

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/audit-logs?page_size=5"
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/projects/demo-app/logs?page_size=5"
```

- 备注：/audit-logs 官方 summary "Get recent logs of the projects which the user is a member of"，返回字段 id/username/resource/resource_type/operation/op_time（对照 v2.12.0 API 的 AuditLog 定义），覆盖 create/delete/pull 等操作；项目级 /projects/{name}/logs 同口径；控制台「日志查询」页等价；普通用户仅可见本人所属项目日志，系统管理员可查全局，构成"审计记录受权限保护"的证据。
- 预期证据：审计日志样例（含时间、用户、操作、资源）截图、控制台日志页截图、普通用户无删除审计记录的说明或实测。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">{</span><span class="s2">&#34;id&#34;</span>:10231,<span class="s2">&#34;username&#34;</span>:<span class="s2">&#34;developer01&#34;</span>,<span class="s2">&#34;resource&#34;</span>:<span class="s2">&#34;demo-app/app-web&#34;</span>,<span class="s2">&#34;resource_type&#34;</span>:<span class="s2">&#34;artifact&#34;</span>,<span class="s2">&#34;operation&#34;</span>:<span class="s2">&#34;pull&#34;</span>,<span class="s2">&#34;op_time&#34;</span>:<span class="s2">&#34;2026-09-01T10:21:33.000Z&#34;</span><span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">{</span><span class="s2">&#34;id&#34;</span>:10230,<span class="s2">&#34;username&#34;</span>:<span class="s2">&#34;robot</span><span class="nv">$ci</span><span class="s2">-puller&#34;</span>,<span class="s2">&#34;resource&#34;</span>:<span class="s2">&#34;demo-app/app-web&#34;</span>,<span class="s2">&#34;resource_type&#34;</span>:<span class="s2">&#34;artifact&#34;</span>,<span class="s2">&#34;operation&#34;</span>:<span class="s2">&#34;push&#34;</span>,<span class="s2">&#34;op_time&#34;</span>:<span class="s2">&#34;2026-09-01T09:58:02.000Z&#34;</span><span class="o">}</span>
</span></span><span class="line"><span class="cl">（字段与官方 AuditLog 定义一致，人与行为可追溯）
</span></span></code></pre></div>
</details>


### B. 审计留存与清理（Log Rotation / Purge）

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/system/purgeaudit/schedule"
```

- 备注：控制台路径 管理 → 清理 → 「日志轮转 Log Rotation」页：保留时长 "Keep records in"（按小时/天）、清理范围 "Included Operations"（create/delete/pull）、DRY RUN 与 PURGE NOW，调度 None/Hourly/Daily/Weekly/Custom；官方 API 示例参数即 {"parameters":{"audit_retention_hour":168,...}}（168 小时=7 天，**远短于 6 个月**，现场取小值时必须以日志平台外送补偿）；「Audit Log Forward Syslog Endpoint」审计转发与 "Skip Audit Log Database" 在 配置 → 系统设置，docker-compose 默认端点为 harbor-log:10514。
- 预期证据：purge 调度回显截图、Log Rotation 配置截图、外送端点配置截图。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">{</span><span class="s2">&#34;schedule&#34;</span>:<span class="o">{</span><span class="s2">&#34;type&#34;</span>:<span class="s2">&#34;Hourly&#34;</span>,<span class="s2">&#34;cron&#34;</span>:<span class="s2">&#34;0 0 * * * *&#34;</span><span class="o">}</span>,<span class="s2">&#34;parameters&#34;</span>:<span class="o">{</span><span class="s2">&#34;audit_retention_hour&#34;</span>:720,<span class="s2">&#34;dry_run&#34;</span>:false,<span class="s2">&#34;include_operations&#34;</span>:<span class="s2">&#34;create,delete,pull&#34;</span><span class="o">}}</span>
</span></span><span class="line"><span class="cl">（本体留存 <span class="m">720</span> <span class="nv">小时</span><span class="o">=</span><span class="m">30</span> 天，不足 <span class="m">6</span> 个月部分由审计转发+日志平台 <span class="m">180</span> 天留存承担，两项证据须同时在场）
</span></span></code></pre></div>
</details>


### C. 组件日志

**核查命令**：

```bash
cd /opt/harbor && docker compose logs --tail 50 core
docker compose logs --tail 20 jobservice
grep -n -A5 "^log:" harbor.yml
ls /var/log/harbor | head -n 10
```

- 备注：harbor.yml 的 log.level 默认 info、log.local.location 默认 /var/log/harbor、rotate_count 50、rotate_size 200M（官方 configure-yml 文档）；harbor-log 容器汇聚各组件 syslog（官方 compose 模板将 10514 仅绑定到 127.0.0.1:1514），/var/log/harbor 下 core.log/jobservice.log/registry.log/postgres.log/proxy.log 按 200M×50 轮转；组件日志属运行日志，操作级审计以上文 /audit-logs 为准。
- 预期证据：组件日志样例截图、log 配置截图、/var/log/harbor 轮转文件截图。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose logs --tail <span class="m">50</span> core（节选）
</span></span><span class="line"><span class="cl">Aug <span class="m">30</span> 10:21:33 host core<span class="o">[</span>...<span class="o">]</span>: <span class="s2">&#34;/api/v2.0/projects&#34;</span> response <span class="m">200</span>
</span></span><span class="line"><span class="cl">ls /var/log/harbor
</span></span><span class="line"><span class="cl">core.log  jobservice.log  registry.log  postgres.log  proxy.log
</span></span><span class="line"><span class="cl">（log level info，按 200M×50 轮转，并经 rsyslog 上送日志平台）
</span></span></code></pre></div>
</details>


### D. 审计外送与 6 个月留存闭环

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/configurations" | grep -oE '"(audit_log_forward_endpoint|skip_audit_log_database)":[^,}]+'
grep -R -i "10514\|harbor" /etc/rsyslog.conf /etc/rsyslog.d 2>/dev/null | head -n 6
```

- 备注：audit_log_forward_endpoint 官方字段描述 "The endpoint of the audit log forwarder"；skip_audit_log_database 官方描述 "Whether skip the audit log in database"——置 true 时本体库不留存，必须确认外送端点有效且平台留存不少于 6 个月，否则判不符合；留存证据以日志平台检索到 6 个月前的 Harbor 审计记录截图为准。
- 预期证据：configurations 回显截图、日志平台 6 个月前记录检索截图、外送链路说明。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;audit_log_forward_endpoint&#34;</span>:<span class="s2">&#34;harbor-log:10514&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;skip_audit_log_database&#34;</span>:false
</span></span><span class="line"><span class="cl">（本体留存 <span class="m">30</span> 天 + harbor-log 汇聚 → rsyslog → 日志平台留存 <span class="m">180</span> 天，闭环成立）
</span></span></code></pre></div>
</details>


## 入侵防范

> **对应控制点**：GB/T 22239-2019 8.1.4.4 入侵防范 a)~h)、8.1.4.5 恶意代码防范
>
> **判定要点**：HTTPS 强制且证书有效、管理面收敛（80/443 限源）、Trivy 已部署且扫描策略运行、高危镜像拉取拦截已启用、基础镜像来源可信、宿主机恶意代码防护到位、漏洞修补有记录 → 符合；部分缺失但有补偿（WAF/IPS、镜像准入、EDR）且证据齐全 → 部分符合；HTTP 明文部署、无扫描无拦截、版本陈旧且有未修补高危漏洞 → 不符合（高风险）。
>
> **取证要求**：harbor.yml https 段与证书截图、监听与防火墙截图、scanners 回显截图、项目部署安全策略截图、Trivy 扫描报告样例、宿主机 EDR 截图。

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">高风险提示</div>


①仅以 HTTP（harbor.yml 未配置 https 段）对外提供服务且管理端跨安全域可达，登录凭据与镜像层明文传输，官方文档将 http 明确标注为不适合生产环境，判高风险；②安装时未附加 --with-trivy 且未接入外部扫描器，镜像带洞即分发、无任何拦截，判高风险；③项目级 "Prevent vulnerable images from running"（防漏洞镜像拉取）未启用且 severity 未设置，高危漏洞镜像可自由被下游拉取运行，一并记录整改。

判定口径详见 [22、高风险判定指引与加固对照表](../../../reinforce/其他系统或设备/22高风险判定指引与加固对照表/)。
</div>


### A. HTTPS 与端口暴露面

**核查命令**：

```bash
grep -n -A4 "^https:" /opt/harbor/harbor.yml
ss -lntp | grep -E ":443 |:80 "
curl -sk -o /dev/null -w "%{http_code}\n" http://registry.demo.local/api/v2.0/health
openssl s_client -connect registry.demo.local:443 </dev/null 2>/dev/null | openssl x509 -noout -subject -dates
```

- 备注：官方 v2.12 compose 模板将宿主 443 映射到 nginx 容器内 8443（{{https_port}}:8443）、宿主 80 映射容器 8080；4443 为历史 Notary 端口，自 v2.8 内置 Notary 移除后新部署无需开放；证书路径由 https.certificate/private_key 指定，证书与密钥同时落盘于数据卷 secret 目录（compose 挂载 {{data_volume}}/secret/cert）；HTTP 探测返回 301/跳转为阴性证据，直接返回 200 且承载管理端时结合判定要点判高风险。
- 预期证据：https 配置截图、监听截图、HTTP 跳转/拒绝回显、证书有效期截图。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">https:
</span></span><span class="line"><span class="cl">  port: <span class="m">443</span>
</span></span><span class="line"><span class="cl">  certificate: /data/cert/registry.demo.local.crt
</span></span><span class="line"><span class="cl">  private_key: /data/cert/registry.demo.local.key
</span></span><span class="line"><span class="cl">curl http://registry.demo.local/api/v2.0/health -o /dev/null -w <span class="s2">&#34;%{http_code}&#34;</span>
</span></span><span class="line"><span class="cl"><span class="m">301</span>
</span></span><span class="line"><span class="cl"><span class="nv">notAfter</span><span class="o">=</span>2027-08-30T00:00:00+08:00
</span></span><span class="line"><span class="cl">（HTTPS 已强制，80 仅跳转；未发现 <span class="m">4443</span> 监听，历史 Notary 端口已关闭）
</span></span></code></pre></div>
</details>


### B. Trivy 扫描器与漏洞库

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/scanners"
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/configurations" | grep -oE '"scan_all_policy":\{.*\}'
grep -n -A8 "^trivy:" /opt/harbor/harbor.yml
```

- 备注：官方漏洞扫描文档原文 "Clair has been removed as a default scanner in v2.2"，2.x 以 Trivy 为默认扫描器、安装时须附加 --with-trivy（官方 install.sh 原文 "Please set --with-trivy if needs enable Trivy in Harbor"），1.x 现场默认为 Clair、取证材料不同；/scanners 回显扫描器名称/URL/状态，控制台「审查服务」页可见默认标记；定时全量扫描经 configurations 的 scan_all_policy（官方取值 "none" 与 "daily"，daily_time 为相对 UTC 0 点的秒偏移）；离线/弱网环境核对 trivy.skip_update、ignore_unfixed 取值并记录漏洞库离线更新方式（官方提示匿名拉取 GitHub 限流 60 次/小时、配 github_token 后 5000 次/小时）。
- 预期证据：scanners 回显截图、trivy 配置截图、扫描报告样例、全量扫描调度截图。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">{</span><span class="s2">&#34;name&#34;</span>:<span class="s2">&#34;Trivy&#34;</span>,<span class="s2">&#34;url&#34;</span>:<span class="s2">&#34;http://trivy-adapter:8080&#34;</span>,<span class="s2">&#34;vendor&#34;</span>:<span class="s2">&#34;Aqua Security&#34;</span>,...<span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;scan_all_policy&#34;</span>:<span class="o">{</span><span class="s2">&#34;type&#34;</span>:<span class="s2">&#34;daily&#34;</span>,<span class="s2">&#34;parameter&#34;</span>:<span class="o">{</span><span class="s2">&#34;daily_time&#34;</span>:0<span class="o">}}</span>
</span></span><span class="line"><span class="cl">trivy:
</span></span><span class="line"><span class="cl">  ignore_unfixed: <span class="nb">false</span>
</span></span><span class="line"><span class="cl">  skip_update: <span class="nb">false</span>
</span></span><span class="line"><span class="cl">（默认扫描器 Trivy，每日 <span class="m">0</span> 点全量扫描，漏洞库在线更新）
</span></span></code></pre></div>
</details>


### C. 拉取拦截与签名策略（部署安全）

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/projects/demo-app" | grep -oE '"(prevent_vul|severity|auto_scan|enable_content_trust_cosign|enable_content_trust)":[^,}]+'
```

- 备注：官方项目配置页策略名：防漏洞镜像拉取复选框 "Prevent vulnerable images from running"（选择 severity 级别；官方说明 "Harbor does not prevent images with a vulnerability severity of negligible from running"）、推送自动扫描 "Automatically scan images on push"；项目 metadata API 对应字段 prevent_vul/severity/auto_scan，severity 官方取值 "none"、"low"、"medium"、"high"、"critical"；内容信任以项目配置页 Cosign/Notation 复选框承载（enable_content_trust_cosign/enable_content_trust），启用后未签名镜像不可拉取；三项策略与安全管理制度（漏洞准入）应互相印证。
- 预期证据：项目部署安全配置截图、metadata 回显截图、被拦截拉取的实测/告警记录。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;prevent_vul&#34;</span>:true
</span></span><span class="line"><span class="cl"><span class="s2">&#34;severity&#34;</span>:<span class="s2">&#34;high&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;auto_scan&#34;</span>:true
</span></span><span class="line"><span class="cl"><span class="s2">&#34;enable_content_trust_cosign&#34;</span>:false
</span></span><span class="line"><span class="cl">（高危及以上漏洞镜像禁止拉取、推送自动扫描已启用；cosign 签名校验未启用，记录为整改建议）
</span></span></code></pre></div>
</details>


### D. 恶意代码防范与镜像供应链

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/projects/demo-app/artifacts?page_size=3&with_scan_overview=true"
systemctl list-units --type=service --no-pager 2>/dev/null | grep -iE "edr|clam|hips|av-"
```

- 备注：镜像层恶意内容防护落点：①准入——Trivy 漏洞扫描与拉取拦截（见 B/C），基础镜像来源白名单与流水线准入访谈取证；②Harbor 本体对 blob 原样存储、不改写镜像内容，构建期投毒须由 CI/EDR 溯源；③宿主机防恶意代码软件/EDR 的安装、病毒库更新与拦截记录截图（服务名因单位而异，现场确认）；④仓库内历史制品建议抽样核对扫描概览与 CVE 允许清单审批记录。
- 预期证据：制品扫描概览截图、EDR 安装与病毒库截图、镜像准入制度、CVE 允许清单审批记录。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/artifacts?with_scan_overview<span class="o">=</span>true（节选）
</span></span><span class="line"><span class="cl"><span class="s2">&#34;digest&#34;</span>:<span class="s2">&#34;sha256:9c7f8b2e...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;scan_overview&#34;</span>:<span class="o">{</span>...<span class="o">{</span><span class="s2">&#34;summary&#34;</span>:<span class="o">{</span><span class="s2">&#34;critical&#34;</span>:0,<span class="s2">&#34;high&#34;</span>:1,<span class="s2">&#34;medium&#34;</span>:12,...<span class="o">}}}</span>
</span></span><span class="line"><span class="cl">（最新制品扫描概览随制品 API 返回；1 个 high 漏洞经 CVE 允许清单审批留痕，宿主机 EDR 病毒库当日更新）
</span></span></code></pre></div>
</details>


## 数据完整性

> **对应控制点**：GB/T 22239-2019 8.1.4.7 数据完整性 a)b)
>
> **判定要点**：镜像分发基于摘要（digest sha256）寻址校验且传输走 TLS、关键项目启用 Cosign/Notation 签名校验、harbor.yml 与证书变更受控可追溯 → 符合；仅传输加密或仅摘要校验 → 部分符合；跨不可信链路明文且无任何校验手段 → 不符合。
>
> **取证要求**：TLS 证书指纹截图、artifact digest 回显截图、签名策略与签名验证记录、存储后端配置截图、配置变更记录。

### A. 传输加密与摘要校验

**核查命令**：

```bash
openssl s_client -connect registry.demo.local:443 </dev/null 2>/dev/null | openssl x509 -noout -subject -dates -fingerprint -sha256
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/projects/demo-app/repositories/app-web/artifacts/v2.3.1"
```

- 备注：Registry 分发协议按 manifest digest（sha256）寻址，客户端拉取后按摘要校验内容，构成端到端完整性机制；API 返回 artifact 的 digest 字段可与 CI/CD 发布记录比对，证明"发布的就是仓库里的"；跨机房复制（replication）目标应基于 HTTPS，避免明文跨区。
- 预期证据：证书指纹截图、digest 回显截图、CI 摘要比对记录、复制策略配置截图。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;digest&#34;</span>:<span class="s2">&#34;sha256:9c7f8b2e...&#34;</span>,<span class="s2">&#34;tags&#34;</span>:<span class="o">[</span><span class="s2">&#34;v2.3.1&#34;</span><span class="o">]</span>,<span class="s2">&#34;push_time&#34;</span>:<span class="s2">&#34;2026-08-30T02:10:11.000Z&#34;</span>
</span></span><span class="line"><span class="cl">（digest 与流水线发布记录一致；握手证书指纹与运维台账一致）
</span></span></code></pre></div>
</details>


### B. 签名校验与存储后端

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/projects/demo-app" | grep -oE '"enable_content_trust_cosign":[^,}]+'
grep -n -B1 -A4 "storage_service" /opt/harbor/harbor.yml | head -n 12
ls /data/registry/docker/registry/v2/repositories 2>/dev/null | head -n 8
```

- 备注：Harbor 2.x 项目级内容信任仅做**校验拦截**，签名工具（cosign/notation）需独立部署，官方内容信任文档原文 "Verified images are determined by Cosign or Notation, depending on the policy you have checked."，两策略同开时制品需双重签名方可拉取；存储后端默认 filesystem（官方模板注释 "storage backend, default is filesystem, options include filesystem, azure, gcs, s3, swift and oss"），改为对象存储时完整性由对象存储校验和与版本化机制补充取证；未签名制品清单可作为启用签名校验前的整改依据。
- 预期证据：签名策略截图、cosign verify 抽样记录、存储后端配置截图、目录树截图。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;enable_content_trust_cosign&#34;</span>:true
</span></span><span class="line"><span class="cl"><span class="c1"># storage_service 处于注释状态 → 默认 filesystem，数据落 /data/registry</span>
</span></span><span class="line"><span class="cl">repositories: demo-app/app-web  demo-app/app-api
</span></span><span class="line"><span class="cl">（关键项目启用 cosign 校验；cosign verify registry.demo.local/demo-app/app-web:v2.3.1 验证记录留档）
</span></span></code></pre></div>
</details>


## 数据保密性

> **对应控制点**：GB/T 22239-2019 8.1.4.8 数据保密性 a)b)
>
> **判定要点**：鉴别信息（控制台口令、机器人 secret、docker login 凭据）经 HTTPS 传输、harbor.yml 中数据库与初始口令不以明文外泄且文件权限收敛、secret 与 common/config 目录权限最小化 → 符合；文件权限过宽或口令明文散落 → 部分符合；口令/密钥明文暴露给无关人员 → 不符合（高风险）。
>
> **取证要求**：文件权限截图、secret 目录截图、数据库口令修改记录、HTTPS 配置截图（复用入侵防范 A）。

### A. 配置、口令与密钥文件权限

**核查命令**：

```bash
ls -l /opt/harbor/harbor.yml /opt/harbor/docker-compose.yml
ls -ld /opt/harbor /opt/harbor/common /opt/harbor/common/config
ls -ld /data/secret /data/secret/cert 2>/dev/null
grep -n "password:" /opt/harbor/harbor.yml | sed "s/:.*/: ***/"
```

- 备注：harbor.yml 含 database.password（官方模板默认 root123，官方文档要求生产环境必须修改）与 harbor_admin_password（仅首次启动读取），docker-compose.yml 为安装器生成文件；common/config 目录由 ./prepare 生成、注入各组件配置与密钥；数据卷 /data/secret 存放证书与内部 TLS 密钥（官方 compose 模板挂载 {{data_volume}}/secret/cert）。以上文件应仅 root/部署账户可读（600/640，目录 700/750），并纳入堡垒机或密钥管理托管。
- 预期证据：权限截图、数据库口令修改记录、密钥管理说明。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">-rw------- <span class="m">1</span> root root <span class="m">14288</span> /opt/harbor/harbor.yml
</span></span><span class="line"><span class="cl">drwx------  <span class="m">5</span> root root <span class="m">4096</span>  /opt/harbor/common
</span></span><span class="line"><span class="cl">drwx------  <span class="m">4</span> root root <span class="m">4096</span>  /data/secret
</span></span><span class="line"><span class="cl">grep -n <span class="s2">&#34;password:&#34;</span> /opt/harbor/harbor.yml
</span></span><span class="line"><span class="cl">52:  password: ***
</span></span><span class="line"><span class="cl">（配置仅 root 可读；数据库口令已改并纳入托管，未发现明文口令散落在脚本/文档）
</span></span></code></pre></div>
</details>


### B. 传输加密与内部 TLS

**核查命令**：

```bash
grep -n -A3 "internal_tls" /opt/harbor/harbor.yml | head -n 8
curl -sk -o /dev/null -w "%{http_code}\n" https://registry.demo.local/api/v2.0/health
```

- 备注：外部传输由 nginx 终结 TLS（见入侵防范 A）；组件间可启用内部 TLS（harbor.yml internal_tls 段，官方安装文档含"Configure Enabling Internal TLS"专节，默认未启用），未启用时以宿主机网络受限（专用 VLAN/防火墙）为补偿并列入整改建议；镜像层数据本身不以加密形态存储，敏感构建信息（凭据、源码包）不应固化进镜像层；使用外部对象存储（s3 等）时应启用 HTTPS 与服务端加密，由存储侧配置截图取证。
- 【不适用】镜像内容加密非仓库本体职责：业务敏感数据以应用层加密或加密制品承担时，可按对象边界判定部分不适用。依据：GB/T 28448-2019 按对象实际数据处理功能判定。
- 预期证据：internal_tls 配置截图、对象存储加密策略截图、镜像内容治理说明、访谈记录。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">grep -n -A3 <span class="s2">&#34;internal_tls&#34;</span> /opt/harbor/harbor.yml（节选）
</span></span><span class="line"><span class="cl">internal_tls:
</span></span><span class="line"><span class="cl">  enabled: <span class="nb">false</span>
</span></span><span class="line"><span class="cl">（组件间内部 TLS 未启用，组件网络限于宿主机内网；外部一律 HTTPS，内部 TLS 列入加固建议）
</span></span></code></pre></div>
</details>


## 备份恢复

> **对应控制点**：GB/T 22239-2019 8.1.4.9 数据备份恢复 a)c)
>
> **判定要点**：配置（harbor.yml、证书、secret）与数据（/data/database、/data/registry、/data/redis）有本地备份且异地存放、恢复经过演练验证、具备冗余（外置数据库/对象存储/多副本）→ 符合；有备份但无恢复演练、或备份物遗漏 registry 存储/secret → 部分符合；无任何备份与冗余措施 → 不符合（高风险）。
>
> **取证要求**：备份目录与策略截图、恢复演练记录、外置数据库/对象存储与冗余说明、/systeminfo/volumes 回显截图。

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">高风险提示</div>


数据库与镜像存储无任何备份、单机单盘部署且无冗余，磁盘故障即全库镜像不可恢复并阻断全部下游发布，按《高风险判定指引》数据备份恢复类口径判高风险；仅备份数据库而漏掉 /data/registry（镜像 blob）或证书与 secret 的，恢复不完整，按部分符合偏下记录并出具整改。

判定口径详见 [22、高风险判定指引与加固对照表](../../../reinforce/其他系统或设备/22高风险判定指引与加固对照表/)。
</div>


### A. 配置与数据库备份

**核查命令**：

```bash
ls -l /my_backup_dir 2>/dev/null | head -n 10
ls -ld /data/database /data/registry /data/redis
find /opt/harbor -maxdepth 1 -type f 2>/dev/null
```

- 备注：官方升级文档给出的备份口径（升级前必须执行，原文 "you MUST backup your data before any data migration"）：停止实例 `sudo docker compose down`、迁移安装目录 `mv harbor /my_backup_dir/harbor`、备份数据库 `cp -r /data/database /my_backup_dir/`；现场取证按此核对备份物是否覆盖 harbor.yml、证书与 secret 目录、/data/database（以上为变更类命令，由运维在授权下实施，现场仅核查备份结果）；Helm/K8s 部署官方另提供 "Backup And Restore Harbor With Velero" 页面。
- 预期证据：备份清单截图、备份策略与周期说明、备份介质异地存放说明。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/my_backup_dir（节选）
</span></span><span class="line"><span class="cl">harbor-2026-08-30.tar.gz  database-2026-08-30/  harbor.yml  cert/
</span></span><span class="line"><span class="cl">（每周日全备、保留 <span class="m">4</span> 版；harbor.yml 与证书/secret 一并入包，另有异地副本）
</span></span></code></pre></div>
</details>


### B. 镜像存储与外置组件冗余

**核查命令**：

```bash
du -sh /data/registry 2>/dev/null
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/systeminfo/volumes"
grep -n -B1 -A3 "external_database\|external_redis" /opt/harbor/harbor.yml | head -n 12
```

- 备注：/data/registry 存放镜像 blob（docker/registry/v2 目录树），体量大，应纳入存储层备份或改用对象存储（由云侧跨区冗余/版本化承担）；/systeminfo/volumes 为管理员专用接口，官方描述仅反映本机磁盘使用（total/free），可佐证容量与增长趋势；harbor.yml external_database/external_redis 段（官方 configure-yml 文档）指向外置 PostgreSQL/Redis 时，冗余能力由数据库侧高可用取证。
- 预期证据：卷使用回显截图、du 截图、对象存储冗余说明、外置数据库高可用截图。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">du -sh /data/registry
</span></span><span class="line"><span class="cl">318G    /data/registry
</span></span><span class="line"><span class="cl">/systeminfo/volumes（节选）
</span></span><span class="line"><span class="cl"><span class="s2">&#34;/data&#34;</span>: <span class="o">{</span><span class="s2">&#34;total&#34;</span>: 214748364800, <span class="s2">&#34;free&#34;</span>: 96207267328<span class="o">}</span>
</span></span><span class="line"><span class="cl">（本地盘剩余约 <span class="m">90</span> GiB；镜像 blob 另经夜间 rsync 至备份存储，数据库已外置主备）
</span></span></code></pre></div>
</details>


### C. 恢复演练

**核查命令**：

```bash
curl -s https://registry.demo.local/api/v2.0/health
docker ps --format "{{.Names}}\t{{.Status}}" | head -n 12
```

- 备注：恢复路径为：重装/还原安装目录与配置 → 恢复 /data/database → 恢复 registry 存储 → `docker compose up -d` → /api/v2.0/health 全部组件 healthy → 抽样 `docker pull` 校验 digest 与备份前一致；演练记录应含时间、参与人、恢复耗时与验证结论（文档取证，结合上两条命令佐证当前实例健康）。
- 预期证据：演练方案与记录、恢复后健康检查与拉取验证截图。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">{</span><span class="s2">&#34;status&#34;</span>:<span class="s2">&#34;healthy&#34;</span>,<span class="s2">&#34;components&#34;</span>:<span class="o">[</span>...<span class="o">]}</span>
</span></span><span class="line"><span class="cl">（2026-08 恢复演练记录：停机 <span class="m">52</span> 分钟恢复全库，抽样 digest 与备份前一致，参与人含运维与安全岗）
</span></span></code></pre></div>
</details>


## 剩余信息保护

> **对应控制点**：GB/T 22239-2019 8.1.4.10 剩余信息保护 a)b)
>
> **判定要点**：无 tag/已删除制品经垃圾回收（GC）定期释放存储、退役项目与离职账号及时清理停用、审计日志按策略清理且清理行为自身有记录 → 符合；GC 调度为 None 从未执行、历史账号长期留存 → 部分符合；已删除数据长期堆积且无任何清理机制 → 不符合。
>
> **取证要求**：GC 调度与历史截图、GC 日志样例、用户清单与在册名单核对记录、purge 历史截图。

### A. 垃圾回收（GC）

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/system/gc/schedule"
```

- 备注：控制台路径 管理 → 清理 → 「垃圾回收 Garbage Collection」页：调度 None/Hourly/Daily/Weekly/Custom，开关 "Allow garbage collection on untagged artifacts"（删除无 tag 制品后回收空间），DRY RUN 预估可释放空间、GC Now 手工触发（官方限制每分钟一次）；官方说明 GC 不中断推拉，另有 2 小时宽限期保护上传中的层；历史表含 Task ID/触发方式/状态/日志，可截图取证；调度为 None 表示从未自动回收，长期运行会累积大量无主 blob 并虚占配额。
- 预期证据：GC 调度截图、GC 历史与日志截图、DRY RUN 估算截图。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/system/gc/schedule（节选）
</span></span><span class="line"><span class="cl"><span class="o">{</span><span class="s2">&#34;schedule&#34;</span>:<span class="o">{</span><span class="s2">&#34;type&#34;</span>:<span class="s2">&#34;Weekly&#34;</span>,<span class="s2">&#34;cron&#34;</span>:<span class="s2">&#34;0 0 0 * * 0&#34;</span><span class="o">}</span>,...<span class="o">}</span>
</span></span><span class="line"><span class="cl">（每周六 <span class="m">0</span> 点 GC；<span class="s2">&#34;允许回收无 tag 制品&#34;</span>开启；最近一次历史显示释放 <span class="m">42</span> GB）
</span></span></code></pre></div>
</details>


### B. 退役项目、账号与日志清理

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/users?page_size=20"
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/system/purgeaudit?page_size=5"
```

- 备注：离职/外包人员账号应在控制台用户管理中停用（官方 Managing Users 文档），users 清单逐项与 HR 在册名单核对；退役项目删除后其 blob 由 GC 释放（官方配额文档原文 "Garbage collection frees storage held by untagged blobs"）；审计日志的清理行为本身记录于 purge 历史（见安全审计 B），形成"清理有痕"的闭环。
- 预期证据：用户清单核对截图、项目清理记录、purge 历史截图、账号与项目生命周期制度。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/users（节选）
</span></span><span class="line"><span class="cl"><span class="s2">&#34;username&#34;</span>:<span class="s2">&#34;lisi&#34;</span>   <span class="s2">&#34;disabled&#34;</span>:true
</span></span><span class="line"><span class="cl"><span class="s2">&#34;username&#34;</span>:<span class="s2">&#34;wangwu&#34;</span> <span class="s2">&#34;disabled&#34;</span>:false
</span></span><span class="line"><span class="cl">/system/purgeaudit（节选）
</span></span><span class="line"><span class="cl"><span class="s2">&#34;job_status&#34;</span>:<span class="s2">&#34;Successful&#34;</span>  <span class="s2">&#34;create_time&#34;</span>:<span class="s2">&#34;2026-09-01T00:00:08.000Z&#34;</span>
</span></span><span class="line"><span class="cl">（离职账号已停用；purge 每小时执行且历史可查，清理行为可追溯）
</span></span></code></pre></div>
</details>


## 个人信息保护

> **对应控制点**：GB/T 22239-2019 8.1.4.11 个人信息保护 a)b)
>
> **判定要点**：Harbor 本体仅处理账号信息（用户名、邮箱、登录与操作记录），不承载业务个人信息；审计日志字段最小化且访问随项目角色收敛、机器人令牌按需最小授权并定期轮换 → 符合；日志外送未脱敏或批量导出无管控 → 部分符合；明文泄露身份信息且无访问控制 → 不符合（高风险）。
>
> **取证要求**：审计日志字段清单与样例（脱敏）、用户数据范围说明、机器人账号台账与轮换记录、日志平台脱敏策略。

### A. 审计日志中的账号信息

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/audit-logs?page_size=5" | grep -oE '"username":"[^"]*"|"operation":"[^"]*"|"op_time":"[^"]*"'
```

- 备注：官方 AuditLog 定义字段仅 id/username/resource/resource_type/operation/op_time，不含口令、手机号、身份证号等敏感字段（对照 v2.12.0 API 定义），字段本身最小化；日志查询权限随项目成员与系统管理员角色收敛（见安全审计 A）；外送至日志平台后应启用脱敏与检索权限控制；留存期限由 Log Rotation 策略统一约束（见安全审计 B），避免审计日志无限期留存个人信息。
- 【不适用】经业务方书面确认镜像仓库不承载个人信息（镜像层不含员工/客户数据）时，"个人信息处理"对 Harbor 本体可判定为不适用，仅保留账号与审计日志层面的核查。依据：GB/T 28448-2019 个人信息保护控制点以实际处理个人信息为前提。
- 预期证据：审计字段样例（脱敏）截图、日志平台脱敏策略、访谈与业务确认单。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;username&#34;</span>:<span class="s2">&#34;developer01&#34;</span> <span class="s2">&#34;operation&#34;</span>:<span class="s2">&#34;pull&#34;</span> <span class="s2">&#34;op_time&#34;</span>:<span class="s2">&#34;2026-09-01T10:21:33.000Z&#34;</span>
</span></span><span class="line"><span class="cl">（无手机号/身份证等字段；日志平台按月脱敏归档，检索权限限安全审计组）
</span></span></code></pre></div>
</details>


### B. 机器人令牌与导出管控

**核查命令**：

```bash
curl -sk -u "admin:********" "https://registry.demo.local/api/v2.0/robots?page_size=10" | grep -oE '"name":"[^"]*"|"expires_at":[0-9]+'
```

- 备注：机器人 secret 仅创建时一次性展示且官方明确 "Harbor does not store robot account secrets"，明文令牌只存在于使用方，其导出（JSON 文件）行为应纳入台账；Refresh Secret 后旧令牌立即失效，轮换操作以管理员身份记入审计日志（可按上文 /audit-logs 抽样核对留痕）；镜像批量导出（docker pull/save）经项目权限与拉取拦截约束，大规模导出应经审批。
- 预期证据：机器人台账与轮换记录、审计日志中 Refresh Secret 留痕截图、导出审批制度。


<details class="td-details"><summary>示例输出（节选）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="s2">&#34;name&#34;</span>:<span class="s2">&#34;robot</span><span class="nv">$ci</span><span class="s2">-puller&#34;</span> <span class="s2">&#34;expires_at&#34;</span>:1789401600
</span></span><span class="line"><span class="cl">（CI 令牌 <span class="m">30</span> 天轮换；2026-08-28 管理员执行 Refresh Secret，审计日志留痕可查）
</span></span></code></pre></div>
</details>


## 参考依据

- GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》（8.1.4 安全计算环境）：[http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=BAFB47E8874764186BDB7865E8344DAF](http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=BAFB47E8874764186BDB7865E8344DAF)
- GB/T 28448-2019《信息安全技术 网络安全等级保护测评要求》（单元测评的测评实施与结果判定：符合/部分符合/不符合/不适用）：[http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=7E736CDF4502B6FF1258DD250AA3EC8C](http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=7E736CDF4502B6FF1258DD250AA3EC8C)
- GB/T 25070-2019《信息安全技术 网络安全等级保护安全设计技术要求》，可在全国标准信息公共服务平台检索：[http://openstd.samr.gov.cn/bzgk/gb/](http://openstd.samr.gov.cn/bzgk/gb/)
- Harbor 官方安装前置条件（Docker 20.10.10-ce+、docker-compose v1.18.0+ 或 docker compose v2、端口 80/443/4443）：[https://goharbor.io/docs/2.12.0/install-config/installation-prereqs/](https://goharbor.io/docs/2.12.0/install-config/installation-prereqs/)
- Harbor 官方 harbor.yml 配置参考（hostname/https/data_volume/trivy/log、harbor_admin_password 仅首次启动读取）：[https://goharbor.io/docs/2.12.0/install-config/configure-yml-file/](https://goharbor.io/docs/2.12.0/install-config/configure-yml-file/)
- Harbor 官方生命周期管理（`docker compose` stop/start/down/up、`./prepare --with-trivy`）：[https://goharbor.io/docs/2.12.0/install-config/reconfigure-manage-lifecycle/](https://goharbor.io/docs/2.12.0/install-config/reconfigure-manage-lifecycle/)
- Harbor 官方身份认证（数据库/LDAP/AD/OIDC、本地用户锁定 db_auth）：[https://goharbor.io/docs/2.12.0/administration/configure-authentication/](https://goharbor.io/docs/2.12.0/administration/configure-authentication/)
- Harbor 官方用户管理（Limited Guest/Guest/Developer/Maintainer/ProjectAdmin 角色定义）：[https://goharbor.io/docs/2.12.0/administration/managing-users/](https://goharbor.io/docs/2.12.0/administration/managing-users/)
- Harbor 官方系统级机器人账号（默认 30 天有效期、secret 不落库、Robot Token Expiration (Days)）：[https://goharbor.io/docs/2.12.0/administration/robot-accounts/](https://goharbor.io/docs/2.12.0/administration/robot-accounts/)
- Harbor 官方项目配额（Default storage consumption、默认不限制）：[https://goharbor.io/docs/2.12.0/administration/configure-project-quotas/](https://goharbor.io/docs/2.12.0/administration/configure-project-quotas/)
- Harbor 官方漏洞扫描（Trivy 默认、Clair 自 v2.2 移出默认、--with-trivy）：[https://goharbor.io/docs/2.12.0/administration/vulnerability-scanning/](https://goharbor.io/docs/2.12.0/administration/vulnerability-scanning/)
- Harbor 官方项目配置与部署安全（Prevent vulnerable images from running、Automatically scan images on push、Public）：[https://goharbor.io/docs/2.12.0/working-with-projects/project-configuration/](https://goharbor.io/docs/2.12.0/working-with-projects/project-configuration/)
- Harbor 官方内容信任（Cosign/Notation 复选框、未签名镜像不可拉取）：[https://goharbor.io/docs/2.12.0/working-with-projects/project-configuration/implementing-content-trust/](https://goharbor.io/docs/2.12.0/working-with-projects/project-configuration/implementing-content-trust/)
- Harbor 官方日志轮转与审计清理（Log Rotation、Keep records in、审计转发 syslog 端点、Skip Audit Log Database）：[https://goharbor.io/docs/2.12.0/administration/log-rotation/](https://goharbor.io/docs/2.12.0/administration/log-rotation/)
- Harbor 官方垃圾回收（调度类型、untagged 制品回收、2 小时宽限期、DRY RUN/GC Now）：[https://goharbor.io/docs/2.12.0/administration/garbage-collection/](https://goharbor.io/docs/2.12.0/administration/garbage-collection/)
- Harbor 官方升级指南内备份步骤（docker compose down、mv harbor、cp -r /data/database）：[https://goharbor.io/docs/2.12.0/administration/upgrade/](https://goharbor.io/docs/2.12.0/administration/upgrade/)
- Harbor 官方 Velero 备份恢复（Helm/K8s 部署）：[https://goharbor.io/docs/2.12.0/administration/backup-restore/](https://goharbor.io/docs/2.12.0/administration/backup-restore/)
- Harbor API v2.0 定义（/health、/audit-logs、/configurations、/scanners、/robots、/system/gc/schedule、/system/purgeaudit、/systeminfo/volumes）：[https://github.com/goharbor/harbor/blob/v2.12.0/api/v2.0/swagger.yaml](https://github.com/goharbor/harbor/blob/v2.12.0/api/v2.0/swagger.yaml)
- Harbor v2.12.0 安装器源码（make/harbor.yml.tmpl 默认值、make/install.sh 的 --with-trivy 与 --with-notary 移除、compose 模板端口映射 8080/8443）：[https://github.com/goharbor/harbor/tree/v2.12.0/make](https://github.com/goharbor/harbor/tree/v2.12.0/make)
- Harbor v2.12.0 前端语言文件（Session Timeout (Minutes) 默认 60 分钟原文）：[https://github.com/goharbor/harbor/blob/v2.12.0/src/portal/src/i18n/lang/en-us-lang.json](https://github.com/goharbor/harbor/blob/v2.12.0/src/portal/src/i18n/lang/en-us-lang.json)
- CNCF Harbor 项目页（graduated 毕业项目，"stores, signs, and scans content"）：[https://www.cncf.io/projects/harbor/](https://www.cncf.io/projects/harbor/)
- 《网络安全等级保护测评高风险判定指引》（中关村信息安全测评联盟团体标准），站内对照表：[22、高风险判定指引与加固对照表](../../../reinforce/其他系统或设备/22高风险判定指引与加固对照表/)
- 命令核验说明：本文命令已于 2026-09 对照 goharbor.io 官方文档（v2.12.0 的 install-config、administration、working-with-projects 各页）与 goharbor/harbor v2.12.0 源码（api/v2.0/swagger.yaml、make/harbor.yml.tmpl、make/install.sh、make/photon/prepare/templates/docker_compose/docker-compose.yml.jinja、src/portal/src/i18n/lang/en-us-lang.json）核验。版本差异注意点：①容器编排命令官方文档统一使用 `docker compose` v2 语法（带空格），前置条件页仍兼容 docker-compose v1.18.0+，install.sh 中 DOCKER_COMPOSE 变量默认仍指向 v1，现场两种语法并存时以实际回显为准；②扫描器：Trivy 为 2.x 默认扫描器（安装须附加 --with-trivy），官方原文 Clair 自 v2.2 移出默认扫描器，1.x 现场默认为 Clair；③内置 Notary/ChartMuseum：v2.6 弃用、自 v2.8 起安装器移除（v2.7.0 install.sh 仍支持 --with-notary，v2.8.0 起直接报错 "notary has been deprecated and removed"），4443 为遗留端口，项目内容信任改由 Cosign/Notation 复选框承载；④harbor_admin_password 仅在 Harbor 首次启动时从 harbor.yml 读取（官方原文），模板默认值 Harbor12345、数据库口令默认 root123；⑤控制台会话超时 Session Timeout (Minutes) 默认 60 分钟，机器人账号默认 30 天有效期且 secret 不落库；⑥auth_mode/self_registration/session_timeout/scan_all_policy 等不在 harbor.yml 中，存于数据库并经 GET /api/v2.0/configurations 核验。

## 关联文章

- 容器板块：[Docker 容器运行平台测评](../docker/)、[Kubernetes 容器编排平台测评](../kubernetes/)、[Memcached 缓存服务测评](../memcached/)
- 板块目录：[中间件与容器](../)
- 配套加固：[17、网络设备、安全设备、服务器、数据库和应用系统的加固方案](../../../reinforce/其他系统或设备/17网络设备安全设备服务器数据库和应用系统的加固方案/)
- 高风险口径：[22、高风险判定指引与加固对照表](../../../reinforce/其他系统或设备/22高风险判定指引与加固对照表/)
- 取证记录：[16、安全评估加固记录表3.0](../../../reinforce/其他系统或设备/16安全评估加固记录表3.0/)
