相较于原PSP(PodSecurityPolicy)策略,容器服务ACK能够提供更多符合K8s应用场景的策略规则,在规则配置上也更加灵活简单,帮助企业安全运维管理人员更好的使用策略治理相关能力。本文介绍如何安装策略治理组件及如何管理策略实例。

背景信息

PodSecurityPolicy(简称PSP)从Kubenetes 1.21版本开始被标记为弃用(deprecated)状态,为此ACK容器服务改版了原先基于PSP的策略管理功能,基于OPA策略和gatekeeper准入控制器,扩展了相应的策略治理状态统计和日志上报检索等能力,同时内置了种类丰富的策略治理规则库,相较于原PSP策略能够提供符合更多K8s应用场景的策略规则,在规则配置上也更加灵活简单,帮助企业安全运维管理人员更好的使用策略治理相关能力。

前提条件

  • 已创建ACK标准版或专有版集群,且集群版本至少为1.16.9-aliyun.1。具体操作, 请参见创建Kubernetes托管版集群创建Kubernetes专有版集群
  • 如果您使用RAM账号进行策略管理,RAM账号需要拥有以下RAM授权条件:
    • cs:DescribePolicies:列举策略治理规则库列表
    • cs:DescribePoliceDetails:获取策略规则模板详情
    • cs:DescribePolicyGovernanceInCluster:获取集群策略治理详情
    • cs:DescribePolicyInstances:获取集群中当前部署的策略实例列表
    • cs:DescribePolicyInstancesStatus:获取集群当前不同策略类型对应的实例部署状态
    • cs:DeployPolicyInstance:在指定集群中部署策略规则实例
    • cs:DeletePolicyInstance:在指定集群中删除策略规则实例
    • cs:ModifyPolicyInstance:在指定集群中修改策略规则实例

    关于如何自定义RAM授权策略,请参见自定义RAM授权策略

注意事项

  • 只支持1.16.9-aliyun.1版本以上的ACK集群。
  • 当前只适用于Linux节点。
  • 当前不支持自定义策略规则,所有规则均来自于阿里云容器服务内置的规则库。
  • 仅支持通过阿里云容器服务ACK组件管理安装gatekeeper组件。

    如果集群中已通过其他途径安装gatekeeper组件,请您卸载后再通过阿里云容器服务ACK组件管理安装gatekeeper组件。关于gatekeeper组件的版本发布信息,请参见gatekeeper

安装策略治理组件

policy-template-controller组件为基于阿里云策略模板开发的K8s控制器,帮助您更好的管理基于不同策略模板部署的策略实例和集群整体的治理状态。

在安装策略治理组件policy-template-controller前,您需要安装以下组件:
  • gatekeeper组件:基于OPA策略引擎的K8s策略准入控制器,帮助您方便地管理和应用集群内的OPA策略,实现命名空间标签管理等功能。
  • logtail-ds日志组件:用于对不符合策略约束的拦截或告警事件的收集和检索。
关于如何安装gatekeeper和logtail-ds组件,请参见管理组件
  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择安全管理 > 策略管理
    策略管理页面会自动检测上述依赖组件的安装状态,对于未安装或需要升级的组件会引导您进行必要的操作。

策略规则库说明

当前阿里云容器服务ACK内置如下类型的策略规则库,策略分类和简要说明如下。关于策略规则库具体的参数配置和模板使用说明,请参见容器安全策略规则库说明

Category Policy Description Severity
CIS-K8s ACKNoEnvVarSecrets 限制Secret以secretKeyRef的形式挂载到应用Pod环境变量中。 medium
ACKPodsRequireSecurityContext 限制Pod中所有容器必须配置securitycontext字段。 low
ACKRestrictNamespaces 限制资源部署在集群指定的命名空间中。 low
ACKRestrictRoleBindings 限制指定命名空间下的rolebinding使用指定范围内的Role或Clusterrole。 high
Infra ACKBlockProcessNamespaceSharing 限制在集群指定范围部署的应用中使用shareProcessNamespace high
ACKEmptyDirHasSizeLimit 要求emptyDir类型的Volume必须指定sizelimit low
ACKLocalStorageRequireSafeToEvict 限制部署在集群指定范围内的Pod必须具有 "cluster-autoscaler.kubernetes.io/safe-to-evict": "true" 注释标签。默认情况下autoscaler在集群自动伸缩时不会驱逐使用HostPath或EmptyDir卷的Pod。为了允许驱逐这些Pod,必须在Pod上添加该注释标签。 low
ACKOSSStorageLocationConstraint 限制指定Namespaces下的部署只能使用指定Region中的阿里云OSS存储卷 low
K8s-general ACKAllowedRepos 限制在集群指定范围部署的应用Pod中拉取白名单列表外的镜像。 high
ACKBlockAutoinjectServiceEnv 要求在应用中配置enableServiceLinks: false防止在Pod环境变量中透出服务IP。 low
ACKBlockAutomountToken 要求在应用中设置automountServiceAccountToken: false字段防止自动挂载serviceaccount high
ACKBlockEphemeralContainer 限制在集群指定范围的应用Pod中启动临时容器。 medium
ACKBlockLoadBalancer 限制在集群指定范围内部署LoadBalancer类型的Service。 high
ACKBlockNodePort 限制在集群指定范围内使用NodePort类型的Service。 high
ACKContainerLimits 要求集群指定范围的应用Pod配置资源limits low
ACKExternalIPs 限制在集群指定范围内的Services实例使用白名单范围之外的externalIPs。 high
ACKImageDigests 限制在集群指定范围内部署不符合digest格式的镜像。 low
ACKRequiredLabels 限制在集群指定范围内部署没有指定范式label标签的应用。 low
ACKRequiredProbes 限制在集群指定范围内部署的Pod配置指定类型的readinessProbe和livenessProbe。 medium
ACKCheckNginxPath CVE-2021-25745止血方案,限制在Ingress实例的spec.rules[].http.paths[].path字段中使用危险配置。Ingress-nginx 1.2.0以下版本建议开启该策略。 high
ACKCheckNginxAnnotation CVE-2021-25746止血方案,限制在Ingress实例的metadata.annotations字段中使用危险配置。Ingress-nginx 1.2.0以下版本建议开启该策略。 high
PSP ACKPSPAllowPrivilegeEscalationContainer 限制在集群指定范围内部署的Pod配置allowPrivilegeEscalation参数。 medium
ACKPSPAllowedUsers 限制在集群指定范围内部署的Pod中的启动usergroupsupplementalGroups以及fsGroup medium
ACKPSPAppArmor 限制在集群指定范围内部署的Pod配置AppArmor。 low
ACKPSPCapabilities 限制在集群指定范围内部署的Pod配置Linux Capabilities能力。 high
ACKPSPFSGroup 限制在集群指定范围内部署的Pod配置 fsGroup。 medium
ACKPSPFlexVolumes 限制在集群指定范围内部署Pod的FlexVolume驱动配置。 medium
ACKPSPForbiddenSysctls 限制在集群指定范围内部署Pod的禁止的Sysctl范围。 high
ACKPSPHostFilesystem 限制在集群指定范围内部署的Pod允许挂载的主机host目录范围。 high
ACKPSPHostNamespace 限制在集群指定范围内部署的Pod是否允许共享主机host命名空间。 high
ACKPSPHostNetworkingPorts 限制在集群指定范围内部署的Pod使用主机网络和指定端口。 high
ACKPSPPrivilegedContainer 限制在集群指定范围内部署的Pod中启动特权容器。 high
ACKPSPProcMount 限制在集群指定范围内部署的Pod允许挂载的Proc类型。 low
ACKPSPReadOnlyRootFilesystem 限制在集群指定范围内部署的Pod使用只读的根文件系统。 medium
ACKPSPSELinuxV2 制在集群指定范围内部署的Pod必须使用AllowedSELinuxOptions参数中规定的Selinux配置 low
ACKPSPSeccomp 限制在集群指定范围内部署的Pod使用指定的Seccomp配置文件。 low
ACKPSPVolumeTypes 限制在集群指定范围内部署的Pod使用指定的Volume挂载类型。 medium

查看集群当前策略治理状态

对于安装了策略治理相关组件的集群,可以通过以下操作查看集群当前策略治理状态。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择安全管理 > 策略管理
  5. 策略实施总览页签中查看集群当前策略治理状态。
    包含以下信息:
    • 策略开启总览,包括高危和中危防护策略的总数和已开启数展示,建议开启的策略列表等。
    • 近7天拦截和告警结果统计。
    • 近7天策略实施记录,当前页面表格中会默认展示7天内最近100条的拦截或告警日志,如果您想查看更多审计日志,可以单击近7天策略实施记录后的未知图标,并单击悬浮窗口中的日志服务链接在SLS日志服务控制台指定的logstore中查看全部日志。策略实施总览

查看策略列表和集群中已部署的策略实例

您可以通过以下操作查看策略列表和在集群中当前已部署的策略实例总数。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择安全管理 > 策略管理
  5. 我的策略页签中查看集群所有可部署的策略名称。
    在列表中显示所有可部署的策略名称,在表格右上角会显示全部策略已开启未开启的策略计数。其中已开启的策略名称会优先显示在表格上部,在策略实例数中会显示对应策略在集群中已部署的实例个数。策略规则说明
    • 单击操作列中的编辑或单击策略名称中的链接可以修改策略实例的配置。
    • 单击操作列中的删除可以删除该策略在集群中部署的所有实例。
    • 如果策略实例数为空说明该策略还未在集群中部署创建,可以通过单击操作列的开启进行参数配置后部署对应的策略实例。
    关于策略说明和模板示例的更多信息,请参见容器安全策略规则库说明

创建策略实例

您可以根据以下操作在指定集群中创建策略实例。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择安全管理 > 策略管理
  5. 我的策略页签中,单击创建策略实例
    创建策略实例对话框配置相关参数。策略的相关参数配置说明:
    参数 说明
    策略类型 首先选择策略类型,包括如下大类:
    • Infra:基础设施层资源相关的策略类型。
    • CIS-K8s:基于CIS等K8s合规规范定制的策略类型。
    • PSP:替代Pod Security Policy(PSP)能力的策略类型。
    • K8s-general:基于最佳安全实践对K8s资源配置进行安全加固约束的通用策略类型。
    实施动作
    • 拦截:违反策略规则约束的指定资源部署会被拦截。
    • 告警:违反策略规则约束的指定资源仍旧可以部署,只会产生对应违规审计的告警日志。
    策略名称 根据选择的策略类型,在策略名称下拉列表中选择需要部署的策略模板名称。更多信息,请参见策略规则库说明
    作用范围 选择策略实例实施在集群中哪些指定的命名空间。
    参数配置
    • 如果参数配置输入框中默认为空,说明规则不需要进行参数配置。
    • 如果输入框中包含需要配置的参数模板,则请参考策略参数说明按照指定格式配置参数。更多信息,请参见策略规则库说明

修改策略实例

您可以根据以下操作在指定集群中修改已经部署的策略实例。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择安全管理 > 策略管理
  5. 我的策略页签中,单击目标策略名称或操作列的编辑
    当策略在集群中已部署超过1个实例时,您可以单击操作列的查看策略实例,选择需要修改配置的指定实例,单击对应策略的编辑,在编辑策略对话框修改相关配置。关于相关配置说明,请参见策略的相关参数配置说明修改策略实例

删除策略实例

您可以根据以下操作在指定集群中删除策略实例。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择安全管理 > 策略管理
  5. 我的策略页签中,在目标策略名称操作列单击删除
    • 在目标策略名称操作列单击删除可以删除对应策略在集群中已经部署的所有实例。
    • 当对应策略在集群中已部署超过1个实例时,您可以单击操作列中的查看策略实例,选择目标实例,单击对应策略的删除