# Consul 注册与配置中心测评（HashiCorp）

> HashiCorp Consul 服务注册发现与 KV 配置中心三级等保现场测评取证命令单：按控制点组织 consul version/info/members、consul catalog services、consul kv get、consul acl token list、consul intention list、consul operator raft list-peers 等只读命令，覆盖 ACL 默认未开启与 default_policy=allow 风险、enable_script_checks 默认 false、HTTP API 8500 与 DNS 8600 暴露面、gossip 加密与 TLS verify_incoming/outgoing 默认 false、KV 明文敏感值与 token 脱敏，配置默认值逐条对照官方文档与 agent/config/default.go 源码核验，附判定要点、示例输出与不收录命令说明。

---

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

---

> 定位：HashiCorp Consul（服务注册发现 + KV 配置中心）三级等保现场测评**取证命令单**，按 GB/T 22239-2019 安全计算环境控制点分节组织核查命令、判定要点与取证要求。
> 适用范围：Consul 1.x 单机（dev）、生产三节点 server + client agent 集群两种主流部署形态；本文 CLI 用法与配置默认值于 2026-09 对照官方 Commands 文档、Agent configuration-file 文档及 `agent/config/default.go` 源码逐条核验（见参考依据节）。
> 配套文章：[Nacos 注册与配置中心测评](../nacos/)（同类注册中心互为对照）、[Kafka 测评](../kafka/)、[Kubernetes 容器编排平台测评](../kubernetes/)（Consul 常作为 K8s 之外的服务底座）、[30、注册中心与负载均衡加固](../../../reinforce/系统管理软件平台/30注册中心与负载均衡加固/)、[22、高风险判定指引与加固对照表](../../../reinforce/其他系统或设备/22高风险判定指引与加固对照表/)、[17、网络设备、安全设备、服务器、数据库和应用系统的加固方案](../../../reinforce/其他系统或设备/17网络设备安全设备服务器数据库和应用系统的加固方案/)。
>
> 使用说明：
>
> - 本文所有命令均为**只读取证**命令，不注册/注销服务、不写 KV、不启停 agent、不 reload；确需变更由被测单位运维方在授权下实施。
> - 每个控制点小节按「对应控制点 → 判定要点 → 取证要求 → 核查命令 → 备注 → 预期证据」编排；命令回显本身即证据，须连同命令行一起截图。
> - Consul 的默认值"安全基线"问题突出（ACL 默认未开启、`default_policy` 默认 `allow`、TLS 默认不强制），**核查时以实测行为为准**（是否可匿名查询、是否可匿名写），不要仅凭配置文件判断。
> - 命令不存在或报 ACL 权限错误时，先确认 agent 版本与 ACL 启用状态，再换等效控制台/API 只读路径取证，**不得据命令缺失直接判不符合**。
> - 示例输出中的地址、token、节点名均为演示值，现场须替换为真实取证结果并对涉及个人信息、SecretID 与内网管理地址的内容脱敏后再入报告。
>
> 不适用标识说明：
>
> - 使用 `【不适用】` 明确标记现场可判定为不适用的控制点。
> - 判定依据采用 GB/T 28448-2019"按测评对象实际功能、是否直接处理数据、是否具备该类安全机制判定"的原则；Consul 为注册发现/配置存储组件，终端业务用户的身份鉴别由后端应用承载。

## 一、基础信息与部署形态

> **对应控制点**：非独立控制点（测评对象确定）；集群冗余佐证 GB/T 22239-2019 8.1.1.1（关键节点冗余）
>
> **判定要点**：版本与部署形态记录完整、server/client 角色清晰、生产集群 server 数 ≥3 且均为 voter、端口监听与台账一致 → 符合；部分缺失 → 部分符合。
>
> **取证要求**：版本截图、成员列表、Raft 同伴表、端口监听实测、部署拓扑图。

### A. 版本与运行状态

**核查命令**（只读）：

```bash
consul version          # 版本（CLI 与 agent 内建版本）
consul info             # agent 调试信息：角色、Raft/serf 状态、HTTP/ACL 概况
```

- 备注：`consul info` 回显中的 `server`/`leader`、`raft` 计数与 `acl` 段可佐证角色与 ACL 启用状态；`consul version` 见参考依据节官方 Commands 页。
- 预期证据：版本回显、`consul info` 关键段截图。


<details class="td-details"><summary>示例输出（节选，演示值）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ consul version
</span></span><span class="line"><span class="cl">Consul v1.18.2
</span></span><span class="line"><span class="cl">Revision 1234abc
</span></span><span class="line"><span class="cl">Build Date 2024-05-01T00:00:00Z   # 示例，现场以实测为准
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ consul info（节选）
</span></span><span class="line"><span class="cl">agent:
</span></span><span class="line"><span class="cl">	check_monitors = 0
</span></span><span class="line"><span class="cl">	node_name = demo-node-1
</span></span><span class="line"><span class="cl">	server = true
</span></span><span class="line"><span class="cl">	leader = false
</span></span><span class="line"><span class="cl">build:
</span></span><span class="line"><span class="cl">	revision = 1234abc
</span></span><span class="line"><span class="cl">consul:
</span></span><span class="line"><span class="cl">	acl = disabled          # ← 示例：ACL 未开启，联动&#34;身份鉴别&#34;节判定
</span></span><span class="line"><span class="cl">	known_servers = 3
</span></span><span class="line"><span class="cl">raft:
</span></span><span class="line"><span class="cl">	state = Follower
</span></span><span class="line"><span class="cl">	term = 12
</span></span></code></pre></div>
</details>


### B. 集群成员与角色

**核查命令**（只读）：

```bash
consul members                          # LAN serf 成员列表（alive/failed/left）
consul members -detailed                # 含地址、标签、版本等明细
```

- 备注：`-detailed` 与 `-status=<regexp>` 为官方 members 页列明的命令选项（`-segment` 为 Enterprise 专属，开源现场不使用）；成员状态长期 `failed`/`left` 残留应联动清理建议。
- 预期证据：成员列表回显、与部署台账比对记录。

### C. Raft 一致性与多节点冗余

**核查命令**（只读）：

```bash
consul operator raft list-peers         # Raft 同伴表：Node/ID/Address/State/Voter/CommitIndex
```

- 备注：生产集群应 ≥3 个 voter 节点且 leader 正常（`leader = true` 仅一个）；单 server 部署应在网络架构条款记录冗余风险。`-stale` 选项为官方 operator raft 页列明（容忍陈旧读），现场一般不带参数执行。
- 预期证据：`list-peers` 回显、最近一次故障切换演练记录（向运维索取）。

### D. 端口与协议面

**核查方法**：按官方默认值核对监听（最终以 `ss -lnt`/`ss -lnu` 实测为准）：

| 端口 | 用途（官方默认） |
|---|---|
| 8300 | server RPC（TCP） |
| 8301 | serf LAN gossip（TCP+UDP） |
| 8302 | serf WAN gossip（TCP+UDP） |
| 8500 | HTTP API（TCP；`ports.https` 官方默认 **-1 即禁用**，8501 为 HTTPS 约定端口） |
| 8600 | DNS 接口（TCP+UDP） |

- 备注：官方默认配置源码 `default.go` 中 `ports.grpc = -1`（默认禁用，dev 模式 8502）；HTTP/DNS 端口默认绑定 `client_addr`（官方默认 `127.0.0.1`，`bind_addr` 默认 `0.0.0.0`）——若运维将 `client_addr` 改为 `0.0.0.0`，则 API/DNS 暴露面扩大，须重点核查访问来源限制。
- 预期证据：端口监听实测（`ss -lnt | grep -E "8300|8301|8302|8500|8600"`）、`ports` 配置节截图。

## 二、身份鉴别（8.1.4.1）

> **对应控制点**：GB/T 22239-2019 8.1.4.1 a)~c)（管理面与 API 面的唯一标识、鉴别、失败处理）
>
> **判定要点**：ACL 已启用（`acl.enabled = true`）、默认策略已收敛为 `deny` 或策略表完整、管理 token 分人保管、UI 访问有来源限制与认证 → 符合；ACL 未开启或默认 `allow` 且 API 可匿名写 → 不符合（高风险）。
>
> **取证要求**：agent 配置中 `acl` 节截图、token 清单（脱敏）、匿名访问实测记录、UI 认证方式说明。

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

官方默认配置**未启用 ACL**（默认配置源码 `default.go` 的 `acl` 节未设置 `enabled`，即默认关闭），且启用后 `acl.default_policy` 官方默认仍为 **`allow`**（无匹配规则时放行）。ACL 未开启时 HTTP API（8500）可匿名读写全部目录、配置与服务注册。若现场实测 API 可匿名注册服务/写 KV，按《高风险判定指引》（2025版）判高风险或高风险倾向。

判定口径详见 [联盟团标-网络安全等级保护测评高风险判定指引（2025版）](../../../gradeprotectionwiki/联盟团标-网络安全等级保护测评高风险判定指引2025版/)（对应 2025 版判例 6.4.1.1、6.4.2.2）。
</div>


**核查方法**：
- 确认配置：`acl { enabled = true, default_policy = "deny", policy/token 段 }`（1.4.0 起支持 acl 节写法）；
- **实测**：从测试机匿名请求 `http://<server-ip>:8500/v1/catalog/services`（只读查询）与 `consul members`（匿名 CLI）——可匿名枚举即记录；是否可匿名**写**（写操作不执行，以策略与访谈佐证）；
- 启用 ACL 后，管理 token（`initial_management`）是否分人保管、是否仍为 1.11 前的固定 `master` 旧键；
- `acl.enable_key_list_policy` 官方默认 false（未开启时 `key_list` 权限语义受官方告警约束），若涉 KV 通配列举权限须在策略表中核对。

**核查命令**（只读，ACL 已启用时执行）：

```bash
consul acl token list                   # 全部 token 清单（AccessorID/策略/有效期）
consul acl token list -format=json      # JSON 输出便于导出取证
```

- 备注：`-meta`、`-format={pretty|json}` 为官方 acl token list 页列明选项；回显中的 **SecretID 默认不展示**，AccessorID 也建议脱敏后入报告。
- 预期证据：`acl` 配置节截图、token 清单导出（脱敏）、匿名访问实测记录。

## 三、访问控制（8.1.4.2）

> **对应控制点**：GB/T 22239-2019 8.1.4.2 a)~e)（账户与权限、服务/目录访问策略、来源限制）
>
> **判定要点**：服务间访问意图（intentions）与配置条目（config entries）有清单且与业务需要一致、KV 敏感前缀访问受策略限制、API/DNS 端口来源受网络层限制 → 符合；无 intentions、KV 全员可读 → 部分符合/不符合（结合 ACL 状态）。
>
> **取证要求**：intention 清单、config entry 清单、KV 目录树（脱敏）、来源限制策略截图。

**核查命令**（只读）：

```bash
consul intention list                   # Connect 服务间访问意图（对应 GET /v1/connect/intentions）
consul config list                      # 全部 config entry；-kind=<kind> 可按类型过滤
consul catalog services                 # 服务目录清单
consul catalog nodes                    # 节点目录清单
consul catalog datacenters              # 数据中心清单
consul kv get <prefix> -keys            # 仅列出前缀下的键名（不取值，避免导出敏感值）
```

- 备注：`consul kv get` 支持 `-recurse`（递归取值）与 `-base64`（输出编码）——**取证时优先 `-keys` 仅列键名**；确需取值核对的（如某敏感配置），值中口令/密钥字段须脱敏。`consul config list` 的 `-kind`/`-filter` 选项见官方 config list 页。
- 预期证据：intention/config 清单导出、KV 键名树、服务目录清单。


<details class="td-details"><summary>示例输出（节选，演示值）</summary><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">$ consul intention list
</span></span><span class="line"><span class="cl">ID                                    Source  Destination  Action
</span></span><span class="line"><span class="cl">2f2a-demo-1111                        web     db           allow
</span></span><span class="line"><span class="cl">3c3b-demo-2222                        *       *            deny
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ consul kv get secrets/ -keys
</span></span><span class="line"><span class="cl">secrets/demo-db-user
</span></span><span class="line"><span class="cl">secrets/demo-db-pass          # ← 仅列键名；取证不导出值
</span></span></code></pre></div>
</details>


## 四、安全审计（8.1.4.3）

> **对应控制点**：GB/T 22239-2019 8.1.4.3 a)~d)（审计覆盖、日志保护、留存 ≥6 个月、集中外送）
>
> **判定要点**：agent 日志集中外送（syslog/文件采集）、操作审计有据可查（谁何时写了 KV/注册了服务）、留存 ≥6 个月、时钟同步 → 符合；仅本地日志无外送 → 部分符合。
>
> **取证要求**：日志外送配置截图、日志平台留存查询记录、`consul monitor` 抽样回显。

**核查命令**（只读）：

```bash
consul monitor                          # 实时跟踪 agent 日志流（Ctrl+C 退出，仅观察）
```

- 备注：`consul monitor` 为官方 Commands 页列明的日志跟踪命令（`-log-level`/`-log-json` 等选项可选），抽样片刻即止，**不要长时间挂占会话**。Consul 开源版的操作级审计（API 请求留痕）能力有限：以主机侧 auditd/journald 对 8500 端口访问的记录、反向代理访问日志与变更申请单补偿取证；`audit` 配置节为 Enterprise 功能，开源现场如文档标注 Enterprise 不判不适用。
- 预期证据：日志外送链路截图、日志平台 6 个月留存查询、变更申请与操作记录比对。

## 五、入侵防范（8.1.4.4 与 8.1.4.5）

> **对应控制点**：GB/T 22239-2019 8.1.4.4（最小安装、关闭多余服务、漏洞修补）+ 8.1.4.5（恶意代码防范边界）
>
> **判定要点**：版本为官方在维护的版本线且无高危漏洞未修、`enable_script_checks` 未开启（或开启且有正当理由与管控）、多余端口已禁用、宿主机防恶意代码措施到位 → 符合。
>
> **取证要求**：版本截图与官方版本对照、配置最小化截图、脚本检查使用情况说明。

### A. 版本与漏洞管理

**核查方法**：`consul version` 记录版本，对照官方发布渠道确认该版本线是否仍在维护；索取该集群的漏洞修补记录（如 CVE 公告对应补丁升级）。

### B. 脚本检查（远程命令执行面）

- 官方默认 `enable_script_checks = false`（文档原文：控制脚本类健康检查是否启用，默认 false，需运维显式开启）。
- 若现场开启：核查脚本来源是否受控、是否存在以健康检查为名的远程执行面；开启本身记录为风险项并联动 8.1.4.5 恶意代码防范说明（脚本内容静态审查，不执行）。

### C. 端口与服务最小化

- `ports.https`/`ports.grpc` 官方默认 -1（禁用）——若现场启用 HTTPS API 属合理配置，但应确认证书与来源限制；多余端口启用且无台账的记录为部分符合。
- 8.1.4.5 恶意代码防范：Consul 自身无恶意代码防护机制，按宿主机统一防护口径判定（联动 [服务器侧测评](../../服务器/) 命令单），本组件层标注说明即可。

## 六、数据完整性（8.1.4.7 与 8.1.1.2 a)）

> **对应控制点**：GB/T 22239-2019 8.1.4.7（校验技术与保密性覆盖传输）+ 8.1.1.2 a)（通信传输完整性）
>
> **判定要点**：gossip 已加密（`encrypt` 32 字节 Base64 密钥）、内部 RPC TLS 已强制（`verify_outgoing = true` 等）→ 符合；默认未强制 TLS → 不符合（结合网络隔离说明，可判部分符合）。
>
> **取证要求**：`encrypt`/`tls` 配置节截图（密钥脱敏）、节点间协议说明。

**核查方法**（配置取证为主，无读出命令）：
- gossip 加密：官方文档要求集群内所有节点共享同一 `encrypt` 密钥（32 字节 Base64，官方推荐 `consul keygen` 生成）——配置节截图即可，**密钥值脱敏**；
- RPC TLS：官方 TLS 文档默认 `verify_incoming`/`verify_outgoing` 均为 **false**（不强制 TLS、不验证对方证书）——现场未显式置 true 即记录为默认不安全配置；核查 `tls { defaults/internal_rpc { verify_incoming/verify_outgoing/verify_hostname } }` 与 `auto_encrypt` 节。

## 七、数据保密性（8.1.4.8 与 8.1.1.2 b)）

> **对应控制点**：GB/T 22239-2019 8.1.4.8（传输/存储保密性）+ 8.1.1.2 b)（通信传输保密性）
>
> **判定要点**：API/集群通信已加密、KV 中口令/密钥不以明文存放（或已迁专用密钥管理且访问受控）→ 符合；KV 明文存密 + API 明文 → 不符合。
>
> **取证要求**：KV 抽样值核对记录（脱敏）、加密配置截图。

**核查方法**：
- KV 敏感项：抽样核对口令/密钥类配置是否明文（`consul kv get` 取值时现场即时脱敏，不截图明文值）；`-base64` 只是**编码不是加密**，不作为防护手段判定；
- HTTPS API 是否启用（`ports.https` 默认 -1，默认态下 API 流量为 HTTP 明文）；
- 节点间 TLS 与 gossip 加密状态承接第六节取证结论。

## 八、备份与恢复（8.1.4.9）

> **对应控制点**：GB/T 22239-2019 8.1.4.9 a)~c)（本地备份恢复、异地/云备份、重要数据冗余）
>
> **判定要点**：KV 与目录数据有定期快照（`consul snapshot` 由运维在变更窗口导出，属写操作不在本文收录）、配置文件有备份、集群 ≥3 server 冗余、有恢复演练记录 → 符合。
>
> **取证要求**：快照文件与周期说明、配置备份、恢复演练记录、Raft 冗余截图（复用第一节 C）。

- 备注：快照导出、恢复导入均为写/变更操作，现场**不执行**；以运维提供的快照文件、备份系统记录与演练报告佐证。

## 九、剩余信息保护（8.1.4.10）

> **对应控制点**：GB/T 22239-2019 8.1.4.10 a)~b)（鉴别信息与敏感数据释放/清除）
>
> **判定要点**：注销/过期的 token 与下线节点的注册信息有清理流程、KV 中废弃敏感键已删除、日志导出件敏感字段已脱敏 → 符合。
>
> **取证要求**：token 撤销记录（`consul acl token list` 对照过期项）、废弃 KV 键清理记录、日志脱敏样例。

- 备注：注销与删除均为写操作，以记录佐证不现场执行；`consul members` 中长期 `left`/`failed` 残留节点联动清理建议。

## 十、个人信息保护（8.1.4.11）

> **对应控制点**：GB/T 22239-2019 8.1.4.11 a)~b)（仅采集必要、禁止未授权访问与披露）；《网络安全法》第 21 条
>
> **判定要点**：服务/节点注册元数据（`node-meta`/`meta=`）不含个人信息或内部人员标识，token 与日志导出件不含未脱敏个人信息 → 符合。
>
> **取证要求**：服务注册脚本抽查、catalog 清单脱敏样例。

- 备注：`consul catalog services/nodes` 抽样核对元数据字段；日志导出件中的 IP、操作人标识须脱敏后入报告。

## 参考依据

| 类别 | 来源 |
|---|---|
| 等级保护基本要求 | GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》：https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=BAFB47E8874764186BDB7865E8344DAF |
| 等级保护测评要求 | GB/T 28448-2019《信息安全技术 网络安全等级保护测评要求》：https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=7E736CDF4502B6FF1258DD250AA3EC8C |
| 法律依据 | 《网络安全法》第 21 条（网络日志留存不少于六个月）：https://www.cac.gov.cn/2016-11/07/c_1119867116_2.htm |
| CLI 文档 | Consul Commands（members/info/version/validate/monitor、catalog services·nodes·datacenters、kv get、acl token list、intention list、config list、operator raft list-peers）：https://developer.hashicorp.com/consul/commands/members 等（2026-09 逐页核验） |
| Agent 配置文档 | Consul Agent configuration-file（acl/general/tls/ui/encryption 各节，含 `default_policy` 默认 allow、`enable_script_checks` 默认 false、`ports.https` 默认 -1、`verify_incoming/outgoing` 默认 false、`ui_config.enabled` 默认 false）：https://developer.hashicorp.com/consul/docs/reference/agent/configuration-file/acl 等（2026-09 逐页核验） |
| 默认配置源码 | hashicorp/consul `agent/config/default.go`（`ports` 表：8300/8301/8302/8500/8600、`https=-1`、`grpc=-1`；`acl` 节未启用 ACL；`client_addr="127.0.0.1"`、`bind_addr="0.0.0.0"`）：https://github.com/hashicorp/consul/blob/main/agent/config/default.go |

**未收录与说明**：

- `consul services list`：官方 Commands 索引下该子命令文档页未能访问核验（404），本文以已核验的 `consul catalog services` 承担服务清单取证，**不收录未核验命令**；
- `consul watch`（变更时触发执行脚本）、`consul exec`/`consul event`（远程执行/事件广播）、`consul join`/`leave`/`force-leave`/`reload`/`maint`（变更类）、`consul connect proxy`（启动代理进程）、`consul snapshot save`（写文件）——均为变更或执行类，测评现场不使用；
- `consul debug`（采集诊断包，可能携带敏感信息且影响面大）不收录；`-segment` 为 Enterprise 选项不收录。

---

## 关联文章

- 同类对照：[Nacos 注册与配置中心测评](../nacos/)、[ZooKeeper 测评](../zookeeper/)、[Kafka 测评](../kafka/)；
- 底座联动：[Kubernetes 容器编排平台测评](../kubernetes/)；
- 加固侧：[30、注册中心与负载均衡加固](../../../reinforce/系统管理软件平台/30注册中心与负载均衡加固/)、[17、加固方案总指南](../../../reinforce/其他系统或设备/17网络设备安全设备服务器数据库和应用系统的加固方案/)；
- 高风险口径：[22、高风险判定指引与加固对照表](../../../reinforce/其他系统或设备/22高风险判定指引与加固对照表/)。
