跳转到内容
搜索文档

添加基础设施应用程序

最后更新 查看 MarkdownAgent 设置

功能可用性

客户端模式 Zero Trust 方案 ↗
  • 流量与 DNS 模式
  • 仅流量模式
所有方案
系统 可用性
Windows ✅
macOS ✅
Linux ✅
iOS ✅
Android ✅
ChromeOS ✅

Access for Infrastructure 允许您对用户如何访问单个服务器、集群或数据库进行细粒度控制。通过在 Cloudflare Access 中添加基础设施应用程序,您可以配置用户如何对资源进行身份验证,以及控制和授权他们可以连接的端口、协议和用户名。访问和命令日志可确保合规性,并允许在发生安全漏洞时对用户活动进行审计。

前提条件

1. 添加目标

目标代表您基础设施中的单个资源(例如服务器、Kubernetes 集群、数据库或容器),用户将通过 Cloudflare 连接到该资源。

目标与协议无关,这意味着您无需为服务器上运行的每个协议定义新目标。要创建新目标:

  1. 在 Cloudflare 仪表板 ↗中,前往 Zero Trust > Access controls(访问控制) > Targets。
  2. 选择 Add a target(添加目标)。
  3. 在 Target hostname 中,为目标输入一个便于识别的名称。我们建议使用服务器主机名,例如 production-server。目标主机名不需要唯一,可以在多个目标中重复使用。主机名用于定义 Access 应用程序保护的目标;它们不用于 DNS 地址解析。

    主机名格式限制

    • 不区分大小写
    • 不超过 253 个字符
    • 仅包含字母数字字符、- 或 .(不允许空格)
    • 以字母数字字符开头和结尾
  4. 在 IP addresses 中,输入目标资源的 IPv4 和/或 IPv6 地址。只有输入完整 IP 地址后,下拉菜单才会显示内容。
  1. 在下拉菜单中,选择资源所在的 IP 地址和虚拟网络。此 IP 地址和虚拟网络配对现已分配给此目标,出于设计考虑,不能在另一个目标中重复使用。
  2. 选择 Add target(添加目标)。

向 Infrastructure Access Targets 端点发出 POST 请求:

Create new targetbash
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/infrastructure/targets" \
	--request POST \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"hostname": "infra-access-target",
		"ip": {
				"ipv4": {
						"ip_addr": "187.26.29.249",
						"virtual_network_id": "c77b744e-acc8-428f-9257-6878c046ed55"
				},
				"ipv6": {
						"ip_addr": "64c0:64e8:f0b4:8dbf:7104:72b0:ec8f:f5e0",
						"virtual_network_id": "c77b744e-acc8-428f-9257-6878c046ed55"
				}
		}
	}'
  1. 向您的 cloudflare_api_token ↗ 添加以下权限:

    • Zero Trust Write
  2. 配置 cloudflare_zero_trust_infrastructure_access_target ↗ 资源:

    resource "cloudflare_zero_trust_infrastructure_access_target" "infra-ssh-target" {
    	account_id = var.cloudflare_account_id
    		hostname   = "infra-access-target"
    		ip = {
    			ipv4 = {
    				ip_addr = "187.26.29.249"
    				virtual_network_id = "c77b744e-acc8-428f-9257-6878c046ed55"
    			}
    			ipv6 = {
    				ip_addr = "64c0:64e8:f0b4:8dbf:7104:72b0:ec8f:f5e0"
    				virtual_network_id = "c77b744e-acc8-428f-9257-6878c046ed55"
    			}
    		}
    }

接下来,创建一个 Access 应用程序来保护该目标。

2. 添加基础设施应用程序

  1. 在 Cloudflare 仪表板 ↗中,前往 Zero Trust > Access controls(访问控制) > Applications(应用程序)。

  2. 选择 Create new application(创建新应用程序)。

  3. 选择 Infrastructure(基础设施)。

  4. 为该应用程序输入任意名称。

  5. 在 Target criteria 中,选择您要保护的目标主机名。此应用程序定义将适用于所有共享所选主机名的目标,包括未来添加的任何目标。同样,如果您之后决定更改某个目标的主机名,重命名后的目标将不再受此应用程序保护。

  6. 输入用于连接服务器的 Protocol 和 Port。

  7. (可选)如果某个协议运行在多个端口上,请选择 Add new target criteria(添加新的目标条件),并使用不同的端口号重新配置相同的目标主机名和协议。

  8. 选择 Next(下一步)。

  9. 要保护您的目标,请配置一个策略来定义谁可以连接以及如何连接:

    1. 为您的策略输入任意名称。

    2. 创建一个规则,匹配允许访问目标的用户。有关更多信息,请参阅 Access 策略并查看基础设施策略选择器列表。

    3. 在 Connection context 中,配置以下设置:

      • SSH user(SSH 用户):输入用户可以登录的 UNIX 用户名(例如 root 或 ec2-user)。
      • Allow users to log in as their email alias:(可选)选中后,匹配您策略定义的用户将能够使用其小写电子邮件地址前缀访问目标。例如,[email protected] 可以以 jdoe 身份登录。
  10. 选择 Add application(添加应用程序)。

向 Access applications 端点发出 POST 请求:

Required API token permissions

At least one of the following token permissions is required:
  • Access: Apps and Policies Write
Add an Access applicationbash
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/apps" \
	--request POST \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"name": "Example infrastructure app",
		"type": "infrastructure",
		"target_criteria": [
				{
						"target_attributes": {
								"hostname": [
										"infra-access-target"
								]
						},
						"port": 22,
						"protocol": "SSH"
				}
		],
		"policies": [
				{
						"name": "Allow a specific email",
						"decision": "allow",
						"include": [
								{
										"email": {
												"email": "[email protected]"
										}
								}
						],
						"connection_rules": {
								"ssh": {
										"usernames": [
												"root",
												"ec2-user"
										]
								}
						}
				}
		]
	}'
  1. 向您的 cloudflare_api_token ↗ 添加以下权限:

    • Access: Apps and Policies Write
  2. 使用 cloudflare_zero_trust_access_application ↗ 资源创建基础设施应用程序:

    resource "cloudflare_zero_trust_access_application" "infra-app" {
    	account_id = var.cloudflare_account_id
    	name       = "Example infrastructure app"
    	type       = "infrastructure"
    
    	target_criteria {
    		port     = 22
    		protocol = "SSH"
    		target_attributes {
    			name = "hostname"
    			values = ["infra-access-target"]
    		}
    	}
    }
  3. 使用 cloudflare_zero_trust_access_policy ↗ 资源向应用程序添加基础设施策略:

    resource "cloudflare_zero_trust_access_policy" "infra-app-policy" {
    	application_id = cloudflare_zero_trust_access_application.infra-app.id
    	account_id = var.cloudflare_account_id
    	name       = "Allow a specific email"
    	decision   = "allow"
    	precedence = 1
    
    	include {
    		email = ["[email protected]"]
    	}
    
    	connection_rules {
    		ssh {
    			usernames = ["root", "ec2-user"]
    		}
    	}
    }

此应用程序中的目标现已受到您的基础设施策略保护。

3. (推荐) 修改 Gateway 中的优先级顺序

默认情况下,Cloudflare 会在评估所有 Gateway 网络策略之后再评估 Access 应用程序策略。要在特定 Gateway 策略之前或之后评估 Access 应用程序,请执行以下步骤:

  1. 在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Traffic policies(流量策略) > Firewall policies(防火墙策略)。在 Network(网络) 中,使用以下配置创建网络策略:

    选择器 运算符 值 操作
    Access Infrastructure Target is Present Allow(允许)
  2. 使用仪表板或 API 更新策略的优先顺序。

该 Gateway 策略将应用于所有 Access for Infrastructure 目标,包括 RDP 和 SSH。

4. (可选) 要求独立 MFA

您可以要求用户在通过 SSH 连接到目标之前使用 YubiKey PIV 密钥进行身份验证。您可以在应用程序级别或策略级别配置 MFA,从而使您能够对敏感用户名执行更严格的要求。

有关设置说明,请参阅为基础设施应用程序强制执行 MFA。

5. 配置服务器

某些协议需要配置服务器以信任通过 Access for Infrastructure 建立的连接。欲了解更多信息,请参阅特定协议的教程:

6. 以用户身份连接

用户使用他们首选的客户端软件连接到目标的 IP 地址。用户必须在设备上登录 Cloudflare One Client,但不需要其他系统配置。您可以选择配置私有 DNS 解析器,以允许连接到目标的私有主机名。

连接到不同的 VNET

要连接到位于不同 VNET 的目标,用户需要切换 Cloudflare One Client 中连接的虚拟网络。

显示可用目标

功能可用性

系统 可用性 最低客户端版本
Windows ✅ 2024.9.346.0
macOS ✅ 2024.9.346.0
Linux ✅ 2024.9.346.0
iOS ❌
Android ❌
ChromeOS ❌

用户可以使用 warp-cli 来显示他们可以访问的目标列表。在设备上,打开终端并运行以下命令:

warp-cli target list
╭──────────────────────────────────────┬──────────┬───────┬───────────────────────┬──────────────────────┬────────────╮
│ Target ID                            │ Protocol │ Port  │ Attributes            │ IP (Virtual Network) │ Usernames  │
├──────────────────────────────────────┼──────────┼───────┼───────────────────────┼──────────────────────┼────────────┤
│ 0193f22a-9df3-78e3-b5bb-7ab631903306 │ SSH      │ 22    │ hostname: do-target   │ 10.116.0.3 (a1net)   │ alice      │
├──────────────────────────────────────┼──────────┼───────┼───────────────────────┼──────────────────────┼────────────┤
│ 0193f22a-9df3-78e3-b5bb-7ab631903306 │ SSH      │ 23    │ hostname: do-target   │ 10.116.0.3 (a1net)   │ root       │
├──────────────────────────────────────┼──────────┼───────┼───────────────────────┼──────────────────────┼────────────┤
│ 01943cff-6130-7989-8bff-cbc02b59a2b1 │ SSH      │ 80    │ hostname: az-target   │ 172.16.0.0 (b1net)   │ alice, bob │
╰──────────────────────────────────────┴──────────┴───────┴───────────────────────┴──────────────────────┴────────────╯

可以选择添加标志来过滤输出。例如:

warp-cli target list --attribute hostname=do-target --username root

要查看所有可用过滤器,请输入 warp-cli target list --help。

撤销用户会话

要撤销用户对所有基础设施目标的访问权限,您可以在 Zero Trust 中撤销该用户或撤销其设备。Cloudflare 目前不支持撤销用户对特定目标的会话。

细粒度目标权限

基础设施 Access 通过 Cloudflare 基于角色的访问控制支持细粒度读取权限。管理员可以分配范围限于特定目标的只读角色,而不是授予账户范围的访问权限。当具有范围角色的用户调用 target 列表 API 时,响应会自动过滤为仅包含他们有权查看的目标。

这对于那些希望让团队了解自己的基础设施目标而不暴露完整目标清单的组织非常有用。

基础设施策略选择器

以下 Access 策略选择器可用于保护基础设施应用程序:

  • 电子邮件 (Email)
  • 以...结尾的电子邮件 (Emails ending in)
  • SAML 组 (SAML group)
  • 国家/地区 (Country)
  • 身份验证方法 (Authentication method)
  • 设备状况 (Device posture)
  • Entra 组、GitHub 组织、Google Workspace 组、Okta 组 (Entra group, GitHub organization, Google Workspace group, Okta group)

这篇文档对您有帮助吗?