Linux使用snoopy记录命令执行日志_/usr/local/lib64/snoopy.so-程序员宅基地

技术标签: execve  Linux  snoopy  preload  记录用户命令  

注:本文基于CentOS 6.5编写

1、关于snoopy

snoopy是一个开源的轻量级lib库, 可以记录系统中所有执行过的命令和参数。它是以预加载(preload)的方式实现历史命令的记录。 通过封装execv()和execve()系统调用,在发生这两个系统调用的时候记录下所需要的信息。

2、安装

在CentOS 6.5系统上可以直接通过yum方式安装,如果没有对应的rpm包也可以直接用源码安装。以下以yum安装方式为例。

yum install -y snoopy

安装完成后查看下组件列表:

[root@CentOS-6-5 /home]# rpm -ql snoopy
/lib64/snoopy.so
/usr/share/doc/snoopy-1.7.10
/usr/share/doc/snoopy-1.7.10/COPYING
/usr/share/doc/snoopy-1.7.10/ChangeLog
/usr/share/doc/snoopy-1.7.10/README
/usr/share/doc/snoopy-1.7.10/README.Fedora
[root@CentOS-6-5 /home]# 

可见就一个.so文件,其他都是文档。

3、配置

在/etc/ld.so.preload文件中添加以下配置,指定snoopy.so库文件所在位置。

[root@CentOS-6-5 /]# cat /etc/ld.so.preload 
/lib64/snoopy.so

由于linux的动态链接机制可以让程序在运行时加载或预处理需要的动态库文件(使用 --static静态选项编译的程序除外),因此后续执行命令时就会加载snoopy.so这个库文件,从而达到记录命令及参数的目的。

4、执行效果

我们可以通过strace看下df -h命令的执行过程。

[root@CentOS-6-5 /home]# strace df -h
...
access("/etc/ld.so.preload", R_OK)      = 0
open("/etc/ld.so.preload", O_RDONLY)    = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=17, ...}) = 0
mmap(NULL, 17, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3, 0) = 0x7fc84144a000
close(3)                                = 0
open("/lib64/snoopy.so", O_RDONLY)      = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\10\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=5952, ...}) = 0
mmap(NULL, 2101216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc841249000
mprotect(0x7fc84124a000, 2093056, PROT_NONE) = 0
mmap(0x7fc841449000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7fc841449000
close(3)                                = 0
munmap(0x7fc84144a000, 17)              = 0
...
open("/etc/mtab", O_RDONLY)             = 3
...      

从上面打印可以看到,df -h命令执行过程会先读取/etc/ld.so.preload的内容,并加载snoopy.so库文件,然后才去执行df -h命令。

对应的日志会记录在/var/log/secure文件中,

Dec 18 01:34:17 CentOS-6-5 snoopy[14034]: [uid:0 sid:11304 tty:/dev/pts/0 cwd:/home filename:/bin/df]: df -h

5、记录ssh远程执行命令

通过snoopy也可以记录ssh远程执行的命令,以远程执行pwd为例,在日志中会有以下记录,

Dec 18 01:47:26 CentOS-6-5 snoopy[14290]: [uid:0 sid:14290 tty: cwd:/ filename:/usr/sbin/sshd]: /usr/sbin/sshd -R 
Dec 18 01:47:26 CentOS-6-5 snoopy[14292]: [uid:0 sid:14292 tty: cwd:/root filename:/bin/bash]: bash -c pwd 

可见,记录的时候分为两部分,一部分是调用/usr/sbin/sshd,之后才是调用/bin/bash执行pwd命令。

6、查看命令是否能被snoopy记录

我们可以通过查看某个命令的链接库中是否包含snoopy来判断,以pwd为例,

[root@CentOS-6-5 /home]# ldd /bin/pwd
	linux-vdso.so.1 =>  (0x00007fff1e753000)
	/lib64/snoopy.so (0x00007f985bdd3000)
	libc.so.6 => /lib64/libc.so.6 (0x00000030b4400000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00000030b4000000)
	/lib64/ld-linux-x86-64.so.2 (0x00000030b3c00000)

通过ldd查看pwd命令链接的动态库,可见,该命令可被snoopy记录。

7、注意事项

A、snoopy相比于history+shell的方式,可以对ssh远程执行命令进行记录。但是由于动态库的限制,对于静态编译的应用则无法记录。

B、对于已经将动态库加载到内存并运行的程序,snoopy也无法生效,除非重启服务。

C、由于是封装execve()类函数,因此snoopy记录的粒度更为细致,比如执行一个脚本,snoopy的记录方式会记录脚本里执行的具体命令,而采用history+shell的方式则只会记录执行脚本这个动作,无法感知脚本具体内容。这一点有好有坏,就看具体场景了。

D、通过封装execve()类函数方式也就决定这种方式拉长了命令的时间,对性能肯定有一定影响。

E、snoopy的方式也很容易通过LD_PRELOAD环境变量绕过记录。

F、新版本2.x.x的snoopy可以设置一些过滤项来避免产生大量日志,也可以配置日志格式,可到github上了解:https://github.com/a2o/snoopy/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010039418/article/details/85068712

智能推荐

python中format函数用法简书_Python str.format() 使用-程序员宅基地

文章浏览阅读123次。1. Basic usage>>> print('{} {}'.format('hello','world'))hello world>>> print('{1} {1} and {0}'.format('hello','world'))world world and hello>>> print('{a} {tom} {a}'.format(tom='hello',a='world')) #可..._str.format()函数取位数

app.use和app.get,app.post区别_app.use 和 app.get-程序员宅基地

文章浏览阅读1.2k次。express中,express的实例app:app.use(path,callback)中的callback既可以是router对象又可以是函数app.get(path,callback)中的callback只能是函数给app.get(app.post、app.put同理)赋个路由对象是不行的,其实,可以将app.get()看作app.use的特定请求(get)的简要写法var express = require('express');var app = express();app_app.use 和 app.get

2-2 MongoDB 之聚合函数查询统计-educoder上面的习题笔记_mongodb里显示第2-3个文档信息-程序员宅基地

文章浏览阅读2.3k次。目录第一关:3-1-1聚合管道操作符将文档定制第二关:3-1-2 聚合管道操作符将文档第三关:3-1-3聚合表达式对文档数据进行统计多管道练习题:MapReduce查询:_mongodb里显示第2-3个文档信息

socket编程入门篇(四)_write(sockfd)-程序员宅基地

文章浏览阅读174次。本篇博客介绍如何用select函数实现并发服务器。下面贴代码:服务端代码#include <stdio.h> #include <unistd.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/socket.h>..._write(sockfd)

实现倾斜文字水印背景-程序员宅基地

文章浏览阅读1.4k次。  早上群里有人问:斜体文字水印背景,文字不确定的怎么做。刚好前段时间做过,特此分享下并记录。  其主要原理是利用UIColor类的一个方法:把图片变成颜色。[[UIColor alloc] initWithPatternImage:xxxxx];该方法会把图片平铺变成一个颜色实体。  代码产生一张倾斜文字图片:- (UIImage *)imageWithText:..._html倾斜文字的背景水印

Matlab 2020a 调用usb3.0摄像头实例_matlab 调用usb 3.0相机-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏15次。## Matlab 2020a 调用usb3.0摄像头实例相机为大大恒水星,型号为(MER-301-125U3C-L)调用摄像头之前,先在命令行输入代码imaqhwinfo看电脑自身是否已下载该格式的相机此次实验中需要下载的是dcam类的camera,而需要下载的其他硬件支持包已经在前一个博客中提到,请自行查阅。Matlab调用摄像头实例如果没有dcam类camera,先去matlab的附加资源管理器中下载硬件支持包(Image Acquisition Toolbox Support Pack_matlab 调用usb 3.0相机

随便推点

tomcat关闭时报Catalina.stop: java.net.ConnectException: 拒绝连接 (Connection refused)的错误-程序员宅基地

文章浏览阅读3.6w次。tomcat修改server.xml的端口为80后启动,无法正常访问tomcat页面的页面,修改回来用8080端口依旧无法正常打开,关闭tomcat后报Catalina.stop: java.net.ConnectException: 拒绝连接 (Connection refused)的错误,首先查看是否80端口被占用了。# lsof -i :8080或者# netstat -an..._java.net.connectexception: 拒绝连接

adaboost算法以及sklearn实现_sklearn adaboost-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏12次。Adaboost分类器非集成的机器学习算法就像古代皇帝一样,一个人说了算;集成学习算法类似于现在的国会,需要听取在会所有人的意见。Adaboost是一个集成学习算法,下面将会对算法进行拆解,以使我们明白Adaboost的内部原理。Adboost算法核心内容可以划分为两个问题:(1)如何构建弱分类器;(2)如何组合这些弱分类器。其中(1)又可以细化为:1)使用哪种模型作为..._sklearn adaboost

android数据库加密之—sqlcipher,作为Android程序员都应掌握-程序员宅基地

文章浏览阅读438次。实现增删改查方法package com.ddv.www.sqlcipher.dbhelper;import android.content.ContentValues;import android.content.Context;import android.util.Log;import net.sqlcipher.Cursor;import net.sqlcipher.SQLException;import net.sqlcipher.database.SQLiteDatabase;.

K-d tree-程序员宅基地

文章浏览阅读263次。在计算机科学中,k-d树(k-dimensional的缩写)是一种空间划分数据结构,用于组织k维空间中的点。k-d树是几种应用程序的有用数据结构,例如涉及多维搜索关键字的搜索(例如范围搜索和最近邻居搜索)。k-d树是二进制空间划分树的一种特殊情况。...

linux 自动化运维工具ansible的使用详细教程_# ansible -i linuxhosts default -m ping-程序员宅基地

文章浏览阅读4.6k次。一、ansible简介1.ansibleansible是新出现的自动化运维工具,基于Python研发。糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端。ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件。主要包括:(1)、连接插件connect..._# ansible -i linuxhosts default -m ping

一文搞懂选举人算法(Raft算法)-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏9次。原文链接:http://www.cnblogs.com/xybaby/p/10124083.htmlraft是工程上使用较为广泛的强一致性、去中心化、高可用的分布式协议。在这里强调了是在工程上,因为在学术理论界,最耀眼的还是大名鼎鼎的Paxos。但Paxos是:少数真正理解的人觉得简单,尚未理解的人觉得很难,大多数人都是一知半解。本人也花了很多时间、看了很多材料也没有真正理解。直到看到r..._选举人算法

推荐文章

热门文章

相关标签