在本地运行 Cloud Workload Security (CWS) 代理,并阻止会将 R2 存储桶设为公开的请求。本指南使用 Cloudflare 账户中的空测试存储桶。
代理和 cf 客户端在同一台 Linux 计算机上运行。对于流水线运行器、应用主机和共享代理,请参阅代理部署选项。
- 一台安装 APT 或 DNF、
curl且可使用sudo的 Linux 计算机或虚拟机。 - 一个可管理 CWS 资源并创建账户 API token 的 Cloudflare 账户。
- 同一账户中的 R2 访问权限,以及创建和配置测试存储桶的权限。
- 已安装并登录 Cloudflare CLI。本指南中的客户端代理设置需要 Node.js 24.5 或更高版本。
- 代理主机上需安装 OpenSSL 并可使用终端。
-
使用 Linux 发行版的软件包管理器安装
cws-proxy:sudo curl -fsSLo /usr/share/keyrings/cloudflare-cws.gpg \ https://downloads.cac.cloudflare.com/packages/keys/cws-package-signing.gpg sudo curl -fsSLo /etc/apt/sources.list.d/cws-proxy.sources \ https://downloads.cac.cloudflare.com/packages/cws-proxy.sources sudo apt update sudo apt install cws-proxysudo rpm --import \ https://downloads.cac.cloudflare.com/packages/keys/cws-package-signing.asc sudo curl -fsSLo /etc/yum.repos.d/cws-proxy.repo \ https://downloads.cac.cloudflare.com/packages/cws-proxy.repo sudo dnf install cws-proxy确认已安装的命令可用:
cws-proxy --help有关代理的 Beta 条款、许可声明和致谢信息,请参阅法律信息。
-
在 Cloudflare 仪表板中,选择你的账户,然后前往 Cloud Workload Security > Policies。
前往 Policies(策略) ↗选择 Add policy,并将其命名为
restrict-r2-public-access。在 Filters 中选择 Wirefilter,然后输入:application.name == "Cloudflare" and application.service == "r2" and application.operation == "r2-put-bucket-public-policy"在 Rego source 中输入以下策略。只有在请求关闭公共访问权限时,该策略才允许所选操作:
Rego sourcetxt package policy.cf_r2_no_public_access default valid := false valid if { input.http.request.body.enabled == false }选择 Add policy 保存策略。
-
前往 Cloud Workload Security > Policy sets。
前往 Policy sets(策略集) ↗选择 Add policy set,并将其命名为
r2-private-buckets。在 Policies 中选择 Attach policy,选中restrict-r2-public-access,然后选择 Attach policies。开启该策略的 Enforce。本指南中请将 Workloads 留空,然后选择 Add policy set。
-
前往 Cloud Workload Security > Deployments。
前往 Deployments(部署) ↗选择 Add deployment,并将其命名为
cws-r2-test。在 Policy sets 中选择 Attach policy set,选中r2-private-buckets,然后选择 Attach policy sets。在 Deployment settings 中,为 Default mode 选择 Default allow。这会允许不匹配防护筛选器的请求。选择 Add deployment 保存。
打开部署并复制其 ID。同时复制你的 Cloudflare 账户 ID。
-
在同一账户中,前往 Manage account > Account API tokens。
前往 Account API tokens(账户 API 令牌) ↗创建具有 Cloud Workload Security Deployment 权限的自定义账户 token。保存该 token 以供代理配置使用。
此 token 用于加载 CWS 配置。已登录的
cf客户端会使用自己的凭据发出 R2 请求。 -
代理需要证书颁发机构 (CA) 证书及其匹配的私钥。客户端需要信任此 CA 证书。
要创建本地测试 CA,请将以下配置保存为
openssl.cnf。如果你已有 CA 证书和密钥文件,请改用这些文件。openssl.cnfini [req] prompt = no distinguished_name = subject x509_extensions = v3_ca [subject] O = Example Inc CN = CWS Local Proxy CA [v3_ca] basicConstraints = critical,CA:true keyUsage = critical,keyCertSign,cRLSign subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer生成证书和私钥:
umask 077 openssl genrsa -out ca-key.pem 4096 openssl req -config openssl.cnf -key ca-key.pem -new -x509 -days 730 -sha256 -out ca-cert.pem将
ca-key.pem保存在代理主机上。客户端仅配置ca-cert.pem。 -
将此配置保存为
config.yaml。将<ACCOUNT_ID>和<DEPLOYMENT_ID>替换为复制的值。如果证书文件不在工作目录中,请使用绝对路径。config.yamlyaml 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>" proxy: logging: format: json verbosity: INFO listen_addr: "127.0.0.1:8080" tls_interception: ca_cert: ./ca-cert.pem ca_private_key: ./ca-key.pem extra_root_cas: [] upstream: proxy: http_proxy: null https_proxy: null ca_cert: null no_proxy: null redis: enabled: falseapi_token_env包含环境变量名称,而非 token 值。此本地示例将代理绑定到回环地址,因此无需 Redis 服务器。有关其他身份验证模式、上游代理、日志记录和 Redis 选项,请参阅代理配置。
-
在运行代理的终端中设置 token 并验证文件:
export CWS_DEPLOYMENT_TOKEN="<DEPLOYMENT_API_TOKEN>" cws-proxy --config config.yaml --config-test验证成功时会输出
CWS proxy configuration is valid。此检查会验证本地配置,不会检查 API 访问权限。在该终端中启动代理:
cws-proxy --config config.yaml保持终端打开。在发送请求前,请等待日志中出现
remote_config_loaded和action_mapper_loaded。不要将此终端的HTTP_PROXY或HTTPS_PROXY变量指向本地代理。 -
为客户端打开第二个终端。替换证书路径和账户 ID,然后设置:
export HTTP_PROXY="http://127.0.0.1:8080" export HTTPS_PROXY="http://127.0.0.1:8080" export NODE_USE_ENV_PROXY=1 export NODE_EXTRA_CA_CERTS="<ABSOLUTE_PATH_TO_CA_CERT_PEM>" export CLOUDFLARE_ACCOUNT_ID="<ACCOUNT_ID>"NODE_EXTRA_CA_CERTS指向 CA 证书,而不是其私钥。这些变量仅对该终端中的cf客户端生效。请确保NO_PROXY和no_proxy不会绕过api.cloudflare.com。 -
在客户端终端中创建一个空测试存储桶,并检查托管域的公共访问状态:
cf r2 buckets create --name cws-r2-guardrails-demo cf r2 buckets domains managed list --bucket-name cws-r2-guardrails-demo托管域的结果应包含
"enabled": false。如果账户中已存在此名称,请使用其他存储桶名称。首先,确认策略允许关闭公共访问权限:
cf r2 buckets domains managed update cws-r2-guardrails-demo --enabled false此请求应成功。然后尝试启用公共访问权限:
cf r2 buckets domains managed update cws-r2-guardrails-demo --enabled true该请求应失败,并返回 HTTP 状态码
403和CWS.Error响应。再次检查托管域的结果,确认公共访问权限仍处于关闭状态。如果请求成功,请立即使用
--enabled false关闭公共访问权限。检查 CLI 是否使用代理、部署是否包含你的策略集,以及 Enforce 是否已开启。要进行进一步检查,请参阅预期被阻止的请求却成功。 -
在客户端终端中删除空存储桶:
cf r2 buckets delete cws-r2-guardrails-demo出现提示时确认删除。
要在本地演练之外应用防护策略,请查看代理部署选项。
要针对特定请求组或添加更多策略,请参阅配置策略。要控制目标,请参阅管理流量范围。
有关启动、证书或意外请求结果的问题,请参阅故障排除。