kubernetes 审计与日志 详解

news2024/11/16 13:53:45

开头语

写在前面:如有问题,以你为准,

目前24年应届生,各位大佬轻喷,部分资料与图片来自网络

内容较长,页面右上角目录方便跳转

基本

介绍

在Kubernetes集群中,API Server的审计日志记录了哪些用户、哪些服务请求操作集群资源,并且可以编写不同规则 控制忽略、存储的操作日志。

审计日志采用SON格式输出,每条日志都包含丰富的元数据,例如请求的URL、HTTP方法、客户端来源等,你可以使 用监控服务来分析API流量,以检测趋势或河能存在的安全隐患。

这些可能服务会访问API Server:

  1. 管理节点(controller--manager、.scheduler)
  2. 工作节点(kubelet、.kube-proxy)
  3. 集群服务(CoreDNS、Calico、HPA等)
  4. kubectl、.APl、Dashboard

事件 阶段

yaml 解析

https://kubernetes.io/zh-cn/docs/tasks/debug/debug-cluster/audit/

audit-policy

修改配置后是需要删除apiserver容器,等待自动pod自动进行创建

apiVersion: audit.k8s.io/v1 # 这是必填项。

kind: Policy

# 不要在 RequestReceived 阶段为任何请求生成审计事件。

omitStages:

  - "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"]



  # 不要在日志中记录对名为 "controller-leader" 的 configmap 的请求。

  - level: None

    resources:

    - group: ""

      resources: ["configmaps"]

      resourceNames: ["controller-leader"]



  # 不要在日志中记录由 "system:kube-proxy" 发出的对端点或服务的监测请求。

  - level: None

    users: ["system:kube-proxy"]

    verbs: ["watch"]

    resources:

    - group: "" # core API 组

      resources: ["endpoints", "services"]



  # 不要在日志中记录对某些非资源 URL 路径的已认证请求。

  - level: None

    userGroups: ["system:authenticated"]

    nonResourceURLs:

    - "/api*" # 通配符匹配。

    - "/version"



  # 在日志中记录 kube-system 中 configmap 变更的请求消息体。

  - level: Request

    resources:

    - group: "" # core API 组

      resources: ["configmaps"]

    # 这个规则仅适用于 "kube-system" 名字空间中的资源。

    # 空字符串 "" 可用于选择非名字空间作用域的资源。

    namespaces: ["kube-system"]



  # 在日志中用 Metadata 级别记录所有其他名字空间中的 configmap 和 secret 变更。

  - level: Metadata

    resources:

    - group: "" # core API 组

      resources: ["secrets", "configmaps"]



  # 在日志中以 Request 级别记录所有其他 core 和 extensions 组中的资源操作。

  - level: Request

    resources:

    - group: "" # core API 组

    - group: "extensions" # 不应包括在内的组版本。



  # 一个抓取所有的规则,将在日志中以 Metadata 级别记录所有其他请求。

  - level: Metadata

    # 符合此规则的 watch 等长时间运行的请求将不会

    # 在 RequestReceived 阶段生成审计事件。

    omitStages:

      - "RequestReceived"

示例

除了命名空间 pod 资源相关操作,其他都不记录

apiVersion: audit.k8s.io/v1

kind: Policy

rules:

- level: Metadata

  # namespaces: ["default"] # 执行命名空间

  verbs: ["create","delete"] # 指定相关操作

  resources: # 执行资源

  - group: ""

    resources: ["pods"]

    # resourceNames: ["controller-leader"] 指定资源名

- level: None

[root@master audit]# ps -ef | grep apiserver

root      831053  831034  0 10:27 ?      

root     2791437 2791419 71 21:09 ?        00:00:08 kube-apiserver --advertise-address=

[root@master audit]# kill -9 2791437

[root@master audit]# kubectl get pod -A

[root@master ~]# kubectl delete  pod web1666

pod "web1666" deleted

[root@master audit]# tail -f /var/log/audit/k8s_audit.log

{

  "kind": "Event",

  "apiVersion": "audit.k8s.io/v1",

  "level": "Metadata",

  "auditID": "c52213b1-0bd6-4790-80ae-7c5aeb159ab9",

  "stage": "ResponseComplete",

  "requestURI": "/api/v1/namespaces/default/pods/web1666",

  "verb": "delete",

  "user": {

    "username": "system:node:node1",

    "groups": [

      "system:nodes",

      "system:authenticated"

    ]

  },

  "sourceIPs": [

    "192.168.100.51"

  ],

  "userAgent": "kubelet/v1.28.1 (linux/amd64) kubernetes/8dc49c4",

  "objectRef": {

    "resource": "pods",

    "namespace": "default",

    "name": "web1666",

    "apiVersion": "v1"

  },

  "responseStatus": {

    "metadata": {},

    "code": 200

  },

  "requestReceivedTimestamp": "2023-11-21T02:11:53.435596Z",

  "stageTimestamp": "2023-11-21T02:11:53.444542Z",

  "annotations": {

    "authorization.k8s.io/decision": "allow",

    "authorization.k8s.io/reason": ""

  }

}

审计日志

开启

审计日志支持写入本地文件和Vebhook (发送到外部HTTP API) 两种方式。

启用审计日志功能:

vi /etc/kubernetes/manifests/kube-apiserver.yaml

---audit-policy-file=/etc/kubernetes/audit/audit-policy.yaml

--audit-log-path=/var/log/audit/k8s_audit.log

---audit-log-maxage=30

---audit-log-maxbackup=10

---audit-log-maxsize=100

注:使用hostpath数据卷将宿主机/etc/kubernetes/,audit目录挂载到容器中

mkdir /etc/kubernetes/audit

touch /var/log/audit/k8s_audit.log

 apiserver.yaml 需要修改内容

      volumeMounts:

      - mountPath: /etc/kubernetes/audit

      name: audit

      readOnly: true

    - mountPath: /var/log/audit/k8s_audit.log

      name: audit-log-file



  volumes:           

  - hostPath:

      path: /etc/kubernetes/audit

      type: DirectoryOrCreate

    name: audit

  - hostPath:

      path: /var/log/audit/k8s_audit.log

      type: File

    name: audit-log-file

解析

yum -y install jq

日志内容

[root@master kubernetes]# tail -1 /var/log/audit/k8s_audit.log  | jq

{

  "kind": "Event",

  "apiVersion": "audit.k8s.io/v1",

  "level": "Metadata",

  "auditID": "95279099-833a-4a79-b942-9cd5da761cc6",

  "stage": "ResponseComplete", # 在那个阶段处理

  "requestURI": "/healthz",

  "verb": "get",

  "user": {

    "username": "system:serviceaccount:calico-system:calico-kube-controllers",

    "uid": "47d3e62f-edcf-4938-b988-ae0b14e40666",

    "groups": [

      "system:serviceaccounts",

      "system:serviceaccounts:calico-system",

      "system:authenticated"

    ],

    "extra": {

      "authentication.kubernetes.io/pod-name": [

        "calico-kube-controllers-6b7b9c649d-xllqh"

      ],

      "authentication.kubernetes.io/pod-uid": [

        "fbf6ee10-fd48-4e64-bd03-31995dedbe6a"

      ]

    }

  },

  "sourceIPs": [

    "10.244.219.105"

  ],

  "userAgent": "kube-controllers/v0.0.0 (linux/amd64) kubernetes/$Format",

  "responseStatus": {

    "metadata": {},

    "code": 200

  },

  "requestReceivedTimestamp": "2023-11-20T09:06:54.725743Z",

  "stageTimestamp": "2023-11-20T09:06:54.727333Z",

  "annotations": {

    "authorization.k8s.io/decision": "allow",

    "authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"system:public-info-viewer\" of ClusterRole \"system:public-info-viewer\" to Group \"system:authenticated\""

  }

}

内容解析

  1. 事件基本信息
    1. kind: 表示事件的类型,这里是 "Event"。
    2. apiVersion: 表示 Kubernetes 审计 API 的版本,这里是 "audit.k8s.io/v1"。
    3. level: 表示事件的级别,这里是 "Metadata"。
    4. auditID: 事件的唯一标识符。
    5. stage: 表示事件发生的阶段,这里是 "ResponseComplete",表示 API 请求的响应已经完成。
  2. 请求信息
    1. requestURI: 表示请求的 URI,这里是 "/healthz"。
    2. verb: 表示请求的动作,这里是 "get",表示是一个 GET 请求。
    3. user: 提供有关执行请求的用户的详细信息,包括用户名、UID、用户组等。
    4. sourceIPs: 表示请求的来源 IP 地址。
    5. userAgent: 表示发起请求的用户代理信息,这里是 "kube-controllers/v0.0.0 (linux/amd64) kubernetes/$Format"。
  3. 响应信息
    1. responseStatus: 提供有关响应的信息,包括响应代码和元数据。这里是一个成功的响应,HTTP 状态码为 200。
    2. 时间戳:
    3. requestReceivedTimestamp: 表示请求接收的时间戳。
    4. stageTimestamp: 表示事件阶段的时间戳。
  4. 注释信息
  5. annotations: 提供与事件相关的注释信息,这里包括授权决策的一些详细信息。
  6. authorization.k8s.io/decision: 授权决策,这里是 "allow",表示允许请求。
  7. authorization.k8s.io/reason: 授权决策的原因,这里是 "RBAC: allowed by ClusterRoleBinding...",表示通过 ClusterRoleBinding 的 RBAC 规则允许。

示例

[root@master ~]# docker run -d  --name web1666 nginx:1.17.1

[root@master kubernetes]# cat  /var/log/audit/k8s_audit.log  | grep web1666 | jq

日志收集与呈现方案

审计日志文件 + filebeat

审计日志文件 + ELK

审计webhook + logstash

审计webhook + falco

K8S 日志为什么以 stdout 和 stderr 的方式输出

文件描述符                     作用                                  例子(c语言)

0     (stdin)                 标准输入                           fscanf(stdin,"%s",str);

1     (stdout)               标准输出                           fprintf(stdout,"%s\n","hello");

2      (stderror)              标准错误输出                    fprintf(stderr,"%s\n","error");

1. 简单方便,可以直接使用语言自带的标准库,打印出信息(比如c语言的printf, fprintf函数)作为日志的输入源,不用额外的再建立一个文件。

2. 易管理,可以将容器的标准输出stdout, stderr重定向到log-file.log。 比如将上面的test.c文件编译后,执行  ./a.out >> a.log  2>&1,就会将标准输出存放到a.log里

nginx 导出日志到logs

使用 volumes 中的 emptyDir: {}

yaml 如图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

golang实现加密解密文档

golang实现加密解密文档 package mainimport ("bytes""crypto/aes""crypto/cipher""crypto/rand""encoding/base64""flag""fmt""io""io/ioutil" )func main() {encodePtr : flag.…

过去半年信竞基础学习总结

当Richard同学从去年7月份,开始从YY班学习C和信息学竞赛时,他对C还一无所知,但对计算机和编程的兴趣让他一直都乐在其中。在过去的半年中,通过参加各个平台的月赛,让他更加热爱编程,也让Richard更加了解自己…

linux项目部署(jdk,tomcat,mysql,nginx,redis)

打开虚拟机,与连接工具连接好,创建一个文件夹 cd /tools 把jdk,tomcat安装包放入这个文件夹里面 #解压 tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 编辑jdk文件以及测试jdk安装 第一行代码路径记得改成我…

服务器里面打开浏览器访问不了会是什么原因

我们在日常使用服务器的过程中,时常会有遇到各类情况,近日就有遇到用户联系到德迅云安全,反馈自己在服务器里面打不开浏览器,服务器里面没有网络无法访问的情况。那我们今天就来讲下服务器里面打不开网站可能是由哪些原因导致。 …

可充电助听器有哪些优势?

可充电助听器有哪些优势 01 无需频繁更换电池,对于手指不灵活、眼神不好的老年用户以及无法自行更换电池的儿童用户,使用更为方便。 02 可充电助听器的电池一般密封在助听器内部,机身的防水防尘性能更强。 03 部分充电盒具有快充、储电、…

GC5958Q—三相无刷直流电机速度控制芯片,应用在静音风扇马达上,可替代APX9358/茂达

GC5958Q提供无传感器三相无刷直流电机速度控制的所有电路。正弦波驱动器的方法将是更好的低噪声。该控制器的功能包括启动电路,反电动势换向控制,脉冲宽度调制(PWM)速度控制,锁定保护,和热关断电路。该GC5958Q是适用于游戏机和CPU…

一夜爆火,3天60亿,这泼天的富贵也轮到我们尔滨了

近日,哈尔滨这座北国之城突然成为全国瞩目的焦点,一夜之间,冰雪大世界、索菲亚大教堂、中央大街等老牌旅游景点在网络短视频和游客们的热切关注下,成为了这个冬季的新“顶流”。当地市民姚先生和胡先生异口同声表示:“…

服务发现Discovery

对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息 1、 修改cloud-provider-payment8001的controller import com.my.springcloud.utils.RestResponse; import com.my.springcloud.entities.Payment; import com.my.springcloud.service.PaymentSe…

关于外连接、内连接和子查询的使用(2)

目录 一. 前言 二. 使用外连接、内连接和子查询进行解答 三. 思维导图 一. 前言 在前面我们对外连接、内连接和子查询的使用有了一些了解,今天我们将继续更深入的进行学习。(这里缺少的八个题目在博主的前面博客有解答,大家可以移步前面一…

科技稳田心:地震频发,珈和科技领跑农险业务全流程

近日,日本能登半岛发生7.6级地震,13年以来首次触发“大海啸警报”。据估算,上一次的“3.11日本大地震”,导致了农林水产业损失约1200亿元。 自然灾害正严重影响着农业生产和可持续发展,提高农民抗风险能力&#xff0c…

知识图谱gds使用记录

安装 从下载站下载对应的包到plugin目录下,修改配置文件/etc/neo4j/neo4j.conf,末尾加入gds.*,重新启动 在浏览器输入CALL gds.list()命令进行测试 建立图映射 为了使用图算法,需要先将图数据库的内容映射为一个新图 如果是全…

国标GB28181视频监控EasyCVR平台:视频集中录制存储/云端录像功能及操作介绍

安防视频监控系统EasyCVR视频综合管理平台,采用了开放式的网络结构,可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,同时还具备权限管理、设…

微信预约小程序制作指南:从小白到专家

在当今的数字时代,微信小程序已经成为了一种非常流行的应用方式。预约功能更是成为了许多小程序的核心功能之一。如果你也想为你的小程序添加预约功能,以下步骤将会对你有所帮助。 一、进入乔拓云网后台 乔拓云网是一个在线小程序开发平台,你…

熟悉HDFS常用操作

1. 利用Hadoop提供的Shell命令完成下列任务 (1)向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件。 #检查文件是否存在./bin/hdfs dfs -test -e text.txt echo $? #结果是1 代表已存在 #根据结果判断出文件已存…

OpenHarmony自定义Launcher

前言 OpenHarmony源码版本:4.0release 开发板:DAYU / rk3568 DevEco Studio版本:4.0.0.600 自定义效果: 一、Launcher源码下载 Launcher源码地址:https://gitee.com/openharmony/applications_launcher 切换分支为OpenHarmony-4.0-Release,并下载源码 二、Launcher源…

[AutoSar]基础部分 RTE 08 runnable mapping

目录 关键词平台说明一、runnable mapping的必要性二、runnable mapping 通用规则三、Task type四、可以不用mapping的runnbale 关键词 嵌入式、C语言、autosar、runnable 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C,C编译器HighTec (…

动能芯片|DP1332E多协议高度集成非接触式读写芯片

DP1332E是一个高度集成的非接触读写芯片,它包含80C51微控制器内核,集成了13.56MHz下的各种主动/被动式非接触通信方法和协议。DP1332E有丰富的通讯接口和多协议集成优势,支持ISO/IEC18092,可以极大减少研发成本,高效、灵活的推动项…

铁威马使用小贴士,让NAS实现存储的旷野

结束2024年的第一个假期,我们忙着做年终总结,对来年许下希冀。 2023毋庸置疑是近年来过得较为丰富多彩的一年。 “看了好多场演唱会” “实现了一场说走就走的旅行” “蹦一场无拘无束的音乐节” “去见了很多很多好朋友” “去探索属于我人生的旷…

TS 36.213 V12.0.0-PUSCH相关过程(5)-UE PUSCH hopping过程

​本文的内容主要涉及TS 36.213,版本是C00,也就是V12.0.0。

国际版WPS Office18.6.0

​【应用名称】:WPS Office 【适用平台】:Android 【软件标签】:WPS 【应用版本】:18.5.4 → 18.6.0 【应用大小】:160MB 【软件说明】:WPS Office是使用人数最多的移动办公软件。它具有独有手机阅读…