使用限制条件进行审核

政策控制器限制条件对象允许您为 Kubernetes 集群强制执行政策。为了帮助测试您的政策,您可以在限制条件中添加强制措施。然后,您可以在限制条件对象和日志中查看违规行为。

强制措施的类型

有三种强制执行操作:denydryrunwarn

deny 是默认强制措施。它会自动启用,即使您未在限制条件中添加强制措施。使用 deny 可防止当存在违规行为时发生给定的集群操作。

dryrun 允许您在不主动屏蔽事务的情况下监控违反规则的情况。您可以使用它来测试限制条件是否按预期工作,然后再使用 deny 操作来实施这些限制条件。以这种方式测试限制条件可以防止由于限制条件配置不当而导致的破坏。

warndryrun 类似,但也提供关于准入时发生的违规行为的即时消息。

建议您在测试新限制条件或执行迁移操作(例如升级平台)时,将强制执行操作从 deny 切换为 warndryrun,以便测试您的政策是否按预期运行。

添加强制措施

您可以将 enforcementAction: denyenforcementAction: dryrun 添加到限制条件。

以下示例限制条件(名为 audit.yaml)添加了 dryrun 操作。

#audit.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
  name: user-must-be-3333
spec:
  enforcementAction: dryrun
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
  parameters:
    runAsUser:
      rule: MustRunAs
      ranges:
        - min: 3333
          max: 3333

创建限制条件。例如,使用 kubectl apply -f 进行应用:

kubectl apply -f audit.yaml

查看审核结果

已审核的违规行为会附加到限制条件对象,并写入到日志中。准入控制器拒绝的违规行为不会出现在日志中。

在限制条件对象中查看审核结果

如需查看给定限制条件的违规行为,请运行以下命令并查看 spec.status 字段。

kubectl get constraint-kind constraint-name -o yaml

示例

要从 audit.yaml 查看限制条件的输出,请运行以下命令:

kubectl get K8sPSPAllowedUsers user-must-be-3333 -o yaml

您看到的输出类似于以下内容:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
  creationTimestamp: "2020-05-22T01:34:22Z"
  generation: 1
  name: user-must-be-3333
  resourceVersion: "13351707"
  selfLink: /apis/constraints.gatekeeper.sh/v1beta1/k8spspallowedusers/user-must-be-3333
  uid: 5d0b39a8-9bcc-11ea-bb38-42010a80000c
spec:
  enforcementAction: dryrun
  match:
    kinds:
    - apiGroups:
      - ""
      kinds:
      - Pod
  parameters:
    runAsUser:
      ranges:
      - max: 3333
        min: 3333
      rule: MustRunAs
 status:
  auditTimestamp: "2020-05-22T01:39:05Z"
  byPod:
  - enforced: true
    id: gatekeeper-controller-manager-6b665d4c4d-lwnz5
    observedGeneration: 1
 totalViolations: 5
  violations:
  - enforcementAction: dryrun
    kind: Pod
    message: Container git-sync is attempting to run as disallowed user 65533
    name: git-importer-86564db8cb-5r4gs
    namespace: config-management-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container manager is attempting to run as disallowed user 1000
    name: gatekeeper-controller-manager-6b665d4c4d-lwnz5
    namespace: gatekeeper-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-cckf
    namespace: kube-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-jnhb
    namespace: kube-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8
    namespace: kube-system

在日志中查看审核结果

您可以使用 Logs Explorer 来检索、查看和分析 Policy Controller 的日志数据。

如需获取所有政策控制器日志,请运行以下命令:

kubectl logs -n gatekeeper-system -l gatekeeper.sh/system=yes

审核结果在日志行中有 "process":"audit",因此您可以将输出传送到其他命令并按这些行进行过滤。例如,您可以使用 jq,它能解析 JSON 文件并允许您为特定日志类型设置过滤条件。

日志记录的审核结果示例:

{
"level":"info",
"ts":1590111401.9769812,
"logger":"controller",
"msg":"Container kube-proxy is attempting to run without a required securityContext/runAsUser",
"process":"audit",
"audit_id":"2020-05-22T01:36:24Z",
"event_type":"violation_audited",
"constraint_kind":"K8sPSPAllowedUsers",
"constraint_name":"user-must-be-3333",
"constraint_namespace":"",
"constraint_action":"dryrun",
"resource_kind":"Pod",
"resource_namespace":"kube-system",
"resource_name":"kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8"
}

后续步骤