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