使用 CIS Kubernetes 基准政策限制条件

政策控制器附带默认的限制条件模板库,您可以将该库与 CIS 软件包搭配使用,从而根据CIS Kubernetes 基准来审核集群的合规性。此基准是一系列关于配置 Kubernetes 以支持可靠的安全状况的建议。

此限制条件软件包在以下网域中处理并强制执行政策:

  • RBAC 和服务帐号
  • Pod 安全政策
  • 网络政策和 CNI
  • 密文管理
  • 常规政策

这些政策尚未通过 CIS 认证。

该软件包包含以下限制条件,以满足 CIS 基准中相应控制措施的要求:

限制条件 对照组 ID 对照组说明
psp-privileged-container 5.2.1 尽可能减少特权容器的准许
psp-host-namespace 5.2.2 尽可能减少希望共享主机进程 ID 命名空间的容器的准许
5.2.3 尽可能减少希望共享主机 IPC 命名空间的容器的准许
psp-host-network-ports 5.2.4 尽可能减少希望共享主机网络命名空间的容器的准许
psp-allow-privilege-escalation-container 5.2.5 尽可能减少具有 allowPrivilegeEscalation 的容器的准许
psp-pods-must-run-as-nonroot 5.2.6 尽可能减少根容器的准许
psp-capabilities 5.2.7 尽可能减少具有 NET_RAW 功能的容器的准许
5.2.8 尽可能减少具有附加功能的容器的准许
5.2.9 尽可能减少具有分配的功能的容器的准许
require-namespace-network-policies 5.3.2 确保所有命名空间都定义了网络政策
no-secrets-as-env-vars 5.4.1 优先将 Secret 用作文件而不是用作环境变量
psp-seccomp-docker-default 5.7.2 确保在 pod 定义中将 seccomp 配置文件设置为 docker/default
pods-require-security-context 5.7.3 将安全上下文应用到您的 Pod 和容器

准备工作

  1. 安装并初始化 Google Cloud CLI,它提供了以下说明中使用的 gcloudkubectl 命令。如果您使用 Cloud Shell,则系统会预安装 Google Cloud CLI。
  2. 安装并设置 kpt。在这些说明中,kpt 用于自定义和部署 Kubernetes 资源。
  3. 如果您是第一次使用 Anthos Config Management,请启用 Anthos Config Management
  4. 创建运行 Kubernetes 1.14.x 或更高版本的集群(集群上安装了 Policy Controller),或确保您有权访问此集群。如需详细了解政策控制器安装,请参阅安装政策控制器
  5. 可选:安装 Config Sync 并将集群同步到 Google 示例代码库。此代码库预填充了政策控制器的 CIS 限制条件。如需了解详情,请参阅安装 Config Sync

使用政策控制器审核 CIS 政策

政策控制器允许您为 Kubernetes 集群强制执行政策。为了帮助测试您的工作负载及其对上表中列出的 CIS 政策的合规性,您可以在“审核”模式下部署这些限制条件以发现违规行为,更重要的是让您有机会在 Kubernetes 集群上强制执行之前处理这些违规行为。

您可以在 spec.enforcementAction 设置为 dryrun 的情况下,使用 kptConfig Sync 应用这些政策。

kpt

  1. 使用 kpt 从 GitHub 下载 CIS 政策软件包:

    kpt pkg get https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/bundles/cis-k8s-v1.5.1
    
  2. 运行 set-enforcement-action kpt 函数将政策的强制执行操作设置为 dryrun

    kpt fn eval cis-k8s-v1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  3. 使用 kpt 初始化工作目录,此操作会创建一个资源来跟踪更改:

    cd cis-k8s-v1.5.1
    kpt live init
    
  4. 使用 kpt 应用政策限制条件:

    kpt live apply
    

    输出如下所示:

    k8spspseccomp.constraints.gatekeeper.sh/psp-seccomp-docker-default created
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/pods-require-security-context created
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/prohibit-role-wildcard-access created
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/require-namespace-network-policies created
    k8snoenvvarsecrets.constraints.gatekeeper.sh/no-secrets-as-env-vars created
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-allow-privilege-escalation-container created
    k8spspallowedusers.constraints.gatekeeper.sh/psp-pods-must-run-as-nonroot created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-host-network-ports created
    k8srestrictrolebindings.constraints.gatekeeper.sh/restrict-clusteradmin-rolebindings created
    k8spspcapabilities.constraints.gatekeeper.sh/psp-capabilities created
    k8spsphostnamespace.constraints.gatekeeper.sh/psp-host-namespace created
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-privileged-container created
    13 resource(s) applied. 13 created, 0 unchanged, 0 configured, 0 failed
    
  5. 验证政策限制条件是否已安装,并检查集群中是否存在违规行为:

    kpt live status --output table --poll-until current
    

    状态为 CURRENT,即确认限制条件成功安装。

Config Sync

使用 Config Sync 将政策部署到其集群的运维人员可以按照以下说明操作:

  1. 更改为 Config Sync 的同步目录:

    cd SYNC_ROOT_DIR
    
  2. 使用 kpt 从 GitHub 下载 CIS 政策软件包:

    kpt pkg get git@github.com:GoogleCloudPlatform/acm-policy-controller-library.git/bundles/cis-k8s-v1.5.1 policy/cis
    
  3. 运行 set-enforcement-action kpt 函数将政策的强制执行操作设置为 dryrun

    kpt fn eval policy/cis/cis-k8s-v1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  4. 预览将创建的政策限制条件:

    kpt live init policy/cis/cis-k8s-v1.5.1
    kpt live apply --dry-run policy/cis/cis-k8s-v1.5.1
    

    输出如下所示:

    k8spsphostnamespace.constraints.gatekeeper.sh/psp-host-namespace created (dry-run)
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/pods-require-security-context created (dry-run)
    k8srestrictnamespaces.constraints.gatekeeper.sh/restrict-default-namespace created (dry-run)
    k8srestrictrolebindings.constraints.gatekeeper.sh/restrict-clusteradmin-rolebindings created (dry-run)
    k8snoenvvarsecrets.constraints.gatekeeper.sh/no-secrets-as-env-vars created (dry-run)
    k8spspallowedusers.constraints.gatekeeper.sh/psp-pods-must-run-as-nonroot created (dry-run)
    k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-host-network-ports created (dry-run)
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-privileged-container created (dry-run)
    k8spspseccomp.constraints.gatekeeper.sh/psp-seccomp-docker-default created (dry-run)
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/prohibit-role-wildcard-access created (dry-run)
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/require-namespace-network-policies created (dry-run)
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-allow-privilege-escalation-container created (dry-run)
    k8spspcapabilities.constraints.gatekeeper.sh/psp-capabilities created (dry-run)
    13 resource(s) applied. 13 created, 0 unchanged, 0 configured, 0 failed (dry-run)
    
  5. 将更改推送到 Config Sync 代码库:

    git add SYNC_ROOT_DIR/policy/cis
    git commit -m 'Adding CIS policy audit enforcement'
    git push
    
  6. 验证安装状态:

    watch gcloud beta container hub config-management status --project PROJECT_ID
    

    状态 SYNCED 用于确认政策的安装情况。

查看违规问题

在审核模式下安装政策限制条件后,您可以使用以下命令查看集群上的违规行为:

kubectl get constraint -o json | jq -cC '.items[]| [.kind,.status.totalViolations]'

如果您更希望在 Cloud Logging 中查看违规行为,请转到日志浏览器页面。

转到日志浏览器

在查询编辑器中使用以下过滤条件来监控违规日志:

resource.type="k8s_container"
resource.labels.location=CLUSTER_LOCATION
resource.labels.namespace_name="gatekeeper-system"
resource.labels.pod_name:"gatekeeper-audit-"
jsonPayload.process: "audit"
jsonPayload.event_type: "violation_audited"
jsonPayload.constraint_name:*
jsonPayload.constraint_namespace:*

实施 CIS 政策

查看集群中的政策违规后,下一步就是强制执行这些政策,以使准入控制器阻止任何不合规的资源应用于集群。

kpt

  1. 运行 set-enforcement-action kpt 函数将政策的强制执行操作设置为 deny

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=deny
    
  2. 应用政策限制条件:

    kpt live apply
    

Config Sync

使用 Config Sync 将政策部署到其集群的运维人员可以按照以下说明操作:

  1. 更改为 Config Sync 的同步目录:

    cd SYNC_ROOT_DIR
    
  2. 运行 set-enforcement-action kpt 函数将政策的强制执行操作设置为 deny

    kpt fn eval policy/cis/cis-k8s-v1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=deny
    
  3. 将更改推送到 Config Sync 代码库:

    git add SYNC_ROOT_DIR/policy/cis
    git commit -m 'Enforcing CIS policies for GKE'
    git push
    
  4. 验证安装状态:

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    SYNCED 列中显示的代码库将确认政策的安装情况。

测试政策执行情况

执行快速测试以确认政策执行和对集群上不合规资源的阻止。

使用以下命令在集群上创建不合规的资源:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  namespace: wp
  name: wp-non-compliant
  labels:
    app: wordpress
spec:
  containers:
    - image: wordpress
      name: wordpress
      ports:
      - containerPort: 80
        name: wordpress
EOF

准入控制器应生成一个错误,其中列出了此资源违反政策的行为。