很多情況下我們需要記錄用戶執行過的命令,不管是root還是其他普通用戶,我們可以通過以下方式來記錄。
1.1、預備知識
-
1)PROMPT_COMMAND
這個環境變量中設定的內容將在交互式腳本的提示(PS1)出現之前被執行。也就意味著用戶登錄后每次執行命令前都會執行這個變量中給出的命令。 -
2)rsyslog
系統用來實現日志功能的,配置文件在/etc/rsyslog.conf
,格式日志設備(類型).(連接符號)日志級別 日志處理方式(action)
-
3)logrotate
Logrotate是基于CRON來運行的,其腳本是/etc/cron.daily/logrotate,日志輪轉是系統自動完成的。
實際運行時,Logrotate會調用配置文件/etc/logrotate.conf。
1.2、實戰演練
# 1. 修改rsyslog配置,local7下面添加如下行,注意用tab分割,不是空格
vim /etc/rsyslog.conf
local6.* /var/log/auditlog
# 2. 重啟rsyslog服務
systemctl restart rsyslog
# 3. 修改環境變量文件,文件末尾新增如下行
vim /etc/bashrc
readonly PROMPT_COMMAND='{ date "+%Y-%m-%d %T # $(who am i |awk "{print \$2,\$5}") $(whoami):[$PWD]# $(history 1 | { read x cmd; echo ${cmd}; })"; } | logger -p local6.info'
# 4. 新增logrotate配置audit日志的切割策略
vim /etc/logrotate.d/audit
/var/log/auditlog {
daily
compress
rotate 365
missingok
notifempty
dateext
}
1.3、工作原理
PROMPT_COMMAND會在命令執行前執行。
$(who am i |awk '{print \$2,\$5}')
會輸出登錄用戶用的tty和登錄服務器的遠程電腦IP或者主機名。
$PWD
是內建變量,顯示當前執行命令的工作目錄。
history 1 | { read x cmd; echo ${cmd};
會輸出最后一條歷史命令中的執行信息。
為了不讓用戶修改變量,使用declare -rx
命令定義了只讀環境變量。這里要注意使用readonly
命令也可以定義只讀變量,但是用戶用env命令看不到,只有用export PROMPT_COMMAND
命令將變量設置為環境變量后才能看到。
變量加到/etc/bashrc
是因為用戶登錄后會加載這里的配置,包括sudo
sudo su
sudo su -
su root
su - root
。如果加到其他文件里則部分命令后就不會加載變量,自行嘗試。
修改rsyslog是可以自定義日志輸出的文件路徑和名字,用logger -p
這個命令配合使用。
新增logrotate配置則是需要切割日志,防止單個日志文件太大,以及做好切割備份,方便查詢。
其他實現
【一】
declare -rx PROMPT_COMMAND='{ date "+%Y-%m-%d %T # $(who am i |awk "{print \$2,\$5}") $(whoami):[$PWD]# $(history 1 | { read x cmd; echo ${cmd}; })"; } | logger -t auditlog'
在/etc/profile
最后添加如下行,則日志會直接輸出到messages
日志里。
logger -t auditlog
-t tag 指定日志標簽,結果格式為
Jun 3 17:32:25 XXX auditlog: 日志信息
這種方式:不定義日志格式,直接將日志寫到messages日志文件里,和其他日志放一起,但是可以指定日志標簽,方便檢索。
缺點是(1)會導致日志增大,并且用戶提權后因-t標簽的存在,導致不會記錄提權前的用戶。(2)不能自定義日志路徑。
【二】
# 1. 創建審計用戶組
groupadd audit
# 2. 將普通用戶caoshibo加入audit組
usermod -a -G audit caoshibo
# 3. 創建存放審計日志的目錄
mkdir -p -m 2775 /var/log/Command/
chmod o+t /var/log/Command/
# 4.修改目錄的屬組為audit
chgrp audit /var/log/Command/
# Command audit
export DA=$(date +"%Y%m%d")
export HISTORY_FILE=/var/log/Command/Command-${DA}.log
(umask 002 && touch $HISTORY_FILE)
declare -rx PROMPT_COMMAND='{ date "+%Y-%m-%d %T # $(who am i |awk "{print \$2,\$5}") $(whoami):[$PWD]# $(history 1 | { read x cmd; echo ${cmd}; })"; } >>$HISTORY_FILE'
缺點:用戶可以刪除日志文件。
因為普通用戶和root都要往日志文件里寫,所以需要給普通用戶加一個附加組;并且如果日志文件不存在,普通用戶登錄后也需要新建,所以普通用戶必須有日志文件父目錄的寫權限。為了能讓所有普通用戶都可以寫,就給Command目錄加了SGID權限以及修改目錄屬組為audit。這樣普通用戶在這個目錄下創建的日志文件的屬組會自動繼承Command目錄的屬組,也就是audit。(umask 002 && touch $HISTORY_FILE)
命令則是因為root用戶生成的日志文件權限是644,屬組沒有寫權限。所以這里用 啟動子shell并修改umask的方式生成日志文件。這樣就不會修改root默認的0022
的umask。
其他審計軟件:
https://www.splunk.com/ 免費2個月