使用 config.yaml 配置 Cloud Workload Security (CWS) 代理进程。首先参阅快速入门中的完整本地配置,然后根据此参考文档中的选项替换相关代码块。
两种 API 身份验证模式都可以与直接或链式出站连接以及任意缓存模式组合使用。
该文件必须包含三个顶层对象:
| 对象 | 用途 |
|---|---|
cws |
账户、部署、API 身份验证和配置刷新。 |
proxy |
监听器、日志记录、TLS 证书和出站代理设置。 |
redis |
进程本地缓存限制和可选的共享 Redis 存储。 |
系统会拒绝未知设置,包括这些对象中的未知字段。仅包含一个对象的示例属于部分配置。请保留文件中的其他必需对象。
编辑配置后,请先验证再启动代理:
cws-proxy --config config.yaml --config-test验证成功时会输出 CWS proxy configuration is valid。此检查会验证本地设置,但不会获取部署配置、验证凭据、连接 Redis,也不能证明监听器能够启动。
更改 config.yaml 或其进程环境后,请重启代理。仪表板策略更改则通过配置刷新加载。
cws 对象用于将代理连接到一个账户和一个部署。其设置如下:
| 设置 | 必需或默认值 | 说明 |
|---|---|---|
api_base_url |
必需 | 使用 https://api.cloudflare.com/client/v4。 |
account_id |
必需 | 包含该部署的账户 ID。 |
deployment_id |
必需 | 代理要加载其配置的部署 ID。 |
api_poll_interval_secs |
30 |
部署配置刷新间隔(秒)。必须是至少为 30 的整数。 |
api_token_env |
使用 API token 身份验证时必需 | 包含 API token 的环境变量名称。 |
api_key_env |
使用 Global API Key 身份验证时必需 | 包含 Global API Key 的环境变量名称。 |
api_key_email |
使用 Global API Key 身份验证时必需 | 与该密钥关联的账户邮箱地址,必须是字面值。 |
请选择且仅选择一种身份验证模式。使用 API token 身份验证时,请省略 api_key_env 和 api_key_email。使用 Global API Key 身份验证时,请同时提供这两个密钥字段,并省略 api_token_env。请勿将未使用的身份验证字段设为 null。
请使用具有目标账户的 Cloud Workload Security Deployment 权限的 API token。要创建 token,请参阅创建代理 API token。
将 <ACCOUNT_ID> 和 <DEPLOYMENT_ID> 替换为你的资源 ID:
cws:
api_base_url: "https://api.cloudflare.com/client/v4"
api_poll_interval_secs: 30
api_token_env: CWS_DEPLOYMENT_TOKEN
account_id: "<ACCOUNT_ID>"
deployment_id: "<DEPLOYMENT_ID>"通过代理进程环境中的 CWS_DEPLOYMENT_TOKEN 提供 token。api_token_env 存储的是变量名称,而非其值。此凭据用于加载 CWS 配置。客户端仍需提供自己的云服务提供商凭据。
使用 Global API Key 身份验证时,请将整个 cws 对象替换为以下形式。替换邮箱和资源占位符:
cws:
api_base_url: "https://api.cloudflare.com/client/v4"
api_poll_interval_secs: 30
api_key_env: CWS_GLOBAL_API_KEY
api_key_email: "<ACCOUNT_EMAIL>"
account_id: "<ACCOUNT_ID>"
deployment_id: "<DEPLOYMENT_ID>"通过代理进程环境中的 CWS_GLOBAL_API_KEY 提供密钥。
api_base_url、account_id 和 deployment_id 也接受完整的环境变量引用,例如 ${CWS_ACCOUNT_ID}。引用的变量必须存在且包含非空值。不支持嵌入式替换和 shell 表达式。
例如,将现有 cws 对象中的两个 ID 值替换为:
account_id: "${CWS_ACCOUNT_ID}"
deployment_id: "${CWS_DEPLOYMENT_ID}"其他字符串仍按字面值处理。对于 api_token_env、api_key_env 和 Redis url_env,请直接使用变量名称,不要使用 ${...}。证书路径和 api_key_email 不会展开环境变量引用。
proxy 对象必须包含 logging、tls_interception 和 upstream。其监听器和日志记录选项如下:
| 设置 | 默认值 | 说明 |
|---|---|---|
proxy.listen_addr |
0.0.0.0:8080 |
HTTP 代理监听器的 IP 地址和端口。不接受主机名。IPv6 地址需使用方括号,例如 [::1]:8080。 |
proxy.logging.format |
json |
日志格式:json 或 text。 |
proxy.logging.verbosity |
INFO |
日志级别:CRITICAL、ERROR、WARN、INFO、DEBUG 或 TRACE。值区分大小写。 |
如果客户端与代理位于同一主机或网络命名空间,请保留 127.0.0.1:8080。对于共享代理,请选择客户端可以访问的地址,并将网络访问限制为预期客户端。0.0.0.0 会监听所有 IPv4 接口,不能用作客户端的目标地址。
空的 logging: {} 会使用 JSON 格式和 INFO 级别。要使用便于人阅读的日志,请将 proxy.logging 替换为:
logging:
format: text
verbosity: INFO有关日志事件、决策字段和脱敏指南,请参阅读取代理日志。
proxy.tls_interception 对象必须包含以下三项设置:
| 设置 | 值 | 说明 |
|---|---|---|
ca_cert |
非空文件路径 | 用于为发送给客户端的证书签名的 CA 证书。 |
ca_private_key |
非空文件路径 | 匹配的 CA 私钥。请将此密钥保存在代理主机上。 |
extra_root_cas |
不重复的非空文件路径列表 | 代理出站 TLS 连接的其他受信任根证书。无需添加时请使用 []。 |
客户端信任的是 ca_cert,而不是私钥。有关 CA 创建和客户端设置,请参阅准备证书颁发机构。
路径相对于代理进程的工作目录解析,而非配置文件所在目录。如果这两个目录不同,请使用绝对路径。
如果网络会检查出站 TLS,请将其批准的 CA 证书添加到 extra_root_cas。每个文件仅读取其中的第一个证书,因此每个额外根证书都应使用单独的 PEM 文件。此设置不会配置客户端信任,也不会配置用于为拦截证书签名的 CA。
如果 CWS 必须通过另一个 HTTP 代理访问目标,请使用 proxy.upstream.proxy。这些设置适用于 CWS 代理进程,与客户端的 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY 环境变量相互独立。
出站代理设置如下:
| 设置 | 默认值 | 说明 |
|---|---|---|
http_proxy |
null |
用于目标端口 80 的上游代理 URL。 |
https_proxy |
null |
用于目标端口 443 的上游代理 URL。 |
ca_cert |
null |
连接到 https:// 上游代理时信任的其他 CA 证书文件。仅读取文件中的第一个证书。 |
no_proxy |
null |
不使用上游代理而直接连接的唯一目标规则。空列表也表示没有例外。 |
两个代理 URL 字段都接受 http:// 或 https://。字段决定目标流量的类型,URL 方案决定 CWS 是否使用 TLS 连接上游代理。例如,https_proxy: "http://proxy.example.com:8080" 会将端口 443 的流量通过 HTTP 代理转发。
请分别配置每种流量类型。仅设置 http_proxy 不会将端口 443 的流量通过该代理转发。对于相应类型的直接连接,请省略字段或将其设为 null。proxy.upstream.proxy: {} 会让两种类型都使用直接连接。
代理 URL 可以包含 Basic Auth 凭据。请通过你的密钥管理流程提供此类配置。不要将这些凭据与部署 API 凭据或客户端身份混淆。
将 proxy.upstream 替换为以下代码块,并替换为你的上游代理 URL 和 CA 路径:
upstream:
proxy:
http_proxy: "https://proxy.example.com:8443"
https_proxy: "https://proxy.example.com:8443"
ca_cert: /path/to/upstream-proxy-ca.pem
no_proxy:
- api.example.com
- .internal.example.com
- 192.0.2.10
- 2001:db8::/32ca_cert 用于建立对上游代理的信任。tls_interception.extra_root_cas 用于为出站目标证书建立额外信任。这两项设置适用于不同的连接。
no_proxy 支持以下规则类型:
| 规则 | 匹配 |
|---|---|
api.example.com |
仅限该主机名。 |
.example.com |
父域及其子域。 |
192.0.2.10 或 2001:db8::10 |
该 IP 地址。 |
192.0.2.0/24 或 2001:db8::/32 |
该 CIDR 范围内的 IP 地址目标。 |
主机名比较时不区分大小写。条目应为目标名称或地址,而非 URL 或 host:port 对。对于命名目标,请使用主机名规则,不要假设 CIDR 规则会解析其 DNS 名称。
例外规则会绕过额外的上游代理,但不会绕过 CWS 策略评估。域 ACL 和适用的请求策略仍会生效。
CWS 始终具有容量上限的进程本地内存缓存。Redis 可提供共享存储。不使用 Redis 时,缓存值仅对该进程可用,并会在进程退出时丢失。
请选择与你的 Redis 服务相匹配的连接模式:
| 模式 | enabled |
cluster_mode |
auth_type |
其他必需设置 |
|---|---|---|---|---|
| 仅内存 | false |
不需要 | 不需要 | 无。 |
| 独立 Redis | true |
false |
basic |
url_env. |
| Redis Cluster | true |
true |
basic |
url_env. |
| 使用 IAM 的独立 ElastiCache | true |
false |
iam |
url_env、iam_cluster_name 和 iam_region。 |
| 使用 IAM 的 ElastiCache 集群 | true |
true |
iam |
url_env、iam_cluster_name 和 iam_region。 |
这是快速入门中使用的配置:
redis:
enabled: false此模式下不会使用 Redis 连接和身份验证设置。内存缓存限制仍然适用。
将 redis 对象替换为:
redis:
enabled: true
url_env: CWS_REDIS_URL
cluster_mode: false
auth_type: basic将 Redis 连接 URL 注入名为 CWS_REDIS_URL 的代理环境变量。URL 使用 redis:// 或 rediss://,并在需要时包含 Redis 用户名和密码。rediss:// 使用 TLS。
对于 Redis Cluster,请设置 cluster_mode: true。环境变量可以包含一个种子 URL,也可以包含以逗号分隔的多个种子 URL。每个种子都必须是完整 URL,且所有种子必须使用相同的方案。
将 redis 对象替换为以下形式。请填入你的复制组名称和 AWS 区域:
redis:
enabled: true
url_env: CWS_REDIS_URL
cluster_mode: false
auth_type: iam
iam_cluster_name: "<REPLICATION_GROUP_NAME>"
iam_region: "<AWS_REGION>"对于 ElastiCache 集群,请设置 cluster_mode: true。连接 URL 必须使用 rediss://、包含 ElastiCache 用户名,并省略密码。所有种子 URL 必须使用相同的用户名。代理通过默认 AWS 凭据提供程序链获取 AWS 凭据,并生成 IAM 身份验证令牌。代理的 AWS 身份必须具有连接到该 ElastiCache 用户和复制组的权限。
启用 Redis 后,只有成功连接 Redis 才能启动。缺少连接变量、身份验证无效或连接重试耗尽都会导致启动失败。本地 --config-test 验证不会测试该连接。
redis 设置和默认值如下:
| 设置 | 默认值 | 说明 |
|---|---|---|
enabled |
必需 | 仅使用进程本地内存时为 false;设为 true 可添加 Redis 存储。 |
url_env |
null |
包含 Redis URL 的环境变量名称。启用时必须设置且不能为空。 |
cluster_mode |
禁用时为 false |
启用时必需。Redis Cluster 使用 true,独立 Redis 使用 false。 |
auth_type |
basic |
从 URL 获取凭据时使用 basic;使用 ElastiCache IAM 时使用 iam。 |
iam_cluster_name |
null |
ElastiCache 复制组名称。启用 IAM 身份验证时必需且不能为空。 |
iam_region |
null |
用于签署 IAM 令牌的 AWS 区域。启用 IAM 身份验证时必需且不能为空。 |
max_retries |
3 |
首次尝试之后的额外连接或命令尝试次数。整数范围为 0 至 5。 |
backoff_secs |
1 |
连接或命令尝试之间的整秒间隔。整数范围为 0 至 5。 |
namespace |
cws |
代理内部缓存键的前缀。不能为空,末尾不得带 :,且不得等于 cws_data 或以 cws_data: 开头。 |
cache_item_size |
0 |
从 Redis 读取非内部键时允许读取的最大字节数。设为 0 可取消此读取限制。此限制不适用于进程本地读取或代理内部读取。 |
memory_cache_max_entries |
10000 |
进程本地缓存条目数上限。必须是正整数。 |
memory_cache_max_bytes |
67108864 |
进程本地缓存键和值的总字节数上限,相当于 64 MiB。必须是正整数。 |
无论是否启用 Redis,这两项内存限制都适用。将 cache_item_size 设为零不会取消这些限制。
代理会在内部命名空间后追加 :。策略缓存键使用单独的、按账户和部署划分范围的命名空间 cws_data:<ACCOUNT_ID>:<DEPLOYMENT_ID>:。更改 redis.namespace 不会取代这种策略键隔离机制。