Kubernetes审计日志功能

1. 背景

kubernetes 1.6版本开始支持审计功能,到1.12版本审计功能GA,而本文则是针对kubernetes 1.15+简单说明其审计功能的开启和配置。那何为审计功能呢,审计功能又有什么作用呢?

如下是摘自Kubernetes官方文档的一段话:

Kubernetes 审计功能提供了与安全相关的按时间顺序排列的记录集,记录单个用户、管理员或系统其他组件影响系统的活动顺序。 它能帮助集群管理员处理以下问题:

  • 发生了什么?
  • 什么时候发生的?
  • 谁触发的?
  • 为什么发生?
  • 在哪观察到的?
  • 它从哪触发的?
  • 它将产生什么后果?

2. 审计功能开启

Kubernetes的审计功能是通过kube-apiserver开启,具体是主要设置kube-apiserver的两个启动参数audit-policy-fileaudit-log-path,如果是kubeadm搭建的kubernetes集群,则修改kube-apiserver的配置文件/etc/kubernetes/manifests/kube-apiserver.yaml即可,比如:

至于这两个参数以及如上截图中其他审计相关的参数的具体意义,下文会进一步说明。

2.1 审计策略

审计策略定义了kubernetes哪些资源的事件被记录以及被记录事件的数据规则,对应上面截图中参数audit-policy-file,文件配置会涉及到两个十分重要的名词解释:审计阶段和审计级别。

2.1.1 审计阶段

及记录事件的时机,这里分为四种类型:

  • RequestReceived:一旦接收到请求即刻记录审计事件;
  • ResponseStarted:响应头发出,响应消息体未发出之前,一般适用于长连接或者耗时任务的场景;
  • ResponseComplete:响应消息体完成;
  • Panic:出现panic

2.1.2 审计级别

代表记录审计日志的完整程度,常见的也有四种:

  • None:不记录审计日志;
  • Metadata:记录请求的原子数据信息比如请求的user、method、时间、资源类型等,但不包括请求体和响应体;
  • Request:记录包括Metadata和请求体,但不包括响应体;
  • RequestResponse:记录包括Metadata、请求体、响应体;

当然,除了上述两个关键字之外,审计策略还应包括具体的规则(rules),比如请求的user、method、resource等,并且这里规则的配置跟kubernetes role规则的写法基本一致,举一个简单的审计策略配置的例子,只针对pod的创建和删除记录审计日志:

# cat /etc/kubernetes/pki/audit-policy.yaml
apiVersion: audit.k8s.io/v1beta1  # 必须字段,固定写法
kind: Policy  # 必须字段,固定写法
omitStages:
  - "RequestReceived"  # 审计阶段
rules:  # rule按顺序匹配
  - level: Request  # 审计级别
    verbs:
    - create
    - delete
    resources:
    - group: ""
      resources:
      - pods
  - level: None 

2.2 审计后端

审计后端则实现将审计日志导出,支持两种方式:Log后端webhook后端,后一种方式此文不做展开,简单说明一下Log后端

2.2.1 配置参数

其中最重要的参数则对应上面截图中参数audit-log-path,即审计日志写入的文件路径,如果不设置此参数则表示禁用Log后端,如果设置-则表示标准输出(比如stdout、strerr形式的输出),此时可以通过kubectl logs命令打印日志输出。

还有一些参数比如:

  • audit-log-maxage:日志保留的最大天数;
  • audit-log-maxbackup:日志文件保留的最大数量;
  • audit-log-maxsize:单个日志文件的最大容量,超过则轮转记录到一个新文件;
  • audit-log-format:日志记录的格式,比如json等;

2.2.2 审计日志采集

对于将日志保存到文件中,默认是无法采集到日志信息,实际环境中可以采用sidecar或者其他三方代理的形式比如fluentd,这儿呢为了做下简单测试直接使用了卷挂载的形式(将pod容器中文件映射到本地),即在kube-apiserver添加如下配置:

...
    VolumeMounts:
    - mountPath: /var/log
      name: audit-log
  volumes:
  - hostPath:
      path: /var/log/kubernetes
      type: DirectoryOrCreate
...

保存kube-apiserver配置则会自动重启apiserver,待重启完成后可通过手动删除、创建一个pod来观察审计日志的输出:

你可能感兴趣的:(Kubernetes审计日志功能)