Linux History安全問題【保存記錄防止刪除】+完善Linux/UNIX審計 將每一個shell命令記入日誌

 

2011-09-27 22:11:51|  分類: rhel5_033|舉報|字號 訂閱html

 
 
Linux History安全問題【保存記錄防止刪除】 - zhuzhu - 五事九思  (大連Linux主機維護)
 
Linux利用PROMPT_COMMAND實現審計功能

這個系統審計,記錄什麼用戶,在什麼時間,作了什麼操做。 而後將查到的信息記錄到一個文件裏。node

一. 配置linux

 

1. 在/etc/profile 文件的最後,添加以下2行代碼:typescript

 

 

 

export HISTORY_FILE=/var/log/`date ‘+%Y%m’`.log shell

export PROMPT_COMMAND=’{ date 「+%Y-%m-%d %T ##### $(who am i |awk 「{print \$1\」 \」\$2\」 \」\$5}」)  #### $(history 1 | { read x cmd; echo 「$cmd」; })」; } >> $HISTORY_FILE’ 安全

添加完成保存退出。這樣任何操做命令都會在/var/log/日期.log中看到。還能夠本身定義目錄或者文件。讓別人找不到 只容許本身看。只須要修改bash

 

export HISTORY_FILE=/var/log/`date ‘+%Y%m’`.log  這個記錄就可服務器

/etc/profile: 此文件爲系統的每一個用戶設置環境信息,當用戶第一次登陸時,該文件被執行.並從/etc/profile.d目錄的配置文件中搜集shell的設置.app

 

[root@node1 ~]#. /etc/profile 或者   [root@node1 ~]#source /etc/profile函數

 使更改生效,若是沒有報錯說明成功了。

 驗證日誌裏面是否有數據

 [root@node1 ~]# more /var/log/201107.log

2011-07-21 17:29:08 ##### root pts/2 (192.168.23.250)  #### . /etc/profile

能夠看到裏面已經有數據。

 還可使用

 PROMPT_COMMAND=’{ date 「+%Y-%m-%d %T ##### USER:$USER IP:$SSH_CLIENT PS:$SSH_TTY #### $(history 1 | { read x cmd; echo 「$cmd」; })」; } >>$HISTORY_FILE’

命令不同可是結果是同樣的。

 

 

編者按:爲了確保服務器的安全,保留shell命令的執行歷史是很是有用的一條技巧。然而,shell雖然有歷史功能,可是這個功能並不是針對審計的目的而設計,所以很容易被用戶篡改或是丟失。本文介紹的步驟可以幫助你將每一個shell命令記入日誌(你能夠將本文和bash history logging攻防一文參考着閱讀,看看攻防雙方的思路有何不一樣)。本文做者David Douthitt是一位經驗豐富的UNIX和Linux系統管理員,曾作過Linux發行版的打包工做,也是《Advanced Topics in System Administration》和《GNU Screen: A Comprehensive Manual》兩本書的做者。如下爲正文:

將用戶執行的每一個shell命令記入日誌比最初想象的要來得困難。shell的歷史功能本來旨在幫助用戶使用之前用過的命令。咱們都知道這種使用場合:你剛輸入了一個長長的字段,但是拼錯了一個字符。shell的歷史讓你能夠改正這一個字符,而沒必要輸入其他的全部字符。

然而, shell歷史很難知足審計的目的。換言之,它不是爲了確保系統安全而設計的。

對於bash shell來講,問題顯得尤爲困難,由於該shell的目的是,無論用什麼辦法,儘量爲用戶簡化生活——因此,它擁有全部的「花哨功能」(bells and whistles)。必須顧及全部這些多種功能,而且防止對歷史文件進行更改。

Korn shell比較簡單,使得保護shell的歷史比較容易。

若是想要嚴加保管這些shell的歷史,須要執行一系列的步驟。

首先,鎖定shell的歷史文件自己。更改它的屬性,末尾只添加chattr +a .sh_history或chattr +a .bash_history。這樣一來,就不可能刪除或更改文件中的數據,連用戶都沒法改變屬性——只有root用戶才能改變。

其次,確保歷史變量設置合理、沒法更改。這些歷史變量包括最重要的HISTFILE、HISTCOMMAND和HISTIGNORE。要作到這一點,使用shell的typeset命令,帶-r選項,這使得指定的變量擁有隻讀屬性。良好的操做規範是使全部歷史環境變量都變爲只讀,好比:

export HISTCONTROL=  export HISTFILE=$HOME/.bash_history  export HISTFILESIZE=2000  export HISTIGNORE=  export HISTSIZE=1000  export HISTTIMEFORMAT="%a %b %Y %T %z "  typeset -r HISTCONTROL  typeset -r HISTFILE  typeset -r HISTFILESIZE  typeset -r HISTIGNORE  typeset -r HISTSIZE  typeset -r HISTTIMEFORMAT

HISTTIMEFORMAT是bash shell的擴展,將在歷史文件中提供時間戳。

對於bash shell來講,你須要更改歷史的一些標準選項:

shopt -s cmdhist  #設置cmdhist將把多行命令放入到單單一個歷史行  shopt -s histappend  #設置histappend將確保被添加到歷史文件,而不是像一般的作法那樣覆蓋歷史文件。

另外對於bash shell來講,還要設置PROMPT_COMMAND:

PROMPT_COMMAND="history -a"  typeset -r PROMPT_COMMAND

這是因爲bash shell實際上把歷史寫入到內存中,歷史文件僅在shell會話結束時加以更新。這個命令會把上一個命令附加到磁盤上的歷史文件。

最後,建立一個SIGDEBUG陷阱,將命令發送到系統日誌(syslog)。VMware的ESXi藉助本身版本的ash shell已經具備這樣的功能。簡而言之,應建立一個把當前命令記入日誌(從歷史文件獲取)的函數,而後用logger命令,把它發送到系統日誌。這一步在bash shell和Korn Shell中都適用。

這些步驟有些冗長,不過在新版的bash和ksh中有一些新的功能特性,讓這一切變得極其容易。GNU Bash在4.1版中添加了記入到系統日誌中的功能,只須要編譯shell的時候開啓該功能便可激活。

自推出ksh93以來,Korn Shell就一直具備審計功能。相似bash 4.1,用戶審計是一項編譯時功能。想看看你所用的ksh93版本是否安裝了審計功能,能夠執行下列命令中的某一條:

echo ${.sh.version}  echo $KSH_VERSION

在Ubuntu 10.10中,我獲得了來自ksh93的這個輸出:

# echo ${.sh.version}  Version JM 93t+ 2009-05-01

若是審計功能開啓,特徵字符串(JM)還會有字母A(開啓審計功能),可能還有字母L(開啓針對用戶的審計功能)。IBM DeveloperWorksMusings of an OS Plumber都刊有介紹Korn Shell審計的出色文章。

Bash shell含有審計功能的可能性也比較小。Ubuntu 10.10上的bash是4.1.5(1)版本。

對於仍在使用C shell(以及尤爲是tsch)的用戶,tcsh有一個變種名爲「tcsh-bofh」,它支持記入到系統日誌中。遺憾的是,tcsh-bofh並無獲得長期的維護。早在2010年1月,tcsh-bofh的FreeBSD端口就從FreeBSD端口樹(port tree)去除了。

上述信息也能夠在shell以外獲取。好比有兩個命令:lastcomm(來自Ubuntu Main軟件倉庫中的acct程序包)和auditctl(來自Ubuntu Universe軟件倉庫中的auditd程序包)。另外, Linux Journal在2002年刊發過一篇關於Linux進程統計的好文章。另外還有rootsh和snoopylogger這兩個程序包,只是二者都不在Ubuntu軟件倉庫中。Rootsh比如是typescript的執行版本,而snoopylogger是你能夠添加到用戶環境的系統庫。(這些方法有許多來自在serverfault.com上所提的一個問題,請參閱這個帖子。)

相關文章
相關標籤/搜索