本文介绍根据支付卡行业数据安全标准 (PCI-DSS 3.2.1) 运行工作负载的 Azure Kubernetes 服务 (AKS) 群集的参考体系结构。 此体系结构侧重于基础结构,而不是 PCI-DSS 3.2.1 工作负载。
本文是一系列文章的其中一篇。 阅读简介。
建议和示例摘自此随附的参考实现方案:
GitHub:适用于受管制工作负载的 Azure Kubernetes 服务 (AKS) 基线群集展示了受管制的基础结构。 此实现方案提供了一个微服务应用程序。 目的是帮助你体验基础结构并阐释网络和安全控制。 该应用程序不代表或实现实际的 PCI DSS 工作负载。
下载此体系结构的 Visio 文件。
该网络体系结构基于中心辐射型拓扑。 中心虚拟网络包含用于控制出口流量的防火墙、来自本地网络的网关流量以及用于 SRE(站点可靠性工程师)群集访问的第三个网络。 有两个分支虚拟网络。 一个分支包含 AKS 群集,该群集是持卡人环境 (CDE) 的组件之一,用于托管 PCI DSS 工作负载。 另一个分支生成用于对环境进行受控 SRE 访问的虚拟机映像。
重要
此体系结构和实现方案基于 AKS 基线体系结构。 若要充分利用本文,请熟悉基线组件。 本部分将重点介绍这两种体系结构之间的差异。
组件
下面列出了此体系结构中使用的主要组件。 如果不熟悉这些服务,请参阅相关的 Azure 服务以获取产品文档的链接。
Azure 防火墙
防火墙实例保护出站网络流量。 如果没有此安全层,流量流可能会与恶意第三方服务通信,因此可能泄露敏感的公司数据。
Azure Bastion
基线体系结构为 Azure Bastion 提供子网,但未预配资源。 此体系结构在子网中添加 Azure Bastion,它提供了对跳转盒的安全访问。
Azure 映像生成器
它在单独的虚拟网络中预配,创建具有基本安全性和配置的 VM 映像。 在此体系结构中,它自定义为使用预安装的 Azure CLI、kubectl
和 Flux CLI 等管理工具生成安全节点映像。
适用于跳转盒实例的 Azure 虚拟机规模集
分支网络具有用于跳转盒的额外计算能力。 此规模集旨在作为受管理的访问点,以根据需要针对 AKS 群集运行工具,例如 kubectl
。
Azure 应用程序网关和集成的 Web 应用程序防火墙 (WAF)
Azure 应用程序网关在第 7 层进行负载均衡。 WAF 保护传入流量免受常见 Web 流量攻击。 该实例具有接收用户请求的公共前端 IP 配置。
Azure Kubernetes 服务 (AKS)
托管基础结构,它是持卡人数据环境 (CDE) 的关键部分。 AKS 群集部署为专用群集。 因此,Kubernetes API 服务器不会向公共 Internet 公开,并且仅允许从专用网络向 API 服务器发送流量。
ACR 任务
提供生成和维护容器映像的自动化方式。
Azure Key Vault
存储和管理群集操作所需的机密,例如证书和加密密钥。
群集配置
以下是与基线体系结构相比的一些重大变化:
节点池分段
在此体系结构中,群集有两个用户节点池和一个系统节点池。 节点池的计算选择与基线体系结构中的计算选择相同。 与基线体系结构不同,每个节点池都位于一个专用子网中,以在计算层之间提供额外的网络隔离边界。
注意
计算保护的替代方法是 Azure 机密计算。 AKS 支持机密计算节点,这些节点使你可以在基于硬件的受信任执行环境 (TEE) 中运行敏感工作负载。 有关详细信息,请参阅 Azure Kubernetes 服务上的机密计算节点。
PCI-DSS 3.2.1 要求在操作和连接方面将 PCI 工作负载与其他工作负载隔离。
范围内:PCI 工作负载、它所在的环境和操作。
范围外:可能共享服务但与范围内组件隔离的其他工作负载。
关键策略是提供所需的分离级别。 首选方法是将范围内组件和范围外组件部署在不同的群集中。 使用多个群集的缺点是增加的基础设施和维护开销的成本较高。 为简单起见,此实现方案将所有组件放在一个共享群集中。 如果选择遵循单个群集模型,请使用严格的群集内分段策略。 无论选择如何保持分离,都要注意,随着解决方案的发展,一些范围外组件可能会变成范围内组件。
在参考实现中,我们通过将微服务应用程序部署到单个群集来演示共享的群集方法。 范围内和范围外的工作负载在两个不同的用户节点池中分段。 该应用程序有两组服务:一组具有范围内 Pod,另一组超出范围。 这两组分布在两个用户节点池中。 通过使用 Kubernetes 排斥,范围内和范围外 Pod 将部署到不同的节点中,并且它们从不共享节点 VM 或网络 IP 空间。
入口控制器
基线体系结构使用 Traefik 进行入口控制。 在此参考体系结构中,我们会改用 Nginx。 此更改说明可以根据工作负载的要求更改此组件。
专用 Kubernetes API 服务器
基线体系结构在公共模式下部署了 AKS 群集。 这意味着,与 AKS 托管的 Kubernetes API 服务器的所有通信都通过公共 Internet 进行。 此体系结构无法接受这一点,因为 PCI-DSS 3.2.1 禁止公开接触任何系统组件。 在此受管制体系结构中,群集部署为专用群集。 只允许从专用网络向 Kubernetes API 服务器发送网络流量。 API 服务器通过群集网络中的专用终结点公开。 随着网络安全组和其他内置功能的使用,安全性进一步增强。 这些内容在网络配置中进行了描述。
Pod 安全性
描述工作负载的安全需求时,请为容器使用相关的 securityContext
设置。 这包括基本设置,例如 fsGroup
、runAsUser
/ runAsGroup
,以及将 allowPrivilegeEscalation
设置为 false(除非必需)。 在 seLinuxOptions
中明确定义和删除 Linux 功能以及定义 SELinux 选项。
避免在部署清单中按标记引用映像, 而应使用实际的映像 ID。 这样,就可以可靠地将容器扫描结果与群集中运行的实际内容进行映射。 你可以通过 Azure Policy 强制执行此操作,以将映像 ID 模式包含在允许的正则表达式中。 使用 Dockerfile FROM
指令时,也请遵循此准则。
网络配置
中心-分支都部署在单独的虚拟网络中,每个网络都在自己的专用地址空间中。 默认情况下,不允许任意两个虚拟网络之间的流量。 在网络内,通过创建子网来应用分段。
各种 Azure 服务和功能以及本机 Kubernetes 构造的组合提供了所需的控制级别。 下面是此体系结构中使用的一些选项。
通过网络安全组 (NSG) 实现子网安全
可通过几个 NSG 控制进出群集的流。 下面是一些示例:
群集节点池放置在专用子网中。 对于每个子网,都有 NSG 阻止对节点 VM 的任何 SSH 访问并允许来自虚拟网络的流量。 来自节点池的流量仅限于虚拟网络。
Azure 应用程序网关会拦截来自 Internet 的所有入站流量。 例如,NSG 规则确保:
- 只允许 HTTPS 流量进入。
- 使用服务标记允许来自 Azure 控制平面的流量。 有关详细信息,请参阅允许访问少量源 IP。
在具有 Azure 容器注册表代理的子网上,NSG 仅允许必要的出站流量。 例如,允许流量流向 Azure Key Vault、Microsoft Entra ID、Azure Monitor 和容器注册表需要与之通信的其他服务。
带有跳转盒的子网适用于管理操作。 跳转盒子网上的 NSG 规则仅允许从中心的 Azure Bastion 进行 SSH 访问,并限制出站连接。 跳转盒没有通用的 Internet 访问权限,并且受子网 NSG 和 Azure 防火墙的控制。
随着工作负载、系统安全代理和其他组件的部署,需添加更多 NSG 规则,以帮助定义应允许的流量类型。 流量不应遍历这些子网边界。 由于每个节点池都位于自己的子网中,因此需观察流量模式,然后应用更具体的规则。
使用网络策略实现 Pod 到 Pod 安全性
此体系结构试图尽可能地实现 Microsoft 的“零信任”原则。
用户提供的 a0005-i
和 a0005-o
命名空间中的实现演示了零信任网络作为概念的示例。 每个工作负载命名空间都应该应用限制性 NetworkPolicy。 策略定义将取决于在这些命名空间中运行的 Pod。 请确保考虑就绪情况、活动性和启动探测,并考虑 Log Analytics 代理收集的指标。 考虑跨工作负载标准化端口,以便为允许的容器端口提供一致的 NetworkPolicy 和 Azure Policy。
在某些情况下,这对于群集内的通信是不切实际的。 并非所有用户提供的命名空间都可以使用零信任网络(例如,cluster-baseline-settings
不能使用零信任网络)。
TLS 加密
基线体系结构在群集中的入口控制器之前提供 TLS 加密的流量,但 Pod 到 Pod 的通信是透明的。 在此体系结构中,TLS 扩展到 Pod 到 Pod 流量,并有证书颁发机构 (CA) 的验证。 该 TLS 由服务网格提供,服务网格会在允许通信之前强制执行 mTLS 连接和验证。
该实现方案使用 mTLS。 mTLS 支持可以通过或不通过服务网格来实现。 如果使用网格,请确保它与所选证书颁发者兼容。 此实现方案使用 Open Service Mesh。
当入口资源不包含特定证书时,此实现方案中的入口控制器使用通配符证书来处理默认流量。 这是可以接受的,但如果组织策略不允许使用通配符证书,你可能需要将入口控制器调整为不使用通配符证书。
重要
任何解密持卡人数据的组件都被视为 PCI-DSS 3.2.1 的范围内组件,并且与持卡人数据环境中的其他组件受到相同级别的审查。 在此体系结构中,Azure 应用程序网关是范围内组件,因为它将有效负载作为其 WAF 功能的一部分进行检查。 另一种体系结构选项是使用 Azure 防火墙高级版而不是 WAF 作为入口组件,以利用 Azure 防火墙基于签名的 IDPS 功能。 这将使第一个 TLS 终止位于群集中。 但是,如果没有专用 WAF,则必须使用其他补偿控件来满足要求 6.6。
Azure Key Vault 网络限制
所有机密、密钥和证书都存储在 Azure Key Vault 中。 Key Vault 处理证书管理任务,例如轮换。 与 Key Vault 的通信通过 Azure 专用链接进行。 与 Key Vault 关联的 DNS 记录位于专用 DNS 区域中,因此无法从 Internet 解析。 虽然这样做增强了安全性,但也带来了一些限制。
Azure 应用程序网关不支持从使用专用链接公开的 Key Vault 实例中为 HTTP 侦听器获取 TLS 证书。 因此,该实现方案以混合模型部署 Key Vault。 它仍然对支持专用链接的连接使用专用链接,但也允许公共访问以进行应用程序网关集成。 如果这种混合方法不适合你的部署,请将证书管理流程移至应用程序网关。 这会增加管理开销,但 Key Vault 实例将被完全隔离。 相关信息,请参阅:
DDOS 保护
如果你有具有公共 IP 地址的任何虚拟网络,请启用 Azure DDoS 网络保护。 在此参考体系结构中,包含应用程序网关的子网附加了公共 IP 地址,因此,它在 DDoS 保护范围内。
Azure DDoS 网络保护可以防止基础结构和工作负荷收到大规模欺诈请求。 此类请求可能会导致服务中断或掩盖另一个并发攻击。 Azure DDoS 网络保护成本高昂,通常在跨多个 IP 地址的许多工作负载之间分摊。 请与网络团队协作,协调工作负载的覆盖范围。
标识和访问管理
根据角色的要求定义角色并设置访问控制。 将角色映射到范围尽可能窄的 Kubernetes 操作。 避免使用跨多个职能的角色。 如果一个人担任多个角色,则为该人员分配与等效工作职能相关的所有角色。 因此,即使一个人直接负责群集和工作负载,也可以创建 Kubernetes ClusterRole
,就像有多个人一样。 然后为该人员分配所有相关角色。
最大限度地减少长期访问,特别是对于影响较大的帐户,例如 SRE/Ops 与群集的交互。 AKS 控制平面支持 Microsoft Entra ID Privileged Access Management (PAM) 实时 (JIT) 和条件访问策略,后者根据你生成的规则,为特权访问提供额外的必需身份验证层。
有关使用 PowerShell 配置条件访问的更多详细信息,请参阅New-MgIdentityConditionalAccessPolicy、Get-MgIdentityConditionalAccessPolicy 和 Remove-MgIdentityConditionalAccessPolicy。
磁盘加密
为静态数据设计加密时,请考虑存储磁盘、AKS 代理节点 VM、其他 VM 以及任何临时磁盘和操作系统磁盘。
存储磁盘
默认情况下,Azure 存储磁盘使用 Microsoft 管理的密钥进行静态加密。 如果使用非临时操作系统磁盘或添加数据磁盘,建议使用客户管理的密钥来控制加密密钥。 在存储层之外进行加密,仅将加密数据写入存储介质。 此外,请确保密钥永远不会与存储层相邻。 有关详细信息,请参阅对 Azure 磁盘使用自己的密钥 (BYOK)。
考虑将 BYOK 用于可能与群集交互的任何其他磁盘,例如 Azure Bastion 后面的跳转盒。 如果选择 BYOK,VM 的 SKU 选项和区域可用性将受到限制,因为并非所有 SKU 或区域都支持此功能。
VM 主机
建议启用主机加密功能。 此功能会加密 VM 主机和任何临时操作系统,或缓存在 VM 主机上的数据磁盘。 详细了解 VM 对基于主机的加密的支持。
该功能通过基于主机的加密功能扩展到存储在 AKS 代理节点的 VM 主机上的数据。 与 BYOK 类似,此功能可能会限制 VM SKU 和区域选项。
你可以通过 Azure Policy 强制实施这些功能。
群集备份(状态和资源)
如果工作负载需要群集内存储,请使用可靠且安全的备份和恢复流程。 考虑使用 Azure 备份(用于 Azure 磁盘和 Azure 文件存储)等服务来备份和恢复任何 PersistentVolumeClaim
。 如果备份系统支持本机 Kubernetes 资源,则具备一些优势。 你可以使用用于关键系统恢复技术的备份系统来补充将群集与已知状态相协调的主要方法。 例如,它可以帮助在 Kubernetes 资源级别进行偏移检测以及随时间推移更改编录系统状态。
备份过程需要对备份中的数据进行分类,无论该数据来自群集还是在群集外部。 如果数据在 PCI DSS 3.2.1 的范围内,请扩展合规性边界,以包括备份(将位于群集外部)的生命周期和目标。 备份可能是攻击途径。 设计备份时,应考虑地理限制、静态加密、访问控制、角色和职责、审核、生存时间和防篡改。
群集内备份系统预计将在其操作期间以高特权运行。 评估将备份代理引入群集的风险和好处。 代理功能是否与群集中的另一个管理解决方案重叠? 在不扩大攻击面的情况下,完成此任务所需的最低工具集组合是什么?
Azure Policy 注意事项
通常,应用的 Azure 策略没有工作负载优化设置。 在实现过程中,我们将应用基于 Linux 的工作负载的 Kubernetes 群集 Pod 安全限制标准计划,该计划是一个内置策略计划。 此计划不允许优化设置。 考虑导出此计划并针对特定工作负载自定义其值。 可以将所有 Gatekeeper deny
Azure 策略包含在一个自定义计划下,将所有 audit
Azure 策略包含在另一个计划下。 这样做会将阻止操作从仅供参考的策略中标示出来。
考虑将 kube-system
和 gatekeeper-system
命名空间包含在 audit 策略中,以提高可见性。 在 deny 策略中包含这些命名空间可能会导致群集故障,因为配置不受支持。
你可以通过设置一些 Azure Policy 警报来强制实施数据加密。 例如,可以通过警报来强制实施 BYOK,该警报会检测群集资源上没有 diskEncryptionSetID
的群集。 另一个策略可以检测是否在 agentPoolProfiles
上启用了基于主机的加密。 参考实现方案不使用群集中的任何磁盘,并且操作系统磁盘是临时磁盘。 这两个示例策略都是为了提醒用户注意安全功能而设置的。 这些策略设置为 audit
,而不是 block
。
管理映像
对工作负载使用无分发的基础映像。 借助这些映像,可以最大程度地减少安全外围应用,因为诸如外壳和包管理器之类的补充映像将被删除。 好处之一是降低了 CVE 命中率。
Azure 容器注册表支持符合开放容器计划 (OCI) 映像格式规范的映像。 这与支持验证签名的准入控制器相结合,可确保仅运行已使用私钥签名的映像。 SSE Connaisseur 或 IBM Portieris 等开源解决方案集成了这些流程。
保护容器映像和其他 OCI 项目,因为它们包含组织的知识产权。 使用客户管理的密钥并加密注册表内容。 默认情况下,使用服务管理的密钥对数据进行静态加密,但为了满足法规合规性标准,有时需要使用客户管理的密钥。 将密钥存储在托管密钥存储中,例如 Azure Key Vault。 由于你创建并拥有密钥,因此需负责与密钥生命周期相关的操作,包括轮换和管理。 有关详细信息,请参阅使用客户管理的密钥加密注册表。
Kubernetes API 服务器操作访问
你可以限制对群集执行的命令,而不必构建基于跳转盒的操作流程。 如有 IAM 门控式 IT 自动化平台,请使用预定义操作来控制和审核操作的类型。
生成代理
管道代理应在受管制群集的范围外,因为生成进程可能是威胁载体。 例如,生成过程通常适用于未经测试和不受信任的组件。
虽然经常使用 Kubernetes 作为弹性生成代理基础结构,但不要在受管制工作负载运行时边界内运行该进程。 生成代理不应直接访问群集。 例如,仅授予生成代理对 Azure 容器注册表的网络访问权限,以推送容器映像、Helm 图表等。 然后,通过 GitOps 进行部署。 作为一种常见做法,生成和发布工作流不应直接访问 Kubernetes 群集 API(或其节点)。
监视操作
群集内活动
在 kube-system
中运行的群集内 omsagent
Pod 是 Log Analytics 收集代理。 它们收集遥测、抓取容器 stdout
和 stderr
日志,并收集 Prometheus 指标。 你可以通过更新 container-azm-ms-agentconfig.yaml
ConfigMap 文件来优化其收集设置。 在此参考实现方案中,系统跨 kube-system
和所有工作负载启用日志记录。 默认情况下,从日志记录中排除 kube-system
。 确保调整日志收集过程,以实现均衡成本目标、查看日志时的 SRE 效率和合规性需求。
安全监视
使用 Microsoft Defender for Cloud 中的 Defender for Containers 查看和修正安全建议,并查看有关容器资源的安全警报。 启用 Microsoft Defender 计划,因为它们适用于持卡人数据环境的各种组件。
集成日志,以便高效查看、分析和查询数据。 Azure 提供了数个选项。 可打开 AKS 诊断日志并将其发送到属于 Azure Monitor 的 Log Analytics 工作区。 另一个选项是将数据集成到安全信息和事件管理 (SIEM) 解决方案,例如 Microsoft Sentinel。
根据该标准的要求,所有 Log Analytics 工作区都设置为 90 天的保留期。 可考虑为长期存储设置连续导出。 请勿将敏感信息存储在日志数据中,并确保对存档日志数据的访问受到与最新日志数据相同级别的访问控制。
有关完整的观点,请参阅 Microsoft Defender for Cloud 企业加入指南。 本指南介绍了注册、将数据导出到 SIEM 解决方案、响应警报以及构建工作流自动化。
相关的 Azure 服务
下面是此体系结构的一些关键组件的功能文档链接。
- Azure Kubernetes 服务 (AKS)
- Azure 防火墙
- Azure Bastion
- Azure 映像生成器
- Azure 虚拟机规模集
- Azure 应用程序网关和集成的 Web 应用程序防火墙 (WAF)
- Azure 容器注册表任务
- Azure Key Vault
后续步骤
安装和维护防火墙配置以保护持卡人数据。 不要将供应商提供的默认值用作系统密码和其他安全参数。