[TOC]
0x00 前言 Linux的rsyslog日志服务器配置:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 vi /etc/rsyslog.conf $ModLoad imudp$UDPServerRun 514$ModLoad imtcp$InputTCPServerRun 514$template IpTemplate,"/var/log/%FROMHOST-IP%.log" *.* ?IpTemplate & ~ service rsyslog restart
Linux的rsyslog日志客户端配置:1 2 3 4 5 local1.debug @@192.168.0.66 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 : 这个源码文件和linux history记录处理有关1 2 3 4 5 6 7 8 9 10 11 12 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] = '\0' ; 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日志1 2 3 4 5 6 7 8 9 10 11 # 里定义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)1 2 3 4 5 6 7 8 ./configure --prefix=/usr/local /bash && make && make install 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
备注:
此方法可以将其它shell类型禁用,并将bash软件软连接到/bin/sh中
方法2: 描述:不修改bash源码,利用trap和logger命令将执行命令记录发往远程Rsyslog 服务器
1.编辑/etc/profile文件:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function log2syslog (){ if [ 'printf "\033]0;%s@%s:%s\007" "${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
1 2 3 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源码方式而言比较消耗性能