企業系統安全管理和強化的十個建議
企業系統的安全管理運維涉及到公司信息化系統和數據的防入侵、防泄露工作,這是為所有CSO、COO非常關注的基礎性工作。雖然基礎,但是一旦處理不到位,將會給企業帶來重大數據、經濟損失或者聲譽損失。本文針對企業系統的安全管理,給出了10個非常實用、有效的系統強化措施,能夠較好地幫助企業系統管理員發現和提前處理系統可能存在的風險和漏洞,從而在事前保證企業系統的安全運營。
1、從運行路徑中去掉“.”
在超級用戶(root)模式下,用戶必須明確正在運行的命令是用戶想要的。考慮下面的場景,用戶在哪里登錄了超級用戶,那么用戶的路徑變量就是
.:/usr/bin:/usr/sbin:/bin:/sbin.
用戶在ls目錄下創建了一個包含如下命令的腳本:
#!/usr/bin/ksh
cp /usr/bin/ksh /tmp
chown root:bin /tmp/ksh
chmod 6755 /tmp/ksh
rm -f ls
/bin/ls $*
現在A用戶呼叫并上報一個問題,在他的主目錄里有些不明文件。用戶作為超級管理員,使用cd命令進入他的目錄并運行ls -l命令去查看。突然,在用戶不知情的情況下,A用戶可以運行一個shell腳本來獲取用戶的超級用戶權限!
這樣的情況經常發生,但是很容易避免。如果在用戶的路徑中沒有“.”,用戶會看到一個名為ls的腳本在他的主目錄中,而不會去執行它。
2、規避風險腳本
當用戶寫一個腳本,總是指定正在使用的應用程序的完整路徑。參考下面的腳本:
#!/usr/bin/ksh
date > log
find . -mtime +7 -ls -exec rm -rf {} \; >> log 2>&1
雖然只有三行,并且只有兩行執行命令,然而卻存在很多安全漏洞:
它沒有指定一個路徑。
它沒有給出日期的完整路徑。
它沒有給出查找的完整路徑。
它沒有給出rm的完整路徑。
它執行錯誤檢查。
它沒有驗證目錄的正確性。
讓我們再看一下另外一個腳本是如何解決其中的一些問題的。
#!/usr/bin/ksh
cd /directory || exit -1
PATH=/usr/bin; export PATH
/usr/bin/date > log
/usr/bin/find /directory -mtime +7 -ls -exec /usr/bin/rm -rf {} \; \
>> log 2>&1
第二行,cd /directory || exit -1,告訴ksh的嘗試使用CD命令進入/directory。如果命令失敗,它需要退出腳本并且返回一個–1的代碼。在Ksh命令中||意味著“如果上個命令失敗”,&&則意味著“如果上個命令成功”。舉一個額外的例子,使用命令touch /testfile || echo Could not touch創建一個名為/testfile的文件,或者如果文件不能被創建(也許用戶沒有足夠的權限來創建它),那么在屏幕上會顯示“Could not touch”。使用命令touch
/testfile && echo Created file來創建/testfile文件,如果touch命令成功,在屏幕上只會顯示“Created file”。用戶檢查的條件將決定用戶是使用||還是&&。
如果腳本繼續運行,用戶將進入/directory。現在用戶可以明確指定用戶的路徑,如果用戶忘記了完整路徑可以使用系統搜索命令來鎖定。這個方法的例子并沒有在這個小腳本中,但它是一個很好的習慣,尤其是在當用戶寫長的并且更復雜的腳本時;如果用戶忘了指定完整的路徑,用戶的腳本調用木馬程序幾率將會非常小。
接下來用戶調用date的全名是:/usr/bin/date。用戶也可以完全指定/usr/bin/find和/usr/bin/rm。通過執行此操作,用戶可以讓希望在用戶系統中插入木馬程序并且在用戶不知覺的情況下運行的人更加困難。畢竟,如果他們有足夠的權限來修改文件/usr/bin,他們可能就有足夠的權限來做任何他們想做的事情。
當編寫一個腳本,經常需要遵循這些簡單的規則:
總是指定一個路徑。
總是為每個應用程序使用的完整路徑。
始終運行錯誤檢查,特別是在運行具有潛在破壞性的命令時,如rm命令。
3、盯緊容易忽視的計劃任務
用戶知道什么工作在用戶的系統無人值守下正在運行嗎?當系統安裝完成后,許多操作系統都提供了各種各樣的自動化任務自動為用戶安裝和配置。其他工作隨著時間推移而增加的應用程序,會定期的運行。
要掌握用戶的系統,用戶需要清楚的了解它正在運行的程序。定期審核用戶的計劃任務列表文件中哪些程序正在運行。許多系統的計劃任務文件存儲在/var/spool/cron中。一些計劃任務守護進程另外支持每小時計劃任務,每周計劃任務,每月計劃任務和每年計劃任務的文件,以及一個cron.d目錄。使用man cron命令來將確定用戶的計劃任務守護進程的確切功能。
在每個目錄檢查所有的文件。注意每個工作的所有者,如果用戶的計劃任務守護進程(crond服務)支持,請鎖定計劃任務并且只對需要使用的用戶ID開放。請注意每個正在運行的文件和它所運行的時間。如果預定的計劃用戶不清楚,研究來確定到底是什么文件以及用戶是否需要它。如果用戶正在運行一些用戶覺得他們不需要的東西,與他們聯系,問其原因,然后進行相應處理。
持續跟蹤用戶的計劃任務作業并且定期檢查他們是否有任何的變化。如果用戶發現有些事情已經改變了,進行調查并確定原因。持續跟蹤用戶的系統正在做什么是保持用戶系統安全的一個關鍵步驟。
4、記錄所有守護進程的日志
眾所周知,如果守護進程不在第一個時間記錄任何信息,那么保存和記錄日志也是沒用的。在默認情況下有一些守護進程會創建日志,有一些則沒有。當用戶審核用戶的系統時,驗證用戶的守護進程是否記錄日志信息。
任何公開的守護進程都需要配置日志,日志需要被保存。試著訪問用戶的一些服務,查看用戶的日志服務器收集的日志。如果沒有,閱讀該服務的線上說明手冊并查找所需的操作來激活記錄。啟動它,并嘗試再次使用該服務。持續檢查用戶所有的服務直到確保記錄和保存了所有的日志。
5、運行CIS掃描
互聯網安全中心(CIS)創建了一個系統安全基準測試工具。用戶可以從www.cisecurity.org下載這個工具,對用戶的本地系統進行審計并報告其分析結果。該工具會掃描到好的和壞的結果,并在掃描結束后給出一個整體排名。掃描工具可用于Solaris, HP-UX,Linux,Windows,以及思科路由器。
CIS基準測試最好的地方是他們給出的說明,報告中并不會只是簡單的提到“用戶有什么,哪個不好”;它會告訴用戶為什么說它不好的更深層的原因,它可以讓用戶自己決定是否要禁用“壞東西”或維持原樣。基準工具可能會檢查很多用戶沒有想到的地方,并且給用戶一份系統的詳細報告。
下載并解壓縮CIS工具,閱讀README文檔和PDF文檔。 (PDF文檔針對系統安全提供了很好的參考材料。)按照README文檔說明進行安裝包安裝,工具安裝完成后,用戶應該有一個目錄/opt/CIS。運行命令cis-scan來了解用戶的系統。這取決于用戶服務器的速度和所連接的硬盤數量,掃描可能需要花很長時間才能完成。掃描完成后,用戶將會有一個名為cis-ruler-log.YYYYMMDD-HH:MM:SS.PID的文檔。該文檔是系統的總結報告,包含了所有的測試結果。其中該文檔不包詳細信息--這意味著只能作為索引來參考掃描工具自帶的PDF文檔。逐行審閱ruler-log文件,如果有一個負面的結果,建議在PDF文檔中確定是否可以執行變更。大部分變更可以在不影響服務器的操作下實現,但并不是所有。謹防漏報;用戶可能需要使用PortSentry工具查看端口515是否存在lp漏洞,這會導致了CIS工具報告用戶有lp漏洞的錯誤。在報告末尾,數字越高用戶的系統越“堅固”。
這是一個很好的信息安全工具,定期在用戶的服務器上運行可以保持服務器的健康。訪問互聯網安全中心的網站,隨著關注該工具的不斷發展和變化。
6、運行過程避免使用超級用戶特權
許多運行在的服務器上的服務并不需要超級用戶權限來執行他們的功能。通常,他們不需要任何特殊權限以外的讀取和寫入數據目錄的能力。但由于Unix安全措施規定由超級用戶權限的運行的開放的TCP / IP端口必須低于1024,加上這一事實,大多數著名的端口都低于1024,意味著用戶的守護進程必須在超級用戶權限下開放其端口。
這種困境有幾個解決方法。第一,最安全的并不是運行所有的服務。如果守護進程沒有運行,那么它不需要作為超級用戶運行。然而,這并不是每次都管用的。有時候用戶也需要為守護進程提供運行服務。在這種情況下,創建一個專門的用戶ID來運行守護進程,并且盡可能的嚴格控制它。只使用這個ID寫入可寫的目錄,并且不要給這個ID特別高的權限。然后更改啟動腳本,守護進程只屬于這個新的用戶ID。現在如果攻擊者利用漏洞攻擊用戶的服務器并且損害用戶的守護進程,攻擊者將獲得非特權賬戶并且必須做進一步的工作來獲得超級用戶權限,在更多的損失發生之前將給予用戶更多的時間來跟蹤和阻止他或她。
7、掃描并處理高權限文件
所有系統都有設置用戶ID(SUID)和設置組ID(SGID)文件。這些文件可以使用特定的用戶或組來運行應用程序、腳本和守護進程,而不是個人用戶ID或組ID來運行。top命令是一個很好的例子,它的運行權限較高,所以它可以掃描內核空間中的進程信息。因為大多數用戶的默認權限不能讀取這些信息,top需要運行更高的權限是有必要的。
許多操作系統允許用戶的指定某些磁盤不支持SUID和SGID,通常是通過在用戶的系統掛載文件中使用一個命令來完成。在Solaris中,用戶會在/etc/vfstab中指定nosuid命令。例如,使用nosuid命令將/users安裝在磁盤c2t0d0s3上,用戶可以輸入如下命令:
/dev/dsk/c2t0d0s3 /dev/rdsk/c2t0d0s3 /users ufs 2 yes nosuid
這個/users安裝引導并禁用了SUID和SGID應用程序。應用程序仍然可以運行,但是SUID和SGID位將會被忽略。在所有的文件系統上禁用SUID和SGID是一個良好的安全實踐。
不過,用戶需要定期掃描用戶的系統并獲得一個所有存在SUID和SGID進程中的列表。查找SUID的命令是:-perms +4000,而查找SGID的命令則是:-perms +2000。在整個服務器掃描所有SUID文件,運行這個命令:
# find / -type f -perms +4000 -ls
-type f命令只是查看“常規”的文件,無法查看目錄或通過其他命名管道的特殊文件等。這個命令可以列出每個文件上的SUID位設置。仔細檢查和驗證所有輸出和真正需要SUID和SGID的文件,對于不需要的,毫不猶豫地進行清除處理。
8、掌控開放的端口
在用戶向外界發布用戶的系統之前,用戶需要知道哪些端口是打開的并且允許連接。有些端口是在用戶不知情的情況下開放的,用戶應該在人們通過這些端口訪問用戶的服務器之前關閉它們。有一些工具可以讓用戶知道用戶的系統是暴露的。
可以使用Netstat工具來進行排查。幾乎每一個操作系統都附帶Netstat命令。Netstat是一個簡單的工具,可以顯示用戶的網絡信息,如網絡端口、路由表和網絡連接信息。Netstat工具顯示了/etc/services下所有已經被使用類似人名定義的端口,使其更容易解析和導出。這是一個確保用戶系統上/etc/services持續更新的好理由。在用戶的系統上使用man命令來發現netstat的能力。
下面我們將通過一個簡單的例子來說明:
# netstat
Local Address Remote Address Swind Send-Q Rwind Recv-Q State
server.smtp 192.168.3.4 6144 0 65700 0 CONNECTED
在這個例子中,有人從IP地址192.168.3.4連接到用戶服務器的SMTP服務。用戶應該運行SMTP嗎?應該允許這個人連接到服務器嗎?注意,重大漏洞。用戶打開了遠程連接,用戶最起碼應該使用TCP Wrappers安全機制來保護它。用戶應該禁用它嗎?
# netstat -a | more
UDP: IPv4
Local Address Remote Address State
localhost.ntp Idle
TCP: IPv4
Local Address Remote Address Swind Send-Q Rwind Recv-Q State
*.telnet *.* 0 0 24576 0 LISTEN
建議用戶花些時間去學習netstat吧。如果用戶學會了如何使用,它將為用戶提供豐富的網絡信息,并且讓用戶清楚地看見是誰在什么時間連接到了用戶的系統。
另一個有用的實用程序是lsof (打開的文件列表) 工具。剛開始它只是一個用來顯示有哪些進程打開了文件的簡單工具,但是現在已經進化到可以顯示端口、通道和其他通信。一旦用戶安裝了lsof工具,嘗試一下。只運行lsof來查看系統上打開的所有文件和端口。用戶可以感受一下lsof工具能做什么,同時它也是一個快速審核系統的絕佳方式。lsof | grep TCP命令將顯示系統上所有打開的TCP協議的連接。這個工具功能非常強大,當用戶需要卸載文件系統,而文件系統報告忙碌時也是很有幫助的,lsof可以快速的顯示那個進程正在使用該文件系統。
9、使用一個集中的日志服務器
如果用戶負責維護多個服務器,那么檢查每臺服務器的日志將非常繁瑣。為此,建立一臺專用服務器來搜集其他所有服務器的日志消息。通過整合用戶的日志,用戶只需要掃描一臺服務器,將大大節省用戶的時間。在用戶的服務器被攻破后,這也是一個好的歸檔文件;用戶仍然可以在別的地方查閱這些日志文件。
創建一個核心日志服務器,使用高速CPU和大量的磁盤可用空間。關閉除syslogd之外的其他所有端口和服務,這個系統受到損害的幾率降到最低,可能除了使用TCP-wrapped SSH守護進程來限制用戶的工作站進行遠程訪問。然后驗證syslogd可以從遠程系統接收消息。這不同于從消息提供服務器到消息提供服務器。有些服務器默認接收消息,用戶可能需要關掉它;有些默認不接收消息,用戶需要打開它。
創建一個系統來歸檔舊日志并形成文件。如果用戶的日志曾經被用作為證據,用戶需要能夠證明它們沒有被更改過,用戶需要出示他們是如何創建的。建議用戶壓縮一個星期以上的所有帶時間戳的日志并且通過只讀的媒體,例如CD光盤來復制他們。
一旦用戶有了一個接收日志的服務器,用戶需要啟動其他服務器指向它。編輯/etc/syslog.conf并且確定用戶想復制的信息。最起碼,用戶應該復制最高的緊急程度狀態,緊急狀態,重要信息,臨界狀態和警告信息和更多用戶認為有用的信息。當用戶知道什么是用戶想要復制的信息,添加一個或多個像下面這樣的/etc/syslog.conf命令行:
*.emerg;*.alert;*.crit;*.err;*.warning;*.notice @ip.of.log.srvr
在這個例子中,我們將所有最高的緊急程度狀態,緊急狀態,重要信息,臨界狀態,警告和出現不尋常的事情日志信息發送到遠程服務器。值得注意的是:用戶可以讓它們在同一時間將日志歸檔到遠程服務器。用戶也可以復制到多個日志服務器。Syslog.conf掃描的是所有匹配的條目—syslogd守護進程不會在找到第一個后停止。
10、保持軟件更新
每款軟件都有漏洞。大多數廠商對代碼進行審計并且刪除發現的所有漏洞,但也有些不可避免地發布到外界。某些人花大量的時間去試圖找出這些漏洞;有的人會報告給廠商,但有的人則是自己個人利用。
實際上,偶爾發現的漏洞會補丁修補程序來修正它們。除非脆弱性嚴重,或在外界存在一個已知的漏洞攻擊,那通常不會大張旗鼓地宣布發布這些補丁。用戶的責任是偶爾查看下哪些補丁適合用戶并且可以從軟件廠商處下載。
許多廠商會提供一個工具來幫助您保持您的系統上的補丁。HP-UX有軟件更新管理軟件、Solaris有patchdiag和patchpro,AIX使用SMIT,等等。至少每月運行用戶的診斷工具一次,看看用戶的系統可以更新的補丁,并決定是否需要安裝它們。每個周日下午留出至少一個小時 (或者更多的時間) 專門作為系統維護時間,利用這段時間來安裝補丁和執行其他必要的維護。
用戶應該養成為一個習慣經常去網站上查看用戶安裝的每個應用程序是否有bug修復或安全補丁發布。使用前面創建的應用程序列表來確定是否有適用于用戶的補丁。當用戶更新完補丁后記得更新用戶的列表信息。






















