你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Kubernetes 服务 (AKS) 中使用 Pod 安全许可

Pod 安全准入 (PSA) 使用标签对命名空间中运行的 Pod 强制实施 Pod 安全标准策略。 在 AKS 中,默认启用 Pod 安全准入。 有关 Pod 安全准入和 Pod 安全标准的详细信息,请参阅使用命名空间标签强制实施 Pod 安全标准Pod 安全标准

Pod 安全许可是单个群集实现的内置策略解决方案。 如果想使用企业级策略,建议使用 Azure Policy

开始之前

  • Azure 订阅。 如果没有 Azure 订阅,可以创建一个免费帐户
  • 已安装 Azure CLI
  • 运行 Kubernetes 1.23 或更高版本的现有 AKS 群集。

为群集中的命名空间启用 Pod 安全许可

为单个命名空间启用 PSA

  • 使用 kubectl label 命令为群集中的单个命名空间启用 PSA,并使用要强制执行的策略值设置 pod-security.kubernetes.io/enforce 标签。 以下示例为 NAMESPACE 命名空间启用 restricted 策略。

    kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/enforce=restricted
    

为所有命名空间启用 PSA

  • 使用 kubectl label 命令为群集中的所有命名空间启用 PSA,并使用要强制执行的策略值设置 pod-security.kubernetes.io/warn 标签。 以下示例为群集中的所有命名空间启用 baseline 策略。 如果任何 Pod 部署到不符合基线策略的命名空间,此策略会生成面向用户的警告。

    kubectl label --overwrite ns --all pod-security.kubernetes.io/warn=baseline
    

使用部署强制执行 Pod 安全许可策略

  1. 使用 kubectl create namespace 命令创建两个命名空间。

    kubectl create namespace test-restricted
    kubectl create namespace test-privileged
    
  2. 使用 kubectl label 命令为每个命名空间启用 PSA 策略,其中一个具有 restricted 策略,另一个具有 baseline 策略。

    kubectl label --overwrite ns test-restricted pod-security.kubernetes.io/enforce=restricted pod-security.kubernetes.io/warn=restricted
    kubectl label --overwrite ns test-privileged pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/warn=privileged
    

    这会将 test-restrictedtest-privileged 命名空间配置为阻止运行 Pod,并在任何不符合配置策略的 pod 尝试运行时生成面向用户的警告。

  3. 尝试使用 kubectl apply 命令将 Pod 部署到测试 test-restricted 命名空间。 此命令会导致错误,因为测试 test-restricted 命名空间被配置为阻止不符合 restricted 策略的 Pod。

    kubectl apply --namespace test-restricted -f https://raw.githubusercontent.com/Azure-Samples/azure-voting-app-redis/master/azure-vote-all-in-one-redis.yaml
    

    以下示例输出显示一条警告,指出 Pod 违反了配置的策略:

    ...
    Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "azure-vote-back" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "azure-vote-back" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "azure-vote-back" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "azure-vote-back" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
    deployment.apps/azure-vote-back created
    service/azure-vote-back created
    Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "azure-vote-front" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "azure-vote-front" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "azure-vote-front" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "azure-vote-front" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
    deployment.apps/azure-vote-front created
    service/azure-vote-front created
    
  4. 使用 kubectl get pods 命令确认 test-restricted 命名空间中没有正在运行的 Pod。

    kubectl get pods --namespace test-restricted
    

    以下示例输出显示 test-restricted 命名空间中没有正在运行的 Pod:

    No resources found in test-restricted namespace.
    
  5. 尝试使用 kubectl apply 命令将 Pod 部署到测试 test-privileged 命名空间。 这次,Pod 应该会成功部署,因为 test-privileged 命名空间配置为允许违反 privileged CELVE 的 Pod。

    kubectl apply --namespace test-privileged -f https://raw.githubusercontent.com/Azure-Samples/azure-voting-app-redis/master/azure-vote-all-in-one-redis.yaml
    

    以下示例输出显示 Pod 已成功部署:

    deployment.apps/azure-vote-back created
    service/azure-vote-back created
    deployment.apps/azure-vote-front created
    service/azure-vote-front created
    
  6. 使用 kubectl get pods 命令确认 test-privileged 命名空间中有正在运行的 Pod。

    kubectl get pods --namespace test-privileged
    

    以下示例输出显示 test-privileged 命名空间中有两个正在运行的 Pod:

    NAME                               READY   STATUS    RESTARTS   AGE
    azure-vote-back-6fcdc5cbd5-svbdf   1/1     Running   0          2m29s
    azure-vote-front-5f4b8d498-tqzwv   1/1     Running   0          2m28s
    
  7. 使用 kubectl delete 命令删除 test-restrictedtest-privileged 命名空间。

    kubectl delete namespace test-restricted test-privileged
    

后续步骤

在本文中,你学习了如何为 AKS 群集启用 Pod 安全许可。 有关 Pod 安全许可的详细信息,请参阅使用命名空间标签强制执行 Pod 安全标准 有关 Pod 安全许可使用的 Pod 安全标准的详细信息,请参阅 Pod 安全标准