Kubernetes 审计

一、Auditing 基本概念

在 Kubernetes 集群中,API Server 的审计日志可以帮助集群管理人员记录和追溯不同用户的日常操作,是集群安全运维中重要的环节。

1.1 审计阶段

在这里插入图片描述
审计阶段:记录事件的时机。每个请求都可被记录其相关的阶段(stage),已定义的阶段有:

  • RequestReceived:一点接收到请求后立刻记录审计事件;
  • ResponseStarted: 在响应消息的头部发送后,响应消息体发送前生成的事件,仅对长期运行的请求有效,例如 watch。
  • ResponseComplete: 当响应消息体完成;
  • Panic:当严重错误发生时。

审计日志记录功能会增加 API Server 的内存消耗,因为需要为每个请求存储审计所需要的某些上下文,此外,内存消耗取决于审计日志记录的配置。

1.2 审计级别

审计级别:代表记录审计日志的完整程度。

  • None:符合这条规则的日志将不记录;
  • Metadata:记录请求的元数据信息(如:请求用户、时间戳、动作、资源类型等),但不记录请求或响应的消息体;
  • Request:记录请求的元数据信息、请求体,但不记录响应体;
  • RequestResponse:记录事件的元数据信息、请求体、响应体。

1.3 审计后端

None 以上的级别会生成相应的审计日志并将审计日志输出到后端,当前 api-server 默认提供了两种后端:

  1. Log backend:以 JSON 日志格式保存为本地日志文件,我们需要对 API Server 的设置下列参数:
  • –audit-log-maxbackup 审计日志最大分片存储日志文件数
  • –audit-log-maxsize 单个审计日志轮转之前的最大大小(MB),默认为 100MB
  • –audit-log-path 审计日志保存路径,不指定此标志会禁用日志后端,意味着标准化
  • –audit-log-maxage 保留旧审计日志文件的最大天数 --audit-policy-file 审计日志策略文件的路径。

审计日志文件以 audit-log-maxsize 设置的大小为单位,写满后,kube-apiserver 将以时间戳重新命名原文件,然后继续写入 audit-log-path 指定的日志文件,audit-log-maxbackup 和 audit-log-maxage 参数则用于 kube-apiserver 自动删除旧的审计日志文件。

  1. Webhook backend:将审计事件发送到远程 Web API,我们需要对 API Server 的设置下列参数:
  • –audit-webhook-config-file 设置 Webhook 配置文件的路径。Webhook 配置文件实际上是一个 kubeconfig 文件;
  • –audit-webhook-mode 指定哪种模式回调通知;
  • –audit-webhook-initial-backoff 指定在第一次失败后重发请求等待的时间。后续重试等待时间则呈指数级递增。

1.4 审计策略

下面是一个相关的审计策略的示例:

apiVersion: audit.k8s.io/v1 
kind: Policy
omitStages:
  # 不要在 RequestReceived 阶段为任何请求生成审计事件。
  - "RequestReceived"
rules:
  # 在日志中用 RequestResponse 级别记录 Pod 变化。
  - level: RequestResponse
    resources:
    - group: ""
      # 资源 "pods" 不匹配对任何 Pod 子资源的请求,
      # 这与 RBAC 策略一致。
      resources: ["pods"]
  # 在日志中按 Metadata 级别记录 "pods/log"、"pods/status" 请求
  - level: Metadata
    resources:
    - group: ""
      resources: ["pods/log", "pods/status"]

二、Log backend 的配置过程

#### 日志策略文件
# cat /etc/kubernetes/audit-policy.yaml
apiversion: audit.k8s.io/v1
kind: Policy
omitStages:                         # 对于 RequestReceived 阶段的所有请求,不生成审计事件
  - "RequestReceived"
rules:                              # 指定审计策略的规则
  - level: None                     # 对于 system:kube-proxy 用户对 endpoints 和 services 资源的 watch 操作,不会生成审计事件
    users: ["system:kube-proxy"]
    verbs: ["watch"]
    resources:
    - group: ""
      resources: ["endpoints", "services"]
  - level: None
    users: ["system: system:kube-controller-manager", "system: kube-scheduler"]
    verbs: ["get", "update"]
    namespace: ["kube-system"]
    resources:
    - group: ""
      resources: ["endpoints"]
  - level: None
    userGroups: ["system:authenticated"]
    nonResourceURLs:
    - /healthz*
    - /version
  - level: None
    resources:
    - group: ""
      resources: ["events"]
  - level: Metadata
    - group: ""
      resources: ["secrets", "configmaps"]
    - group: authentication.k8s.io
      resources: ["tokenreviews"]
  - level: Request
    verbs: ["get", "list", "watch"]
    resources:
      - group: ""
      - group: "admissionregistration.k8s.io"
      - group: "apps"
      - group: "authentication.k8s.io"
      - group: "authorization.k8s.io"
      - group: "autoscaling"
      - group: "batch"
      - group: "certificates.k8s.io"
      - group: "networking.k8s.io"
      - group: "policy"
      - group: "rbac.authorization.k8s.io"
      - group: "storage.k8s.io"
  - level: RequestResponse
    resources:
      - group: ""
      - group: "admissionregistration.k8s.io"
      - group: "apps"
      - group: "authentication.k8s.io"
      - group: "authorization.k8s.io"
      - group: "autoscaling"
      - group: "batch"
      - group: "certificates.k8s.io"
      - group: "networking.k8s.io"
      - group: "policy"
      - group: "rbac.authorization.k8s.io"
      - group: "storage.k8s.io"
  - level: Metadata                 # Default level for all other requests.
    omitStages:                     # 符合这条规则的 watch 等长时间运行的请求将不会在 RequestReceived 阶段生成审计事件
    - "RequestReceived"

#### 备份 kube-apiserver.yaml 文件
# cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/

#### 修改 kube-apiserver.yaml 文件
# vim /etc/kubernetes/manifests/kube-apiserver.yaml 
...省略...
spec:
  containers:
  - command:
    - kube-apiserver
    - --audit-policy-file=/etc/kubernetes/audit-policy.yaml
    - --audit-log-path=/var/log/kubernetes/audit/audit.log
    - --audit-log-maxage=30
    - --audit-log-maxbackup=7
...省略... 
    volumeMounts:
    - mountPath: /etc/kubernetes/audit-policy.yaml
      name: audit
      readOnly: true
    - mountPath: /var/log/kubernetes/audit/
      name: audit-log
      readOnly: false
...省略...	
  volumes:
  - name: audit
    hostPath:
      path: /etc/kubernetes/audit-policy.yaml
      type: File
  - name: audit-log
    hostPath:
      path: /var/log/kubernetes/audit/
      type: DirectoryOrCreate
...省略...	

检查 pod kube-apiserver 是否运行正常(等待1~2分钟)

# kubectl get pod -n kube-system

检查日志是否正常收集

# tail -f /var/logs/kubernetes/audit.log
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值