1. 背景
从kubernetes 1.6版本开始支持审计功能,到1.12版本审计功能GA,而本文则是针对kubernetes 1.15+简单说明其审计功能的开启和配置。那何为审计功能呢,审计功能又有什么作用呢?
如下是摘自Kubernetes官方文档的一段话:
Kubernetes 审计功能提供了与安全相关的按时间顺序排列的记录集,记录单个用户、管理员或系统其他组件影响系统的活动顺序。 它能帮助集群管理员处理以下问题:
- 发生了什么?
- 什么时候发生的?
- 谁触发的?
- 为什么发生?
- 在哪观察到的?
- 它从哪触发的?
- 它将产生什么后果?
2. 审计功能开启
Kubernetes的审计功能是通过kube-apiserver开启,具体是主要设置kube-apiserver的两个启动参数audit-policy-file和audit-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来观察审计日志的输出:
