CKS之Kubernetes审计日志

目录

概述

审计事件阶段

审计日志级别

None

Metadata

Request

RequestResponse

审计日志的使用

步骤1:配置审计策略文件

步骤2:配置API Server

步骤3:配置日志存储

注意事项

审计策略与规则

审计日志样例

使用场景


概述

Kubernetes集群中,API Server的审计日志详细记录了用户、服务对集群资源的请求操作. 通过对API Server的审计,可以监控分析API流量,检测安全隐患.

具体来说,这些服务会访问API Server:

  • 管理节点:controller-manager、scheduler
  • 工作节点:kubelet、kube-proxy
  • 集群服务:CoreDNS、Calico、HPA等
  • 客户端工具:kubectl、API、Dashboard


审计事件阶段

当Client客户端向API Server发出请求时,会经历以下某些阶段

阶段说明
RequestReceived表示API Server接收到了请求。这是审计日志记录开始的点,所有的请求无论成功与否都会记录在此阶段
ResponseStarted表示API Server已经找到了请求对应的资源,并开始返回响应。这意味着请求已经被处理,并且开始生成响应。
ResponseComplete表示响应已被完全处理并发送给了请求者。不管请求处理成功还是失败,如果响应体已经生成,就会记录这个阶段。
Panic如果在处理请求的过程中发生了内部服务器错误,会记录这个阶段的日志。
请求流程图


审计日志级别

        在Kubernetes中,可以通过配置审计策略(Audit Policy)来指定对API Server的请求要记录哪些审计日志. 审计策略中包含一个有序的审计规则列表,每条规则通过level字段指定日志级别.

Kubernetes支持以下审计日志级别:

None

level: None表示不记录日志.适用于以下情况:

  • 不需要对某些资源操作审计,如密钥、configmap等
  • 避免Storage大小超支,排除不重要的审计
  • 减少日志存储和传输的性能开销

例如,下面的策略规则不记录对kube-systemkube-public名字空间的审计日志:

- level: None
  namespaces: ["kube-system", "kube-public"]

Metadata

level: Metadata表示只记录审计事件的元数据,不记录请求和响应的消息体.元数据包括:

  • 请求的用户、IP、用户组、资源、动词等
  • 请求的时间戳和审计ID
  • 响应的状态码

适用于以下情况:

  • 关注事件的关键信息,如谁在何时做了什么
  • 消息体可能包含敏感信息,如Secret、私钥
  • 消息体数据量很大,全量记录会占用很多存储

例如,下面的策略规则对匿名用户只记录Metadata级别的日志:

- level: Metadata
  userGroups: ["system:unauthenticated"]

Request

level: Request表示记录事件的元数据和请求消息体,但不记录响应消息体.适用于以下情况:

  • 需要审计请求的具体内容,如创建、更新的资源配置
  • 请求消息体相对较小,全量记录的开销可以接受
  • 响应消息体无需审计,或者数据量过大不宜全量记录

例如,下面的策略规则对认证用户记录Request级别的日志:

- level: Request
  userGroups: ["system:authenticated"]
  verbs: ["create", "update", "patch", "delete"]
  resources:
    - group: "" 
      resources: ["pods", "secrets", "configmaps"]

RequestResponse

level: RequestResponse表示记录事件的元数据、请求消息体、响应消息体,是最高的审计级别.适用于以下情况:

  • 事关安全或合规,需要完整记录请求和响应
  • 全量审计的性能和存储开销在预期之内
  • 调试或故障诊断时需要事后回放完整的API调用过程

例如,下面的策略规则对特权用户的所有写操作记录RequestResponse级别的日志:

- level: RequestResponse
  userGroups: ["manager", "admin"]  
  verbs: ["create", "update", "patch", "delete"]
  resources:
    - group: "*"
      resources: ["*"]


审计日志的使用

步骤1:配置审计策略文件

  1. 创建审计策略文件(例如:/etc/kubernetes/audit/audit-policy.yaml)。

  2. 在审计策略文件中定义审计规则,指定想要审计的资源和相应的日志级别。

    示例策略文件内容:

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
  resources:
  - group: ""
    resources: ["pods"]

步骤2:配置API Server

  1. 编辑API服务器的配置文件(例如:/etc/kubernetes/manifests/kube-apiserver.yaml)。

  2. 在配置文件中添加审计相关的参数,来指定审计策略文件和审计日志的路径。

    示例如下:

--audit-policy-file=/etc/kubernetes/audit/audit-policy.yaml
--audit-log-path=/var/log/k8s_audit.log
--audit-log-maxage=30
--audit-log-maxbackup=10
--audit-log-maxsize=100

步骤3:配置日志存储

  1. 确保审计日志文件(例如:/var/log/k8s_audit.log)能够被正确创建和存储。

  2. 在kube-apiserver的配置文件(例如:/etc/kubernetes/manifests/kube-apiserver.yaml)中设置volumeMounts,将审计策略文件和审计日志文件的存储路径挂载到API服务器的容器内。

    示例如下:

    volumeMounts:
    - mountPath: /etc/kubernetes/audit/audit-policy.yaml
      name: audit
    - mountPath: /var/log/k8s_audit.log
      name: audit-log
    volumes:
    - name: audit
      hostPath:
        path: /etc/kubernetes/audit/audit-policy.yaml
        type: File
    - name: audit-log
      hostPath:
        path: /var/log/k8s_audit.log
        type: FileOrCreate

注意事项

  • 请确保API服务器可以访问审计策略文件和审计日志文件的路径。
  • 审计日志的大小和保留期限应根据集群的实际情况进行调整,避免过大的日志文件占用过多磁盘空间。
  • 对于使用HostPath方式挂载的文件和目录,需要确保它们在宿主机上存在并且权限正确


审计策略与规则

Kubernetes使用审计策略(Policy)来指定对API Server请求的审计规则,也就是上方/etc/kubernetes/audit/audit-policy.yaml的内容

审计策略中包含一个有序的审计规则(Rule)列表,从上到下逐一匹配请求,直到命中某条规则。如果有a、b两条规则都针对pod,从上至下先到a,则a规则生效

每条审计规则指定了:

  • 日志级别(Level): None(不记录)、Metadata(只记录metadata)、Request(记录请求)、RequestResponse(记录请求和响应)
  • 资源(Resources):对哪些资源的请求应用该规则,如pods、deployments
  • 动词(Verbs): 对资源的哪些操作应用该规则,如get、list、create、update、delete等
  • ...

示例审计策略如下:

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
  # 不记录对RequestReceived阶段的日志
  - level: None
    stage: RequestReceived

  # 不记录对kube-system和kube-public命名空间的请求日志
  - level: None
    namespaces: ["kube-system", "kube-public"] 

  # 不记录对/healthz*、/logs、/metrics请求路径的日志
  - level: None
    userGroups: ["system:authenticated"] 
    nonResourceURLs:
      - "/healthz*" 
      - "/logs"
      - "/metrics"

  # 对可信用户记录请求阶段的日志
  - level: Request
    userGroups: ["system:authenticated"]
    verbs: ["get", "list", "watch"]
    resources:
      - group: ""
        resources: ["*"]

  # 对不可信用户记录metadata阶段的日志
  - level: Metadata
    userGroups: ["system:unauthenticated"]

  # 默认记录metadata阶段的日志
  - level: Metadata
    omitStages:
      - RequestReceived


审计日志样例

        这个审计日志输出样例记录了一个创建部署(Deployment)的事件,其中包含了操作的基本元数据,比如请求的类型、用户信息、被操作的对象、时间戳等。

{
  "kind": "Event",                              // 事件类型
  "apiVersion": "audit.k8s.io/v1",              // 审计日志的API版本
  "level": "Metadata",                          // 审计级别
  "auditID": "4becec1a-0d3d-4304-904d-7c0695c3d938",  // 审计事件的唯一标识符
  "stage": "ResponseComplete",                  // 请求阶段,表示响应已完成
  "requestURI": "/apis/apps/v1/namespaces/default/deployments?fieldManager=kubectl-create",  // 请求的URI
  "verb": "create",                             // 请求动作
  "user": {                                     // 用户信息
    "username": "kubernetes-admin",             // 用户名
    "groups": [                                 // 用户所属的组
      "system:masters",
      "system:authenticated"
    ]
  },
  "sourceIPs": [                                // 发起请求的源IP地址
    "192.168.31.71"
  ],
  "userAgent": "kubectl/v1.21.0 (linux/amd64) kubernetes/cb303e6",  // 用户代理,客户端信息
  "objectRef": {                                // 关于被操作对象的引用
    "resource": "deployments",                  // 资源类型
    "namespace": "default",                     // 资源所在的命名空间
    "name": "web-demo",                         // 资源名称
    "apiGroup": "apps",                         // 资源所属的API组
    "apiVersion": "v1"                          // 资源的API版本
  },
  "responseStatus": {                           // 响应状态
    "metadata": {},                             
    "code": 201                                  // HTTP状态码
  },
  "requestReceivedTimestamp": "2021-11-08T16:16:53.551850Z",  // 请求接收的时间戳
  "stageTimestamp": "2021-11-08T16:16:53.569307Z",            // 请求阶段的时间戳
  "annotations": {                              // 注解信息
    "authorization.k8s.io/decision": "allow",   // 授权决策
    "authorization.k8s.io/reason": ""           // 授权原因
  }
}


使用场景

通过分析和监控审计日志,我们可以实现以下目标:

  • 事后审计(Audit): 对受到入侵、误操作造成故障时,可以通过审计日志复盘事故过程.
  • 实时告警(Alert): 对违反策略的行为实时告警,如用户访问未授权的资源.
  • 行为分析(Analysis): 分析用户、服务对资源的访问行为,挖掘使用规律和异常情况.
  • 合规检查(Compliance): 保存审计日志以满足法规合规性要求,如SOX法案.
  • 容量规划(Capacity): 通过审计日志分析资源使用情况,辅助容量评估和规划.
  • 异常检测(Anomaly): 建立API请求基线,侦测异常API调用,对可疑行为发出告警.
  • 溯源取证(Forensics): 充当事件的法律证据,帮助犯罪分析,损失评估等.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/499439.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一、JAVA集成海康SDK

JAVA集成海康SDK 文章目录 JAVA集成海康SDK前言一、项目依赖 jar1. examples.jar2. 项目依赖 jna.jar,可以通过 maven依赖到。二、集成SDK1.HcNetSdkUtil 海康 SDK封装类2.HCNetSDK3.Linux系统集成SDK三、总结前言 提示:首先去海康官网下载 https://open.hikvision.com/dow…

stable diffusion如何下载模型?

文件夹里面有14个模型,把这些模型复制到SD文件夹里 具体位置:SD文件>models>ControlNet

【C/C++】从零开始认识C++历程-启航篇

文章目录 📝前言🌠 什么是C?🌉C的发展史 🌠C的重要性🌉语言的使用广泛度 🌠在工作领域🌉 岗位需求 🌠相关笔试题🌉 公司怎样面试C 🚩总结 &#x…

蓝桥杯 - 小明的背包1(01背包)

解题思路: 本题属于01背包问题,使用动态规划 dp[ j ]表示容量为 j 的背包的最大价值 注意: 需要时刻提醒自己dp[ j ]代表的含义,不然容易晕头转向 注意越界问题,且 j 需要倒序遍历 如果正序遍历 dp[1] dp[1 - vo…

java的多态和final关键字

多态: 多态分为对象多态,行为多态 多态的前提: 有继承/实现关系;存在父类引用子类对象;存在方法重写; 注意:多态是对象,行为的多态,java的成员变量不谈多态 这是我写…

将Knife4j所展示请求参数和响应参数转化为TS类型声明

目标:在浏览器控制台输入js代码,将读取页面所展示的请求参数和响应参数,将他们转化为TS的类型声明,并在控制台中输出出来。 将Knife4j所展示请求参数和响应参数转化为TS类型声明 1 找到所需要的元素节点2 转化元素节点3 封装成函…

本地部署的stable diffusion 如何更新controlnet?

stable diffusion 未启动状态 点击“版本管理” 点击“扩展” 找到controlnet,点击右边的“更新”按钮 完成!

【软考---系统架构设计师】特殊的操作系统介绍

目录 一、嵌入式系统(EOS) (1)嵌入式系统的特点 (2)硬件抽象层 (3)嵌入式系统的开发设计 二、实时操作系统(RTOS) (1)实时性能…

总结TCP各类知识点

前言 本篇博客博主将详细地介绍TCP有关知识点,坐好板凳发车啦~ 一.TCP特点 1.有连接 TCP传输的过程中类似于打电话的各个过程 2.可靠传输 通过TCP自身的多种机制来保证可靠传输 3.面向字节流 内容是以字节的方式来进行发送与接收 4.缓冲区 TCP有接收缓冲区…

网络安全接入认证-802.1X接入说明

介绍 802.1X是一个网络访问控制协议,它可以通过认证和授权来控制网络访问。它的基本原理是在网络交换机和认证服务器之间建立一个安全的通道,并要求客户端提供身份验证凭据。如果客户端提供的凭据是有效的,交换机将开启端口并允许访问。否则&…

服务器被挖矿了怎么办,实战清退

当我们发现服务器资源大量被占用的时候,疑似中招了怎么办 第一时间重启服务是不行的,这些挖矿木马一定是会伴随着你的重启而自动重启,一定时间内重新霸占你的服务器资源 第一步检查高占用进程 top -c ps -ef 要注意这里%CPU,如果…

1.8.1 摄像机

一、摄像机 OpenGL本身没有摄像机的概念,但是我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。 本节将会讨论如何在OpenGL中配置一个摄像机,让你能够在3D场景中…

Web APIs

文章目录 Web APIs1. DOM1.1 介绍DOM 树DOM 节点document 1.2 获取DOM对象1.3 操作元素内容1.4 操作元素属性常用属性修改控制样式属性操作表单元素属性自定义属性 1.5 间歇函数1.6 事件事件监听事件类型事件处理程序 1.7 事件类型鼠标事件键盘事件焦点事件文本框输入事件 1.8 …

【JavaScript】数组 ③ ( JavaScript 数组长度 | 修改数组长度 | 数组案例 )

文章目录 一、JavaScript 数组长度1、数组长度2、修改数组长度 二、数组案例1、求数组元素平均值2、求数组元素最大值 一、JavaScript 数组长度 1、数组长度 在 JavaScript 中 , 数组长度 可以通过 数组变量的 length 属性 获取 , 该属性 返回 数组中的元素数量 , 也就是 数组长…

【Java】ArrayList数组的扩容机制 jdk1.8

📝个人主页:哈__ 期待您的关注 ArrayList和普通数组不同,ArrayList支持动态扩容,那么ArrayList到底是如何扩容的呢?你又是否知道ArrayList数组的初始长度是多少呢? 在开始介绍之前,我们要先介…

【IDEA+通义灵码插件】实现属于你的大模型编程助手

1、前言 大模型到底该以一种什么方式落地,从而嵌入我们的工作当中,助力我们工作效率的提升,其实最好的方式也许就是虚拟助手的方式,就像钢铁侠的"贾维斯"一样,随叫随到能回答问题,能自动的解决一…

python函数参数中独立星号*的作用

python函数中间有一个()分隔,星号后面为*命名关键字参数,星号本身不是参数**。命名关键字参数,在函数调用时必须带参数名字进行调用。如下例子:

【Golang入门教程】Go语言变量的初始化

文章目录 强烈推荐引言举例多个变量同时赋值总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能 推荐一个个人工作,日常中比较常…

深入剖析哈希表:以Java中的HashMap为例

哈希表是一种非常高效的数据结构,它允许我们以接近常数的时间复杂度进行插入、删除和查找操作。在Java中,HashMap类是实现哈希表的一个非常流行的工具。本文将深入探讨哈希表的工作原理,并通过Java代码来展示HashMap的使用和内部机制。 一、…

Linux 动静态库的制作,使用和加载

Linux 动静态库的制作,使用和加载 一.前置说明1.mylib.h2.mylib.c3.mymath.h mymath.c4.如何制作库 二.动静态库的制作1.静态库的制作1.制作2.使用一下静态库,验证是否成功打包 2.动态库的制作1.编译.c源文件文件生成.o目标文件2.打包生成动态库3.编写makefile文件,自动化制作动…