谁是linux SIGKILL的凶手---linux审计日志排障的杀手锏

一、背景描述

在我们的技术生涯中,总会碰到那精彩的一瞬间,哪怕是一瞬间,曾经的熟悉php内核的同事和今天碰到的排障瞬间,都是我技术生涯中那精彩的一瞬间,写一篇日志记录一下。

今天碰到一个问题,就是采集器的agent 总是被另一个进程在5分钟之后杀掉

具体现象

# sudo strace -p 6574
strace: Process 6574 attached
restart_syscall(<... resuming interrupted read ...>

过了一会收到SIGKILL 信号

# sudo strace -p 6574
strace: Process 6574 attached
restart_syscall(<... resuming interrupted read ...>) = ?
+++ killed by SIGKILL +++

那么我们现在面临的问题是如何找到发送SIGKILL的真凶。我们知道linux 信号里和其他信号还不一样,比如说SIGTERM 是可捕获的,SIGKILL 是不可捕获的,当进程收到信号的时候进程会被操作系统强制杀掉,这也给我排障带来了很大的障碍。

二、谁是SIGKILL真凶的搜查之旅

1)初步使用strace 排障

当出现这个问题的时候我们使用strace 进行排障

具体命令如下

$ sudo strace -p 7000 -e trace=signal

具体排查效果

strace: Process 7000 attached
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=6672, si_uid=1000} ---
+++ killed by SIGTERM +++

 我们发现使用strace 可以很成功的捕获SIGTERM这一类的可捕获信号,但是当我们捕获SIGKILL的时候

$ sudo strace -p 7220 -e trace=signal
strace: Process 7220 attached
+++ killed by SIGKILL +++

发现SIGKILL被捕捉不了

总结:

使用strace 只可以捕获客捕捉的信号,当我们使用不可捕捉信号的时候strace 就已经回天乏术了

2)查看linux 内核相关日志查找SIGKILL信息

去 /var/log/messages 和 journalctl 也没查到相关日志

3)开启linux信号跟踪,找到发送信号的进程号

# 进入目录
cd /sys/kernel/debug/tracing/# 过滤SIGKILL
echo 'sig==9' > events/signal/signal_generate/filter # 开启过滤
echo '1' > events/signal/signal_generate/enable# 开启tracing_on
echo '1' > tracing_on

我们可以查看tracing 目录下面trace 查看是谁发起的SIGKILL的信号

# tracer: nop
#
# entries-in-buffer/entries-written: 1/1   #P:16
#
#                                _-----=> irqs-off/BH-disabled
#                               / _----=> need-resched
#                              | / _---=> hardirq/softirq
#                              || / _--=> preempt-depth
#                              ||| / _-=> migrate-disable
#                              |||| /     delay
#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
#              | |         |   |||||     |         |bash-6558    [008] d..1.  2476.431621: signal_generate: sig=9 errno=0 code=0 comm=sleep pid=8784 grp=1 res=0

我们发现是linux的6558 发出的SIGKILL 信号杀掉了8784。

但是重点来了,我们知道是6558调用 kill 命令发出SIGKILL信号,但是6558 是一个子进程,他被父进程使用后立马被回收了,我们如何定位到调用6558 的父进程呢?、

我想过使用BCC EBPF 去HOOK linux 内核的exec clone 一类的函数去追查真凶,但是用户的linux主机中并没有bcc,无法使用ebpf,这时候我较劲脑汁也无法查找出最后的根因,真的没办法了吗?

三、精彩的一瞬-----linux审计日志排障

当我不知所措的时候一个搞了20多年的内核程序员说,你为什么不打开审计日志呢?这精彩的一瞬在这一刻让我找到了问题的真凶。就像一局棋,这一笔就是画龙点睛的最后一步,他找到了最后的真凶。

我们可是梳理思路能不能从系统调用的execve 这一侧找到问题的根因呢?我们使用审计日志审查SIGKILL的发出者以及execve的使用者,双管齐下找到了最后的真凶。具体步骤如下:

1)提前安装审计日志程序

sudo apt install auditd

2)添加审计日志规则

定位ls 用了哪个系统调用

# strace ls
execve("/usr/bin/ls", ["ls"], 0x7ffcd8de3d10 /* 49 vars */) = 0
brk(NULL)                               = 0x55d7dade2000

我们使用进程的时候会调用execve,于是我们添加审计日志

vi /etc/audit/rules.d/audit.rules

-a exit,always -F arch=b64 -F a1=9 -S kill -k sigkill
-a exit,always -F arch=b32 -F a1=9 -S kill -k sigkill
-a exit,always -F arch=b64 -F a1=15 -S kill -k sigterm
-a exit,always -F arch=b32 -F a1=15 -S kill -k sigterm
-a exit,always -F arch=b64 -F a1=19 -S kill -k sigstop
-a exit,always -F arch=b32 -F a1=19 -S kill -k sigstop
-a always,exit -F arch=b64 -S execve -k exec
-a always,exit -F arch=b32 -S execve -k exec

-a exit,always:表示无论系统调用是否成功,都会记录事件。

-F arch=b32:指定CPU架构为32位系统。

-F a1=15:表示系统调用的第一个参数为15,即SIGTERM信号。

-S kill:表示监视kill系统调用。

-k sigterm:使用"sigterm"作为事件的键值。

修改完成规则后我们重启审计日志服务:

service auditd restart

3)查看审计日志

/var/log/audit/audit.log

我们用sleep 为例:

type=SYSCALL msg=audit(1704732268.057:196): arch=c000003e syscall=59 success=yes exit=0 a0=55e92bc5bc30 a1=55e92bc5f7c0 a2=55e92bc57110 a3=8 items=2 ppid=7356 pid=11663 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=2 comm="sleep" exe="/usr/bin/sleep" subj=unconfined key="exec"ARCH=x86_64 SYSCALL=execve AUID="zhanglei" UID="root" GID="root" EUID="root" SUID="root" FSUID="root" EGID="root" SGID="root" FSGID="root"

最后通过审计日志我们一步步找到了kill 调用的父进程,最终找到了使用Kill 发送 SIGKILL的真凶

四、总结

在没有ebpf 的情况下,我们可以使用strace 找到相关系统调用,然后进一步使用审计日志,找到问题出现的根源,从而解决问题。

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

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

相关文章

2022 年全国职业院校技能大赛高职组云计算赛项试卷

【赛程名称】云计算赛项第一场-私有云 某企业拟使用OpenStack 搭建一个企业云平台&#xff0c;以实现资源池化弹性管理、企业应用集中管理、统一安全认证和授权等管理。 系统架构如图 1 所示&#xff0c;IP 地址规划如表 1 所示。 图 1 系统架构图 表 1 IP 地址规划 设备…

docker 利用特权模式逃逸并拿下主机

docker 利用特权模式逃逸并拿下主机 在溯源反制过程中&#xff0c;会经常遇到一些有趣的玩法&#xff0c;这里给大家分享一种docker在特权模式下逃逸&#xff0c;并拿下主机权限的玩法。 前言 在一次溯源反制过程中&#xff0c;发现了一个主机&#xff0c;经过资产收集之后&…

[手写爬虫框架],从回忆Python到爬虫原理解析

手写爬虫框架&#xff0c;又名&#xff1a;手写爬虫框架的第1天 数据存储&#xff08;无数据库版&#xff09; HTML正文抽取多媒体文件抽取Email提醒 实战项目&#xff1a;基础爬虫 基础爬虫架构及运行流程URL管理器HTML下载器HTML解析器数据存储器爬虫调度器 从爬虫底层 —&…

网站开发第一弹---HTML01

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;网站开发flask框架 &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现…

基于pytorch的循环神经网络情感分析系统

任务目标 基于给定数据集&#xff0c;进行数据预处理&#xff0c;搭建以LSTM为基本单元的模型&#xff0c;以Adam优化器对模型进行训练&#xff0c;使用训练后的模型进行预测并计算预测分类的准确率。 数据简介 IMDB数据集是一个对电影评论标注为正向评论与负向评论的数据集…

Spring Boot Starter介绍和实战

引言 Spring Boot Starter 是 Spring Boot 提供的一种机制&#xff0c;用于简化和集成应用程序的依赖管理。通过创建自定义的 Starter&#xff0c;可以将一组相关的依赖打包成一个简单的、可重用的模块&#xff0c;使应用程序的配置和依赖管理更加方便。在本文中&#xff0c;我…

【AI视野·今日NLP 自然语言处理论文速览 第七十二期】Mon, 8 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 8 Jan 2024 Totally 17 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers DeepSeek LLM: Scaling Open-Source Language Models with Longtermism Authors DeepSeek AI Xiao Bi, Deli Ch…

深度卷积神经网络

目录 1.AlexNet 2. 代码实现 1.AlexNet (1)特征提取 (2)选择核函数来计算相关性&#xff1a;怎么判断在高维空间里面两个点是如何相关的&#xff0c;如果是线性模型就是做内积。 (3)凸优化问题 (4)漂亮的定理 丢弃法的作用就是因为模型太大了&#xff0c;使用它来对模型做…

python连接sqlite3工具类

简单使用python连接sqlite3工具类&#xff0c;代码可根据场景自行抽象 #!/usr/bin/env python # -*- coding: utf-8 -*-import sqlite3class SQLiteHandler:# 示例用法default_db_path "example.db"def __init__(self, db_fileNone):self.db_file db_file or self…

Spring面试整理-Spring的AOP

Spring的面向切面编程(AOP)是其核心功能之一,它允许开发者在不改变原有代码的情况下,增加额外的行为(如日志记录、事务管理、安全检查等)。AOP 通过定义"切面"(aspects)和"通知"(advice)来实现这一功能。 AOP概念 切面(Aspect):切面是模块化的…

TCP 和 UDP 的区别

TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种主要的传输层协议&#xff0c;它们在网络通信中有一些关键的区别&#xff1a; &#xff08;1&#xff09;http1 / http2 基于 tcp 协议&#xff0c;https …

XCODE IOS 静态链接库替换升级

XCODE 版本15.2. 一个很久需求没更新的IOS 应用&#xff0c;近来有新需求要开发。 拉下代码运行&#xff0c;出现了个BAD_ACCESS错误。出错的位置位于一个调用的第三方的.a静态库内部。因为调用代码并没有修改&#xff0c;很容易想到可能XCODE相关升级&#xff0c;导致的问题。…

无监督学习Principal Component Analysis(PCA)精简高维数据

目录 介绍 一、PCA之前 二、PCA之后 介绍 Principal Component Analysis (PCA) 是一种常用的数据降维和特征提取技术。PCA通过线性变换将高维数据映射到低维空间&#xff0c;从而得到数据的主要特征。PCA的目标是找到一个正交基的集合&#xff0c;使得将数据投影到这些基…

Android Studio 分别运行flutter 的debug和release版本

前言 由于在Android Studio 没找到运行release版本的入口,现在通过命令行运行 1.release版本 运行release版本的话直接执行下面命令3 flutter run --release相关命令统计 1.生成apk flutter build apk2.安装apk&#xff1a; flutter install3.运行release版本 flutter …

【期末不挂科-单片机考前速过系列P11】(第十一章:单片机的并行拓展例题)经典例题盘点(带图解析)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

初探UAF漏洞(3)

构造exp #include <iostream> #include <Windows.h>typedef void(*FunctionPointer) ();typedef struct _FAKE_USE_AFTER_FREE {FunctionPointer countinter;char bufffer[0x54]; }FAKE_USE_AFTER_FREE, * PUSE_AFTER_FREE;void ShellCode() {_asm{noppushadmov e…

github上的python图片转excel,pytesseract安装相关问题

问题1&#xff1a;明明都pip install pytesseract&#xff0c;但是就是安装不上 pytesseract 未安装链接: https://pan.baidu.com/s/1I4HzCgO4mITWTcZFkdil6g?pwdafes 提取码: afes 安装后一路next&#xff0c;然后配置环境变量 C:\Program Files\Tesseract-OCR新建一个系统…

第十九章 类的继承

文章目录 一、继承二、原型三、原型和实例关系的检测 一、继承 面向对象三大特点&#xff1a;封装&#xff0c;继承&#xff0c;多态 封装&#xff1a;打包继承&#xff1a;一个对象A不具有某个功能a&#xff0c;通过某种方式使用了对象B的a功能 的过程多态&#xff1a;对象或…

【SQL server】DML触发器监控数据库字段值改变

文章目录 前言DML触发器基本思路创建触发器固定字段触发示例完整示例代码变量声明查询新旧值插入数据到日志表效果视频动态字段触发示例完整代码示例触发器基本信息变量声明定义游标打开游标临时表创建循环处理字段

c++学习:容器stack栈+queue+map(简易输入法)+deque

目录 stack 模板原型 头文件 模板的成员类型和成员对象和成员函数 栈类模板的容器对象 实例 queue 模板原型 头文件 模板的成员类型和成员对象和成员函数 队列类模板的容器对象 实例 map 模板原型 头文件 模板的成员类型和成员对象和成员函数 关联类模板的容器…