一個SUN系統(tǒng)就象和NT系統(tǒng)一樣,容易受到來自internet的各種可惡的攻擊。幸運(yùn)的是,不象NT,你可以用以下三個簡單的手段把SUN變的相對安全些,它們是:
1)防止堆棧溢出
2)關(guān)閉不用的服務(wù)
3)給系統(tǒng)打補(bǔ)丁
1. 防止堆棧溢出
至少90%以上的安全問題都是來自所謂的“堆棧溢出”。攻擊者通過給一個以root身份運(yùn)行的程序提供比它所預(yù)期的輸入多得多的東西,使被攻擊程序無法處理而改變執(zhí)行流程去執(zhí)行攻擊者指定的代碼。
Solaris 2.6和Solaris 7都具備把用戶堆棧設(shè)成不可執(zhí)行的能力,以使這種攻擊不能得逞。要使能這個特點(diǎn):
0)變成root
1)對/etc/system文件做個拷貝
cp /etc/system /etc/system.BACKUP
2)用你最鐘愛的編輯器編輯/etc/system文件
3)到文件的最后,插入以下幾行:
set noexec_user_stack=1
set noexec_user_stack_log=1
4)保存文件,退出編輯器
一旦重啟機(jī)器,這些改變就會生效。如果這不是一個你可以關(guān)閉的系統(tǒng),那么你用adb來改變一個運(yùn)行中的系統(tǒng)的參數(shù)也是可能的,但這不是我個人樂意去干的事。
當(dāng)然會有些合法使用可執(zhí)行堆棧的程序在你做出如上改變后而不能正常運(yùn)行。所幸的是這樣的程序的并不多,我所知的就只有GNU ada 編譯器。
2. 在inetd.conf中關(guān)閉用不著的服務(wù)
有許多用不著的服務(wù)自動的處于使能狀態(tài)。它們中可能存在的漏洞將使攻擊者甚至不需要一個賬戶就能控制你的機(jī)器。關(guān)閉這些不需要的服務(wù)來保護(hù)你的系統(tǒng),你可以用如下方法來關(guān)閉:
0)變成root
1)對inetd的配置文件/etc/inetd.conf做個拷貝
cp /etc/inetd.conf /etc/inetd.conf.BACKUP
2)編輯/etc/inetd.conf文件
未被激活的服務(wù)是在前面被“#“符號注釋掉的,舉個例子,你的部份inetd.conf可能是這樣的:
# Tnamed serves the obsolete IEN-116 name server protocol.
#
name dgram udp wait root /usr/sbin/in.tnamed in.tnamed
不需要這個服務(wù),因?yàn)槟銈冎械?9.999%不會用到這個“已經(jīng)被廢棄的IEN-116名字服務(wù)
協(xié)議“,把這個注釋掉以后,這行看起來會象是:
# Tnamed serves the obsolete IEN-116 name server protocol.
#
#name dgram udp wait root /usr/sbin/in.tnamed in.tnamed
^
|
看到這個新的“#” 符號了吧
我建議注釋掉幾乎所有的服務(wù),只留下:
ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd
telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd
time stream tcp nowait root internal
time dgram udp wait root internal
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
rstatd/2-4 tli rpc/datagram_v wait root /usr/lib/netsvc/rstat/rpc.rstatd
rpc.rstatd
fs stream tcp wait nobody /usr/openwin/lib/fs.auto fs
100083/1 tli rpc/tcp wait root /usr/dt/bin/rpc.ttdbserverd
rpc.ttdbserverd
在只需要不多圖形操作的服務(wù)器或是要保證相當(dāng)?shù)陌踩阋苍S應(yīng)該關(guān)掉字體服務(wù)fs,也可以關(guān)掉系統(tǒng)性能監(jiān)視器rstatd和tooltalk服務(wù)器ttdbserverd。事實(shí)上在確實(shí)需要安全的機(jī)器上你甚至應(yīng)該注釋掉telnet和ftp。
你可以用grep找出機(jī)器能過inetd所提供的服務(wù):
grep -v "^#" /etc/inetd.conf
這將返回/etc/inetd.conf中所有沒被注釋掉的行。
3)在/etc/inetd.conf中做出改變之后,找到inetd進(jìn)程的id號,用kill向它發(fā)送HUP信號來刷新
它。一定要確保kill了inetd進(jìn)程后,它還在運(yùn)行,例如:
root@multics: ps -ef | grep inetd
root 196 1 0 15:32:14 ? 0:00 /usr/sbin/inetd -s
root@multics: kill -HUP 196
root@multics: ps -ef | grep inetd
root 196 1 0 15:32:14 ? 0:00 /usr/sbin/inetd -s
3. 給系統(tǒng)打補(bǔ)丁
跟所有的復(fù)雜系統(tǒng)一樣,SUN有它的漏洞,其中的一些從性質(zhì)上來說是相當(dāng)嚴(yán)重的。SUN公司有向它的客戶甚至是沒有技術(shù)支持的客戶提供補(bǔ)丁的優(yōu)良傳統(tǒng)。這些補(bǔ)丁或者以集合包或者以單個補(bǔ)丁的形式存在的。不幸的是,要完全修補(bǔ)你的系統(tǒng),既需要大的補(bǔ)丁集合包,又需要單個的補(bǔ)丁。然而我們將介紹一種把補(bǔ)丁包和單個補(bǔ)丁結(jié)合起來使用的方法。
1)變成root
2)鍵入
umask 022
來設(shè)置你的許可模式--給系統(tǒng)打補(bǔ)丁不僅要求所有的補(bǔ)丁被"nobody"用戶可讀,而且包括補(bǔ)丁之前的所有目錄(不要問為什么,反正是一般這么干的)。
3)創(chuàng)建一個叫“patch“的目錄,并進(jìn)入它,我一般是這樣做的:
mkdir /var/tmp/patch
cd /var/tmp/patch
在你建“patch“目錄的文件系統(tǒng)中要保證有足夠的磁盤空間(提示:你可以試著鍵入
df -k
來看看文件系統(tǒng)上可用的磁盤空間,不要用/tmp!#p#副標(biāo)題#e#
4)用ftp連接sunsolve站
ftp sunsolve.sun.com
你的登錄用戶名是“anonymous“,口令是你的電子郵件地址。
5)轉(zhuǎn)到二進(jìn)制模式,鍵入:
bin
關(guān)閉提示,鍵入:
prompt
--你不需要為下載每個補(bǔ)丁回答”是,我需要下那個補(bǔ)丁“ 。
6)補(bǔ)丁位于sunsolve站的/pub/patches目錄,所以鍵入:
cd /pub/patches
7)得到對應(yīng)于你操作系統(tǒng)版本的PatchReport文件,你可以用以下命令列出那些文件:
ls *.PatchReport
例如:
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
ftp> ls *.PatchReport
200 PORT command successful.
150 Opening ASCII mode data connection for file list.
Solaris1.1.1.PatchReport
Solaris1.1.2.PatchReport
Solaris1.1.PatchReport
Solaris2.3.PatchReport
Solaris2.4.PatchReport
Solaris2.4_x86.PatchReport
Solaris2.5.1.PatchReport
Solaris2.5.1_x86.PatchReport
Solaris2.5.PatchReport
Solaris2.5_x86.PatchReport
Solaris2.6.PatchReport
Solaris2.6_x86.PatchReport
Solaris7.PatchReport
Solaris7_x86.PatchReport
226 Transfer complete.
remote: *.PatchReport
360 bytes received in 0.0044 seconds (79.16 Kbytes/s)
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
對x86和sparc文件有不同的補(bǔ)丁報告文件,sparc版本的是那些沒有“x86“字樣的。
8)得到一份補(bǔ)丁報告文件,比如:
get Solaris2.6.PatchReport
9)得到一份對應(yīng)于你系統(tǒng)版本的推薦補(bǔ)丁集合包和它的README文件,可以用如下命令列出推薦的文件:
ls *Recommended*
輸出可能是這樣的:
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
ftp> ls *Recommended*
200 PORT command successful.
150 Opening ASCII mode data connection for file list.
2.3_Recommended.README
2.3_Recommended.tar.Z
2.4_Recommended.README
2.4_Recommended.tar.Z
2.4_x86_Recommended.README
2.4_x86_Recommended.tar.Z
2.5.1_Recommended.README
2.5.1_Recommended.tar.Z
2.5.1_x86_Recommended.README
2.5.1_x86_Recommended.tar.Z
2.5_Recommended.README
2.5_Recommended.tar.Z
2.5_x86_Recommended.README
2.5_x86_Recommended.tar.Z
2.6_Recommended.README
2.6_Recommended.tar.Z
2.6_x86_Recommended.README
2.6_x86_Recommended.tar.Z
7_Recommended.README
7_Recommended.zip
7_x86_Recommended.README
7_x86_Recommended.zip
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
你可以用mget命令把推薦文件和readme都拿下來,比如:
mget 7_x86_Recommended*
這可能要等上一會兒。
10)在下載推薦文件的時候,你可以打開補(bǔ)丁報告文件看看,里面會有關(guān)于安全修補(bǔ)的一節(jié)可能是這樣的:
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
Solaris 2.5.1 Patches Containing Security Fixes:
------------------------------------------------
103594-19 SunOS 5.5.1: sendmail fixes
103603-10 SunOS 5.5.1: ftp, in.ftpd, in.rexecd and in.rshd patch
103627-11 SunOS 5.5.1: Linker patch
103630-14 SunOS 5.5.1: ip ifconfig arp udp icmp patch
106689-01 * SunOS 5.5.1: /usr/sbin/in.uucpd patch
106905-01 * SunOS 5.5.1: apropos/catman/man/whatis patch
103566-43 OpenWindows 3.5.1: Xsun patch
106411-06 * OpenWindows 3.5.1: xdm patch
(& c.)
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
“*“標(biāo)記的補(bǔ)丁沒有包括在推薦補(bǔ)丁集合包里,我們要把它們包括進(jìn)來。
11)當(dāng)推薦補(bǔ)丁集合包下載完后,你需要下載補(bǔ)丁報告中所標(biāo)記的單個補(bǔ)丁,最快的方法是用mget,這樣用:
mget 106689* 106905* 106411*
重要:你可能想用一個mget命令得到所有的補(bǔ)丁,但mget的參數(shù)的個數(shù)是有限制的!而且,我并沒有指定版本號,這不僅僅是為了少輸入字符和得到相關(guān)的README文件,也是因?yàn)樵谘a(bǔ)丁報告發(fā)布過程中,版本號可能是會變化的。
12)下載完所有的東西后,鍵入:
quit
來結(jié)束ftp會話。
13)到現(xiàn)在,你已經(jīng)下載了補(bǔ)丁集合包和單個補(bǔ)丁,因?yàn)槔^續(xù)下去打單個的補(bǔ)丁包太費(fèi)體力,我們將先把補(bǔ)丁包和單個補(bǔ)丁合并起來。首先解壓補(bǔ)丁包:
如果你用的是Solaris 2.6或更早的,
uncompress 2*Recommended.tar.Z
tar -xvf 2*Recommended.tar
如果用的是Solaris 7,
unzip 7*Recommended.zip
其次,把所有的單個補(bǔ)丁移到你的建立的Recommended目錄:
mv 1* *Recommended
然后,進(jìn)到保存有全部補(bǔ)丁的Recommended目錄:
cd *Recommended
14)現(xiàn)在我們可以把所有單個的補(bǔ)丁加到patch_order文件中,在這個文件中列出
了所有將被install_cluster腳本安裝的補(bǔ)丁,你可以手工把它們加進(jìn)去(提示:
這是錯誤的選擇)或者用UNIX的命令工具來幫你做這件事。
如果你是Solaris 7,用下面的命令:
ls *.zip | cut -d"." -f1 >> patch_order
如果是Solaris 2.6或以前的:
ls *.tar.Z | cut -d"." -f1 >> patch_order
15)現(xiàn)在是解壓所有單個補(bǔ)丁包的時候了,因?yàn)樗鼈冞€是壓縮格式的。
A)如果你用Solaris 7,你可以用unzip一次解壓一個文件:
unzip 108723.zip
討厭的是,你不能用“unzip *.zip“,因?yàn)閡nzip不能這樣工作,為了避免多次地輸入unzip,你可以用下面的UNIX命令讓unzip為你解壓所有的東西:
ls *.zip | xargs -n1 unzip
B)如果用的是Solaris 2.6或更低的,鍵入:
uncompress *.tar.Z
現(xiàn)在你必須用tar分離出單個的補(bǔ)丁,你可以用以下命令一次處理一個文件:
tar -xvf 108723.tar
討厭的是,你不能用“tar -xvf *.tar“,因?yàn)閠ar不能這樣工作,為了避免多次地輸入tar,你可以用下面的UNIX命令讓tar為你分離所有的東西:
ls *.zip | xargs -n1 tar -xvf
16)到現(xiàn)在所有的補(bǔ)丁都準(zhǔn)備好了,關(guān)閉計算機(jī):
/usr/sbin/shutdown -y -g0 -i0
啟到到單用戶模式,
對sparc:
boot -s
對x86, 啟動時, 鍵入:
b -s
系統(tǒng)引導(dǎo)后,在提示符后輸入root口令后,鍵入:
mountall
來mount所有的文件系統(tǒng)。然后輸入:
cd /var/tmp/patch/*Recommended
進(jìn)到保存所有補(bǔ)丁的目錄,現(xiàn)在你可以鍵入以下命令來安裝“所有”的補(bǔ)丁了:
./install_cluster
跟著提示做就行了。如果這是個Solaris 2.5.1或是個Solaris 2.6的系統(tǒng),可以走開搞杯咖啡喝喝,因?yàn)橐c(diǎn)時間的。不要太擔(dān)心補(bǔ)丁安裝過程中的錯誤,很多時候出現(xiàn)錯誤是因?yàn)槟銢]有安裝一個特定的軟件或已經(jīng)打了某個補(bǔ)丁。打完補(bǔ)丁后,關(guān)機(jī)重啟,輸入:
/usr/sbin/shutdown -y -g0 -i6
好了,現(xiàn)在你就有了一個修補(bǔ)過的系統(tǒng)了。