Linux的安全 (此為轉貼,但鷹派無聊人說未得他們允許不許轉貼,好像不是他們鷹派寫的,為什麼作者不告他們侵權???)
概述
UNIX的系統安全和系統管理員有很大的關系。安裝越多的服務,越容易導致系統的安全漏洞。一些其它的操作系統,如:SCO,實際上更容易有安全漏洞,因為,為了更加“用戶友好”,這些操作系統集成了更多的服務。
Linux本身是穩定和安全的,但是它可以以不同的形式發行。在安裝Linux時候,最好先最小化安裝,然後再加上必要的軟件。這樣可以減小某個程序出現安全隱患的可能。如果管理得好,Linux可以是最安全的系統。
如果在系統中有隱患存在,在網絡上成千上萬的自願者就會指出隱患,並給出修正。大的公司,比如:商業軟件公司,只能把有限的人力用於解決這方面的問題。把問題都公開出來,對它們來說可能沒有什麼好處,而且通過正規的發行和升級渠道,一個小小修正到用戶手中都要很長的時間。也許這些修正會以補丁的方式出現,但是商業軟件的系統管理員都傾向於使用現成的軟件,而且自以為這些軟件都是很專業的。
在編程的時候隨時可能發生錯誤,但是,當有上萬個人在看程序的源代碼,這些錯誤就能很快地被發現。現在全球共有一千二百萬的Linux拷貝,想想看,這是一種什麼情況。如果系統有安全漏洞,很容易就被某個人發現了。
這一章將討論一些保護服務器安全的一般方法。我們假定這台服務器是連在Internet上的。在通常情況下,有些服務,如:NFS、Samba、Imap和Pop只是供內部用戶使用的。當然,也可以把這台服務器和外界隔離,這樣就可以簡單地避免外部的入侵。但是這沒有什麼實際意義,我們下面要介紹的是如何避免來自外部的和內部的攻擊。
1. 基礎知識
盡量少讓外人知道有關系統的信息。有時候簡單地用finger程序就能知道不少系統信息,比如:有多少用戶、管理員什麼時候登錄、什麼時候工作、他們是誰、誰現在在用這個系統以及其它有利於黑客猜出用戶口令的信息。你可以用一個強大的finger daemon和tcpd限制可以連接到服務器的用戶以及他們可以知道的有關系統的信息。但是,最好還是把finger軟件包卸載掉。
日志是了解Linux系統運行情況的唯一方法。當然,這是以黑客沒有破壞日志文件為前提的,但是這種情況很少見。把所有的連接都記錄下來,可以發現攻擊者和他們試圖進行的攻擊。如果你看不懂日志,可以向別人請教,一定要學會看懂它們。向別人請教你不懂的東西這是很正常的,不要不好意思。我自己就是從不斷地犯錯誤和改正錯誤中學到不少知識的。因為驕傲自大不能學到東西和本身的資質差是兩碼事。看下面的《31. 創建所有重要的日志文件的硬拷貝》,你可以學到怎樣管理日志文件的一些有用的知識。
限制系統中SUID的程序。SUID的程序是以root(UNIX世界中的上帝)權限運行的程序。有時候這是必須的,但是在多數情況下這沒有必要。因為SUID程序可以做任何root可以做的事,這樣有更多的機會出現安全隱患。也許,它們有時候會帶來安全隱患,有時候不會,但是黑客可以利用SUID的程序來破壞系統的安全。這就是一種叫exploit的程序的由來。exploit程序是一種利用SUID程序的程序或腳本,具有很大的破壞力,可以用來得到root的shell、獲取password文件、讀其他人的郵件、刪除文件,等等。這方面的知識可以參考《34. 帶“s”位的程序》。
2. BIOS安全,設定引導口令
禁止從軟盤啟動,並且給BIOS加上密碼。每次啟動的時候都手工檢查一下BIOS,這樣可以提高系統的安全性。禁止從軟盤啟動,可以阻止別人用特殊的軟盤啟動你的計算機;給BIOS加上密碼,可以防止有人改變BIOS的參數,比如:允許從硬盤啟動或不用輸入口令就可以引導計算機。
3. 安全策略
有一點很重要而且必須指出的是:如果你不知道要保護什麼,那麼更本沒有辦法保證系統的安全。所以必須要有一個安全策略,基於這樣的一個策略才可以決定哪些東西允許別人訪問,哪些不允許。如何制定一個安全策略完全依賴於你對於安全的定義。下面的這些問題提供一些一般的指導方針:
* 你怎麼定義保密的和敏感的信息?
* 你想重點防范哪些人?
* 遠程用戶有必要訪問你的系統嗎?
* 系統中有保密的或敏感的信息嗎?
* 如果這些信息被洩露給你的競爭者和外面的人有什麼後果?
* 口令和加密能夠提供足夠的保護嗎?
* 你想訪問Internet嗎?
* 你允許系統在Internet上有多大的訪問量?
* 如果發現系統被黑客入侵了,下一步該怎麼做?
這個列表很短,真正的安全策略可能包含比這多得多的內容。可能你要做的第一件是:評估一下你偏執的程度。任何一個安全策略多少都有一定程度的偏執:確定到底在多大程度上相信別人,包括內部的人和外部的人。安全策略必須在允許用戶合理地使用可以完成工作所必須的信息和完全禁止用戶使用信息之間找到平衡點。這個平衡點就是由系統策略決定的。
4. 口令
這章的Linux安全概要就從口令的安全開始。許多人都把所有的東西保存在計算機上,防止別人查看這些信息的方法就是用口令把計算機保護起來。沒有什麼東西是絕對安全的。與常識相反的是:無法破解的口令是不存在的。只要給足時間和資源,所有的口令都能用社會工程(譯者注:原文是social engineering,找不出更好的翻譯,大致的意思是用社會和心理學的知識,而不是用純粹的技術手段)或強行計算的方法猜出來。
通過社會工程或其它方法獲得服務器的口令是最簡單和最流行的入侵服務器的方法。決大多數的技術支持人員很容易獲得其他用戶的口令,因為用戶的安全意識很差而且很輕易就相信自己的同事,特別是幫助自己解決問題的人。有很多登記在案的成功入侵就是因為一些別有用心的人利用安全管理上的松懈而獲得成功的。有時候,在特定的時間在特定的地點,上級或老板對員工喊話就有可能洩露機密,導致可怕的後果。
因為破解口令是一項很耗時間和資源的工作,所以應該使得口令文件難於破解,這樣即使黑客獲取了口令文件也不能輕易破解。作為一個系統管理員,自己在每個周末運行一下口令破解程序,是保證系統安全的好方法。這有利於盡早地發現和替換那些很容易被猜出來的口令。而且,還要有一個好的口令檢查機制,在用戶選擇新口令或改變舊口令的時候,來排除那些有安全隱患的口令。那些字典裡的單詞、或者全是大寫或全是小寫的以及沒有包含數字或特殊字符的字符串是不能用來做口令的。我建議用下面的規則選擇有效的口令:
* 口令至少要有6個字符,最好包含一個以上的數字或特殊字符。
* 口令不能太簡單,所謂的簡單就是很容易猜出來,也就是用自己的名字,電話號碼、生日、職業或者其它個人信息作為口令。
* 口令必須是有有效期的,在一段時間之後就要更換口令。
* 口令在這種情況下必須作廢或者重新設定:如果發現有人試圖猜測你的口令,而且已經試過很多次了。
5. 口令長度
安裝完Linux系統之後默認的最小口令長度為5。這就是說一個新的用戶可以訪問服務器,那麼他的口令必須多於5字符。但是這樣是不夠安全的,最好口令的長度能夠大於8。可以強制用戶使用8個字符以上的口令。編輯“/etc/login.defs”文件,把最小口令長度由5改成8。找到 PASS_MIN_LEN 5 這一行,改為:PASS_MIN_LEN 8 。“login.defs”是很重要的配置文件。可以在這個文件中設定一些其它的安全策略,比如:口令的有效期。
6. root帳號
“root”帳號是Unix系統中享有特權的帳號。“root”帳號是不受任何限制和制約的。因為系統認為root知道自己在做些什麼,而且會按root說的做,不問任何問題。因此,可能會因為敲錯了一個命令,導致重要的系統文件被刪除。用root帳號的時候,要非常非常小心。因為安全原因,在不是絕對必要的情況下,不要用root帳號登錄。特別要注意的是:不在自己的服務器上的時候,千萬不要在別的計算機上用“root”登錄自己的服務器。這是非常非常非常糟糕的一件事。
7. 加密
加密時要用到密匙,密匙是一個特殊的數字,把密匙和需要加密的信息經過加密算法加密之後,只有知道密匙的人才能把信息讀出來。如果所有的計算機主機都在你的控制下,加密當然是一個好方法,但是,如果其中一台“被信任的”主機被黑客控制了,你馬上就有危險了。這就不僅僅是用戶的帳號和口令有危險了。在通常情況下,加密是用來保證機密信息在系統中傳送的安全。如果一台計算機被控制了,那麼這些加密信息就會讓人知道或是洩密了。有一個好的安全策略,這種危險的可能性會降到最低,但是如果某台主機的密匙被洩露出去,那麼危險始終存在。使用如:OpenSSL、SSH和MD5這樣的加密技術是非常有用的,可以參考後面的章節。
8. “/etc/exports"文件
如果通過NFS把文件共享出來,那麼一定要配置“/etc/exports”文件,使得訪問限制盡可能的嚴。這就是說,不要用通配符,不允許對根目錄有寫權限,而且盡可能只給只讀權限。編輯exports文件(vi /etc/exports)加入:
例如:
/dir/to/export host1.mydomain.com(ro,root_squash)
/dir/to/export host2.mydomain.com(ro,root_squash)
“/dir/to/export”是你想共享出來的目錄,host.mydomain.com是允許訪問這個目錄的計算機。ro代表只讀,root_squash代表不允許對根目錄進行寫操作。使這些改變生效,你還要運行“/usr/sbin/exportfs -a”命令。
注意:在服務器上裝NFS服務是會有安全隱患的,就我個人而言,不建議你使用NFS。
9. 禁止使用控制台程序
一個最簡單而且最常用的保證系統安全的方法就是禁止使用所有的控制台程序,如:shutdown和halt。可以運行下面的命令來實現:
[root@deep]# rm -f /etc/security/console.apps/servicename
這裡servicename是你要禁止的控制台程序名。除非你使用xdm,否則不要把xserver文件刪掉,如果這樣除了root之外,沒有人可以啟動X服務器了。(如果使用xdm啟動X服務器,這時root是唯一需要啟動X服務器的用戶,這才有必要把xserver文件刪掉)。例如:
[root@deep]# rm -f /etc/security/console.apps/halt
[root@deep]# rm -f /etc/security/console.apps/poweroff
[root@deep]# rm -f /etc/security/console.apps/reboot
[root@deep]# rm -f /etc/security/console.apps/shutdown
[root@deep]# rm -f /etc/security/console.apps/xserver (如果刪除,只有root可以啟動X).
這些命令就可以禁止所有的控制台程序:halt、poweroff、reboot和shutdown。記住,只有裝了Xwindow,刪除xerver文件才會有效果。
注意:根據我們前一章的介紹安裝服務器,Xwindow是沒有安裝上的,上面說的那些文件可能不會出現在“/etc/security”目錄下的,如果這樣就可以不管這一節介紹的方法。
10. 禁止控制台的訪問
為了禁止所有的控制台訪問,包括程序和文件,請在“/etc/pam.d/”目錄下的所有文件中,給那些包含pam_console.so的行加上注釋。這一步是上一章《禁止使用控制台程序》的延續。下面的腳本可以自動完成這項工作。轉成root身份,創建disabling.sh腳本文件(touch disabling.sh),接著加入下面這些行:
# !/bin/sh
cd /etc/pam.d
for i in * ; do
sed '/[^#].*pam_console.so/s/^/#/' < $i > foo && mv foo $i
done
用下面的命令使腳本有可執行的權限,並執行它:
[root@deep]# chmod 700 disabling.sh
[root@deep]# ./disabling.sh
這樣“/etc/pam.d”目錄下所有文件中包含“pam_console.so”的行都被加上注釋。這個腳本運行完之後,可以把它從系統中刪掉。
11. “/etc/inetd.conf”文件
inetd,也叫作“超級服務器”,根據網絡請求裝入網絡程序。“inetd.conf”文件告訴inetd監聽哪些網絡端口,為每個端口啟動哪個服務。把Linux系統放在任何的網絡環境中,第一件要做的事就是了解一下服務器到底要提供哪些服務。不需要的那些服務應該被禁止掉,最好卸載掉,這樣黑客就少了一些攻擊系統的機會。查看“/etc/inetd.conf”文件,了解一下inetd提供哪些服務。用加上注釋的方法(在一行的開頭加上#號),禁止任何不需要的服務,再給inetd進程發一個SIGHUP信號。
第一步:把文件的許可權限改成600。
[root@deep]# chmod 600 /etc/inetd.conf
第二步:確信文件的所有者是root。
[root@deep]# stat /etc/inetd.conf
這個命令顯示出來的信息應該是:
File: "/etc/inetd.conf"
Size: 2869 Filetype: Regular File
Mode: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 8,6 Inode: 18219 Links: 1
Aclearcase/" target="_blank" >ccess: Wed Sep 22 16:24:16 1999(00000.00:10:44)
Modify: Mon Sep 20 10:22:44 1999(00002.06:12:16)
Change: Mon Sep 20 10:22:44 1999(00002.06:12:16)
第三步:編輯inetd.conf文件(vi /etc/inetd.conf),禁止所有不需要的服務,如:ftp、 telnet、 shell、 login、 exec、talk、ntalk、 imap、 pop-2、pop-3、finger、auth,等等。如果你覺得某些服務有用,可以不禁止這些服務。但是,把這些服務禁止掉,系統受攻擊的可能性就會小很多。改變後的inetd.conf文件的內容如下面所示:
# To re-read this file after changes, just do a 'killall -HUP inetd'
#
#echo stream tcp nowait root internal
#echo dgram udp wait root internal
#discard stream tcp nowait root internal
#discard dgram udp wait root internal
#daytime stream tcp nowait root internal
#daytime dgram udp wait root internal
#chargen stream tcp nowait root internal
#chargen dgram udp wait root internal
#time stream tcp nowait root internal
#time dgram udp wait root internal
#
# These are standard services.
#
#ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
#telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
#
# Shell, login, exec, comsat and talk are BSD protocols.
#
#shell stream tcp nowait root /usr/sbin/tcpd in.rshd
#login stream tcp nowait root /usr/sbin/tcpd in.rlogind
#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd
#comsat dgram udp wait root /usr/sbin/tcpd in.comsat
#talk dgram udp wait root /usr/sbin/tcpd in.talkd
#ntalk dgram udp wait root /usr/sbin/tcpd in.ntalkd
#dtalk stream tcp wait nobody /usr/sbin/tcpd in.dtalkd
#
# Pop and imap mail services et al
#
#pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
#pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
#imap stream tcp nowait root /usr/sbin/tcpd imapd
#
# The Internet UUCP service.
#
#uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -l
#
# Tftp service is provided primarily for booting. Most sites
# run this only on machines acting as "boot servers." Do not uncomment
# this unless you *need* it.
#
#tftp dgram udp wait root /usr/sbin/tcpd in.tftpd
#bootps dgram udp wait root /usr/sbin/tcpd bootpd
#
# Finger, systat and netstat give out user information which may be
# valuable to potential "system crackers." Many sites choose to disable
# some or all of these services to improve security.
#
#finger stream tcp nowait root /usr/sbin/tcpd in.fingerd
#cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd
#systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx
#netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat -f inet
#
# Authentication
#
#auth stream tcp nowait nobody /usr/sbin/in.identd in.identd -l -e -o
#
# End of inetd.conf
注意:改變了inetd.conf文件之後,別忘了給inetd進程發一個SIGHUP信號(killall -HUP inetd)。
[root@deep /root]# killall -HUP inetd
第四步:
為了保證“inetd.conf”文件的安全,可以用chattr命令把它設成不可改變。把文件設成不可改變的只要用下面的命令:
[root@deep]# chattr +i /etc/inetd.conf
這樣可以避免“inetd.conf”文件的任何改變(意外或是別的原因)。一個有“i”屬性的文件是不能被改動的:不能刪除或重命名,不能創建這個文件的連接,不能往這個文件裡寫數據。只有系統管理員才能設置和清除這個屬性。如果要改變inetd.conf文件,你必須先清除這個不允許改變的標志:
[root@deep]# chattr -i /etc/inetd.conf
12. TCP_WRAPPERS
在默認情況下,RedHat Linux允許所有的服務請求。用TCP_WRAPPERS來保護服務器的安全,使其免受外部的攻擊,比想象的要簡單和輕松得多。在“/etc/hosts.deny”文件中加入“ALL: ALL@ALL, PARANOID”以禁止所有計算機訪問你的服務器,然後在“/etc/hosts.allow”文件中一個一個加入允許訪問你的服務器的計算機。這種作法是最安全的。
TCP_WRAPPERS是由兩個文件控制的,依次是:/etc/hosts.allow和/etc/hosts.deny。判斷是依次進行的,具體的規則如下:
* 如果在在/etc/hosts.allow文件中有匹配的項(daemon, client),那麼允許訪問;
* 否則,查看/etc/hosts.deny,如果找到匹配的項,那麼訪問被禁止;
* 否則,訪問被允許。
第一步:編輯hosts.deny文件(vi /etc/hosts.deny)加入下面這些行:
Access is denied by default.
# Deny access to everyone.
ALL: ALL@ALL, PARANOID #Matches any host whose name does not match its address, see bellow.
這樣做的意思是:所有的服務、訪問位置,如果沒有被明確地允許,也就是在/etc/hosts.allow中找不到匹配的項,就是被禁止的。
注意:加上“PARANOID”參數之後,如果要在服務器上使用telnet或ftp服務,就要在服務器的“/etc/hosts”文件中加入允許使用telnet和ftp服務的客戶端計算機的名字和IP地址。否則,在顯示登錄提示之前,因為DNS的域名解析,可能要等上幾分鐘時間。
第二步:編輯hosts.allow文件(vi /etc/hosts.allow)。例如,可以加入下面這些行(被授權訪問的計算機要被明確地列出來):
sshd: 208.164.186.1 gate.openarch.com
被授權訪問的計算機的IP地址是:208.164.186.1,主機名是:gate.openarch.com,允許使用的服務是:sshd。
第三步:tcpdchk是檢查TCP_WAPPERS配置的程序。它檢查TCP_WAPPERS的配置,並報告它可以發現的問題或潛在的問題。在所有的配置都完成了之後,請運行tcpdchk程序:
[root@deep]# tcpdchk
13. “/etc/aliases”文件
aliases文件如果管理錯誤或管理得太粗心了就會造成安全隱患。例如:很多的軟件產商都把“decode”這個別名放在aliases文件裡。這樣做的目的是為了方便通過email傳送二進制文件。在發送郵件的時候,用戶把二進制文件用“uuencode”轉成ASCII文件,然後把結果發給接受端的“decode”。由這個別名讓郵件信息通過“/usr/bin/uuencode”程序把二進制文件重新轉換成ASCII文件。如果允許“decode”出現在aliases文件中,可以想象將會有什麼樣的安全隱患。
把定義“decode”這個別名的行從aliases文件中刪除。同樣的,每一個會運行程序的別名都要好好查看一下,很有可能要把它們刪除掉。要使改動生效,還必須運行:
[root@deep]# /usr/bin/newaliases
編輯aliases文件(vi /etc/aliases),刪除或注釋掉下面這些行:
# Basic system aliases -- these MUST be present.
MAILER-DAEMON: postmaster
postmaster: root
# General redirections for pseudo accounts.
bin: root
daemon: root
#games: root ??remove or comment out.
#ingres: root ??remove or comment out.
nobody: root
#system: root ??remove or comment out.
#toor: root ??remove or comment out.
#uucp: root ??remove or comment out.
# Well-known aliases.
#manager: root ??remove or comment out.
#dumper: root ??remove or comment out.
#operator: root ??remove or comment out.
# trap decode to catch security attacks
#decode: root
# Person who should get root's mail
#root: marc
別忘了運行“/usr/bin/newaliases”使改變生效。
14. 防止sendmail被沒有授權的用戶濫用
最新版的sendmail(8.9.3)集成了很強大的防止垃圾郵件(anti-spam)的功能,可以防止郵件服務器被沒有授權的用戶濫用。要實現這個功能可以通過編輯“/etc/sendmail.cf”文件,改變配置文件以阻止那些發垃圾郵件的人。
編輯sendmail.cf文件(vi /etc/sendmail.cf),把這一行:
O PrivacyOptions=authwarnings
改為:
O PrivacyOptions=authwarnings,noexpn,novrfy
這些改變可以防止發垃圾郵件的人使用sendmail中的“EXPN”和“VRFY”命令。這些命令經常被沒有授權的人使用。參考本書sendmail配置這一節以獲得更多這方面的信息。
編輯sendmail.cf文件(vi /etc/sendmail.cf),把這一行:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
改為:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b NO UCE C=xx L=xx
這將改變sendmail接受連接時所顯示的提示信息。你要把“C=xx L=xx”中的“xx”改成你所在的國家和地區編碼。例如:我是這樣寫的“C=CA L=QC”,代表加拿大,魁北克。這個改變不會對sendmail有什麼影響,但是news.admin.net-abuse.email新聞組的人建議這麼做,主要是為了預防法律上的問題。
15. 使系統對ping沒有反應
防止你的系統對ping請求做出反應,對於網絡安全很有好處,因為沒人能夠ping你的服務器並得到任何反應。TCP/IP協議本身有很多的弱點,黑客可以利用一些技術,把傳輸正常數據包的通道用來偷偷地傳送數據。使你的系統對ping請求沒有反應可以把這個危險減到最小。用下面的命令:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
運行完這個命令後,系統對ping就沒有反應了。可以把這一行加到“/etc/rc.d/rc.local”文件中去,這樣當系統重新啟動的時候,該命令就會自動運行。對ping命令沒有反應,至少可以把絕大多數的黑客排除到系統之外,因為黑客不可能知道你的服務器在哪裡。重新恢復對ping的響應,可以用下面的命令:
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all"
16. 不要顯示系統提示信息
如果你不想讓遠程登錄的用戶看到系統的提示信息,你可以改變“/etc/inetd.conf”文件中的telnet設置:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
在末尾加上“-h”參數可以讓daemon不顯示任何系統信息,只顯示登錄提示。當然,只有在服務器上裝了telnet服務器才有這樣做的必要。
17. “/etc/host.conf”文件
Linux用解析器(resolver)庫把主機名翻譯成IP地址。“/etc/host.conf”文件定義主機名是怎樣解析的。“/etc/host.conf”文件中的那些項告訴解析器庫用什麼服務,以什麼順序解析主機名。
編輯host.conf文件(vi /etc/host.conf)加入下面這些行:
# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We have machines with multiple IP addresses.
multi on
# Check for IP address spoofing.
nospoof on
order選項指明的是選擇服務的順序。上面“order bind, hosts”說的是解析器庫解析文件名的時候先查詢域名服務器,然後再查看“/etc/hosts”文件。因為性能和安全上的原因,最好將解析器庫的查找順序設成先查域名服務器(bind)。當然也要先安裝了DNS/BIND軟件,否則這樣配置根本沒有任何作用。
multi選項決定在“/etc/hosts”文件中出現的主機能不能有多個IP地址(多個網絡界面)。具有多個IP網絡界面的主機被稱為具有多個網絡界面(multiomed),因為同時有多個IP地址也就意味著這台主機有多個網絡界面。例如:網關服務器就有多個IP地址,必須把這個選項設成ON。
nospoof選項指明不允許IP偽裝。IP偽裝是把自己偽裝成別的計算機去欺騙其它的計算機,獲得它的信任。這種攻擊方法把自己偽裝成別的服務器,並且與其它客戶機、服務器和大型數據存儲系統建立網絡連接或其它類型的網絡活動。不管對任何類型的服務器,這個選項都要設成ON。
18. 路由協議
路由和路由協議會導致一些問題。IP原路徑路由(IP source routing),也就是IP包包含到達底目的地址的詳細路徑信息,是非常危險的,因為根據RFC 1122規定目的主機必須按原路徑返回這樣的IP包。如果黑客能夠偽造原路徑路由的信息包,那麼它就能截取返回的信息包,並且欺騙你的計算機,讓它覺得正在和它交換信息的是可以信任的主機。我強烈建議你禁止IP原路徑路由以避免這個安全漏洞。
用下面的命令在你的服務器上禁止IP原路徑路由:
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done
把上面的命令加到“/etc/rc.d/rc.local”文件中去,你就不用在系統重新啟動之後再把這些命令敲一遍。注意,上面的命令將禁止所有的網絡界面(lo、ethN、pppN,等等)的原路徑路由包。如果你打算安裝書中介紹的IPCHAINS防火牆,就不必用這些命令了,因為在防火牆的腳本文件中已經包含這些命令了。
19. 使TCP SYN Cookie保護生效
“SYN Attack”是一種拒絕服務(DoS)的攻擊方式,會消耗掉系統中的所有資源,迫使服務器重新啟動。拒絕服務(這種攻擊方式用巨大的信息流來消耗系統的資源,以至於服務器不能夠響應正常的連接請求)是很容易被黑客利用的。在2.1系列的內核中,syn cookie只是一個可選項,並沒有使其生效。想要使其生效必須用下面的命令:
[root@deep]# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
把這個命令加入“/etc/rc.d/rc.local”文件中,等下次系統重新啟動的時候就不必重新敲一遍了。如果打算安裝IPCHAINS防火牆,你就沒有必要用這個命令,因為它已經包含在防火牆的腳本文件裡了。
20. 防火牆
安全問題的另一個解決方案是把計算機主機和內部計算機間的信息傳送同外部的網絡隔離開,只讓內部網絡與外部網絡之間的信息交流,通過一個安全的網關進行。這樣一個網關叫做防火牆,在下面的一些章節我們會用很大的篇幅介紹防火牆。
21. “/etc/services”文件
端口號和標准服務之間的對應關系在RFC 1700 “Assigned Numbers"中有詳細的定義。“/etc/services”文件使得服務器和客戶端的程序能夠把服務的名字轉成端口號,這張表在每一台主機上都存在,其文件名是“/etc/services”。只有“root”用戶才有權限修改這個文件,而且在通常情況下這個文件是沒有必要修改的,因為這個文件中已經包含了常用的服務所對應的端口號。為了提高安全性,我們可以給這個文件加上保護以避免沒有經過授權的刪除和改變。為了保護這個文件可以用下面的命令:
[root@deep]# chattr +i /etc/services
22. “/etc/securetty”文件
“/etc/securetty”文件允許你規定“root”用戶可以從那個TTY設備登錄。登錄程序(通常是“/bin/login”)需要讀取“/etc/securetty”文件。它的格式是:列出來的tty設備都是允許登錄的,注釋掉或是在這個文件中不存在的都是不允許root登錄的。
注釋掉(在這一行的開頭加上#號)所有你想不讓root登錄的tty設備。
編輯securetty文件(vi /etc/securetty)象下面一樣,注釋掉一些行:
tty1
#tty2
#tty3
#tty4
#tty5
#tty6
#tty7
#tty8
上面這樣做的意思是只允許root在tty1上登錄。我建議只允許root在一個tty設備上登錄,如果從其它tty上登錄,用“su”命令把身份轉成“root”。
23. 特殊的帳號
禁止操作系統中不必要的預置帳號(每次升級或安裝完都要檢查一下)。Linux系統中就提供這樣一些你可能不需要的預置帳號。如果確實不需要這些帳號,就把它們刪掉。系統中有越多的帳號,就越容易受到攻擊。
我們假定你已經在系統中使用shadow口令。如果不是這樣,最好在系統中加上shadow口令的支持,因為這樣系統會更安全。如果你是按照上一章介紹的方法安裝服務器,那麼在“安全驗證配置”這一步就已經選上“Enable Shaow Passwords”這個選項了。
* 在系統中刪除一個用戶可以用這個命令:
[root@deep]# userdel username
* 在系統中刪除一個組可以用這個命令:
[root@deep]# groupdel username
第一步
用下面的命令刪除一些不必要的用戶:
[root@deep]# userdel adm
[root@deep]# userdel lp
[root@deep]# userdel sync
[root@deep]# userdel shutdown
[root@deep]# userdel halt
[root@deep]# userdel news
[root@deep]# userdel uucp
[root@deep]# userdel operator
[root@deep]# userdel games (如果不用X Window服務器,可以刪除這個用戶)
[root@deep]# userdel gopher
[root@deep]# userdel ftp (如果沒安裝匿名ftp服務器,可以刪除這個用戶)
第二步
輸入下面的命令刪除一些不必要的組:
[root@deep]# groupdel adm
[root@deep]# groupdel lp
[root@deep]# groupdel news
[root@deep]# groupdel uucp
[root@deep]# groupdel games (delete this group if you don't use X Window Server).
[root@deep]# groupdel dip
[root@deep]# groupdel pppusers
[root@deep]# groupdel popusers (delete this group if you don't use pop server for email).
[root@deep]# groupdel slipusers
第三步
在系統中加入必要的用戶:
* 在系統中添加用戶,用這個命令:
[root@deep]# useradd username
* 給系統中的用戶添加或改變口令,用這個命令:
[root@deep]# passwd username
例如:
[root@deep]# useradd admin
[root@deep]# passwd admin
這些命令的輸出是這樣的:
Changing password for user admin
New UNIX password: somepasswd
passwd: all authentication tokens updated successfully
第四步
“不許改變”位可以用來保護文件使其不被意外地刪除或重寫,也可以防止有些人創建這個文件的符號連接。刪除“/etc/passwd”、“/etc/shadow”、“/etc/group”或“/etc/gshadow”都是黑客的攻擊方法。
給口令文件和組文件設置不可改變位,可以用下面的命令:
[root@deep]# chattr +i /etc/passwd
[root@deep]# chattr +i /etc/shadow
[root@deep]# chattr +i /etc/group
[root@deep]# chattr +i /etc/gshadow
注意:如果將來要在口令或組文件中增加或刪除用戶,就必須先清除這些文件的不可改變位,否則就不能做任何改變。如果沒有清除這些文件的不可改變位,安裝那些會自動在口令文件和組文件中加入新用戶的rpm軟件包的時候,在安裝過程中就會出現出錯的提示。
24. 防止任何人都可以用su命令成為root
如果不想任何人都可以用“su”命令成為root或只讓某些用戶有權使用“su”命令,那麼在“/etc/pam.d/su”文件中加入下面兩行。我建議盡量限制用戶通過“su”命令成為root。
第一步
編輯su文件(vi /etc/pam.d/su)在文件的頭部加入下面兩行:
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_wheel.so group=wheel
加入這兩行之後,“/etc/pam.d/su”文件變為:
#%PAM-1.0
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_wheel.so group=wheel
auth required /lib/security/pam_pwdb.so shadow nullok
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so shadow use_authtok nullok
session required /lib/security/pam_pwdb.so
session optional /lib/security/pam_xauth.so
這兩行的意思是只有“wheel”組的成員才能用su命令成為root。注意,“wheel”組是系統中用於這個目的的特殊帳號。不能用別的組名。把這節介紹的方法和《22. “/etc/securetty”文件》中介紹的方法結合起來,可以更好地加強系統的安全性。
第二步
我們在“/etc/pam.d/su”配置文件中定義了“wheel”組,現在介紹一下怎樣讓一些用戶可以用“su”命令成為“root”。下面是一個例子,讓admin用戶成為“wheel”組的成員,這樣就可以用“su”命令成為“root”:
[root@deep]# usermod -G10 admin
“G”是表示用戶所在的其它組。“10”是“wheel”組的ID值,“admin”是我們加到“wheel”組的用戶。用同樣的命令可以讓其他的用戶可以用su命令成為root。
25. 資源限制
限制用戶對系統資源的使用,可以避免拒絕服務(如:創建很多進程、消耗系統的內存,等等)這種攻擊方式。這些限制必須在用戶登錄之前設定。例如,可以用下面的方法對系統中用戶加以。
第一步
編輯limits.conf文件(vi /etc/security/limits.conf),加入或改變下面這些行:
* hard core 0
* hard rss 5000
* hard nproc 20
這些行的的意思是:“core 0”表示禁止創建core文件;“nproc 20”把最多進程數限制到20;“rss 5000”表示除了root之外,其他用戶都最多只能用5M內存。上面這些都只對登錄到系統中的用戶有效。通過上面這些限制,就能更好地控制系統中的用戶對進程、core文件和內存的使用情況。星號“*”表示的是所有登錄到系統中的用戶。
第二步
必須編輯“/etc/pam.d/login”文件,在文件末尾加入下面這一行:
session required /lib/security/pam_limits.so
加入這一行後“/etc/pam.d/login”文件是這樣的:
#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_pwdb.so shadow nullok
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so nullok use_authtok md5 shadow
session required /lib/security/pam_pwdb.so
session required /lib/security/pam_limits.so
#session optional /lib/security/pam_console.so
26. 更好地控制mount上的文件系統
可以用一些選項,如:noexec、nodev和nosuid,更好地控制mount上的文件系統,如:“/home”和“/tmp”。這些都在“/etc/fstab”文件中設定。fstab文件包含了各個文件系統的描述信息。如果想知道在這個文件中可以設定哪些選項,請用man命令查看關於mount的幫助。
編輯fstab文件(vi /etc/fstab),並根據需要把這兩行:
/dev/sda11 /tmp ext2 defaults 1 2
/dev/sda6 /home ext2 defaults 1 2
改變成:
/dev/sda11 /tmp ext2 nosuid,nodev,noexec 1 2
/dev/sda6 /home ext2 nosuid,nodev 1 2
“nodev”表示不允許在這個文件系統上有字符或特殊的塊設備。“nosuid”表示不允許設定文件的suid(set-user-identifier)和sgid(set-group-identifier)許可位。“noexec”表示不允許文件系統上有任何可執行的二進制文件。
注意:上面的例子中,“/dev/sda11”mount到“/tmp”目錄上,而“/dev/sd6”mount到“/home”目錄上。當然這和你的實際情況會有所不同,這些取決於你是怎麼分區的以及用什麼樣的硬盤,例如:IDE硬盤是hda、hdb,等等,而SCSI硬盤是sda、sdb,等等。
27. 把rpm程序轉移到一個安全的地方,並改變默認的訪問許可
一旦在Linux服務器上用rpm命令安裝完所有需要的軟件,最好把rpm程序轉移到一個安全的地方,如:軟盤或其它你認為安全的地方。因為如果有人入侵了你的服務器,他就不能用rpm命令安裝那些有害的軟件。當然,如果將來要用rpm安裝新的軟件,你就要把rpm程序拷回原來的目錄。
* 把rpm程序移到軟盤上,用下面的命令:
[root@deep]# mount /dev/fd0 /mnt/floppy/
[root@deep]# mv /bin/rpm /mnt/floppy/
[root@deep]# umount /mnt/floppy
注意:千萬不要把rpm程序從系統中卸載掉,否則以後就不能重新安裝它,因為安裝rpm程序或其它軟件包本身就要用rpm命令。
還有一點要注意的是,把rpm命令的訪問許可從默認的755改成700。這樣非root用戶就不能使用rpm命令了。特別是考慮到萬一在安裝完新軟件之後忘了把rpm程序移到一個安全的地方,這樣做就更有必要了。
* 改變“/bin/rpm”默認的訪問權限,用下面這個命令:
[root@deep]# chmod 700 /bin/rpm
28. 登錄shell
為了方便重復輸入很長的命令,bash shell可以在“~/.bash_history”文件(“~/”是家目錄,每個用戶都是不一樣的)中存500個曾經輸入過的命令。每一個有自己帳號的用戶,在自己的家目錄中,都會有“.bash_history”文件。可能會有這種情況,用戶在不該輸入口令的地方輸入了口令,而輸入的口令會在“.bash_history”文件中保存下來。而且“.bash_history”文件越大這種可能性也越大。
在“/etc/profile”文件中HISTFILESIZE和HISTSIZE這兩行決定了系統中所有用戶的“.bash_history”文件可以保存多少命令。我建議把“/etc/profile”文件中的HISTFILESIZE和HISTSIZE都設成一個比較小的值,如:20。
編輯profile文件(vi /etc/profile),把這些行改成:
HISTFILESIZE=20
HISTSIZE=20
這樣每個用戶家目錄下的“.bash_history”就最多只能存20個命令。如果黑客試圖在用戶的“~/.bash_history”文件中發現一些口令,他就沒有什麼機會了。
29. “/etc/lilo.conf”文件
LILO是Linux上一個多功能的引導程序。它可以用於多種文件系統,也可以從軟盤或硬盤上引導Linux並裝入內核,還可以做為其它操作系統的“引導管理器”。
根(/)文件系統對LILO來說很重要,有下面這兩個原因:第一:LILO要告訴內核到那裡去找根文件系統;第二:LILO要用到的一些東西,如:引導扇區、“/boot”目錄和內核就存放在根文件系統中。引導扇區包括LILO引導程序的第一部分,這個部分在引導階段的後半部分還要裝入更大的引導程序。這兩個引導程序通常存在“/boot/boot.b”文件中。內核是由引導程序裝入並啟動的。在RedHat Linux系統中,內核通常在根目錄或“/boot”目錄下。
因為LILO對Linux系統非常重要,所以我們要盡可能地保護好它。LILO最重要的配置文件是“/etc”目錄下的“lilo.conf”文件。用這個文件我們可以配置或提高LILO程序以及Linux系統的安全性。下面是LILO程序的三個重要的選項設置。
* 加入:timeout=00
這項設置設定LILO在引導默認的系統之前,等候用戶輸入的時間。 C2安全等級規定這個時間間隔必須設成0,因為多重引導會使系統的安全措施形同虛設。除非想用多重引導,否則最好把這項設成0。
* 加入:restricted
當LILO引導的時候,輸入參數linux single,進入單用戶(single)模式。因為單用戶模式沒有口令驗證,所以可以在LILO引導時,加上口令保護。“restricted”選項只能和“password”合起來用。注意要給每個內核都要加上口令保護。
* 加入:password=password
用單用戶模式啟動Linux系統的時候,系統要求用戶輸入這個口令。口令是大小寫敏感的,而且要注意,要讓“/etc/lilo.conf”文件,除了root之外,其他用戶沒有讀的權限,這樣也就看不到口令了。下面是用“lilo.conf”文件保護LILO的一個具體例子。
第一步
編輯lilo.conf文件(vi /etc/lilo.conf),加上或改變下面介紹的三個設置:
boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=00 ??change this line to 00.
Default=linux
restricted ??add this line.
password=password ??add this line and put your password.
image=/boot/vmlinuz-2.2.12-20
label=linux
initrd=/boot/initrd-2.2.12-10.img
root=/dev/sda6
read-only
第二步
因為“/etc/lilo.conf”配置文件裡,存在沒有經過加密的口令,所以只有root才能有讀的權限。用下面的命令改變文件的權限:
[root@deep]# chmod 600 /etc/lilo.conf (will be no longer world readable).
第三步
使改變後的“/etc/lilo.conf”配置文件生效:
[root@deep]# /sbin/lilo -v (to update the lilo.conf file).
第四步
為了更安全一點,可以用chattr命令給“lilo.conf”文件加上不可改變的權限。
* 讓文件不可改變用下面的命令:
[root@deep]# chattr +i /etc/lilo.conf
這樣可以避免“lilo.conf”文件因為意外或其它原因而被改變。如果想要改變“lilo.conf”文件,必須先清除它的不可改變標志。
* 清除不可改變的標記用下面的命令:
[root@deep]# chattr -i /etc/lilo.conf
30. 使Control-Alt-Delete關機鍵無效
把“/etc/inittab”文件中的一行注釋掉可以禁止用Control-Alt-Delete關閉計算機。如果服務器不是放在一個安全的地方,這非常重要。
編輯inittab文件(vi /etc/inittab)把這一行:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
改為:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
用下面的命令使改變生效:
[root@deep]# /sbin/init q
31. 創建所有重要的日志文件的硬拷貝
保證在“/var/log”目錄下的不同日志文件的完整性是保證系統安全所要考慮的非常重要的一個方面。如果我們在服務器上已經加上了很多安全措施,黑客還是能夠成功入侵,那麼日志文件就是我們最後的防范措施。因此,很有必要考慮一下用什麼方法才能保證日志文件的完整性。如果服務器上或網絡中的其它服務器上已經安裝了打印機,就可以把重要的日志文件打印出來。這要求有一個可以連續打印的打印機,並用syslog把所有重要的日志文件傳到“/dev/lp0”(打印設備)。黑客可以改變服務器上的文件、程序,等等,但是,把重要的日志文件打印出來之後,他就無能為力了。
例如:
記錄下服務器上所有的telnet、mail、引導信息和ssh連接,並打印到連接在這台服務器上的打印機。需要在“/etc/syslog.conf”文件中加入一行。
編輯syslog.conf文件(vi /etc/syslog.conf),在文件末尾加入下面這一行:
authpriv.*;mail.*;local7.*;auth.*;daemon.info /dev/lp0
重新啟動syslog daemon使改動生效:
[root@deep]# /etc/rc.d/init.d/syslog restart
又例如:
記錄下服務器上所有的telnet、mail、引導信息和ssh連接,並打印到本地網絡中其它服務器上連接的打印機,要在這台接收日志文件的服務器的“/etc/syslog.cof”文件中加入一行。如果本地網中沒有打印機,可以把所有的日志文件拷貝到別的服務器上,只要忽略下面第一步,把“/dev/lp0”加到其它服務器的“syslog.conf”文件中,直接跳到在其它服務器上設置“-r”參數那一步。把所有日志文件拷貝到其它計算機上,使你可以在一台計算機上管理多台計算機的日志文件,從而簡化管理工作。
編輯接收日志文件的服務器(例如:mail.openarch.com)上的syslog.conf文件(vi /etc/syslog.conf),在文件的末尾加入下面這一行:
authpriv.*;mail.*;local7.*;auth.*;daemon.info /dev/lp0
因為syslog daemon的默認配置是拒絕接收來自網絡上的信息,我們必須使它能夠接收來自網絡上的信息,在syslog daemon的腳本文件(指的是接收日志文件的服務器上的腳本文件)中加入下面的“-r”參數。
編輯syslog腳本文件(vi +24 /etc/rc.d/init.d/syslog),把這一行:
daemon syslogd -m 0
改為:
daemon syslogd -r -m 0
重新啟動syslog daemon使改動生效:
[root@mail]# /etc/rc.d/init.d/syslog restart
如果接收日志文件的服務器上有防火牆,你可以檢查一下防火牆的腳本文件中有沒有下面幾行(沒有就加上):
ipchains -A input -i $EXTERNAL_INTERFACE -p udp
-s $SYSLOG_CLIENT
-d $IPADDR 514 -j ACCEPT
在這個例子中防火牆的腳本文件中定義了EXTERNAL_INTERFACE="eth0";
IPADDR="208.164.186.2";
SYSLOG_CLIENT="208.164.168.0/24"
重新啟動接收日志文件的服務器上的防火牆,使改動生效:
[root@mail]# /etc/rc.d/init.d/firewall restart
這個防火牆規則允許接收日志文件的服務器接收來自端口514(syslog的端口)的UDP包。關於防火牆的資料可以查看《第七章 網絡防火牆》。
最後,編輯一下發送日志文件的服務器上的“syslog.conf”文件(vi /etc/syslog.conf),在末尾加上這一行:
authpriv.*;mail.*;local7.*;auth.*;daemon.info @mail
“mail”是接收日志文件的計算機主機名。如果有人試圖黑你的計算機並且威脅把所有重要的系統日志文件都刪掉,你就不用怕了,因為你已經打印出來或者在別的地方還有一個拷貝。這樣就可以根據這些日志文件分析出黑客在什麼地方,然後出理這次入侵事件。
重新啟動syslog daemon,使改變生效:
[root@deep]# /etc/rc.d/init.d/syslog restart
同樣也要看看發送日志文件的服務器的防火牆的腳本文件中有沒有這幾行(沒有加上);
ipchains -A output -i $EXTERNAL_INTERFACE -p udp
-s $IPADDR 514
-d $SYSLOG_SERVER 514 -j ACCEPT
這裡防火牆的腳本文件中定義了:
EXTERNAL_INTERFACE="eth0"
IPADDR="208.164.186.1"
SYSLOG_SERVER="mail.openarch.com"
重新啟動防火牆,使改變生效:
[root@deep]# /etc/rc.d/init.d/firewall restart
這個防火牆的規則允許發送日志文件的服務器通過端口514(syslog端口)發送UDP包。關於防火牆的資料可以查看《第七章 網絡防火牆》。
注意:千萬不要用網關服務器來收集和管理所有的系統日志信息。有關syslogd程序的其它一些參數和策略,可以用man命令查看幫助:syslogd(8)、syslog(2)和syslog.conf(5)。
32. 改變“/etc/rc.d/init.d/”目錄下的腳本文件的訪問許可
改變啟動和停止daemon的腳本文件的權限。
[root@deep]# chmod -R 700 /etc/rc.d/init.d/*
這樣只有root可以讀、寫和執行這個目錄下的腳本。我想一般用戶沒有什麼必要知道腳本文件的內容。
注意:如果你安裝或升級了一個程序,要用到“/etc/rc.d/init.d/”中system V腳本,不要忘記再檢查一下改變和檢查這個腳本文件的許可。
33. “/etc/rc.d/rc.local”文件
在默認情況下,當登錄裝有Linux系統的計算機時,系統會告訴你Linux發行版的名字、版本號、內核版本和服務器名稱。這洩露了太多的系統信息。最好只顯示一個“Login:”的提示信息。
第一步
編輯“/ect/rc.d/rc.local”文件,在下面這些行的前面加上“#”:
--
# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" > /etc/issue
#echo "$R" >> /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue
--
第二步
刪除“/etc”目錄下的“issue.net”和“issue”文件:
[root@deep]# rm -f /etc/issue
[root@deep]# rm -f /etc/issue.net
注意:“/etc/issue.net”文件是用戶從網絡登錄計算機時(例如:telnet、SSH),看到的登錄提示。同樣在“/etc”目錄下還有一個“issue”文件,是用戶從本地登錄時看到的提示。這兩個文件都是文本文件,可以根據需要改變。但是,如果想刪掉這兩個文件,必須向上面介紹的那樣把“/etc/rc.d/rc.local”腳本中的那些行注釋掉,否則每次重新啟動的時候,系統又會重新創建這兩個文件。
34. 帶“s”位的程序
用ls -l命令列出來的文件,如果文件的權限位中出現“s”,則這些文件的SUID(-rwsr-xr-x)或SGID(-r-xr-sr-x)位被設定了。因為這些程序給執行它的用戶一些特權,所以如果不需要用到這些特權,最好把這些程序的“s”位移去。可以用下面這個命令“chmod a -s 文件名”移去相應文件的“s”位。
可以清除“s”位的程序包括但不限於:
1) 重來不用的程序
2) 不希望非root用戶運行的程序
3) 偶爾用用,但是不介意先用su命令變為root後再運行。
下面加了星號(*)的程序,我個人認為有必要移去“s”位。注意,系統可能需要一些SUID的程序才能正常運行,所以要千萬小心。
* 用下面的命令查找所有帶“s”位的程序:
[root@deep]# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {} ;
*-rwsr-xr-x 1 root root 35168 Sep 22 23:35 /usr/bin/chage
*-rwsr-xr-x 1 root root 36756 Sep 22 23:35 /usr/bin/gpasswd
*-r-xr-sr-x 1 root tty 6788 Sep 6 18:17 /usr/bin/wall
-rwsr-xr-x 1 root root 33152 Aug 16 16:35 /usr/bin/at
-rwxr-sr-x 1 root man 34656 Sep 13 20:26 /usr/bin/man
-r-s--x--x 1 root root 22312 Sep 25 11:52 /usr/bin/passwd
-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/suidperl
-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/sperl5.00503
-rwxr-sr-x 1 root slocate 24744 Sep 20 10:29 /usr/bin/slocate
*-rws--x--x 1 root root 14024 Sep 9 01:01 /usr/bin/chfn
*-rws--x--x 1 root root 13768 Sep 9 01:01 /usr/bin/chsh
*-rws--x--x 1 root root 5576 Sep 9 01:01 /usr/bin/newgrp
*-rwxr-sr-x 1 root tty 8328 Sep 9 01:01 /usr/bin/write
-rwsr-xr-x 1 root root 21816 Sep 10 16:03 /usr/bin/crontab
*-rwsr-xr-x 1 root root 5896 Nov 23 21:59 /usr/sbin/usernetctl
*-rwsr-xr-x 1 root bin 16488 Jul 2 10:21 /usr/sbin/traceroute
-rwxr-sr-x 1 root utmp 6096 Sep 13 20:11 /usr/sbin/utempter
-rwsr-xr-x 1 root root 14124 Aug 17 22:31 /bin/su
*-rwsr-xr-x 1 root root 53620 Sep 13 20:26 /bin/mount
*-rwsr-xr-x 1 root root 26700 Sep 13 20:26 /bin/umount
*-rwsr-xr-x 1 root root 18228 Sep 10 16:04 /bin/ping
*-rwxr-sr-x 1 root root 3860 Nov 23 21:59 /sbin/netreport
-r-sr-xr-x 1 root root 26309 Oct 11 20:48 /sbin/pwdb_chkpwd
* 用下面的命令禁止上面選出來的SUID的程序:
[root@deep]# chmod a-s /usr/bin/chage
[root@deep]# chmod a-s /usr/bin/gpasswd
[root@deep]# chmod a-s /usr/bin/wall
[root@deep]# chmod a-s /usr/bin/chfn
[root@deep]# chmod a-s /usr/bin/chsh
[root@deep]# chmod a-s /usr/bin/newgrp
[root@deep]# chmod a-s /usr/bin/write
[root@deep]# chmod a-s /usr/sbin/usernetctl
[root@deep]# chmod a-s /usr/sbin/traceroute
[root@deep]# chmod a-s /bin/mount
[root@deep]# chmod a-s /bin/umount
[root@deep]# chmod a-s /bin/ping
[root@deep]# chmod a-s /sbin/netreport
如果你想知道這些程序到底有什麼用,可以用man命令查看幫助。
例如:
[root@deep]# man netreport
35. 異常和隱含文件
在系統的每個地方都要查看一下有沒有異常和隱含文件(點號是起始字符的,用“ls”命令看不到的文件),因為這些文件可能是隱藏的黑客工具或者其它一些信息(口令破解程序、其它系統的口令文件,等等)。在UNIX下,一個常用的技術就是用一些特殊的名,如:“...”、“.. ”(點點空格)或“..^G”(點點control-G),來隱含文件或目錄。用“find”程序可以查找到這些隱含文件。
例如:
[root@deep]# find / -name ".. " -print -xdev
[root@deep]# find / -name ".*" -print -xdev | cat -v
同時也要注意象“.xx”和“.mail”這樣的文件名的。(這些文件名看起來都很象正常的文件名)
36. 查找所有SUID/SGID位有效的文件
系統中SUID和SGID文件很有可能成為安全隱患,必須被嚴密監控。因為這些程序都給執行它的用戶一些特權,所以要確保危險的SUID程序沒有被安裝。
黑客常常利用SUID程序,故意留下一個SUID的程序作為下次進入系統的後門。注意系統中所有的SUID和SGID的程序,並跟蹤它們,這樣你就可以盡早發現入侵者。
用下面的命令查找系統中所有的SUID和SGID程序:
[root@deep]# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {} ;
注意:參考《第九章 安全軟件》中關於sXid的介紹,sXid可以為你每天自動的完成這項任務,並用email報告結果。
37. 查找任何人都有寫權限的文件和目錄
如果黑客獲得並改變了一些系統文件,這些系統文件就會成為安全漏洞。任何人都有寫權限的目錄也同樣有危險,因為黑客可以根據他們的需要自由地添加或刪除文件。在正常情況下有些文件是可寫的,包括一些“/dev”目錄下的文件和符號連接。
在系統中定位任何人都有寫權限的文件和目錄用下面的命令:
[root@deep]# find / -type f ( -perm -2 -o -perm -20 ) -exec ls -lg {} ;
[root@deep]# find / -type d ( -perm -2 -o -perm -20 ) -exec ls -ldg {} ;
注意:象Tripware軟件這樣的文件和目錄完整性的檢查器能夠掃描、管理和方便地發現被改變過的任何人都有寫權限的文件。參考《第九章 安全軟件》以獲得關於Tripware的更多信息。
38. 查找沒有主人的文件
發現沒有主人的文件就意味著有黑客入侵你的系統了。不能允許沒有主人的文件存在。如果在系統中發現了沒有主人的文件或目錄,先查看它的完整性,如果一切正常,給它一個主人。有時候卸載程序可能會出現一些沒有主人的文件或目錄,在這種情況下可以把這些文件和目錄刪除掉。
定位系統中沒有主人的文件用下面的命令:
[root@deep]# find / -nouser -o -nogroup
注意:不用管“/dev”目錄下的那些文件。
39. 查找“.rhosts”文件
查找“.rhosts”文件是日常管理工作的一部分,因為這些文件不允許在系統中存在。記住,黑客有可能只要有一個帳號就可能入侵整個網絡。
可以用下面的命令定位系統中的“.rhosts”文件:
[root@deep]# find /home -name .rhosts
也可以用一個cron任務定期地查看、報告和刪除$HOME/.rhosts文件。同時,也必須讓用戶知道你會經常地進行這種審核。
用root身份在“/etc/cron.daily”目錄下,創建“find_rhosts_files”腳本文件(touch /etc/cron.daily/find_rhosts_files),並在腳本文件中加入下面幾行:
#!/bin/sh
/usr/bin/find /home -name .rhosts | (cat <<EOF
This is an automated report of possible existent ".rhosts" files on the server
deep.openarch.com, generated by the find utility command.
New detected ".rhosts" files under the "/home" directory include:
EOF
cat
) | /bin/mail -s "Content of .rhosts file audit report" root
然後,讓這個腳本可執行,把所有者和組設置成“root”:
[root@deep]# chmod 755 /etc/cron.daily/find_rhosts_files
[root@deep]# chown 0.0 /etc/cron.daily/find_rhosts_files
每一天都會有一份主題為“Content of .rhosts file audit report”的郵件發給“root”,報告新發現的“.rhosts”文件。
40. 系統已經被黑客控制
如果你確信系統已經被黑客控制,趕快聯系CERT(r) Coordination Center或FIRST(Forum of Incident Response and Security Teams)。
電子郵件:[email protected]
CERT熱線電話:(+1) 412-268-7090
傳真:(+1) 412-268-6989
CERT/CC的人員在工作日回答問題的時間是:8:00 a.m. - 8:00 p.m. EST (GMT -5)/EDT (GMT -4));在其它時間或者節假日他們也接收緊急求救電話。