Rsyslog服务日志审计留存
时间:2022-07-28
本文章向大家介绍Rsyslog服务日志审计留存,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
[TOC]
0x00 前言
Linux的rsyslog日志服务器配置:
vi /etc/rsyslog.conf
#将其中下面四行的注释取消
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
#### GLOBAL DIRECTIVES ####中加入如下内容:
$template IpTemplate,"/var/log/%FROMHOST-IP%.log"
*.* ?IpTemplate
& ~
#说明:实现在接收远程的日志为客户端IP地址命名。
#重新启动rsyslogd服务
service rsyslog restart
Linux的rsyslog日志客户端配置:
#vi /etc/rsyslog.conf
local1.debug @@192.168.0.66
#然后重新启动rsyslogd服务
service rsyslog restart
0x01 实际案例
Linux安全运维历史命令记录发往Rsyslog服务器
描述:将history 命令记录发往Rsyslog服务器,即将Linux history 记录发往本地/远程Rsyslog 服务器的2种方法。
syslog日志收集:
- windows: visualsyslog
方法1:
描述:从bash4.1 版本开始支持Rsyslog,所以我们需要下载bash4.1以后版本修改bash源码支持syslog记录,首先下载bash源码可以从gnu.org下载,并且系统需要安装gcc等编译环境;
1.修改两处源码:
- bashhist.c :
#bash_syslog_history 函数里面
void bash_syslog_history (line)
if (strlen(line) < SYSLOG_MAXLEN) {
syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d UID=%d USER=%s CMD=%s", getpid(), current_user.uid, current_user.user_name,line);
}else{
strncpy (trunc, line, SYSLOG_MAXLEN);
trunc[SYSLOG_MAXLEN - 1] = ' ';
syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY (TRUNCATED): PID=%d UID=%d USER=%s CMD=%s", getpid(), current_user.uid, current_user.user_name,trunc);
}
#效果
HISTORY (TRUNCATED): PPID=%d PID=%d SID=%d UID=%d User=%s %s", getppid(), getpid(), getsid(getpid()), current_user.uid, current_user.user_name, trunc
- config-top.h : 设置开启syslog日志
# 里定义syslog的FACILITY为 user (用户级别的日志)级别为info
#define SYSLOG_HISTORY
#if defined (SYSLOG_HISTORY)
# define SYSLOG_FACILITY LOG_USER
# define SYSLOG_LEVEL LOG_INFO
# define OPENLOG_OPTS LOG_PID
#endif
#if defined (SYSLOG_HISTORY)
#define SYSLOG_SHOPT 1
#endif
2.编译与修改/etc/passwd 修改用户的登录shell (当然也可以直接替换原先的bash)
./configure --prefix=/usr/local/bash && make && make install
#修改用户的默认bash
root:x:0:0:root:/root:/usr/local/bash/bin/bash
f3:x:1004:1004::/home/f3:/usr/local/bash/bin/bash
#建立软连接
$ln -s /usr/local/bash/bin/bash /usr/bin/bash
3.修改/etc/rsyslog.conf最后重启rsyslog
#将FACILITY为user且日志级别为info的信息发往 远程rsyslog 服务器 10.1.100.1
user.info @@10.1.100.1
备注:
- 此方法可以将其它shell类型禁用,并将bash软件软连接到/bin/sh中
方法2:
描述:不修改bash源码,利用trap和logger命令将执行命令记录发往远程Rsyslog 服务器
1.编辑/etc/profile文件:
# cat >> /etc/profile
function log2syslog(){
#过滤PS命令执行(每次执行都有) 或者采用 PROMPT_COMMAND 系统变量代替下面
if [ 'printf " 33]0;%[email protected]%s:%s 07" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' != "$BASH_COMMAND" ];then
logger -p user.notice -t bash-$$ -i -n 192.168.1.88 -- "${SSH_CONNECTION} - ${USER} - ${PWD} - ${BASH_COMMAND}"
fi
}
trap log2syslog DEBUG
#函数解释一下:
我们知道用户登录之后shell 都会执行/etc/profile中的内容在shell中每执行一次命令都是一个activity,`trap log2syslog DEBUG`意为对shell中的每一个activity都执行一遍log2syslog 函数
logger 是一个向syslog发送日志的接口:-p 表示syslog的Facility -t 表示tag -n 表示远程syslog 地址 # 信息之间用— 隔开
$BASH_COMMAND 表示 最新执行的shell命令
$$ 表示当前shell的进程id
$SSH_CONNECTION 当前ssh连接的tcp socket 五元组信息
$USER 表示当前执行命令的用户
$PWD 表示执行命令时所在目录
2.vim /etc/rsyslog.conf
增加修改配置后user.* @@192.168.1.88
,重启rsyslog service rsyslog restart
#log日志服务器
user.* @@192.168.1.88:514
Aug 2 13:42:35 10.10.107.222 master local1 notice bash-12610[12650] 192.168.1.88 52965 10.10.107.222 22 - root - /root - grep --color=auto "12610"
注意事项:
- logger方法的不足:每记录一条命令日志到远程syslog服务器都会产生一个新的进程,如果命令activity 量很大则相比修改bash源码方式而言比较消耗性能
- 【自然框架】——页面基类与设计模式(二) 模板模式
- HLS Lesson17-数组优化:数组映射和重组
- HLS Lesson16-数组优化:数组分割
- HLS Lesson15-for循环优化:其他方法
- 对自己的上网搜索记录进行爬虫是怎样一种体验
- HLS Lesson13-for循环优化:合并
- HLS Lesson12-for循环优化:基本性能指标
- HLS Lesson11-c/c++ testbench书写续2
- 【机器学习】实例详解机器学习如何解决问题
- 企业网站架构之Nginx+tomcat+memcached集群
- 企业级Docker Registry开源工具Harbor的介绍以及使用指南
- HLS Lesson8-基本操作
- Windows渗透测试工具:RedSnarf
- HLS Lesson7-复合数据类型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【动手学深度学习笔记】之读取和存储
- 据说这才是看热搜的正确方法?
- Ubuntu18.04安装Anaconda3和VSCode指南
- 微信小程序里如何使用npm?小程序集成友盟举例
- 听说你的表情包不够用了?
- 【Python】Python爬虫爬取中国天气网(二)
- C#和sql连接实例
- 【Python】五分钟画一条动态心形曲线~
- 三步修改jupyter notebook主题和页面宽度
- “为了看星星,我自己做了一个行星观测器”
- Java生成报表数据图片
- 【动手学深度学习笔记】之二维卷积层
- Gitee+VuePress搭建个人博客
- 【Python】使用Pygame做一个Flappy bird小游戏(四)
- Github妙用