0×01. 前言
在誰動了我(wǒ)的主機? 之活用History命令|Linux安全運維一(yī)文中(zhōng),作者已經演示了如何将history 命令記錄發往本地Rsyslog,本文會介紹将Linux history 記錄發往遠程Rsyslog 服務器的2種方法。
0×01. 方法1,修改bash源碼,使其支持将history曆史記錄發往遠程Rsyslog 服務器
從bash4.1 版本開(kāi)始,bash開(kāi)始支持Rsyslog,所以我(wǒ)們需要下(xià)載bash4.1以後版本,這裏以bash4.4爲例
bash源碼下(xià)載地址: https://ftp.gnu.org/gnu/bash/
共計需要修改兩處源碼:
1) 先修改bashhist.c
從源碼文件名字也可以看出這個源碼文件和linux history記錄處理有關
748 #if defined (SYSLOG_HISTORY)
749 #define SYSLOG_MAXLEN 600
750
751 extern char *shell_name;
752
753 #ifndef OPENLOG_OPTS
754 #define OPENLOG_OPTS 0
755 #endif
756
757 void
758 bash_syslog_history (line)
759 const char *line;
760 {
761 char trunc[SYSLOG_MAXLEN];
762 static int first = 1;
763
764 if (first)
765 {
766 openlog (shell_name, OPENLOG_OPTS, SYSLOG_FACILITY);
767 first = 0;
768 }
769
770 if (strlen(line) 771 syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d UID=%d User=%s CMD=%s", getpid(), current_user.uid, current_user.user_name, line);
772 else
773 {
774 strncpy (trunc, line, SYSLOG_MAXLEN);
775 trunc[SYSLOG_MAXLEN - 1] = '\0';
776 syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY (TRUNCATED): PID=%d UID=%d User=%s CMD=%s", getpid(), current_user.uid, current_user.user_name, trunc);
777 }
778 }
779 #endif
需要修改771行和776行,修改内容,如上所示
其中(zhōng)PID表示當前執行linux命令的bash進程ID,使用函數getpid()獲取;UID表示執行命令用戶的ID,用current_user.uid 表示;User表示執行命令的用戶名,用 current_user.user_name表示;CMD表示執行的曆史命令内容。
2)再修改config-top.h
116 #define SYSLOG_HISTORY
117 #if defined (SYSLOG_HISTORY)
118 # define SYSLOG_FACILITY LOG_USER
119 # define SYSLOG_LEVEL LOG_INFO
120 # define OPENLOG_OPTS LOG_PID
121 #endif
122
将116行注釋去(qù)掉(2個#去(qù)掉一(yī)個就好),去(qù)掉之後,如上所示
這裏定義syslog的FACILITY爲 user (用戶級别的日志(zhì))
日志(zhì)級别爲info
3)編譯
./configure --prefix=/usr/local/bash && make && make install
4) 修改/etc/passwd 修改用戶的登錄shell (當然也可以直接替換原先的bash)
root:x:0:0:root:/root:/usr/local/bash/bin/bash
f3:x:1004:1004::/home/f3:/usr/local/bash/bin/bash
5)修改/etc/rsyslog.conf
user.info @@10.1.100.1
将FACILITY 爲user 且日志(zhì)級别爲info的信息發往 遠程rsyslog 服務器 10.1.100.1
最後重啓rsyslog
6) 收日志(zhì)
這裏遠程rsyslog 日志(zhì)選擇windows平台的visualsyslog,下(xià)載地址爲:https://github.com/MaxBelkov/visualsyslog/, 以下(xià)是收到的日志(zhì)截圖:
\
0×01. 方法2,不修改bash源碼,利用trap和logger命令将執行命令記錄發往遠程Rsyslog 服務器
1) vim /etc/profile
添加以下(xià)内容
function log2syslog
{
declare command
command=$BASH_COMMAND
logger -p local1.notice -t bash-$$ -i -n 10.1.100.1 -- $SSH_CONNECTION---$USER---$PWD---$command
}
trap log2syslog DEBUG
解釋一(yī)下(xià):
我(wǒ)們知(zhī)道用戶登錄之後shell 都會執行/etc/profile中(zhōng)的内容
在shell中(zhōng)每執行一(yī)次命令都是一(yī)個activity,trap log2syslog DEBUG 意爲對shell中(zhōng)的每一(yī)個activity都執行一(yī)遍log2syslog 函數
logger 是一(yī)個向syslog發送日志(zhì)的接口
$BASH_COMMAND 表示 最新執行的shell命令
$$ 表示當前shell的進程id
$SSH_CONNECTION 當前ssh連接的tcp socket 五元組信息
$USER 表示當前執行命令的用戶
$PWD 表示執行命令時所在目錄
這些信息之間用— 隔開(kāi)
-p 表示syslog的Facility
-t 表示tag
-n 表示遠程syslog 地址
2) vim /etc/rsyslog.conf
增加:
local1.* @@10.1.100.1
修改配置後,重啓rsyslog
3)截圖
\
4) 該方法的不足
因爲每記錄一(yī)條命令日志(zhì)到遠程syslog服務器都會産生(shēng)一(yī)個新的進程,如果命令activity 量很大(dà),則相比修改bash源碼方式而言比較消耗性能
如3)中(zhōng)截圖所示,Tag中(zhōng)每一(yī)個bash後面中(zhōng)括号都表示一(yī)個新的進程id, 你可自行對比修改bash源碼方式就沒有此類問題
上一(yī)篇:安全預警:VMware虛拟機逃逸利用工(gōng)具已在網上大(dà)規模流傳,用戶請盡快更新
下(xià)一(yī)篇:維基解密揭秘CIA五種惡意軟件用法