概述
如果需要一次向 Cloudflare 添加多个站点(10 个以上),可以通过 Cloudflare API 来完成。在以下情况下添加多个站点非常有用:
- 将多个域名映射回单个规范域名,例如您希望 Cloudflare 保护的不同国家/地区(.com.au、.co.uk 等)的域名
- 您是代理商或 IT 咨询公司,并为您的客户管理多个域名(注意:您应该考虑 Cloudflare 合作伙伴计划)
- 您要将现有的一组网站转移到 Cloudflare
使用 API,您可以快速地添加多个站点,特别是您已熟悉如何更改名称服务器或添加 DNS 记录的情况下。
先决条件
要通过自动化将多个站点添加到 Cloudflare,您需要:
- 一个现有的 Cloudflare 帐户(注册 / 登录)
- 基本熟悉命令行
- 已安装 curl(macOS 和 Linux 上默认安装)
- 您的 Cloudflare API 密钥
- 要添加的域名列表(每行一个域名,使用换行符分隔,例如“domains.txt”)
通过 API 添加域名
Cloudflare 具有功能齐全的 API(文档),允许您自动创建新域名,以及配置 DNS 记录、页面规则和诸多安全设置。我们将使用此 API 自动同时添加多个域名。
打开您的终端应用程序(例如 Terminal 或 Terminal.app),并设置您的 API 密钥和电子邮件:
export CF_API_EMAIL=you@example.com export CF_API_KEY=abc123def456ghi789
接着,我们编写一个简单的 for 循环来获取每个域名:
for domain in $(cat domains.txt);do \ curl -X POST -H "X-Auth-Key: $CF_API_KEY" -H "X-Auth-Email: $CF_API_EMAIL" \ -H "Content-Type: application/json" \ "https://api.cloudflare.com/client/v4/zones"\ --data '{"account": {"id": "id_of_that_account"}, "name":"'$domain'","jump_start":true}'; done
“jump_start”键会使 Cloudflare 自动尝试扫描常见 DNS 记录,例如“www”、“mail”和“blog”等等;这样,您就不必手动配置它们(但仍然要确认我们已全部找到它们)。id_of_that_account 可在 Cloudflare 概述应用的帐户 ID 下找到。
API 会返回响应,包括您需要在您的注册商处(您注册域名的地方)更改的名称服务器。
{ "result": { "id": "abc123def456ghi789", "name": "example.com", "status": "pending", "paused": false, "type": "full", "development_mode": 0, "name_servers": [ "chad.ns.cloudflare.com", "lucy.ns.cloudflare.com" ], "original_name_servers": [ "ns-cloud-e1.googledomains.com", "ns-cloud-e2.googledomains.com", "ns-cloud-e3.googledomains.com", "ns-cloud-e4.googledomains.com" ], "original_registrar": null, "original_dnshost": null, "modified_on": "2018-02-12T01:42:13.827149Z", "created_on": "2018-02-12T01:42:13.827149Z", "meta": { "step": 4, "wildcard_proxiable": false, "custom_certificate_quota": 0, "page_rule_quota": 3, "phishing_detected": false, "multiple_railguns_allowed": false }, "owner": { "id": "abc123def456ghi789", "type": "user", "email": "you@example.com" }, "account": { "id": "abc123def456ghi789", "name": "you@example.com" }, "permissions": [ "#access:edit", "#access:read", "#analytics:read", "#app:edit", "#billing:edit", "#billing:read", "#cache_purge:edit", "#dns_records:edit", "#dns_records:read", "#lb:edit", "#lb:read", "#logs:read", "#member:edit", "#member:read", "#organization:edit", "#organization:read", "#ssl:edit", "#ssl:read", "#subscription:edit", "#subscription:read", "#waf:edit", "#waf:read", "#worker:edit", "#worker:read", "#zone:edit", "#zone:read", "#zone_settings:edit", "#zone_settings:read" ], "plan": { "id": "0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "name": "Free Website", "price": 0, "currency": "USD", "frequency": "", "is_subscribed": true, "can_subscribe": false, "legacy_id": "free", "legacy_discount": false, "externally_managed": false } }, "success": true, "errors": [], "messages": [] }
注意响应中的 "name_servers" 键。对于您在帐户下添加的所有站点,这些通常是同一对,例如:
"name_servers": [ "chad.ns.cloudflare.com", "lucy.ns.cloudflare.com" ]
复制提供给您的值(不是上面的值)并在您的注册商处更新名称名服务器。
通过 flarectl(Cloudflare 的 CLI 工具)添加域名
您还可以使用 Cloudflare 的官方 CLI 工具 flarectl 添加域名。您可以为您的操作系统(Windows、macOS/Darwin、Linux)下载预建程序包,并用来创建域名。
您需要先设置 API 凭据:
export CF_API_EMAIL=you@example.com export CF_API_KEY=abc123def456ghi789
... 然后在 flarectl 中运行以下命令:
for domain in $(cat domains.txt);do flarectl zone create --zone=$domain --jumpstart=false; done
在此之后,可以通过“flarectl zone list”获取每个域的名称服务器:
for domain in $(cat domains.txt);do flarectl zone info --zone=$domain; done
Cloudflare的API
今天,我们宣布我们的API Token普遍可用了——这是一种可扩展的,更安全的与Cloudflare API交互的方式。作为致力于让互联网变得更好的一份子,Cloudflare努力简化客户在边缘的可管理性。我们做到这一点的方法之一是确保我们所有的产品和服务都可以通过API进行配置。从合作伙伴到企业再到开发人员,客户都希望实现Cloudflare的自动化管理。有时候这(自动化管理)可以通过我们的API直接完成,有时是通过我们帮助维护的开源软件完成的,比如我们的Terraform提供程序或Cloudflare-Go库。自动化Cloudflare管理的客户必须保持其Cloudflare服务尽可能安全,这一点至关重要。
最小权限及其重要性
保护软件系统很难。限制软件的功能是一种很好的防御措施,可以防止错误或恶意行为造成的影响超出其范围。最小权限原则有助于指导给定系统应该具有多少访问权限才能执行操作。这一原则最初由Jerome Saltzer提出,“系统的每个程序和每个特权用户都应该使用最少的权限来完成工作。” 就Cloudflare而言,许多客户拥有利用各种服务来路由流量的不同域。如果一个不良行为者获得了对系统未经授权的访问权,他们就可以使用该系统拥有的任何权限来造成进一步的破坏或窃取额外的信息。
让我们看看API Token的功能如何适应最小特权原则。
关于API Token
API Token提供三种主要权限:
- 根据Cloudflare资源界定API Token的作用域
- 根据权限界定API Token的作用域
- 规定多个API Token
让我们来逐个分解一下这些功能。
通过Cloudflare资源(Cloudflare Resource)界定API Token的作用域
Cloudflare按照区域划分服务配置,等同于通过域名划分。此外,一些客户有多个账户,每个账户又有多个区域。重要的是,当API被授予访问服务的权限时,它应当只能访问与当前任务相关的账户资源和区域。API Token的作用域可以被限定为只覆盖特定账户和特定区域。一个常见的用例是,如果您有一个暂存区和生产区,那么API Token可以被限制为仅能影响暂存区,而不能访问生产区。
按权限界定API Token的作用域
能够将API Token限定在特定区域内是很好的,但是在一个区域内可以配置许多不同的服务:防火墙规则、页面规则和负载平衡器(仅仅举几个例子)。如果客户的服务只能创建新的防火墙规则来响应流量模式,那么允许该服务更改DNS记录也是对最低权限的侵犯。API Token可以让您将每个token的作用域设置为特定权限。您可以组合多个权限来创建自定义Token,从而适应特定的用例。
多个API Token
如果您使用Cloudflare来保护和加速多个服务,这可能会从多个地方(不同的服务器、虚拟机、容器或Workers)对Cloudflare更改API。能够为每个服务创建API Token意味着每个服务都与来自其他服务的更改隔离。如果一个API Token泄漏或需要轮转,其他服务的API Token不会受到任何影响。此外,前面提到的功能还意味着可以将每个服务的范围界定为所需的操作和资源。这使得客户可以更好地在通过API访问Cloudflare时实现最小权限原则。
现在,让我们逐步介绍如何创建和使用一个API Token。
使用API Token
要创建您的第一个API Token,您需要转到用户个人资料的“API Tokens”部分,您可以通过以下网址找到该部分:dash.cloudflare.com/profile/api-tokens
1. 在这个页面上,除了全局API秘钥和原始CA秘钥之外,您还可以找到所有API Token的列表。
要创建您的第一个API Token,请点击“创建令牌(Create Token)”
2. 在创建屏幕上,有两种创建Token的方法。你可以通过“自定义(Custom)”选项从头开始创建,也可以通过选择“从模板开始(Start with a template)”来使用预定义的模板。
在这一案例中,我们将使用“编辑区域DNS(Edit zone DNS)”模板来创建API Token,该Token可以编辑单个区域的DNS记录。
3. 选择了模板以后,我们需要为API Token选择一个区域。注意,DNS编辑权限已被预先选择。
在这一例中,我们选择“garrettgalow.com”作为其DNS记录将能被API Token编辑的区域。
4. 选择了continue to summary(继续操作,汇总选择)以后,我就可以查看我的选择。在本例中,资源和权限都非常简单,但在这里您还有更改的机会,以确保在创建API Token之前赋予它正确的权限。
5. 创建好后,我们将看到该API Token。这一页面是唯一一次向您显示秘钥的机会,所以请您确保将它存放在安全的地方。拥有这些秘钥的人都可以在指定的资源上执行授权操作,因此您要像保护密码一样保护它。在下面的截图中,我用黑框盖出了这个秘钥,原因显然。如果您碰巧丢失了这个秘钥,您总是可以从API Token表重新生成它,这样您就不必重新配置所有权限。
除了秘钥本身以外,这一页面还提供了一个curl请求示例,可用于验证Token是否已经创建成功。它还提供了一个示例,说明如何将Token用于任何直接HTTP请求。对于API Token,我们现在遵循的是RFC授权承载标准。调用该API,我们会看到一个成功的响应,告诉我们该令牌有效且可用。
~$ curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \ > -H "Authorization: Bearer vh9awGupxxxxxxxxxxxxxxxxxxx" \ > -H "Content-Type:application/json" | jq { "result": { "id": "ad599f2b67cdccf24a160f5dcd7bc57b", "status": "active" }, "success": true, "errors": [], "messages": [ { "code": 10000, "message": "This API Token is valid and active", "type": null } ] }
接下来还有什么?
对于使用Cloudflare API的每个人,我们建议从先前使用的API秘钥转到使用API Token。随着这一公告的发出,我们的Terraform provider,Cloudflare-Go library以及WordPress plugin均已更新,以实现API Token的兼容性。其他的函数库也将很快更新。API Token以及API秘钥都将暂时被支持,以便客户能够安全地进行迁移。我们还有更多API Token的计划功能,以进一步保护token的使用,敬请期待将来的公告吧!
请让我们知悉您在Cloudflare社区中对API安全的想法以及接下来您想看到的内容。
We protect entire corporate networks, help customers build Internet-scale applications efficiently, accelerate any website or Internet application, ward off DDoS attacks, keep hackers at bay, and can help you on your journey to Zero Trust.
Visit 1.1.1.1 from any device to get started with our free app that makes your Internet faster and safer.
To learn more about our mission to help build a better Internet, start here. If you're looking for a new career direction, check out our open positions.