audit日志重复保存

一、当前环境

Kylin Linux Advanced Server
release V10 (SP1) /(Tercel)-aarch64-Build04/20200711
Kylin Linux Advanced Server
release V10 (SP1) /(Tercel)-aarch64-Build20/20210518

二、问题描述

Centos: audit 服务启动状态下,只会 /var/log/audit/audit.log 会记录 audit的信息
Kylinos: 在 audit 服务启动状态下,会同时向 /var/log/messages 和 /var/log/audit/audit.log 会记录 audit的信息
openeuler 也存在同样的问题

三、分析

1.经过分析,内核的audit使用netlink与用户空间进行通信。
如下图所示
在这里插入图片描述
2.下载systemd 243的源码,可见对内核的audit的netlink进行了连接
在这里插入图片描述

3.下载对应版本的audit服务的源码,也可见对内核的audit的netlink进行了连接。
在这里插入图片描述

4.如下图所示,左边为Kylin V10 SP1 20200711,左边CentOS8,Kylin-V10(SP1)多了一个systemd-journald-audit.socket。

在这里插入图片描述

5.当删除/usr/lib/systemd/system/systemd-journald-audit.socket文件时,/var/log/message日志中便不再保存audit日志了。

6.经过分析,该问题为systemd的问题,systemd-journald.service会记录audit的日志,开启auditd服务之后,又会去记录audit日志,导致audit日志记录了双份。

7.经资料查找,下面补丁,可以解决这个问题。

From 7a650ee8d3faf79fd5ef866b69741880a3a42b8d Mon Sep 17 00:00:00 2001
From: Jan Synacek <jsynacek@redhat.com>
Date: Thu, 2 May 2019 14:11:54 +0200
Subject: [PATCH] journal: don't enable systemd-journald-audit.socket
 by default

Resolves: #1699287

---
 units/meson.build                 | 3 +--
 units/systemd-journald.service.in | 2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/units/meson.build b/units/meson.build
index 4eb09a3..ccea8a6 100644
--- a/units/meson.build
+++ b/units/meson.build
@@ -110,8 +110,7 @@ units = [
          'sysinit.target.wants/'],
         ['systemd-journal-gatewayd.socket',     'ENABLE_REMOTE HAVE_MICROHTTPD'],
         ['systemd-journal-remote.socket',       'ENABLE_REMOTE HAVE_MICROHTTPD'],
-        ['systemd-journald-audit.socket',       '',
-         'sockets.target.wants/'],
+        ['systemd-journald-audit.socket',       ''],
         ['systemd-journald-dev-log.socket',     '',
          'sockets.target.wants/'],
         ['systemd-journald.socket',             '',
diff --git a/units/systemd-journald.service.in b/units/systemd-journald.service.in
index 0cb1bfa..fa7348a 100644
--- a/units/systemd-journald.service.in
+++ b/units/systemd-journald.service.in
@@ -34,7 +34,7 @@ RestrictRealtime=yes
 RestrictSUIDSGID=yes
 RuntimeDirectory=systemd/journal
 RuntimeDirectoryPreserve=yes
-Sockets=systemd-journald.socket systemd-journald-dev-log.socket systemd-journald-audit.socket
+Sockets=systemd-journald.socket systemd-journald-dev-log.socket
 StandardOutput=null
 SystemCallArchitectures=native
 SystemCallErrorNumber=EPERM
-- 
2.23.0
<think>我们正在运行 Kubernetes 1.23.6 版本,需要配置审计日志策略来记录 PVC(PersistentVolumeClaim)的创建和删除操作。根据引用[1],Kubernetes审计功能可以记录集群中的操作序列,包括用户、应用程序和控制平面的活动。我们将通过修改kube-apiserver的配置来启用审计,并定义审计策略文件来捕获PVC的创建和删除事件。 ### 步骤概览 1. 创建审计策略文件,指定记录PVC的创建(create)和删除(delete)操作。 2. 修改kube-apiserver的静态Pod清单,添加审计相关的启动参数。 3. 确保所需的目录存在(参考引用[2]中提到的目录结构)。 4. 重启kube-apiserver以使配置生效。 ### 详细步骤 #### 1. 创建审计策略文件 在控制平面节点上(如master节点),创建审计策略文件,例如`/etc/kubernetes/audit-policy.yaml`。该文件将定义我们想要记录的PVC事件。 ```yaml apiVersion: audit.k8s.io/v1 kind: Policy rules: # 记录PVC的创建和删除操作 - level: Metadata verbs: ["create", "delete"] resources: - group: "" # 核心API组 resources: ["persistentvolumeclaims"] # 可选:忽略其他资源的日志,但注意:默认情况下,没有匹配规则的资源将不会被记录。 # 我们可以添加一条规则来忽略其他资源的日志,但这里我们只关注PVC,所以其他资源不记录。 # 注意:如果希望记录所有资源的元数据,可以添加一条规则:level: Metadata,但这样日志量会很大。 ``` #### 2. 修改kube-apiserver清单 kube-apiserver以静态Pod方式运行,其清单文件通常位于`/etc/kubernetes/manifests/kube-apiserver.yaml`。我们需要编辑这个文件,添加审计相关的参数和卷挂载。 在`spec.containers.command`部分添加以下参数: ```yaml - --audit-policy-file=/etc/kubernetes/audit-policy.yaml - --audit-log-path=/var/log/kubernetes/audit.log - --audit-log-maxsize=100 # 每个审计日志文件的最大大小(MB) - --audit-log-maxbackup=5 # 保留的旧日志文件的最大数量 ``` 同时,在`volumeMounts`和`volumes`中添加相应的挂载: 在`volumeMounts`中添加: ```yaml - mountPath: /etc/kubernetes/audit-policy.yaml name: audit-policy readOnly: true - mountPath: /var/log/kubernetes name: audit-log ``` 在`volumes`中添加: ```yaml - name: audit-policy hostPath: path: /etc/kubernetes/audit-policy.yaml type: File - name: audit-log hostPath: path: /var/log/kubernetes type: DirectoryOrCreate # 如果目录不存在则创建 ``` #### 3. 创建所需目录 根据引用[2],我们需要确保宿主机上存在相关目录。在控制平面节点上执行: ```bash # 配置文件目录(已存在则跳过) sudo mkdir -p /etc/kubernetes # 日志目录 sudo mkdir -p /var/log/kubernetes # 设置日志目录权限(确保apiserver可以写入) sudo chmod 700 /var/log/kubernetes ``` 将审计策略文件保存到`/etc/kubernetes/audit-policy.yaml`。 #### 4. 重启kube-apiserver 保存修改后的`kube-apiserver.yaml`文件,Kubernetes会自动重启kube-apiserver Pod。等待几分钟,然后检查日志是否开始记录。 ### 验证 检查审计日志文件是否生成: ```bash sudo tail -f /var/log/kubernetes/audit.log ``` 然后创建一个PVC并删除,观察日志中是否有相关事件。事件中会包含`verb`(create/delete)和`objectRef.resource`(persistentvolumeclaims)等信息。 ### 注意事项 - 审计日志可能会快速增长,需要定期清理或使用日志轮转工具。 - 在Kubernetes 1.23中,审计日志功能稳定,但请确保在测试环境中验证后再应用到生产环境。 - 如果集群有多个master节点,需要在每个master节点上重复上述步骤(因为每个节点运行自己的apiserver实例)。 ### 示例日志片段 创建PVC的日志可能如下: ```json { "kind": "Event", "apiVersion": "audit.k8s.io/v1", "level": "Metadata", "auditID": "c1d1a8c7-5e2e-4a8a-9a1f-0e3f2a5b6c7d", "stage": "ResponseComplete", "requestURI": "/api/v1/namespaces/default/persistentvolumeclaims", "verb": "create", "user": { "username": "admin", "groups": ["system:authenticated"] }, "sourceIPs": ["192.168.1.1"], "objectRef": { "resource": "persistentvolumeclaims", "namespace": "default", "name": "my-pvc", "apiVersion": "v1" }, "responseStatus": { "code": 201 }, "requestReceivedTimestamp": "2023-10-05T12:00:00.000000Z", "stageTimestamp": "2023-10-05T12:00:00.100000Z" } ``` 删除PVC的日志类似,但`verb`为`delete`。 ### 相关问题 1. 如何将Kubernetes审计日志发送到外部系统(如Elasticsearch)进行集中存储和分析? 2. 如何配置审计日志的保留策略和自动清理? 3. 除了PVC,如何审计其他资源(如Pod、Deployment)的操作?</think>### Kubernetes 1.23.6 配置审计日志记录 PVC 创建/删除操作 #### 📝 步骤 1:创建审计策略文件 在控制平面节点创建策略文件 `/etc/kubernetes/audit-policy.yaml`: ```yaml apiVersion: audit.k8s.io/v1 kind: Policy rules: # 记录 PVC 创建/删除操作 - level: Metadata verbs: ["create", "delete"] resources: - group: "" # 核心 API 组 resources: ["persistentvolumeclaims"] # 可选:记录 PVC 更新操作(如状态变更) - level: Request verbs: ["update"] resources: - group: "" resources: ["persistentvolumeclaims"] # 记录命名空间操作(PVC 依赖命名空间) - level: Metadata resources: - group: "" resources: ["namespaces"] ``` #### ⚙️ 步骤 2:修改 API 服务器配置 编辑 `/etc/kubernetes/manifests/kube-apiserver.yaml`,添加审计参数: ```yaml spec: containers: - command: - kube-apiserver # 审计配置参数 ▼ - --audit-policy-file=/etc/kubernetes/audit-policy.yaml - --audit-log-path=/var/log/kubernetes/audit.log - --audit-log-maxsize=100 # 单个日志文件最大 100MB - --audit-log-maxbackup=5 # 保留 5 个备份文件 # 卷挂载 ▼ volumeMounts: - mountPath: /etc/kubernetes/audit-policy.yaml name: audit-policy readOnly: true - mountPath: /var/log/kubernetes name: audit-log volumes: - name: audit-policy hostPath: path: /etc/kubernetes/audit-policy.yaml type: File - name: audit-log hostPath: path: /var/log/kubernetes type: DirectoryOrCreate # 自动创建目录[^2] ``` #### 📂 步骤 3:创建必要目录 ```bash # 创建配置和日志目录[^2] sudo mkdir -p /etc/kubernetes /var/log/kubernetes sudo chmod 700 /var/log/kubernetes # 安全权限设置 # 放置策略文件 sudo cp audit-policy.yaml /etc/kubernetes/ ``` #### 🔄 步骤 4:重启 API 服务器 ```bash # 删除 API 服务器 Pod 触发重建 sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/ sleep 10 sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/ ``` #### ✅ 验证配置 检查 PVC 操作是否被记录: ```bash # 创建测试 PVC kubectl create -f - <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-audit-pvc spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi EOF # 删除 PVC kubectl delete pvc test-audit-pvc # 检查审计日志 sudo tail /var/log/kubernetes/audit.log | grep persistentvolumeclaims ``` #### 🔍 典型 PVC 审计日志示例 ```json // PVC 创建记录 { "verb": "create", "objectRef": { "resource": "persistentvolumeclaims", "name": "test-audit-pvc", "apiVersion": "v1" }, "responseStatus": {"code": 201}, "user": {"username": "admin"}, "sourceIPs": ["192.168.1.5"] } // PVC 删除记录 { "verb": "delete", "objectRef": { "resource": "persistentvolumeclaims", "name": "test-audit-pvc" }, "responseStatus": {"code": 200}, "user": {"username": "admin"} } ``` #### ⚠️ 注意事项 1. 日志轮转:通过 `--audit-log-maxsize` 和 `--audit-log-maxbackup` 自动管理日志大小 2. 性能影响:生产环境建议仅记录必要操作(避免使用 `RequestResponse` 级别) 3. PVC 状态关联:删除 PVC 会导致关联 PV 进入 `Released` 状态[^1] 4. 多主节点:需在所有控制平面节点重复配置 > 📌 关键点:PVC 操作通过 `resources: ["persistentvolumeclaims"]` 捕获,命名空间操作有助于跟踪资源归属[^3] --- ### 🔎 相关问题 1. 如何将 Kubernetes 审计日志与 Elasticsearch 集成实现集中存储? 2. PVC 的 `Bound` 和 `Released` 状态变更在审计日志中如何体现? 3. 审计日志中的 `Request` 和 `RequestResponse` 级别有何具体区别? 4. 如何配置自动清理超过 30 天的旧审计日志
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值