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日志收集:

方法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:%s07" "${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源码方式而言比较消耗性能