第三部分 常見Unix安全設(shè)置方案
3.1 Solaris 系列
3.1.1 PROM OpenBoot 和物理安全
3.1.1.1 OpenBoot安全級(jí)別
none :不需要任何口令。所有OpenBoot設(shè)置都可以修改,任何人只要物理接觸到主控臺(tái),就可以完全控制。command:除了boot和go之外所有命令都需要口令。full:除了go命令之外所有命令都需要口令。
3.1.1.2 改變OpenBoot安全級(jí)別
首先使用eeprom security-password 命令設(shè)置OpenBoot口令,然后在root登入狀態(tài)使用eeprom security-mode=command命令改變安全級(jí)別為command或在OK狀態(tài):ok setenv security-mode=command的密碼保護(hù)來實(shí)現(xiàn)。
3.1.2 文件系統(tǒng)的安全
3.1.2.1 基礎(chǔ)知識(shí)
文件系統(tǒng)是unix系統(tǒng)安全的核心。在unix中,所有的事物都是文件。Unix中的基本文件類型有正規(guī)文件、目錄、特殊文件、鏈接、Sockets等等。這些不同類型的文件以一個(gè)分層的樹結(jié)構(gòu)進(jìn)行組織,以一個(gè)叫/"root/"的目錄為起始位置(/"//")。整個(gè)就是一個(gè)文件系統(tǒng)。每個(gè)文件對(duì)應(yīng)一個(gè)/"i節(jié)點(diǎn)/",/"i節(jié)點(diǎn)/"包括UID(文件擁有者)、GID(文件所在組)、模式(文件的權(quán)限)、文件大小、文件類型、ctime(/"i節(jié)點(diǎn)/"上次修改時(shí)間)、mtime(文件上次修改時(shí)間)、atime(文件
上次訪問時(shí)間)、nlink(鏈接數(shù))。它表示了文件的基本屬性。
大家注意到,/"//"下有很多的目錄,那么這些目錄是干什么的呢?下面簡(jiǎn)要介紹一下目錄結(jié)構(gòu)。如下:
/bin 用戶命令的可執(zhí)行文件
/dev 特殊設(shè)備文件
/etc 系統(tǒng)執(zhí)行文件、配置文件、管理文件,主要是配置文件
/home 用戶起始目錄
/lib 引導(dǎo)系統(tǒng)以及在root文件系統(tǒng)中運(yùn)行命令所需的共享庫文件
/lost+found 與特定文件系統(tǒng)斷開連結(jié)的丟失文件
/mnt 臨時(shí)安裝的文件系統(tǒng)(如光驅(qū)、軟驅(qū))
/proc 一個(gè)偽文件系統(tǒng),用來作為到內(nèi)核數(shù)據(jù)結(jié)構(gòu)或正在運(yùn)行的進(jìn)程的接口(用于調(diào)試)
/sbin 只有root使用的可執(zhí)行文件和只需要引導(dǎo)或安裝/usr的文件
/tmp 臨時(shí)文件
/usr 為用戶和系統(tǒng)命令使用的可執(zhí)行文件、頭文件、共享庫、幫助文件、本地程序(在/usr/local中)
/var 用于電子郵件、打印、cron等的文件,統(tǒng)計(jì)文件,日志文件文件系統(tǒng)有多種類型,unix內(nèi)核支持如下文件系統(tǒng):
1) ext2 固定和可移動(dòng)磁盤都支持的一種高性能文件系統(tǒng),用于linux
2) msdos 由MS-DOS和Windows使用
3) umsdos Linux使用的一種擴(kuò)充的DOS文件系統(tǒng),支持長(zhǎng)文件名、權(quán)限設(shè)置
4) iso9660 遵從ISO9660標(biāo)準(zhǔn)的CD-ROM文件系統(tǒng)
5) hpfs High Performance Filesystem,高性能文件系統(tǒng),OS/2使用
6) minix 在Minux OS中使用,最早的Linux文件系統(tǒng)
7) nfs 用來訪問遠(yuǎn)程計(jì)算機(jī)中磁盤的網(wǎng)絡(luò)文件系統(tǒng)
8) swap 用作交換的磁盤分區(qū)
3.1.2.2 文件權(quán)限
文件權(quán)限是unix文件系統(tǒng)安全的關(guān)鍵。Unix中的每個(gè)用戶有一個(gè)唯一的用戶名和UID(用戶ID號(hào)),每個(gè)用戶屬于一個(gè)或多個(gè)組?;痉纸M成員在/etc/passwd中定義,附加的分組成員在/etc/group中定義。例如,用戶tiger的UID為225,分組為11(students),此外,他還是分組185(postgraduates)的成員。每個(gè)文件和目錄有三組權(quán)限,一組是文件的擁有者、一組是文件所屬組的成員、一組是其他所有用戶。/"r/"表示可讀,/"w/"表示可寫,/"x/"表示可執(zhí)行。一共9位(每組3位),合起來稱為模式位(mode bits)。
模式位通常由一列10個(gè)字符來表示,每個(gè)字符表示一個(gè)模式設(shè)置,第一個(gè)指明文件類型,如(d表示目錄,-表示普通文件,l表示鏈接文件等等)。例如,用ls -l 命令顯示如下:
drwxr-xr-x 2 root root 1024 Aug 13 09:22 backup/
-rw-r--r-- 1 root root 1824 Apr 21 18:45 client.c
-rw------- 1 root root 65536 Apr 22 17:56 core
-rw-r----- 1 root root 2351 Apr 22 14:01 cry1.bak
-rwxr-xr-x 1 root root 27492 Apr 21 18:47 crypt*
-rw-r----- 1 tiger tiger 2450 Apr 22 15:16 cryption_server.c
-rw-r----- 1 tiger tiger 1544 Apr 22 15:02 myinclude.h
-rwxr-xr-x 1 root root 8280 May 3 10:35 test*
例如最后一行以/"-/"開始,表示test使一個(gè)普通文件,文件擁有者可以讀寫執(zhí)行、本組其他成員可以讀執(zhí)行、其他用戶可以讀執(zhí)行。我們可以用chmod和umask命令來改變權(quán)限,這很簡(jiǎn)單,察看相應(yīng)的幫助就知道怎么修改權(quán)限。
3.1.2.3 SUID/SGID
為什么要單獨(dú)把他們從文件權(quán)限中分出來講呢?因?yàn)?,這是網(wǎng)絡(luò)入侵者非常愛用的入侵入口。SUID表示/"設(shè)置用戶ID/",SGID表示/"設(shè)置組ID/"。當(dāng)用戶執(zhí)行一個(gè)SUID文件時(shí),用戶ID在程序運(yùn)行過程中被置為文件擁有者的用戶ID。如果文件屬于root,那用戶就成為超級(jí)用戶。同樣,當(dāng)一個(gè)用戶執(zhí)行SGID文件時(shí),用戶的組被置為文件的組。例如,PS命令以SUID root運(yùn)行,他從系統(tǒng)內(nèi)存中讀取,這是一般用戶不能做的。SUID程序代表了重要的安全漏洞,特別是SUID設(shè)為root的程序。
Unix實(shí)際上有兩種類型的用戶ID。/"real user ID/"是在登錄過程中建立的用戶ID。 /"effective user ID/"是在登錄后的會(huì)話過程中通過SUID和SGID位來修改。當(dāng)一個(gè)用戶運(yùn)行一條命令時(shí),進(jìn)程繼承了用戶登錄Shell的權(quán)限,這時(shí)/"real user ID/"和/"effective user ID/"是相同的。當(dāng)SUID位被設(shè)置時(shí),進(jìn)程繼承了命令擁有者的權(quán)限。例如普通用戶運(yùn)行passwd命令時(shí),他能夠修改/etc/passwd文件,盡管文件是屬于root的。這成為可能是因?yàn)閜asswd命令以root的SUID權(quán)限運(yùn)行。那么如何識(shí)別SUID程序呢?我們檢查文件的權(quán)限模式,在它的第四位如果不是/"x/",而是/"s/",就是一個(gè)SUID程序。例如,ls -l /bin/su命令顯示:
-rwsr-xr-x 1 root root 14888 Aug 15 1999 /bin/su* 表明su是一個(gè)SUID程序。
Unix系統(tǒng)安全的一種典型攻擊就是創(chuàng)建一個(gè)SUID是root的shell拷貝,然后把他隱藏。通過調(diào)用后門,攻擊者就獲得了root的權(quán)利。例如,某個(gè)系統(tǒng)管理員忘了關(guān)閉某個(gè)root的Shell,一個(gè)壞人經(jīng)過運(yùn)行如下命令:
cp /bin/bash /home/badman/.bash; chmod 4777 /home/badman/.bash
badman現(xiàn)在就有了一個(gè)bash的SUID root拷貝任其處理。他就有完整的root權(quán)限了。因此,系統(tǒng)管理員應(yīng)該定期察看系統(tǒng)中有哪些SUID和SGID文件。用下面的命令可以實(shí)現(xiàn):find / -type f //( -perm -4000 -o -perm -2000 //) -ls
當(dāng)然,攻擊者可以通過修改find命令來逃避檢測(cè),所以要運(yùn)行專門的檢測(cè)軟件(如Tripwire)來進(jìn)行檢查。
3.1.2.4 加密與驗(yàn)證
Tripwire工具提出了使用密碼校驗(yàn)和來確定文件是否經(jīng)過了未認(rèn)證的修改,加密技術(shù)可以用來保護(hù)機(jī)密文件甚至整個(gè)文件系統(tǒng)。加密是通過密鑰將明文轉(zhuǎn)化為一堆亂碼的密文,從而起到保護(hù)文件內(nèi)容的作用。Unix常用的加密算法有crypt(最早的加密工具)、DES(目前最常用的)、IDEA(國(guó)際數(shù)據(jù)加密算法)、RC4、Blowfish(簡(jiǎn)單高效的DES)、RSA等等。具體的加密算法這里不再闡明,需要了解請(qǐng)閱讀Bruce Schneier的《應(yīng)用密碼學(xué)》一書。注意單向hash函數(shù),他處理任意長(zhǎng)度的信息并返回一個(gè)固定長(zhǎng)度的hash值(128位)。常用的有MD5、SHA、HAVAL、Snefru等等。單向hash函數(shù)經(jīng)常和公開密鑰算法一起來創(chuàng)建數(shù)字簽名,提供身份證明。與傳統(tǒng)的簽名相比,數(shù)字簽名還可以指出文件是否被修改過。
PGP是unix下用來保護(hù)信息特別是電子郵件的工具。他使用IDEA算法為數(shù)據(jù)加密,使用RSA算法來進(jìn)行密鑰管理和數(shù)字簽名,使用MD5來作為一個(gè)單向hash函數(shù)。其特點(diǎn)在于安全:不僅內(nèi)容被偽裝,連發(fā)送者的簽名也加密。PGP還可以用來加密本地文件?,F(xiàn)在常用的Linux下的PGP工具為:pgpe(加密)、pgps(簽名)、pgpv(確認(rèn)/解密)、pgpk(管理密鑰)。請(qǐng)參考相應(yīng)的幫助來使用。
/"特洛伊木馬/"的故事不知道大家聽說過沒有。古希臘人久攻特洛伊城不下,于是假裝求和,送了一個(gè)巨大的木馬作為禮物,向城主Minerva表示和解。特洛伊人將木馬拉入城內(nèi),到了夜晚,藏在木馬中的希臘士兵鉆出來,里應(yīng)外合,攻破特洛伊城。在計(jì)算機(jī)安全領(lǐng)域,這種欺騙技巧成為攻擊計(jì)算機(jī)安全的一種標(biāo)準(zhǔn)方式。他藏在你的計(jì)算機(jī)里,隨時(shí)可能爆發(fā),如果攻擊者需要的話。因此,一旦一個(gè)系統(tǒng)被裝了特洛伊木馬,他就不能在信任了,必須從新安裝。怎么避免呢,要養(yǎng)成良好的習(xí)慣,例如:限制下載,只從有聲望的站點(diǎn)下載東西;檢驗(yàn)下載的文件;避免運(yùn)行已編譯好的二進(jìn)制代碼,從源代碼開始編譯;不執(zhí)行不信任的電子郵件發(fā)送的程序;不執(zhí)行從非信任的Web站點(diǎn)得到的Java applets和Java Script。
MD5校驗(yàn)和有時(shí)與軟件一起發(fā)行,用戶可以用他來檢驗(yàn)一個(gè)軟件包。用戶可以運(yùn)行Red Hat Linux中包含的md5sum工具,例如:md5sum cops.1.04.tar.gz 結(jié)果:lfa416872934e5bee99068f9989cb8b0 cops.1.04.tar.gz 和軟件包自帶的校驗(yàn)和文件比較,如果不符,則說明文件在傳輸過程中出了問題,最好從新下載,本文件不可靠。md5sum還可以用來檢驗(yàn)系統(tǒng)文件,在第一次安裝系統(tǒng)之后對(duì)重要的lilo系統(tǒng)二進(jìn)制文件進(jìn)行一下校驗(yàn):md5sum lilo,其結(jié)果應(yīng)該一直保持不變,除非升級(jí)。
3.1.2.5 完整性檢查
完整性是安全系統(tǒng)的核心屬性。用戶需要知道昨天寫的文件和今天打開的文件沒有被改動(dòng)。攻擊者可以用很多方法破壞文件系統(tǒng),從依靠錯(cuò)誤配置的權(quán)限獲益到放置特洛伊木馬和病毒。Linux中用cksum命令對(duì)一個(gè)特定文件執(zhí)行16位校驗(yàn)和的計(jì)算,上面的md5sum也是一個(gè)檢驗(yàn)的命令。
RPM(Red Hat Package manager)是由Red Hat Software開發(fā)并包含在其Linux產(chǎn)品之中的多功能軟件安裝管理器。他可以用來建立、安裝、查詢、檢驗(yàn)、升級(jí)和卸載獨(dú)立的軟件包。
3.1.2.6 加密文件系統(tǒng)
加密文件系統(tǒng)是文件系統(tǒng)安全的一個(gè)更引人注目的方法。他根據(jù)一個(gè)簡(jiǎn)單的推斷:如果一個(gè)系統(tǒng)保存機(jī)密數(shù)據(jù),那么就應(yīng)該以加密形式保存。加密文件系統(tǒng)(CFS)的核心思想是: CFS為目錄和文件提供一個(gè)透明的接口,并自動(dòng)使用用戶的密鑰加密。一條單獨(dú)的命令把一個(gè)密鑰和一個(gè)目錄關(guān)聯(lián)起來,從這時(shí)起,目錄的內(nèi)容在寫時(shí)自動(dòng)加密,在打開時(shí)自動(dòng)解密。
一個(gè)由意大利人開發(fā)的透明加密文件系統(tǒng)(TCFS),用戶甚至不知道他們的文件倍加密了。從下面的地址下載:
http://tcfs.dia.unisa.it/
3.1.2.7 備份
備份的重要性我想不需要多說了,那么備份有那些策略呢?常見的有:系統(tǒng)初裝時(shí)的備份、定期備份、增量式備份(只備份改動(dòng)的)、特別備份(為某些文件備份)等等。Linux系統(tǒng)提供了以下備份工具:
1) cp:拷貝,例如把dir1中的所有內(nèi)容拷貝到dir2:cp -R dir1 dir2
2) tar:可以創(chuàng)建、把文件添加到或從一個(gè)tar檔案中解開文件。檔案本身也是一個(gè)文件,它包含其他的許多文件和有關(guān)信息。Tar最初用于磁帶機(jī)。
3) cpio:把文件拷貝進(jìn)或拷貝出一個(gè)cpio檔案或tar檔案,與tar類似
4) dump:得到整個(gè)文件系統(tǒng)并把他拷貝到備份介質(zhì)上,一個(gè)確保完整備份的正規(guī)方式是跟隨定期增量備份運(yùn)行一個(gè)0級(jí)或完全備份,dump支持10個(gè)級(jí)別并能把上次備份后改動(dòng)的所有文件以更低的級(jí)別備份。缺省情況dump將備份到磁盤介質(zhì)。例如,把一個(gè)SCSI硬盤(/dev/rsd0a) 以0級(jí)備份到磁帶(/dev/rst0)。dump 0f0 /dev/rst0 1500 /dev/sd0a
5) restore:用來恢復(fù)整個(gè)文件系統(tǒng)或提取單個(gè)文件。與dump相對(duì)。注意,restore命令特別冒險(xiǎn),因?yàn)樗\(yùn)行SUID root,像任何SUID root程序一樣,可以根據(jù)自己的風(fēng)險(xiǎn)來運(yùn)行restore。
3.1.2.8 其他常見系統(tǒng)安全工具導(dǎo)航
1)CRYPT BREAKERS WORKBENCH一個(gè)集成多種工具的平臺(tái),幫助一個(gè)加密人員讀取BSD4.2加密的文件。ftp://coast.cs.purdue.edu/pub/tools/unix/cbw
2)HOBGOBLIN ftp://coast.cs.purdue.edu/pub/tools/unix/hobgoblin/
3)TRIPWIRE,強(qiáng)烈推薦,是一個(gè)文件系統(tǒng)完整性檢查工具。http://www.tripwiresecurity.com/
4)TROJAN,一個(gè)可以被任何用戶運(yùn)行來檢查特洛伊木馬的perl程序。ftp://coast.cs.purdue.edu/pub/tools/unix/trojan/trojan.pl
5)PGP,流行的郵件和文件加密程序。http://rufus.w3.org/linux/RPM/pgp.html
6)LIBDES,建立一個(gè)DES加密庫和一個(gè)DES加密程序的工具。包括一個(gè)crypt(3)的快速實(shí)現(xiàn)。ftp://ftp.psy.uq.oz.au/pub/Crypto/DES/
3.1.3 用戶賬號(hào)和環(huán)境的安全
3.1.3.1 口令管理增強(qiáng)方法
可以使用如下命令及其參數(shù)來增強(qiáng)對(duì)用戶密碼的管理:
1)passwd -n 30 user #強(qiáng)迫用戶每30天修改一次密碼;
2)passwd -f user #強(qiáng)迫用戶在下一次登錄時(shí)修改口令;
3)passwd -n 2 -x 1 user #禁止用戶修改口令;
4)passwd -l user #封鎖用戶賬號(hào),禁止登錄。
3.1.3.2 CRACK
Crack可以找出/etc/shadow中那些容易猜測(cè)的口令,雖然運(yùn)行crack將會(huì)使CPU的負(fù)載加重,但它在第一次運(yùn)行時(shí)就可以給出10%系統(tǒng)帳號(hào)的口令。
URL:ftp://sable.ox.ac.uk/pub/comp/security/software/crackers/
3.1.3.3 取消ROOT的遠(yuǎn)程登陸
默認(rèn)在/etc/default/login里加上 /"CONSOLE/"行,在/etc/ftpusers里加上root。
3.1.3.4 配置ROOT的環(huán)境
1)將umask設(shè)為077或者027.
2)查看你的環(huán)境中路徑設(shè)置情況,不要有./
3.1.3.5 刪除不必要的帳號(hào)
移去或者鎖定那些不是必須的帳號(hào),比如sys//uucp//nuucp//listen等等,簡(jiǎn)單的辦法是在/etc/shadow的password域中放上NP字符。
3.1.3.6 NIS的安全問題
NIS從來就不是一個(gè)安全的服務(wù),如果配置得當(dāng)?shù)脑扤IS+會(huì)更好些,就象暴力破解密碼一樣,NIS域名如果被猜出來,就會(huì)給入侵者提供相當(dāng)豐富的信息,要關(guān)閉這個(gè)漏洞,可以將信任主機(jī)的地址放在/var/yp/securenets中。并且考慮使用NIS+或者secure RPC。
3.1.3.7 取消rlogin/rsh服務(wù)
移去/etc/hosts.equiv和/.rhosts以及各home目錄下的.rhosts,并且在/etc/inetd.conf中把r系列服務(wù)都?xì)⒌?,然后找出inetd的進(jìn)程號(hào),重啟它。
3.1.3.8 限制通過網(wǎng)絡(luò)進(jìn)入系統(tǒng)
Telnet和ftp守護(hù)進(jìn)程是從inetd進(jìn)程啟動(dòng)的,inetd的配置文件是/etc/inetd.conf,還包含了其它的各種服務(wù),所以你可以干脆移去這個(gè)文件,新建一個(gè)只包括以下兩行的文件:
ftp stream tcp nowait root /usr/local/bin/tcpd /usr/local/bin/wu-ftpd
telnet stream tcp nowait root /usr/local/bin/tcpd /usr/sbin/in.telnetd
當(dāng)然這是基于你需要telnet及ftp的基礎(chǔ)上的,如果你連這兩個(gè)服務(wù)都不用的話,你就可以將它注釋掉或者刪除,這樣在系統(tǒng)啟動(dòng)的時(shí)候inetd就不需要啟動(dòng)了。
Tcpd的訪問控制是由/etc/hosts.allow和/etc/hosts.deny文件控制的,tcpd先查找/etc/hosts.allow,如果你在這里面允許了某幾臺(tái)主機(jī)的telnet或ftp訪問的話,那么deny訪問就是對(duì)其它所有機(jī)器的了。這是/"默認(rèn)拒絕/"的訪問控制策略,下面是一個(gè)hosts.allow文件的樣本:
ALL: 172.16.3.0/255.255.255.0
這將允許172.16.3.0網(wǎng)絡(luò)的主機(jī)上任何用戶訪問你的telnet及ftp服務(wù),記住在這里要放置IP地址,因?yàn)橛蛎容^容易受到欺騙攻擊……
現(xiàn)在我們準(zhǔn)備拒絕其余所有人的連接了,將下面的語句放在/etc/hosts.deny中:
ALL: /usr/bin/mailx -s /"%d: connection attempt from %c/" root@mydomain.com
這條指令不僅拒絕了其它所有的連接,而且能夠讓tcpd發(fā)送email給root--一旦有不允許的連接嘗試發(fā)生時(shí)。
現(xiàn)在你可能希望用syslog記錄下所有的訪問記錄,那么在/etc/syslog.conf放進(jìn)如下語句:
auth.auth.notice;auth.info /var/log/authlog
注意兩段語句間的空白是tab鍵,否則syslog可能會(huì)不能正常工作。
3.1.3.9 配置S/Key
S/Key是一個(gè)用于實(shí)現(xiàn)安全的一次性口令方案的軟件,它根據(jù)一系列信息(包括一個(gè)秘密口令)通過MD5處理而形成的初始鑰匙,該初始鑰匙再交給MD4進(jìn)行處理,資助將128位的數(shù)字簽名縮成64位,該64位信息再次傳給MD5函數(shù),這個(gè)過程一直持續(xù)直到達(dá)到期望值…… 開始使用S/Key時(shí),要建立一個(gè)以/usr/local/bin/keysh為shell的帳號(hào):
在/etc/passwd中加入
access:x:100:100:Access Account:/tmp:/usr/local/bin/keysh
并且在/etc/shadow中加入
access:NP:6445::::::
然后使用passwd access命令來設(shè)定用戶的訪問密碼。
由于/usr/local/bin/keysh不是一個(gè)標(biāo)準(zhǔn)的shell,所以你的/etc/shells文件中內(nèi)容如下:
/sbin/sh
/usr/local/bin/keysh
只有使用這兩種login shell的用戶才允許接入。
然后建立一個(gè)文件/etc/skeykeys并賦予一定的許可權(quán)限:
touch /etc/skeykeys
chmod 600 /etc/skeykeys
chown root /etc/skeykeys
chgrp root /etc/skeykeys
使用keyinit access命令來初始化S/Key秘密口令。
現(xiàn)在你可以配置允許用戶通過keysu命令來成為超級(jí)用戶,首先改變/etc/group:
root::0:root,access
只有在這里列出來的用戶才允許通過keysu成為超級(jí)用戶?,F(xiàn)在可以使用不著keyinit root命令來初始化超級(jí)用戶的S/Key秘密口令,建議該口令要與user的有所區(qū)別。
本來你可以將/bin/su刪掉以確定用戶只能使用keysu……,但不幸的是,許多腳本使用/bin/su來開啟進(jìn)程,所以只需用chmod 500 /bin/su來改變它的權(quán)限就行了。
3.1.3.10 X的安全配置
使用SUN-DES-1選項(xiàng)來調(diào)用Secure RPC來通過X鑒別,可以使用xhost +user@host來通過訪問請(qǐng)求。
3.1.3.11 開啟SUN-DES-1鑒別機(jī)制
set DisplayManager*authorize: true
set DisplayManager._0.authName: SUN-DES-1
rm ~/.Xauthority
增加對(duì)localhost的許可權(quán)限,通過
xauth local/unix:0 SUN-DES-1 unix.local@nisdomain
xauth local:0 SUN-DES-1 unix.local@nisdomain
Start X via xinit -- -auth ~/.Xauthority
把你自己加入,并移去其他所有人:
xhost +user@ +unix.local@nisdomain -local -localhost
賦予用戶foo進(jìn)入主機(jī)/"node/"的權(quán)限:
允許foo進(jìn)入node: xhost +foo@
建立適當(dāng)?shù)膄oo的xauthority: xauth add node:0 SUN-DES-1 unix.node@nisdomain
foo現(xiàn)在就能連上/"node/"了: xload -display node:0
3.1.4 系統(tǒng)的啟動(dòng)和關(guān)閉
3.1.4.1 更改不必要的啟動(dòng)文件
通常情況下,你要檢查所有在/etc/rc2.d和/etc/rc3.d以S開頭的文件,所有并非必要的設(shè)備或者服務(wù)都可以重命名(不要再以S開頭),然后你可以重新啟動(dòng),從/var/adm/messages中來觀察自啟動(dòng)的情況,并且從ps -elf的輸出中加以檢查。
3.1.4.2 系統(tǒng)里的Strip
在Solaris下,你可以通過對(duì)/etc/rc[S0-3].d文件來修改啟動(dòng)時(shí)自引導(dǎo)的動(dòng)作。考慮移去/etc/rc2.d中在你系統(tǒng)中用不到的服務(wù),我還建議你移除/etc/init.d里除下以下列表中文件外的所有東西:
K15rrcd S05RMTMPFILES K15solved S20sysetup
S72inetsvc S99audit S21perf
S99dtlogin K25snmpd S30sysid.net S99netconfig
K50pop3 S74syslog S75cron S92rtvc-config
K60nfs.server K65nfs.client S69inet
K92volmgt README S95SUNWmd.sync
S01MOUNTFSYS S71sysid.sys S88utmpd S95rrcd
這些文件可能會(huì)與你的不同--這取決于你機(jī)器里的圖形卡/是否使用Solaris DiskSuits等等。移除/etc/rc3.d里的文件........。
3.1.4.3 取消NFS服務(wù)
NFS的共享輸出是由/etc/dfs/dfstab文件管理的.可以刪除它。要將NFS服務(wù)器的守護(hù)進(jìn)程關(guān)閉則可以重命名/etc/rc3.d/S15nfs.server。要防止一臺(tái)機(jī)器成為NFS客戶機(jī),可以重命名文件/etc/rc2.d/S73nfs.client--當(dāng)重命名這些自啟動(dòng)文件時(shí),要注意不要將文件的首字母設(shè)為/"S/"。
3.1.4.4 rpcbind中的安全問題
Rpcbind是允許rpc請(qǐng)求和rpc服務(wù)之間相互連接的程序,但標(biāo)準(zhǔn)的rpc是不安全的,它使用的是/"AUTH_UNIX/"驗(yàn)證, 也就是說它依靠的是遠(yuǎn)程系統(tǒng)的IP地址和遠(yuǎn)程用戶的UID來驗(yàn)證。一般的系統(tǒng)可能需要某些rpc存在,但對(duì)各種服務(wù)器如Web servers, ftp servers, mail servers, etc)最好將rpc服務(wù)關(guān)閉,你也可以通過一些安全工具來確定rpc服務(wù)是否會(huì)影響到你系統(tǒng)的安全性??梢酝ㄟ^將/etc/rc2.d/S71RPC改名來禁止rpc。
3.1.4.5 in.finger的安全問題
in.fingerd在過去有一些安全問題,如果你想提供finger工具,用nobody來運(yùn)行它。
3.1.4.6 sendmail的設(shè)置
/usr/lib/sendmail守護(hù)程序并沒有打開,因?yàn)槟悴槐乜傇?5端口監(jiān)聽mail的列表請(qǐng)求,你可以在root的crontab文件中增加:
0 * * * * /usr/lib/sendmail -q > /var/adm/sendmail.log 2>&1
這條命令要以每小時(shí)調(diào)用sendmail進(jìn)程處理排隊(duì)中的郵件。
3.1.5 cron 和 at
3.1.5.1 cron任務(wù)的注意事項(xiàng)
1) 查看所有的cron任務(wù)--在/var/spool/cron/crontabs文件中可以找到它們。
2) 必須在/etc/default/cron里設(shè)置了/"CRONLOG=yes/" 來記錄corn的動(dòng)作。
3.1.5.2 cron用戶配置
/etc/cron.d/cron.allow和/etc/cron.d/cron.deny兩個(gè)文件決定了一個(gè)特定用戶是否可以運(yùn)行crontab命令。daemon、bin、smtp、nuucp、listen、nobody、noaccess這些用戶不應(yīng)該有執(zhí)行crontab權(quán)限。
3.1.5.3 at 用戶配置
/etc/cron.d/at.allow和/etc/cron.d/at.deny兩個(gè)文件決定了一個(gè)特定用戶是否可以運(yùn)行at命令。daemon、bin、smtp、nuucp、listen、nobody、noaccess這些用戶不應(yīng)該有執(zhí)行at權(quán)限。
3.1.5.4 cron和Tripwire
Tripwire應(yīng)該配置成定期檢查下面文件和目錄:/etc/cron.d、/etc/default、/var/cron、/var/spool/cron、/etc/cron.d/cron.allow、/etc/cron.d/at.allow、/etc/cron.d/at.deny
3.1.6 系統(tǒng)日志
創(chuàng)建所有重要的日志文件的硬拷貝
保證在“/var/log”目錄下的不同日志文件的完整性是保證系統(tǒng)安全所要考慮的非常重要的一個(gè)方面。如果我們?cè)诜?wù)器上已經(jīng)加上了很多安全措施,黑客還是能夠成功入侵,那么日志文件就是我們最后的防范措施。因此,很有必要考慮一下用什么方法才能保證日志文件的完整性。如果服務(wù)器上或網(wǎng)絡(luò)中的其它服務(wù)器上已經(jīng)安裝了打印機(jī),就可以把重要的日志文件打印出來。這要求有一個(gè)可以連續(xù)打印的打印機(jī),并用syslog把所有重要的日志文件傳到“/dev/lp0”(打印設(shè)備)。黑客可以改變服務(wù)器上的文件、程序,等等,但是,把重要的日志文件打印出來之后,他就無能為力了。
例如,記錄下服務(wù)器上所有的telnet、mail、引導(dǎo)信息和ssh連接,并打印到連接在這臺(tái)服務(wù)器上的打印機(jī)。需要在“/etc/syslog.conf”文件中加入一行。編輯syslog.conf文件(vi /etc/syslog.conf),在文件末尾加入下面這一行:
authpriv.*;mail.*;local7.*;auth.*;daemon.info /dev/lp0
“mail”是接收日志文件的計(jì)算機(jī)主機(jī)名。如果有人試圖黑你的計(jì)算機(jī)并且威脅把所有重要的系統(tǒng)日志文件都刪掉,你就不用怕了,因?yàn)槟阋呀?jīng)打印出來或者在別的地方還有一個(gè)拷貝。這樣就可以根據(jù)這些日志文件分析出黑客在什么地方,然后出理這次入侵事件。
authpriv.*;mail.*;local7.*;auth.*;daemon.info@mail
3.1.7 Solaris ndd命令
ndd命令能容易的在不重新配置系統(tǒng)內(nèi)核和重起系統(tǒng)的情況下,修改核心和TCP/IP的設(shè)備的一些參數(shù)。使用如下命令可看到相應(yīng)的幫助。
[root@ /]> ndd /dev/arp //?
? (read only)
arp_cache_report (read only)
arp_debug (read and write)
arp_cleanup_interval (read and write)
[root@ /]> ndd /dev/icmp //?
? (read only)
icmp_wroff_extra (read and write)
icmp_def_ttl (read and write)
icmp_bsd_compat (read and write)
icmp_xmit_hiwat (read and write)
icmp_xmit_lowat (read and write)
icmp_recv_hiwat (read and write)
icmp_max_buf (read and write)
icmp_status (read only)
[root@ /]> ndd /dev/ip //?
? (read only)
ip_forwarding (read and write)
ip_respond_to_address_mask_broadcast(read and write)
ip_respond_to_echo_broadcast (read and write)
ip_respond_to_timestamp (read and write)
ip_respond_to_timestamp_broadcast(read and write)
ip_send_redirects (read and write)
ip_forward_directed_broadcasts(read and write)
ip_debug (read and write)
ip_mrtdebug (read and write)
ip_ire_cleanup_interval (read and write)
ip_ire_flush_interval (read and write)
ip_ire_redirect_interval (read and write)
ip_def_ttl (read and write)
ip_forward_src_routed (read and write)
ip_wroff_extra (read and write)
ip_ire_pathmtu_interval (read and write)
ip_icmp_return_data_bytes (read and write)
ip_send_source_quench (read and write)
ip_path_mtu_discovery (read and write)
ip_ignore_delete_time (read and write)
ip_ignore_redirect (read and write)
ip_output_queue (read and write)
ip_broadcast_ttl (read and write)
ip_icmp_err_interval (read and write)
ip_reass_queue_bytes (read and write)
ip_strict_dst_multihoming (read and write)
ip_addrs_per_if (read and write)
ip_ill_status (read only)
ip_ipif_status (read only)
ip_ire_status (read only)
ip_ipc_status (read only)
ip_rput_pullups (read and write)
ip_enable_group_ifs (read and write)
[root@ /]> ndd /dev/tcp //?
? (read only)
tcp_close_wait_interval (read and write)
tcp_conn_req_max_q (read and write)
tcp_conn_req_max_q0 (read and write)
tcp_conn_req_min (read and write)
tcp_conn_grace_period (read and write)
tcp_cwnd_max (read and write)
tcp_debug (read and write)
tcp_smallest_nonpriv_port (read and write)
tcp_ip_abort_cinterval (read and write)
tcp_ip_abort_linterval (read and write)
tcp_ip_abort_interval (read and write)
tcp_ip_notify_cinterval (read and write)
tcp_ip_notify_interval (read and write)
tcp_ip_ttl (read and write)
tcp_keepalive_interval (read and write)
tcp_maxpsz_multiplier (read and write)
tcp_mss_def (read and write)
tcp_mss_max (read and write)
tcp_mss_min (read and write)
tcp_naglim_def (read and write)
tcp_rexmit_interval_initial (read and write)
tcp_rexmit_interval_max (read and write)
tcp_rexmit_interval_min (read and write)
tcp_wroff_xtra (read and write)
tcp_deferred_ack_interval (read and write)
tcp_snd_lowat_fraction (read and write)
tcp_sth_rcv_hiwat (read and write)
tcp_sth_rcv_lowat (read and write)
tcp_dupack_fast_retransmit (read and write)
tcp_ignore_path_mtu (read and write)
tcp_rcv_push_wait (read and write)
tcp_smallest_anon_port (read and write)
tcp_largest_anon_port (read and write)
tcp_xmit_hiwat (read and write)
tcp_xmit_lowat (read and write)
tcp_recv_hiwat (read and write)
tcp_recv_hiwat_minmss (read and write)
tcp_fin_wait_2_flush_interval (read and write)
tcp_co_min (read and write)
tcp_max_buf (read and write)
tcp_zero_win_probesize (read and write)
tcp_strong_iss (read and write)
tcp_rtt_updates (read and write)
tcp_wscale_always (read and write)
tcp_tstamp_always (read and write)
tcp_tstamp_if_wscale (read and write)
tcp_rexmit_interval_extra (read and write)
tcp_deferred_acks_max (read and write)
tcp_slow_start_after_idle (read and write)
tcp_slow_start_initial (read and write)
tcp_co_timer_interval (read and write)
tcp_extra_priv_ports (read only)
tcp_extra_priv_ports_add (write only)
tcp_extra_priv_ports_del (write only)
tcp_status (read only)
tcp_bind_hash (read only)
tcp_listen_hash (read only)
tcp_conn_hash (read only)
tcp_queue_hash (read only)
tcp_host_param (read and write)
tcp_1948_phrase (write only)
顯示當(dāng)前值
#ndd /dev/arp arp_debug 0
0: 代表特性禁止
ndd -set /dev/arp arp_debug 1
1: 代表特性允許
由于這些參數(shù)一般是經(jīng)過優(yōu)化過的,而且一旦改變失誤,可能導(dǎo)致系統(tǒng)的不正常工作。所以sun不提供文檔供人隨意調(diào)節(jié)。
3.1.8 系統(tǒng)補(bǔ)丁
跟所有的復(fù)雜系統(tǒng)一樣,SUN有它的漏洞,其中的一些從性質(zhì)上來說是相當(dāng)嚴(yán)重的。SUN公司有向它的客戶甚至是沒有技術(shù)支持的客戶提供補(bǔ)丁的優(yōu)良傳統(tǒng)。這些補(bǔ)丁或者以集合包或者以單個(gè)補(bǔ)丁的形式存在的。不幸的是,要完全修補(bǔ)你的系統(tǒng),既需要大的補(bǔ)丁集合包,又需要單個(gè)的補(bǔ)丁。然而我們將介紹一種把補(bǔ)丁包和單個(gè)補(bǔ)丁結(jié)合起來使用的方法。
用patchadd -p 或 showrev -p命令來察看補(bǔ)丁在系統(tǒng)里的安裝情況,在你想保護(hù)的主機(jī)以及大眾都可以訪問的主機(jī)上,你應(yīng)該到SUN公司的主頁上去查找相關(guān)的補(bǔ)丁包來安裝,并且應(yīng)該常常查看最新的補(bǔ)丁發(fā)布情況。
補(bǔ)丁步驟:
1) 變成 root
2) 鍵入 umask 022來設(shè)置你的許可模式--給系統(tǒng)打補(bǔ)丁不僅要求所有的補(bǔ)丁被/"nobody/"用戶可讀,而且包括補(bǔ)丁之前的所有目錄(不要問為什么,反正是一般這么干的)。
3) 創(chuàng)建一個(gè)叫“patch“的目錄,并進(jìn)入它,我一般是這樣做的:
mkdir /var/tmp/patch
cd /var/tmp/patch
在你建“patch“目錄的文件系統(tǒng)中要保證有足夠的磁盤空間(提示:你可以試著鍵入:df -k來看看文件系統(tǒng)上可用的磁盤空間,不要用/tmp!
4) 用ftp連接sunsolve站ftp sunsolve.sun.com 你的登錄用戶名是“anonymous“,口令是你的電子郵件地址。
5) 轉(zhuǎn)到二進(jìn)制模式,鍵入: bin 關(guān)閉提示,鍵入: prompt 你不需要為下載每個(gè)補(bǔ)丁回答是,我需要下那個(gè)補(bǔ)丁。
6) 補(bǔ)丁位于sunsolve站的/pub/patches目錄,所以鍵入: cd /pub/patches
7) 得到對(duì)應(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)
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
對(duì)x86和sparc文件有不同的補(bǔ)丁報(bào)告文件,sparc版本的是那些沒有“x86“字樣的。
8) 得到一份補(bǔ)丁報(bào)告文件,比如:get Solaris2.6.PatchReport
9) 得到一份對(duì)應(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*
這可能要等上一會(huì)兒。
10) 在下載推薦文件的時(shí)候,你可以打開補(bǔ)丁報(bào)告文件看看,里面會(huì)有關(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ǔ)丁報(bào)告中所標(biāo)記的單個(gè)補(bǔ)丁,最快的方法是用mget,這樣用: mget 106689* 106905* 106411*
重要:你可能想用一個(gè)mget命令得到所有的補(bǔ)丁,但mget的參數(shù)的個(gè)數(shù)是有限制的!而且,我并沒有指定版本號(hào),這不僅僅是為了少輸入字符和得到相關(guān)的README文件,也是因?yàn)樵谘a(bǔ)丁報(bào)告發(fā)布過程中,版本號(hào)可能是會(huì)變化的。
12) 下載完所有的東西后,鍵入:quit來結(jié)束ftp會(huì)話。
13) 到現(xiàn)在,你已經(jīng)下載了補(bǔ)丁集合包和單個(gè)補(bǔ)丁,因?yàn)槔^續(xù)下去打單個(gè)的補(bǔ)丁包太費(fèi)體力,我們將先把補(bǔ)丁包和單個(gè)補(bǔ)丁合并起來。
首先解壓補(bǔ)丁包:
如果你用的是Solaris 2.6或更早的,
uncompress 2*Recommended.tar.Z
tar -xvf 2*Recommended.tar
如果用的是Solaris 7,
unzip 7*Recommended.zip
其次,把所有的單個(gè)補(bǔ)丁移到你的建立的Recommended目錄:
mv 1* *Recommende d
然后,進(jìn)到保存有全部補(bǔ)丁的Recommended目錄:
cd *Recommended
14) 現(xiàn)在我們可以把所有單個(gè)的補(bǔ)丁加到patch_order文件中,在這個(gè)文件中列出了所有將被install_cluster腳本安裝的補(bǔ)丁,你可以手工把它們加進(jìn)去(提示:這是錯(cuò)誤的選擇)或者用UNIX的命令工具來幫你做這件事。
如果你是Solaris 7,用下面的命令:
ls *.zip | cut -d/"./" -f1 >> patch_order
如果是Solaris 2.6或以前的:
ls *.tar.Z | cut -d/"./" -f1 >> patch_order
15) 現(xiàn)在是解壓所有單個(gè)補(bǔ)丁包的時(shí)候了,因?yàn)樗鼈冞€是壓縮格式的。如果你用Solaris 7,你可以用unzip一次解壓一個(gè)文件:
unzip 108723.zip
討厭的是,你不能用“unzip *.zip“,因?yàn)閡nzip不能這樣工作,為了避免多次地輸入unzip,你可以用下面的UNIX命令讓unzip為你解壓所有的東西:
ls *.zip | xargs -n1 unzip
如果用的是Solaris 2.6或更低的,鍵入:
uncompress *.tar.Z
現(xiàn)在你必須用tar分離出單個(gè)的補(bǔ)丁,你可以用以下命令一次處理一個(gè)文件:
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ì)算機(jī):
/usr/sbin/shutdown -y -g0 -i0
啟到到單用戶模式,對(duì)sparc: boot -s
對(duì)x86, 啟動(dòng)時(shí), 鍵入:b -s
系統(tǒng)引導(dǎo)后,在提示符后輸入root口令后,鍵入:mountall
來mount所有的文件系統(tǒng)。
然后輸入:
cd /var/tmp/patch/*Recommended
進(jìn)到保存所有補(bǔ)丁的目錄,現(xiàn)在你可以鍵入以下命令來安裝“所有”的補(bǔ)丁了:
./install_cluster
跟著提示做就行了。如果這是個(gè)Solaris 2.5.1或是個(gè)Solaris 2.6的系統(tǒng),可以走開搞杯咖啡喝喝,因?yàn)橐c(diǎn)時(shí)間的。不要太擔(dān)心補(bǔ)丁安裝過程中的錯(cuò)誤,很多時(shí)候出現(xiàn)錯(cuò)誤是因?yàn)槟銢]有安裝一個(gè)特定的軟件或已經(jīng)打了某個(gè)補(bǔ)丁。
打完補(bǔ)丁后,關(guān)機(jī)重啟,輸入:
/usr/sbin/shutdown -y -g0 -i6
3.1.9 高級(jí)指南
3.1.9.1如何防止在堆棧中執(zhí)行代碼?
入侵者常常使用的一種利用系統(tǒng)漏洞的方式是堆棧溢出,他們?cè)诙褩@锴擅畹夭迦胍欢未a,利用它們的溢出來執(zhí)行,以獲得對(duì)系統(tǒng)的某種權(quán)限。
要讓你的系統(tǒng)在堆棧緩沖溢出攻擊中更不易受侵害,你可以在/etc/system里加上如下語句:
set noexec_user_stack=1
set noexec_user_stack_log =1
第一句可以防止在堆棧中執(zhí)行插入的代碼,第二句則是在入侵者想運(yùn)行exploit的時(shí)候會(huì)做記錄,一旦重啟機(jī)器,這些改變就會(huì)生效。如果這不是一個(gè)你可以關(guān)閉的系統(tǒng),那么你用adb來改變一個(gè)運(yùn)行中的系統(tǒng)的參數(shù)也是可能的。
當(dāng)然會(huì)有些合法使用可執(zhí)行堆棧的程序在你做出如上改變后而不能正常運(yùn)行。所幸的是這樣的程序的并不多,我們所知的就只有GNU ada 編譯器。
3.1.9.2 ARP
有關(guān)ARP協(xié)議的細(xì)節(jié),在這里我們就不再詳細(xì)介紹了。對(duì)于sun的系統(tǒng),核心默認(rèn)的ARP表過期的時(shí)間是5分鐘,并且可以調(diào)節(jié).另外一張表是ip層的路由表,它和arp表配合記錄動(dòng)態(tài)路由信息,20分鐘過期,最后一個(gè)特性是”無償ARP” ,即系統(tǒng)廣播自己的硬件地址。這個(gè)特性用來診斷是否存在相同的硬件地址,另外也用來生成硬件地址的變動(dòng)通知。
1)ARP攻擊
針對(duì)ARP的攻擊主要有兩種,一種是DOS,一種是Spoof。ARP欺騙往往應(yīng)用于一個(gè)內(nèi)部網(wǎng)絡(luò),我們可以用它來擴(kuò)大一個(gè)已經(jīng)存在的網(wǎng)絡(luò)安全漏洞。
如果你可以入侵一個(gè)子網(wǎng)內(nèi)的機(jī)器,其它的機(jī)器安全也將受到ARP欺騙的威脅。同樣,利用APR的DOS甚至能使整個(gè)子網(wǎng)癱瘓。
2)對(duì)ARP攻擊的防護(hù)
防止ARP攻擊是比較困難的,修改協(xié)議也是不大可能。但是有一些工作是可以提高本地網(wǎng)絡(luò)的安全性。
首先,你要知道,如果一個(gè)錯(cuò)誤的記錄被插入ARP或者IP route表,可以用兩種方式來刪除:
a. 使用arp -d host_entry
b. 自動(dòng)過期,由系統(tǒng)刪除
這樣,可以采用以下的一些方法:
1). 減少過期時(shí)間
#ndd -set /dev/arp arp_cleanup_interval 60000
#ndd -set /dev/ip ip_ire_flush_interval 60000
60000=60000毫秒 默認(rèn)是300000
加快過期時(shí)間,并不能避免攻擊,但是使得攻擊更加困難,帶來的影響是在網(wǎng)絡(luò)中會(huì)大量的
出現(xiàn)ARP請(qǐng)求和回復(fù),請(qǐng)不要在繁忙的網(wǎng)絡(luò)上使用。
2). 建立靜態(tài)ARP表
這是一種很有效的方法,而且對(duì)系統(tǒng)影響不大。缺點(diǎn)是破壞了動(dòng)態(tài)ARP協(xié)議??梢越⑷缦碌奈募?
test.cnns.net 08:00:20:ba:a1:f2
user. cnns.net 08:00:20:ee:de:1f
使用arp -f filename加載進(jìn)去,這樣的ARP映射將不會(huì)過期和被新的ARP數(shù)據(jù)刷新,除非使用arp -d才能刪除。但是一旦合法主機(jī)的網(wǎng)卡硬件地址改變,就必須手工刷新這個(gè)arp文件。這個(gè)方法,不適合于經(jīng)常變動(dòng)的網(wǎng)絡(luò)環(huán)境。
3).禁止ARP
可以通過ifconfig interface -arp 完全禁止ARP,這樣,網(wǎng)卡不會(huì)發(fā)送ARP和接受ARP包。但是使用前提是使用靜態(tài)的ARP表,如果不在apr表中的計(jì)算機(jī) ,將不能通信。這個(gè)方法不適用與大多數(shù)網(wǎng)絡(luò)環(huán)境,因?yàn)檫@增加了網(wǎng)絡(luò)管理的成本。但是對(duì)小規(guī)模的安全網(wǎng)絡(luò)來說,還是有效和可行的。
3)IP Forwarding (IP轉(zhuǎn)發(fā))
IP是用來傳輸數(shù)據(jù)的底層協(xié)議。IP 轉(zhuǎn)發(fā)是在不同網(wǎng)卡之間路由包數(shù)據(jù)的過程。一般是用路由器來實(shí)現(xiàn),但是擁有多網(wǎng)絡(luò)接口的主機(jī)也可以實(shí)現(xiàn)。當(dāng)有兩個(gè)網(wǎng)絡(luò)接口的時(shí)候,Solairs系統(tǒng)默認(rèn)打開ip轉(zhuǎn)發(fā)。
1) 關(guān)閉IP轉(zhuǎn)發(fā)
對(duì)于多宿主主機(jī),存在可能的安全問題是,攻擊者可能通過ip轉(zhuǎn)發(fā)的方式訪問到私有網(wǎng)絡(luò)。在solaisr系統(tǒng)中,包轉(zhuǎn)發(fā)能很的容易關(guān)閉。簡(jiǎn)單的生成一個(gè)文件 /etc/notrouter,就能在下次啟動(dòng)的時(shí)候關(guān)閉ip轉(zhuǎn)發(fā)。另外通過ndd命令也能在系統(tǒng)運(yùn)行的時(shí)候關(guān)閉ip轉(zhuǎn)發(fā):
#ndd -set /dev/ip ip_forwarding 0
2) 嚴(yán)格限定多主宿主機(jī)
如果是多宿主機(jī),還可以加上更嚴(yán)格的限定防止ip spoof的攻擊
#ndd -set /dev/ip ip_strict_dst_multihoning 1
默認(rèn)是關(guān)閉的(值為0)
3) 轉(zhuǎn)發(fā)包廣播
由于在轉(zhuǎn)發(fā)狀態(tài)下默認(rèn)是允許的,為了防止被用來實(shí)施smurf攻擊,關(guān)閉這一特性。 (參見cert-98.01)
#ndd -set /dev/ip ip-forward_directed_broadcasts 0
4)路由
路由的過程就是檢查路由信息,從而決定如何從哪個(gè)接口傳輸數(shù)據(jù)包的過程。即使一個(gè)桌面系統(tǒng),也要有路由設(shè)置。路由表需要實(shí)時(shí)的升級(jí)?,F(xiàn)在有多種路由協(xié)議可以用來路由數(shù)據(jù)。
Solaris系統(tǒng)使用in.routed守護(hù)程序支持RIP version 1,使用in.rdisc守護(hù)進(jìn)程支持ICMP路由更新。當(dāng)solairs系統(tǒng)配置成為一個(gè)路由設(shè)備來轉(zhuǎn)發(fā)數(shù)據(jù)包的時(shí)候,它通過上面的兩種方式動(dòng)態(tài)更新路由信息。
5)攻擊
有多種方法能威脅動(dòng)態(tài)路由協(xié)議。攻擊者能偽造虛假的路由更新信息發(fā)送過來,從而達(dá)到DOS的效果;同樣的方法,還能使數(shù)據(jù)報(bào)文轉(zhuǎn)發(fā)到其他的網(wǎng)絡(luò)上,使攻擊者能監(jiān)聽數(shù)據(jù)。
默認(rèn)的solairs系統(tǒng)使用系統(tǒng)守護(hù)程序動(dòng)態(tài)管理路由信息。靜態(tài)路由很好的防止路由信息被遠(yuǎn)程動(dòng)態(tài)改變。使用/etc/defaultrouter來設(shè)置本地子網(wǎng)的路由。使用route命令來設(shè)置其他路由信息。
但是對(duì)于一個(gè)簡(jiǎn)單網(wǎng)絡(luò)來說,使用靜態(tài)路由是合適的,一旦網(wǎng)絡(luò)中有較多的路由設(shè)備,必須使用動(dòng)態(tài)路由。Solairs系統(tǒng)將來也會(huì)繼續(xù)支持動(dòng)態(tài)路由協(xié)議。
l 轉(zhuǎn)發(fā)源路由包
源路由包中包含了了指定數(shù)據(jù)如何路由的信息。因此攻擊者可能使用源路由包繞過某些特定的路由器和防火墻設(shè)備,也可能用來避開一個(gè)已知的IDS系統(tǒng)的監(jiān)控范圍。在大多數(shù)solairs的應(yīng)用系統(tǒng)上,是不需要這個(gè)特性的。由于solairs在打開ip轉(zhuǎn)發(fā)以后默認(rèn)支持源路由轉(zhuǎn)發(fā),所以我們必須手動(dòng)關(guān)閉它:
#ndd -set /dev/ip ip_forward_src_routed 0
6)ICMP
ICMP:網(wǎng)絡(luò)控制信息協(xié)議。下面討論在IP驅(qū)動(dòng)上配置solaris的ICMP特性。
1) 廣播:
ICMP廣播經(jīng)常會(huì)帶來麻煩,這里有一條原則來防止廣播風(fēng)暴-控制ICMP的錯(cuò)誤信息不被生成。為來防止攻擊者利用ICMP實(shí)施DOS攻擊,最好禁止本地網(wǎng)絡(luò)對(duì)ICMP廣播的響應(yīng)。Solairs系統(tǒng)能調(diào)節(jié)三種ICMP廣播的參數(shù)。
2)響應(yīng)Echo廣播:
Echo廣播通常用來診斷網(wǎng)絡(luò)主機(jī)的存活情況,一旦主機(jī)收到一個(gè)對(duì)廣播地址的echo請(qǐng)求,默認(rèn)情況下所有系統(tǒng)會(huì)回復(fù)這個(gè)廣播要求。當(dāng)有人惡意定制過量的echo包,系統(tǒng)中的流量將大為增加。因此我們可以關(guān)閉對(duì)echo廣播的響應(yīng)
#ndd -set /dev/ip ip_respond_to_echo_boadcast 0
3)響應(yīng)時(shí)間戳廣播
時(shí)間戳通常用來同步兩個(gè)不同系統(tǒng)的時(shí)鐘,但是系統(tǒng)沒有必要回復(fù)對(duì)廣播地址發(fā)送的時(shí)間戳請(qǐng)求,所以我們可以關(guān)閉這種回應(yīng)。
#ndd -set /dev/ip ip_respond_to_timestamp_broadcast 0
4)地址掩碼廣播
地址掩碼請(qǐng)求被用來確定本地掩碼,通常是網(wǎng)絡(luò)中無盤工作站在啟動(dòng)的時(shí)候發(fā)送。用下面的命令能禁止對(duì)這樣請(qǐng)求的應(yīng)答
#ndd -set /dev/ip ip_respind_to_address_mask_broadcast 0
7)重定向錯(cuò)誤
1)重定向錯(cuò)誤
通常是路由器用來通知主機(jī)使用另一個(gè)路由器來傳輸數(shù)據(jù)的指示報(bào)文。報(bào)文重指定的路由器必須和發(fā)送路由器一樣連接同一個(gè)子網(wǎng),而收到報(bào)文的主機(jī)必須在自己的路由表里新增一條到那個(gè)子網(wǎng)的路由。不像ARP的包,這個(gè)路由不會(huì)過期也不會(huì)自動(dòng)刪除。很多系統(tǒng)檢測(cè)這樣的報(bào)文用來發(fā)現(xiàn)錯(cuò)誤和潛在的問題,從而優(yōu)先更改自己的路由表。
2)接受重定向錯(cuò)誤
一個(gè)攻擊者能偽造重定向錯(cuò)誤的報(bào)文從而給目標(biāo)主機(jī)裝載一個(gè)新的路由,而這個(gè)路由也許更本就是錯(cuò)誤的,這樣主機(jī)就不會(huì)和一些特定的主機(jī)或網(wǎng)絡(luò)通信,這是一種DOS攻擊。雖然重定向報(bào)文本身有一些校驗(yàn)規(guī)則,但是這些規(guī)則能很容易的被欺騙。而且目前存在大量的工具來達(dá)到這個(gè)目的。大多數(shù)只有一條默認(rèn)路由主機(jī)系統(tǒng)是不需要理會(huì)這種報(bào)文的,因此我們可以使用ndd命令忽略ICMP重定向錯(cuò)誤報(bào)文。(solairs默認(rèn)是不忽略的)
#ndd -set /dev/ip ip_ignore_redirect 1
3)發(fā)送重定向錯(cuò)誤報(bào)文
只有路由器才需要重定向錯(cuò)誤,任何主機(jī)即使是多宿主主機(jī)也不需要發(fā)送這種報(bào)文,因此我們可以使用ndd來禁止本機(jī)發(fā)送錯(cuò)誤重定向報(bào)文。
#ndd -set /dev/ip ip_send_redirects 0
4)時(shí)間戳響應(yīng)
就像前面提到的,時(shí)間戳廣播報(bào)文在大多數(shù)環(huán)境下是不需要的。而solaris系統(tǒng)還能夠完全不接受這種報(bào)文。
#ndd -set /dev/ip ip_respond_to_timestamp 0
關(guān)閉這個(gè)特性以后,有些使用rdate系統(tǒng)命令的unix主機(jī)將不能再同步時(shí)鐘。但是solaris 2.6和7使用更好的時(shí)鐘同步方式-NTP(網(wǎng)絡(luò)時(shí)間協(xié)議),請(qǐng)參見xntpd的幫助。
8)SYN_flood攻擊
TCP-SYN flood又稱半開式連接攻擊,每當(dāng)我們進(jìn)行一次標(biāo)準(zhǔn)的TCP連接(如WWW瀏覽,下載文件等)會(huì)有一個(gè)一個(gè)三次握手的過程,首先是請(qǐng)求方向服務(wù)方發(fā)送一個(gè)SYN消息,服務(wù)方收到SYN后,會(huì)向請(qǐng)求方回送一個(gè)SYN-ACK表示確認(rèn),當(dāng)請(qǐng)求方收到SYN-ACK后則再次向服務(wù)方發(fā)送一個(gè)ACK消息,一次成功的TCP連接由此就建立,可以進(jìn)行后續(xù)工作了,如圖所示:
請(qǐng)求方 服務(wù)方
---------------------> SYN
SYN-ACK <----------------
----------------------> ACK
而TCP-SYN flood在它的實(shí)現(xiàn)過程中只有前兩個(gè)步驟,當(dāng)服務(wù)方收到請(qǐng)求方的SYN并回送SYN-ACK確認(rèn)消息后, 請(qǐng)求方由于采用源地址欺騙等手段,致使服務(wù)方得不到ACK回應(yīng),這樣,服務(wù)方會(huì)在一定時(shí)間處于等待接收請(qǐng)求方ACK消息的狀態(tài),一臺(tái)服務(wù)器可用的TCP連接是有限的,如果惡意攻擊方快速連續(xù)的發(fā)送此類連接請(qǐng)求,則服務(wù)器可用TCP連接隊(duì)列很快將會(huì)阻塞,系統(tǒng)可用資源,網(wǎng)絡(luò)可用帶寬急劇下降,無法向用戶提供正常的網(wǎng)絡(luò)服務(wù)。
對(duì)于solaris 2.5.1,只有安裝了patch 103582-1(或以上)才能防止syn_flood.在synflood沒有流行以前,連接隊(duì)列和backlog隊(duì)列是相同的,solairs 2.6/7和安裝了patch以后的2.5.1系統(tǒng),現(xiàn)在存在兩條隊(duì)列,一個(gè)是已連接的隊(duì)列,一條是未連接完成的隊(duì)列。SYN攻擊時(shí)只能填充后一條隊(duì)列,而且,一旦隊(duì)列滿,將隨機(jī)丟棄老的syn包。系統(tǒng)還會(huì)監(jiān)控這個(gè)隊(duì)列被短時(shí)間填充的情況,一旦懷疑是syn_flood,將在系統(tǒng)的messages中記錄下來。
Mar 8 19:24:01 example unix: WARNING: High TCP connect timeout rate!
System (port 80) may be under a SYN flood attack!
新隊(duì)列的大小也是可以調(diào)節(jié)的,繁忙的web服務(wù)器需要提高未連接隊(duì)列的大小。默認(rèn)的大小是1024,我們可以提高到4096。
#ndd -set /dev/tcp tcp_conn_req_max_q0 4096
當(dāng)然,一般情況下,核心的隊(duì)列增大,系統(tǒng)的內(nèi)存最好也應(yīng)有相應(yīng)的增加。
9)連接耗盡攻擊
和SYN flood攻擊不同,連接耗盡攻擊不太常見。因?yàn)檫@種攻擊必須使用真實(shí)IP,攻擊的目標(biāo)是已連接隊(duì)列。許多系統(tǒng)有一個(gè)同時(shí)連接的上限,取決于核心參數(shù)和系統(tǒng)內(nèi)存情況。作為通常的web服務(wù)器,這個(gè)上限值很難達(dá)到,因?yàn)閔ttp的連接是典型的短時(shí)連接。但是一個(gè)攻擊者可能快速發(fā)送大量的連接請(qǐng)求,同時(shí)保持連接,這樣正常訪問者的連接就可能被服務(wù)器拒絕 。
我們可以通過優(yōu)化系統(tǒng)核心和增加內(nèi)存來緩解,但不是根本的方法。因?yàn)楣粽呖赡芡瑫r(shí)調(diào)動(dòng)多臺(tái)機(jī)器同時(shí)攻擊。當(dāng)然,我們可以在發(fā)現(xiàn)攻擊以后,在防火墻或路由器上拒絕這些IP來源的連接。
如果不通過網(wǎng)絡(luò)設(shè)備,僅僅通過調(diào)節(jié)系統(tǒng)參數(shù)來緩解攻擊。一方面,可以調(diào)節(jié)web server,如apache的timeout參數(shù),減短連接保持時(shí)間,另一方面,我們可以將核心以連接隊(duì)列參數(shù)增大(默認(rèn)是128)。
#ndd -set /dev/tcp tcp_conn_req_max_q 1024
以上的方法能阻止大多數(shù)連接耗盡的攻擊企圖,除非攻擊者調(diào)動(dòng)更多的資源,發(fā)動(dòng)大規(guī)模的DDOS,但這樣會(huì)使攻擊者更容易暴露。
10)IP 欺騙
IP欺騙基本原理:
TCP連接的建立 :為了利用TCP連接交換數(shù)據(jù),主機(jī)間首先必須建立一個(gè)連接。TCP建立連接時(shí)可以分為3個(gè) 步驟,稱為三步握手法。如果主機(jī)A運(yùn)行rlogin客戶程序,并且希望連接到主機(jī)B上的rlogin daemon 服務(wù)器程序上,連接過程如圖二所示。
1 A ---SYN---> B
2 A <--SYN/ACK--- B
3 A ---ACK---> B
需要提醒大家的是,主機(jī)A和B的TCP模塊分別使用自己的序列編號(hào)。在時(shí)刻1時(shí),客戶端 通過設(shè)置標(biāo)志位SYN=1告訴服務(wù)器它需要建立連接。同時(shí),客戶端在其TCP頭中的序列號(hào)域SEQ放置了它的初始序列號(hào)(ISN),并且告訴服務(wù)器序列號(hào)標(biāo)示域是有效的,應(yīng)該被檢查。在時(shí)刻2時(shí),服務(wù)器端在接收了上面的SYN后,作出的反應(yīng)是將自己的ISN和對(duì)客戶端的ACKA發(fā)向客戶端并且告知下一個(gè)期待獲得的數(shù)據(jù)序列號(hào)是(ISN+1)??蛻舳嗽诘谝涣鲿r(shí)刻,對(duì)服務(wù)器的ISN進(jìn)行確認(rèn)。這時(shí),數(shù)據(jù)傳輸就可以進(jìn)行了。ISN與序列號(hào)的遞增了解序數(shù)編號(hào)如何選擇初始
序列號(hào)和如何根據(jù)時(shí)間變化是很重要的。似乎應(yīng)該有這種情況,當(dāng)主機(jī)啟動(dòng)后序列編號(hào)初始化為1,但實(shí)際上并非如此。初始序列號(hào)是由tcp_init函 數(shù)確定的。ISN每秒增加序列號(hào)128000,如果有連接出現(xiàn),每次連接將反計(jì)數(shù)器的數(shù)值增加 64000。很顯然,這使得用于表示ISN的32位計(jì)數(shù)器在沒有連接的情況下每9.32小時(shí)復(fù)位 一次。之所以這樣,是因?yàn)檫@樣有利于最大限度地減少舊有連接的信息干擾當(dāng)前連接的 機(jī)會(huì)。這里運(yùn)用了望2MSL等待時(shí)間的概念(不在本文討論的范圍之內(nèi)。)如果初始序列 號(hào)是隨意選擇的,那么不能保證現(xiàn)有序列號(hào)是不同于先前的。假設(shè)有這樣一種情況,在 一個(gè)路由回路中的數(shù)據(jù)包最終跳出了循環(huán),回到了“舊有”的連接(此時(shí)其實(shí)是不同于 前者的現(xiàn)有連接(,顯然會(huì)發(fā)生對(duì)現(xiàn)有連接的干擾。 端口號(hào) 為了提供對(duì)TCP模塊的并行訪問,TCP提供了叫做端口的用戶接口。端口被操作系統(tǒng)內(nèi)核 利用來標(biāo)示不同的網(wǎng)絡(luò)進(jìn)程,也就是嚴(yán)格區(qū)分傳輸層入口的標(biāo)示(就是說,IP不關(guān)心他們的存在)。
TCP端口與IP地址一起提供網(wǎng)絡(luò)端到端的通信。事實(shí)上,在任何時(shí)刻任何I nternet連接都能由4個(gè)要素來措述:源IP地址、源地址端口號(hào)、目的IP地址和目的地址。采樣目標(biāo)主機(jī)發(fā)出的TCP序列號(hào),猜測(cè)出它的數(shù)據(jù)序列號(hào)。然后,偽裝成被信任的主機(jī), 同時(shí)建立起 與目標(biāo)主機(jī)基于地址驗(yàn)證的應(yīng)用連接。如果成功,黑客可以使用一種簡(jiǎn)單的命令放置一個(gè)系統(tǒng)后門,以進(jìn)行非授權(quán)操作。
目前,RFC 1498定義了更好的隨機(jī)ISN生成方法,使得這種攻擊很難成功。對(duì)于solaris系統(tǒng)ISN生成有三種方式。
0: 可預(yù)測(cè)的ISN
1: 增強(qiáng)的ISN 隨機(jī)生成
2: RFC 1948描述的ISN生成方式
所有版本的solaris默認(rèn)生成方式值是1。2.5.1只有 0,1兩種方式,2.6/7擁有0,1,2三種ISN生成方式。
我們可以修改/etc/default/inetinit文件來提高ISN的生成強(qiáng)度。將 TCP_STRONG_ISS=1改為 TCP_STRONG_ISS=2重起系統(tǒng)使他生效。對(duì)于solair 2.5.1,此方法無效。
11)增加私有端口
一般的情況下,1-1024端口被稱為私有端口,只允許具有根權(quán)限的進(jìn)程連接。但是有些大于1024的端口,即使需要這樣的限制,卻無法定義,如NFS的服務(wù)器端口2049,當(dāng)然還有一些其他定義的高于1024的私有端口。
在solairs2.5.1/2.6/7下使用如下方式,可以自定義最小的非私有端口
ndd -set /dev/tcp tcp_smallest_nonpriv_port 205
這樣以來,0-2049都被定義為私有端口。在solaris 2.6/7下,還能使用另一個(gè)參數(shù)單獨(dú)指定私有端口。
#ndd /dev/tcp tcp_extra_priv_ports
2049
4045
用來顯示已經(jīng)定義的擴(kuò)展私有端口
#ndd -set /dev/tcp tcp_extra_priv_ports_add 6112
來增加新的私有端口定義。
使用 ndd -set /dev/tcp tcp_extra_priv_ports_del 來刪除定義。
要注意的是,不要隨便定義私有端口,因?yàn)橛行┓歉鶛?quán)限的進(jìn)程會(huì)使用這些端口。特別是改變最小非私有端口這個(gè)參數(shù),經(jīng)常會(huì)引起問題。應(yīng)仔細(xì)分析你的需求再用擴(kuò)展私有端口定義的方式單獨(dú)增加。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注