像find和secure這樣的程序稱為檢查程序,它們搜索文件系統,尋找出SUID/SGID文件,設備文件,任何人可寫的系統文件,設有口令的登錄用戶,具有相同UID/GID的用戶等等.
(1)記帳
UNIX記帳軟件包可用作安全檢查工具,除最後登錄時間的記錄外,記帳系統還能保存全天運行的所有進程的完整記錄,對於一個進程所存貯的信息包括UID,命令名,進程開始執行與結束的時間,CPU時間和實際消耗的時間,該進程是否是root進程,這將有助於系統管理員了解系統中的用戶在干什麼.acctcom命令可以列出一天的帳目表.有明,系統中有多個記帳數據文件,記帳信息保存在文件/usr/adm/pacct*中,/usr/adm/pacct是當前記錄文件,/usr/adm/pacctn是以前的記帳文件(n為整型數).若有若干個記帳文件要查看,可在acctcom命令中指定文件名:
acctcom /usr/adm/pacct? /usr/adm/pacct
要檢查的問題的其中之一是:在acctcom的輸出中查找一個用戶過多的登錄過程,若有,則說明可能有人一遍遍地嘗試登錄,猜測口令,企圖非法進入系統.此外,還應查看root進程,除了系統管理員用su命令從終端進入root,系統啟動,系統停止時間,以及由init(通常init只啟動getty,login,登錄shell),cron啟動的進程和具有root SUID許可的命令外,不應當有任何root進程.
由記帳系統也可獲得有關每個用戶的CPU利用率,運行的進程數等統計數據.
(2)其它檢查命令
*du:報告在層次目錄結構(當前工作目錄或指定目錄起)中各目錄占用的磁盤塊數.可用於檢查用戶對文件系統的使用情況.
*df:報告整個文件系統當前的空間使用情況.可用於合理調整磁盤空間的使用和管理.
*ps:檢查當前系統中正在運行的所有進程.對於用了大量CPU時間的進程,同時運行了許多進程的用戶,運行了很長時間但用了很少CPU時間的用戶進程應當深入檢查.還可以查出運行了一個無限制循環的後台進程的用戶,未注銷戶頭就關終端的用戶(一般發生在直接連線的終端).
*who:可以告訴系統管理員系統中工作的進展情況等等許多信息,檢查用戶的登錄時間,登錄終端.
*su:每當用戶試圖使用su命令進入系統用戶時,命令將在/usr/adm/sulog文件中寫一條信息,若該文件記錄了大量試圖用su進入root的無效操作信息,則表明了可能有人企圖破譯root口令.
*login:在一些系統中,login程序記錄了無效的登錄企圖(若本系統的login程序不做這項工作而系統中有login源程序,則應修改login).
每天總有少量的無效登錄,若無效登錄的次數突然增加了兩倍,則表明可能有人企圖通過猜測登錄名和口令,非法進入系統.
這裡最重要的一點是:系統管理沒越熟悉自己的用戶和用戶的工作習慣,就越能快速發現系統中任何不尋常的事件,而不尋常的事件意味著系統已被人竊密.
(3)安全檢查程序的問題
關於以上的檢查方法的一個警告,若有誘騙,則這些方法中沒有幾個能防誘騙.如find命令,如果碰到路徑名長於256個字符的文件或含有多於200個文件的目錄,將放棄處理該文件或目錄,用戶就有可能利用建立多層目錄結構或大目錄隱藏SUID程序,使其逃避檢查(但find命令會給出一個錯誤信息,系統管理員應手工檢查這些目錄和文件).也可用ncheck命令搜索文件系統,但它沒有find命令指定搜索哪種文件的功能.
如果定期存取.profile文件,則檢查久未登錄用戶的方法就不奏效了.而用戶用su命令時,除非用參數-,否則su不讀用戶的.profile.
有三種方法可尋找久未登錄的帳戶:
. UNIX記帳系統在文件/usr/adm/acct/sum/login中為每個用戶保留了最後一次登錄日期.用這個文件的好處是,該文件由系統維護,所以可完全肯定登錄日期是准確的.缺點是必須在系統上運行記帳程序以更新
loginlog文件,如果在清晨(午夜後)運行記帳程序,一天的登錄日期可能就被清除了.
. /etc/passwd文件中的口令時效域將能告訴系統管理員,用戶的口令是否過期了,若過期,則意味著自過期以來,戶頭再未被用過.這一方法的好處在於系統記錄了久未用的戶頭,檢查過程簡單,且不需要記帳系統所需要的磁盤資源,缺點是也許系統管理員不想在系統上設置口令時效,而且這一方法僅在口令的最大有效期(只有幾周)才是准確的.
.系統管理員可以寫一個程序,每天(和重新引導系統時)掃描/etc/wtmp,自己保留下用戶最後登錄時間記錄,這一方法的好處是不需要記帳程序,並且時間准確,缺點是要自己寫程序.
以上任何方法都可和/usr/adm/sulog文件結合起來,查出由login或su登錄戶頭的最後登錄時間.
如果有人存心破壞系統安全,第一件要做的事就是尋找檢查程序.破壞者將修改檢查程序,使其不能報告任何異常事件,也可能停止系統記帳,刪除記帳文件,使系統管理員不能發現破壞者干了些什麼.
(4)系統洩密後怎麼辦?
發現有人已經破壞了系統安全的時候,這時系統管理員首先應做的是面對肇事用戶.如果該用戶所做的事不是蓄意的,而且公司沒有關於"破壞安全"的規章,也未造成損壞,則系統管理員只需清理系統,並留心該用戶一段時間.如果該用戶造成了某些損壞,則應當報告有關人士,並且應盡可能地將系統恢復到原來的狀態.
如果肇事者是非授權用戶,那就得做最壞的假設了:肇事者已設法成為root且本系統的文件和程序已經洩密了.系統管理員應當想法查出誰是肇事者,他造成了什麼損壞?還應當對整個文件做一次全面的檢查,並不只是檢查SUID和SGID,設備文件.如果系統安全被一個敵對的用戶破壞了,應當采用下面的步驟:
.關系統,然後重新引導,不要進入多用戶方式,進入單用戶方式.
.安裝含有本系統原始UNIX版本的帶和軟盤.
.將/bin,/usr/bin,/etc,/usr/lib中的文件拷貝到一個暫存目錄中.
.將暫存目錄中所有文件的校驗和(用原始版本的sum程序拷貝做校驗和,不要用/bin中的suM程序做)與系統中所有對就的文件的校驗和進行比較,如果有任何差別,要查清差別產生的原因.如果兩個校驗和不同,是由於安裝了新版本的程序,確認一相是否的確是安裝了新版本程序.如果不能找出校驗和不同的原因,用暫存目錄中的命令替換系統中的原有命令.
.在確認系統中的命令還未被竄改之前,不要用系統中原命令.用暫存目錄中的shell,並將PATH設置為僅在暫存目錄中搜索命令.
.根據暫存目錄中所有系統命令的存取許可,檢查系統中所有命令的存取許可.
.檢查所有系統目錄的存取許可,如果用了perms,檢查permlist文件是否被竄改過.
.如果系統UNIX(/unix)的校驗和不同於原版的校驗和,並且系統管理員從未修改過核心,則應當認為,一個非法者"很能干",從暫存緩沖區重新裝入系統.系統管理員可以從逐步增加的文件系統備份中恢復用戶的文件,但是在檢查備份中的"有趣"文件之前,不能做文件恢復.
.改變系統中的所有口令,通知用戶他們的口令已改變,應找系統管理員得到新口令.
.當用戶來要新口令時,告訴用戶發生了一次安全事故,他們應查看自己的文件和目錄是否潛伏著危害(如SUID文件,特洛依木馬,任何人可寫的目錄),並報告系統管理員任何異乎尋常的情況.
.設法查清安全破壞是如何發生的?如果沒有肇事者說明,這也許是不可能弄清的.如果能發現肇事者如何進入系統,設法堵住這個安全漏洞.
第一次安裝UNIX系統時,可以將shell,sum命令,所有文件的校驗和存放在安全的介質上(帶,軟盤,硬盤和任何可以卸下並鎖焉起來的介質).於是不必再從原版系統帶上重新裝入文件,可以安裝備份介質,裝入shell和sum,將存在帶上的校驗和與系統中文件的校驗和進行比較.系統管理員也許想自己寫一個計算校驗和的程序,破壞者將不能知道該程序的算法,如果將該程序及校驗和保存在帶上,這一方法的保密問題就減小到一個物理的安全問題,即只需將帶鎖起來.
.改變系統中的所有口令,通知用戶他們的口令已改變,應找系統管理員得到新口令.
.當用戶來要新口令時,告訴用戶發生了一次安全事故,他們應查看自己的文件和目錄是否潛伏著危害(如SUID文件,特洛依木馬,任何人可寫的目錄),並報告系統管理員任何異乎尋常的情況.
.設法查清安全破壞是如何發生的?如果沒有肇事者說明,這也許是不可能弄清的.如果能發現肇事者如何進入系統,設法堵住這個安全漏洞.
第一次安裝UNIX系統時,可以將shell,sum命令,所有文件的校驗和存放在安全的介質上(帶,軟盤,硬盤和任何可以卸下並鎖焉起來的介質).於是不必再從原版系統帶上重新裝入文件,可以安裝備份介質,裝入shell和sum,將存在帶上的校驗和與系統中文件的校驗和進行比較.系統管理員也許想自己寫一個計算校驗和的程序,破壞者將不能知道該程序的算法,如果將該程序及校驗和保存在帶上,這一方法的保密問題就減小到一個物理的安全問題,即只需將帶鎖起來.