你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
保护 Kubernetes 数据平面强化
本页介绍如何使用 Microsoft Defender for Cloud 的一组专门用于 Kubernetes 数据平面强化的安全建议。
提示
有关可能会针对 Kubernetes 群集和节点显示的安全建议的列表,请查看容器建议。
设置工作负载保护
Microsoft Defender for Cloud 包含安装适用于 Kubernetes 的 Azure Policy 后即可使用的一组建议。
先决条件
- 添加 Azure Policy 所需的 FQDN/应用程序规则。
- (对于非 AKS 群集)将现有 Kubernetes 群集连接到 Azure Arc。
启用 Kubernetes 数据平面强化
可以通过以下两种方式之一启用适用于 Kubernetes 的 Azure Policy:
- 使用计划/连接器设置为所有当前和将来的群集启用
- 在现有群集上部署适用于 Kubernetes 的 Azure Policy
使用计划/连接器设置为所有当前和将来的群集启用适用于 Kubernetes 的 Azure Policy
注意
如果启用此设置,则适用于 Kubernetes 的 Azure Policy Pod 将安装在群集上。 此操作会为 Pod 分配少量的 CPU 和内存以供使用。 此分配可能会达到最大容量,但不会影响资源上剩余的 CPU 和内存。
注意
由于 EKS 中的限制要求群集管理员为群集本身的新 IAM 角色添加权限,因此不支持通过连接器启用 AWS。
为 Azure 订阅或本地启用
如果启用 Microsoft Defender for Containers,则默认情况下会在相关订阅中为 Azure Kubernetes 服务和已启用 Azure Arc 的 Kubernetes 群集启用“适用于 Kubernetes 的 Azure Policy”设置。 如果在初始配置中禁用该设置,则可以在之后手动启用它。
如果在容器计划下禁用了“适用于 Kubernetes 的 Azure Policy”设置,则可以按照以下步骤在订阅中的所有群集中启用它:
登录 Azure 门户。
导航到“Microsoft Defender for Cloud”“环境设置”。
选择相关订阅。
在“Defender 计划”页上,确保“容器”切换为“打开”。
选择“设置”。
在“设置和监视”页中,将“适用于 Kubernetes 的 Azure Policy”切换为“打开”。
为 GCP 项目启用
在 GCP 连接器上启用 Microsoft Defender for Container 时,将会为相关项目中的 Google Kubernetes 引擎默认启用“适用于 Azure Arc 的 Azure Policy 扩展”设置。 如果在初始配置中禁用该设置,则可以在之后手动启用它。
如果在 GCP 连接器下禁用了“适用于 Azure Arc 的 Azure Policy 扩展”设置,则可以按照以下步骤 在 GCP 连接器上启用它。
在现有群集上部署适用于 Kubernetes 的 Azure Policy
可以通过“建议”页在现有 Kubernetes 群集上手动配置适用于 Kubernetes 的 Azure Policy。 启用后,强化建议将变为可用(其中一些建议需要其他配置才能正常工作)。
注意
对于 AWS,无法使用连接器进行大规模加入,但可以使用建议已启用 Azure Arc 的 Kubernetes 群集应安装适用于 Kubernetes 的 Azure 策略扩展安装在所有现有群集或特定群集上。
将 Azure Policy for Kubernetes 部署到指定群集:
在“建议”页中,搜索相关建议:
Azure -
"Azure Kubernetes Service clusters should have the Azure Policy add-on for Kubernetes installed"
GCP -
"GKE clusters should have the Azure Policy extension"
。AWS 和本地 -
"Azure Arc-enabled Kubernetes clusters should have the Azure policy extension for Kubernetes extension installed"
。提示
建议包括在五个不同的安全控件中,在下一步中选择哪个控件都无关紧要。
从任何安全控件中,选择建议来查看可在其上安装加载项的资源。
选择相关群集,然后选择“修正”。
查看并配置建议的捆绑包
适用于 Kubernetes 的 Azure Policy 加载项安装完成大约 30 分钟后,Defender for Cloud 会显示群集的运行状况,以提供以下建议(每个建议都在相关的安全控制中),如下所示:
注意
如果是第一次安装适用于 Kubernetes 的 Azure Policy,这些建议将显示为建议列表中的新添加项。
提示
某些建议包含参数,必须通过 Azure Policy 自定义参数才能有效地使用这些建议。 例如,若要从“应只从受信任的注册表部署容器映像”建议中受益,必须定义受信任的注册表。 如果没有为建议输入需要进行配置的必需参数,则工作负载将显示为“不正常”。
注意
默认情况下,Microsoft Defender 传感器和 Azure Monitor 代理 (AMA) 等组件部署在 kube 系统命名空间中。 此设置可确保它们未在数据平面建议中标记为不合规。 但是,安装在不同命名空间中的第三方供应商工具可能标记为不符合。 若要从这些建议中排除第三方供应商,可以将其命名空间添加到排除列表。
建议名称 | 安全控制 | 需要进行配置 |
---|---|---|
应强制执行容器 CPU 和内存限制 | 保护应用程序免受 DDoS 攻击 | 是 |
应只从受信任的注册表部署容器映像 | 修正漏洞 | 是 |
应强制对容器使用最低权限 Linux 功能 | 管理访问和权限 | 是 |
容器应仅使用允许的 AppArmor 配置文件 | 修正安全配置 | 是 |
服务应只侦听允许的端口 | 限制未经授权的网络访问 | 是 |
应限制对主机网络和端口的使用 | 限制未经授权的网络访问 | 是 |
Pod HostPath 卷装载的使用应仅限于已知列表 | 管理访问和权限 | 是 |
应避免使用特权提升的容器 | 管理访问和权限 | 否 |
应避免使用共享敏感主机命名空间的容器 | 管理访问和权限 | 否 |
应强制对容器使用不可变(只读)根文件系统 | 管理访问和权限 | 否 |
Kubernetes 群集应只可通过 HTTPS 进行访问 | 加密传输中的数据 | 否 |
Kubernetes 群集应禁用自动装载 API 凭据 | 管理访问和权限 | 否 |
Kubernetes 群集不应使用默认命名空间 | 实现安全最佳实践 | 否 |
Kubernetes 群集不应授予 CAPSYSADMIN 安全功能 | 管理访问和权限 | 否 |
应避免特权容器 | 管理访问和权限 | 否 |
应避免以根用户身份运行容器 | 管理访问和权限 | 否 |
对于带有需要自定义的参数的建议,需要设置参数:
设置参数:
登录 Azure 门户。
导航到“Microsoft Defender for Cloud”“环境设置”。
选择相关订阅。
在 Defender for Cloud 的菜单中,选择“安全策略”。
选择相关分配。 默认分配为
ASC default
。打开“参数”选项卡,并根据需要修改这些值。
选择“查看 + 保存”。
选择“保存”。
若要强制实施任何建议:
若要查看适用于你的群集的建议:
打开 Defender for Cloud 的“资产清单”页并将资源类型筛选器设为“Kubernetes 服务”。
选择要调查的群集,并查看可用于该群集的可用建议。
在查看工作负载保护集中的建议时,会随群集一起列出受影响的 pod(“Kubernetes 组件”)数目。 有关特定 pod 的列表,请选择该群集,然后选择“采取操作”。
若要测试强制实施,请使用下面的两个 Kubernetes 部署:
一个是正常的部署,遵循工作负载保护建议捆绑包。
另一个是运行不正常的部署,不遵循任何建议。
按原样部署示例 .yaml 文件,或参考它们来修正自己的工作负载。
正常的部署示例 .yaml 文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-healthy-deployment
labels:
app: redis
spec:
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
annotations:
container.apparmor.security.beta.kubernetes.io/redis: runtime/default
spec:
containers:
- name: redis
image: <customer-registry>.azurecr.io/redis:latest
ports:
- containerPort: 80
resources:
limits:
cpu: 100m
memory: 250Mi
securityContext:
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 1000
---
apiVersion: v1
kind: Service
metadata:
name: redis-healthy-service
spec:
type: LoadBalancer
selector:
app: redis
ports:
- port: 80
targetPort: 80
非正常的部署示例 .yaml 文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-unhealthy-deployment
labels:
app: redis
spec:
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
hostNetwork: true
hostPID: true
hostIPC: true
containers:
- name: redis
image: redis:latest
ports:
- containerPort: 9001
hostPort: 9001
securityContext:
privileged: true
readOnlyRootFilesystem: false
allowPrivilegeEscalation: true
runAsUser: 0
capabilities:
add:
- NET_ADMIN
volumeMounts:
- mountPath: /test-pd
name: test-volume
readOnly: true
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /tmp
---
apiVersion: v1
kind: Service
metadata:
name: redis-unhealthy-service
spec:
type: LoadBalancer
selector:
app: redis
ports:
- port: 6001
targetPort: 9001
后续步骤
在本文中,你已了解了如何配置 Kubernetes 数据平面强化。
如需相关材料,请参阅以下页面内容: