安全運維之:Linux系統賬戶和登錄安全
一、合理使用Shell歷史命令記錄功能
在Linux下可通過history命令查看用戶所有的歷史操作記錄,同時shell命令操作記錄默認保存在用戶目錄下的.bash_history文件中,通過這個文件可以查詢shell命令的執行歷史,有助于運維人員進行系統審計和問題排查,同時,在服務器遭受黑客攻擊后,也可以通過這個命令或文件查詢黑客登錄服務器所執行的歷史命令操作,但是有時候黑客在入侵服務器后為了毀滅痕跡,可能會刪除.bash_history文件,這就需要合理的保護或備份.bash_history文件。下面介紹下history日志文件的安全配置方法。
默認的history命令只能查看用戶歷史操作記錄,并不能區分每個用戶操作命令的時間,這點對于排查問題十分不便,不過可以通過下面的方法(加入四行內容)讓history命令自動記錄所有shell命令的執行時間,編輯/etc/bashrc文件:
- HISTFILESIZE=4000
- HISTSIZE=4000
- HISTTIMEFORMAT='%F %T'
- export HISTTIMEFORMAT
其中,HISTFILESIZE定義了在.bash_history文件中保存命令的記錄總數,默認值是1000,這里設置為4000;HISTSIZE定義了history命令輸出的記錄總數;HISTTIMEFORMAT定義時間顯示格式,這里的格式與date命令后的“+"%F %T"”是一致的;HISTTIMEFORMAT作為history的時間變量將值傳遞給history命令。
通過這樣的設置后,執行history命令,就會顯示每個歷史命令的詳細執行時間,例如:
- [root@server ~]# history
- 247 2013-10-05 17:16:28 vi /etc/bashrc
- 248 2013-10-05 17:16:28 top
- 249 2013-10-05 17:04:18 vmstat
- 250 2013-10-05 17:04:24 ps -ef
- 251 2013-10-05 17:16:29 ls -al
- 252 2013-10-05 17:16:32 lsattr
- 253 2013-10-05 17:17:16 vi /etc/profile
- 254 2013-10-05 17:19:32 date +"%F %T"
- 255 2013-10-05 17:21:06 lsof
- 256 2013-10-05 17:21:21 history
為了確保服務器的安全,保留shell命令的執行歷史是非常有用的一條技巧。shell雖然有歷史功能,但是這個功能并非針對審計目的而設計,因此很容易被黑客篡改或是丟失。下面再介紹一種方法,可以實現詳細記錄登錄過系統的用戶、IP地址、shell命令以及詳細操作時間等,并將這些信息以文件的形式保存在一個安全的地方,以供系統審計和故障排查。
將下面這段代碼添加到/etc/profile文件中,即可實現上述功能。
- #history
- USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
- HISTDIR=/usr/share/.history
- if [ -z $USER_IP ]
- then
- USER_IP=`hostname`
- fi
- if [ ! -d $HISTDIR ]
- then
- mkdir -p $HISTDIR
- chmod 777 $HISTDIR
- fi
- if [ ! -d $HISTDIR/${LOGNAME} ]
- then
- mkdir -p $HISTDIR/${LOGNAME}
- chmod 300 $HISTDIR/${LOGNAME}
- fi
- export HISTSIZE=4000
- DT=`date +%Y%m%d_%H%M%S`
- export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT"
- export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]"
- chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null
這段代碼將每個用戶的shell命令執行歷史以文件的形式保存在/usr/share/.history目錄中,每個用戶一個文件夾,并且文件夾下的每個文件以IP地址加shell命令操作時間的格式命名。下面是user01用戶執行shell命令的歷史記錄文件,基本效果如下:
- [root@server user01]# pwd
- /usr/share/.history/user01
- [root@server user01]# ls -al
- -rw------- 1 user01 wheel 56 Jul 6 17:07 192.168.12.12.history.20130706_164512
- -rw------- 1 user01 wheel 43 Jul 6 17:42 192.168.12.12.history.20130706_172800
- -rw------- 1 user01 wheel 22 Jul 7 12:05 192.168.12.19.history.20130707_111123
- -rw------- 1 user01 wheel 22 Jul 8 13:41 192.168.12.20.history.20130708_120053
- -rw------- 1 user01 wheel 22 Jul 1 15:28 192.168.12.186.history.20130701_150941
- -rw------- 1 user01 wheel 22 Jul 2 19:47 192.168.12.163.history.20130702_193645
- -rw------- 1 user01 wheel 22 Jul 3 12:38 192.168.12.19.history.20130703_120948
- -rw------- 1 user01 wheel 22 Jul 3 19:14 192.168.12.134.history.20130703_183150
保存歷史命令的文件夾目錄要盡量隱蔽,避免被黑客發現后刪除。
二、合理使用su、sudo命令
su命令是一個切換用戶的工具,經常用于將普通用戶切換到超級用戶下,當然也可以從超級用戶切換到普通用戶。為了保證服務器的安全,幾乎所有服務器都禁止了超級用戶直接登錄系統,而是通過普通用戶登錄系統,然后再通過su命令切換到超級用戶下,執行一些需要超級權限的工作。通過su命令能夠給系統管理帶來一定的方便,但是也存在不安全的因素,例如系統有10個普通用戶,每個用戶都需要執行一些有超級權限的操作,就必須把超級用戶的密碼交給這10個普通用戶,如果這10個用戶都有超級權限,通過超級權限可以做任何事,那么會在一定程度上對系統的安全造成了威協。因此su命令在很多人都需要參與的系統管理中,并不是最好的選擇,超級用戶密碼應該掌握在少數人手中,此時sudo命令就派上用場了。
sudo命令允許系統管理員分配給普通用戶一些合理的“權利”,并且不需要普通用戶知道超級用戶密碼,就能讓他們執行一些只有超級用戶或其他特許用戶才能完成的任務,比如系統服務重啟、編輯系統配置文件等,通過這種方式不但能減少超級用戶登錄次數和管理時間,也提高了系統安全性。因此,sudo命令相對于權限無限制性的su來說,還是比較安全的,所以sudo也被稱為受限制的su,另外sudo也是需要事先進行授權認證的,所以也被稱為授權認證的su。
sudo執行命令的流程是:將當前用戶切換到超級用戶下,或切換到指定的用戶下,然后以超級用戶或其指定切換到的用戶身份執行命令,執行完成后,直接退回到當前用戶,而這一切的完成要通過sudo的配置文件/etc/sudoers來進行授權。
例如,/etc/shadow文件普通用戶是無法訪問的:
- [user01@unknown ~]$ more /etc/shadow
- /etc/shadow: Permission denied
如果要讓普通用戶user01可訪問這個文件,可以在/etc/sudoers添加如下內容:
- user01 ALL = /bin/more /etc/shadow
- 這樣,通過如下方式user01用戶就可訪問/etc/shadow文件:
- [user01@unknown ~]$ sudo more /etc/shadow
- [sudo] password for user01:
執行這個命令后,需要輸入user01用戶的密碼,然后就可訪問文件內容了。在這里sudo使用時間戳文件來完成類似“檢票”的系統,當用戶輸入密碼后就獲得了一張默認存活期為5分鐘的“入場券”(默認值可以在編譯的時候改變)。超時以后,用戶必須重新輸入密碼才能查看文件內容。
如果每次都需要輸入密碼,那么某些自動調用超級權限的程序就會出現問題,此時可以通過下面的設置,讓普通用戶無需輸入密碼即可執行具有超級權限的程序。例如,要讓普通用戶centreon具有/etc/init.d/nagios腳本重啟的權限,可以在/etc/sudoers添加如下設置:
- CENTREON ALL = NOPASSWD: /etc/init.d/nagios restart
這樣,普通用戶centreon就可以執行nagios重啟的腳本而無需輸入密碼了。如果要讓一個普通用戶user02具有超級用戶的所有權限,而又不想輸入超級用戶的密碼,只需在/etc/sudoers添加如下內容即可:
- user02 ALL=(ALL) NOPASSWD: ALL
這樣user02用戶登錄系統后,就可以通過執行如下命令切換到超級用戶下:
- [user02@unknown ~]$ sudo su -
- [root@unknown ~]# pwd
- /root
sudo設計的宗旨是:賦予用戶盡可能少的權限但仍允許它們完成自己的工作,這種設計兼顧了安全性和易用性,因此,強烈推薦通過sudo來管理系統賬號的安全,只允許普通用戶登錄系統,如果這些用戶需要特殊的權限,就通過配置/etc/sudoers來完成,這也是多用戶系統下賬號安全管理的基本方式。
三、刪減系統登錄歡迎信息
系統的一些歡迎信息或版本信息,雖然能給系統管理者帶來一定的方便,但是這些信息有時候可能被黑客利用,成為攻擊服務器的幫兇,為了保證系統的安全,可以修改或刪除某些系統文件,需要修改或刪除的文件有4個,分別是/etc/issue、/etc/issue.net、/etc/redhat-release和/etc/motd。
/etc/issue和/etc/issue.net文件都記錄了操作系統的名稱和版本號,當用戶通過本地終端或本地虛擬控制臺等登錄系統時,/etc/issue的文件內容就會顯示,當用戶通過ssh或telnet等遠程登錄系統時,/etc/issue.net文件內容就會在登錄后顯示。在默認情況下/etc/issue.net文件的內容是不會在ssh登錄后顯示的,要顯示這個信息可以修改/etc/ssh/sshd_config文件,在此文件中添加如下內容即可:
- Banner /etc/issue.net
其實這些登錄提示很明顯泄漏了系統信息,為了安全起見,建議將此文件中的內容刪除或修改。
/etc/redhat-release文件也記錄了操作系統的名稱和版本號,為了安全起見,可以將此文件中的內容刪除。
/etc/motd文件是系統的公告信息。每次用戶登錄后,/etc/motd文件的內容就會顯示在用戶的終端。通過這個文件系統管理員可以發布一些軟件或硬件的升級、系統維護等通告信息,但是此文件的最大作用就、是可以發布一些警告信息,當黑客登錄系統后,會發現這些警告信息,進而產生一些震懾作用。看過國外的一個報道,黑客入侵了一個服務器,而這個服務器卻給出了歡迎登錄的信息,因此法院不做任何裁決。