[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

#### GLOBAL DIRECTIVES ####中加入如下内容:
$template IpTemplate,"/var/log/%FROMHOST-IP%.log"
*.* ?IpTemplate
& ~

#说明:实现在接收远程的日志为客户端IP地址命名。
#重新启动rsyslogd服务
service rsyslog restart

Linux的rsyslog日志客户端配置:

1
2
3
4
5
#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 : 这个源码文件和linux history记录处理有关
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #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] = '\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 

#修改用户的默认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

1
2
#将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文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# cat >> /etc/profile
function log2syslog(){
#过滤PS命令执行(每次执行都有) 或者采用 PROMPT_COMMAND 系统变量代替下面
if [ 'printf "\033]0;%[email protected]%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
#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源码方式而言比较消耗性能