跳转到内容
本站为社区维护的非官方中文翻译,与 Cloudflare, Inc. 无关联。本站不提供账户登录,请勿在任何非官方站点输入您的 Cloudflare 账户信息。官方文档:developers.cloudflare.com

快速入门

最后更新 查看 MarkdownAgent 设置

在本地运行 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 并可使用终端。

在本地设置代理

  1. 安装代理

    使用 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-proxy
    sudo 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 条款、许可声明和致谢信息,请参阅法律信息。

  2. 创建防护策略

    在 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 保存策略。

  3. 创建策略集

    前往 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。

  4. 创建部署

    前往 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。

  5. 创建代理 API token

    在同一账户中,前往 Manage account > Account API tokens。

    前往 Account API tokens(账户 API 令牌) ↗

    创建具有 Cloud Workload Security Deployment 权限的自定义账户 token。保存该 token 以供代理配置使用。

    此 token 用于加载 CWS 配置。已登录的 cf 客户端会使用自己的凭据发出 R2 请求。

  6. 准备证书颁发机构

    代理需要证书颁发机构 (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。

  7. 配置代理

    将此配置保存为 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: false

    api_token_env 包含环境变量名称,而非 token 值。此本地示例将代理绑定到回环地址,因此无需 Redis 服务器。

    有关其他身份验证模式、上游代理、日志记录和 Redis 选项,请参阅代理配置。

  8. 验证并启动代理

    在运行代理的终端中设置 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 变量指向本地代理。

  9. 通过代理转发 CLI 流量

    为客户端打开第二个终端。替换证书路径和账户 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。

  10. 验证防护策略

    在客户端终端中创建一个空测试存储桶,并检查托管域的公共访问状态:

    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 是否已开启。要进行进一步检查,请参阅预期被阻止的请求却成功。

  11. 删除测试存储桶

    在客户端终端中删除空存储桶:

    cf r2 buckets delete cws-r2-guardrails-demo

    出现提示时确认删除。

后续步骤

要在本地演练之外应用防护策略,请查看代理部署选项。

要针对特定请求组或添加更多策略,请参阅配置策略。要控制目标,请参阅管理流量范围。

有关启动、证书或意外请求结果的问题,请参阅故障排除。

这篇文档对您有帮助吗?