前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Rsyslog服务日志审计留存

Rsyslog服务日志审计留存

作者头像
全栈工程师修炼指南
发布2020-10-23 16:53:15
1.4K0
发布2020-10-23 16:53:15
举报

[TOC]

0x00 前言

Linux的rsyslog日志服务器配置:

代码语言:javascript
复制
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日志客户端配置:

代码语言:javascript
复制
#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 :
代码语言:javascript
复制
#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日志
代码语言:javascript
复制
# 里定义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)

代码语言:javascript
复制
./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

代码语言:javascript
复制
#将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文件:

代码语言:javascript
复制
# 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

代码语言:javascript
复制
#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源码方式而言比较消耗性能
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 前言
  • 0x01 实际案例
  • Linux安全运维历史命令记录发往Rsyslog服务器
    • 方法1:
      • 方法2:
      相关产品与服务
      日志服务
      日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档