1. 程式人生 > >Unix高階安全設定

Unix高階安全設定

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

文章閱讀 The Big Green 討論區 [Software]

--------------------------------------------------------------------------------
發信人: Mars (FangQ), 信區: Software
標  題: Unix高階安全設定[ZZ]
發信站: The Big Green (Sat Oct  5 16:58:10 2002) , 轉信

http://www.20cn.net/ns/wz/sys/data/20020822032035.htm

Unix高階安全設定 (閱覽 338 次)

Unix高階安全設定

 

作者:KCN

第一部分 Unix歷史與發展

1.1 UNIX簡介
UNIX 已有數十年的歷史,在這期間,它的改變即使沒有上億次,也有數百萬次了,有成千上
萬的個人和公司實現了上千種不同的版本,有上百萬系統管理員在從微型嵌入式系統到超級
計算機上都安裝過它。無可爭論,沒有兩個實際的UNIX作業系統是完全相同的。
  UNIX”一詞是屬於Open Group的一個商標,該組織是一個要求符號得到正確歸屬的國際
協會。在這數十年當中,該標識已經被沖淡到沒有具體含義。雖然如此,Open Group仍釋出
了“The Single UNIX Specification”,這可以在

http://www.UNIX-systems.org/online.
html上看到。
  “Unix”是雙關語,表示名字Multics,它最初被寫作“Unics”,表示UNiplexed Info
rmation and Computing System。“Unix”和“UNIX”在如今都被廣泛使用。曾經有一段時
間,Dennis Ritchie試圖宣佈用小寫版本,因為“UNIX”不是開頭字母組成。
  許多執行Linux等類似UNIX系統的人認為他們執行的是UNIX。正式UNIX系統和非正式UNI
X系統通常被認為屬於一類----不論是書中、媒介、網上還是社會公認。
  按照UNIX FAQ的定義,UNIX是“一個用C語言編寫的作業系統,它有層次檔案系統並整合
了檔案和裝置I/O,其系統呼叫介面包括fork ( )和pipe ( )等服務,使用者介面包括cc、tro
ff、grep、awk等工具和一個被選擇的shell”。可以再加一些,UNIX為多工提供一致的方
式,並內建有建立、同步和終止程序的操作,它可在不同種類計算機間進行移植。

1.2 UNIX發展與歷史
1969年,Ken Thompson、Dennis Ritchie和其他一些人在AT&T貝爾實驗室開始進行一個“li
ttle-used PDP-7 in a corner”的工作,它後來成為UNIX。10年裡,UNIX在AT&T的發展經歷
了數個版本。V4(1974)用C語言重寫,這成為系統間作業系統可移植性的一個里程碑。V6(
1975)第一次在貝爾實驗室以外使用,成為加州大學伯克利分校開發的第一個UNIX版本的基
礎。
貝爾實驗室繼續在UNIX上工作到80年代,有1983年的System V(“五”,不是字母)版本和
1989年的System V,Release 4(縮寫為SVR4)版本。同時,加利福尼亞大學的程式設計師改動了
AT&T釋出的原始碼,引發了許多主要論題。Berkeley Standard Distribution(BSD)成為第
2個主要“UNIX”版本。1984年的BSD 4.2版在大學和公司計算部門中得到廣泛應用,它的一
些特徵被吸收到SVR4中。
從90年代開始,AT&T的原始碼許可證創造了市場的繁榮,不同開發者開發了數百種UNIX版本
。AT&T在1993年把UNIX產業賣給了Novell, Novell兩年後又把它賣給了Santa Cruz Operati
on。同時,UNIX商標被轉讓給X/Open協會,X/Open協會後來成為了Open Group。
當UNIX的經營從一個實體到另一個實體傳遞時,幾個長期的開發開始收穫果實。傳統上,要
得到一個執行的BSD系統,使用者需要從AT&T得到原始碼許可證。但到90年代早期,伯克利的開
發者在BSD上做了許多工作,使原始的AT&T原始碼大部分被改動了。後續的程式設計師,從Willi
am和Lynne Jolitz開始在網路分佈環境中開發BSD,後來在1992年成為386BSD 0.1版。這個最
初的“免費原始碼”BSD具有三個分支,即:Net BSD、Free BSD和Open BSD,都以BSD 4.4為
基礎。
1984年,程式設計師Richard Stallman開始開發來源於UNIX的免費GNU(GNU Not UNIX)。到90年
代早期,GNU專案出現了幾個程式設計里程碑,包括GNU C庫和Bourne Again Shell (bash)的發行
。整個系統除了一個關鍵因素即工作核心外基本完成。
接下來是芬蘭赫爾辛基大學的學生Linus Torvalds。Linus看到了一個叫作Minix的小型UNIX
系統,覺得自己能做得更好。1991年秋天,他發行了一個叫“Linux”的免費軟體核心的源代
碼—是他的姓和Minux的組合。到1994年,Linus和一個核心開發小組發行了Linux 1.0版。L
inus和朋友們有一個免費核心,Stallman和朋友們擁有一個免費的UNIX克隆系統的其餘部分
。人們把Linux核心和GNU合在一起組成一個完整的免費系統,該系統被稱為“Linux”,儘管
Stallman更願意取名為“GNU/Linux System”[6]。有幾種不同類別的GNU/Linux:一些可以
被公司用來支援商業使用,如Red Hat、Caldera Systems和S.U.S.E;其他如Debian GNU/Li
nux,更接近於最初的免費軟體概念。
Linux現已發展到核心2.2版。Linux能在幾種不同體系結構的晶片上執行,並已經被各界接納
或支援。其支持者有惠普、矽谷影象和Sun等有較長曆史的UNIX供應商,還有康柏和Dell等P
C供應商以及Oracle和IBM等主要軟體供應商。或許最具諷刺的是,微軟承認無所不在的免費
軟體的競爭性威脅,但它不願或不能公開自己的軟體原始碼。
後來微軟開始推出Windows NT (Windows 2000)。到90年代末,許多供應商開始放棄UNIX服務
器平臺而轉向Windows NT。例如Silicon Graphics 公司已決定把Intel硬體和NT作為未來的
圖形平臺。

第二部分 Unix典型安全隱患
2.1 RPC守護程序程式的錯誤使入侵者可以直接獲得root許可權
對Unix威脅最大可以說就是rpc上面的漏洞,遠端過程呼叫(Remote Procedure Call)允許
一臺計算機上的程式去執行另一臺計算機上的程式。它們廣泛的應用在各種網路服務中,如
檔案共享服務NFS。有很多漏洞是RPC本身的缺陷導致的,它們正不停的湧現出來。有很明顯
的證據表明,1999年末2000年初大規模的分散式拒絕服務攻擊中,很多被作為攻擊跳板的犧
牲品就是因為存在RPC漏洞。在Solar Sunrise事件期間,對美國陸軍廣為人知的成功攻擊就
是因為在數百臺國防部的系統中找到了一個RPC漏洞。
2.2 一些應用的遠端漏洞
遠端漏洞可以使遠端攻擊者在只對開放了有漏洞服務的應用利用的情況下,就可以得到一些
許可權或者root許可權。
例如:BIND程式存在的問題,利用nxt,qinv,in.named可直接得到root許可權
BIND(Berkeley Internet Name Domain)軟體包是域名服務(DNS)的一個應用最廣泛的實現
軟體--我們所有人都通過它來定位Internet上的系統,只需知道域名(如www.cnns.net
而不用知道IP地址,由此可體會它的重要性--這使它成為最受歡迎的攻擊目標。
2.3 本地漏洞
本地漏洞雖然沒有上面兩種漏洞那麼嚴重,但是他也是評估系統安全與否的一個重要因素,
它可以使許可權地的系統使用者來提升自己的系統許可權,或者使一個得到了一些許可權的遠端攻擊
者,擴大自己的戰果,提升許可權。
例如,ff.core緩衝區溢位漏洞,一個普通使用者只要執行一個簡單的指令碼,就可以令緩衝區溢
出從而的到一個root shell。
2.4 暴露系統資訊
嚴格的說這不是漏洞,但是他核你的系統安全相關。舉例子來說,finger暴露了系統合法用
戶名,預設shell等等資訊,這就可以被攻擊者利用起來猜密碼。再如某個軟體的版本號暴露
,就會令攻擊者,針對此版本來進行攻擊,這就使攻擊者更容易的入侵的系統。

第三部分 常見Unix安全設定方案
3.1 Solaris 系列
3.1.1 PROM OpenBoot 和物理安全
3.1.1.1 OpenBoot安全級別
none :不需要任何口令。所有OpenBoot設定都可以修改,任何人只要物理接觸到主控臺,就
可以完全控制。command:除了boot和go之外所有命令都需要口令。full:除了go命令之外所
有命令都需要口令。
3.1.1.2 改變OpenBoot安全級別
首先使用eeprom security-password 命令設定OpenBoot口令,然後在root登入狀態使用eep
rom security-mode=command命令改變安全級別為command或在OK狀態:ok setenv security
-mode=command的密碼保護來實現。
3.1.2 檔案系統的安全
3.1.2.1 基礎知識
檔案系統是unix系統安全的核心。在unix中,所有的事物都是檔案。Unix中的基本檔案型別
有正規檔案、目錄、特殊檔案、連結、Sockets等等。這些不同型別的檔案以一個分層的樹結
構進行組織,以一個叫"root"的目錄為起始位置("/")。整個就是一個檔案系統。每個檔案對
應一個"i節點","i節點"包括UID(檔案擁有者)、GID(檔案所在組)、模式(檔案的許可權)、文
件大小、檔案型別、ctime("i節點"上次修改時間)、mtime(檔案上次修改時間)、atime(檔案
上次訪問時間)、nlink(連結數)。它表示了檔案的基本屬性。
大家注意到,"/"下有很多的目錄,那麼這些目錄是幹什麼的呢?下面簡要介紹一下目錄結構
。如下:
/bin 使用者命令的可執行檔案
/dev 特殊裝置檔案
/etc 系統執行檔案、配置檔案、管理檔案,主要是配置檔案
/home 使用者起始目錄
/lib 引導系統以及在root檔案系統中執行命令所需的共享庫檔案
/lost+found 與特定檔案系統斷開連結的丟失檔案
/mnt 臨時安裝的檔案系統(如光碟機、軟碟機)
/proc 一個偽檔案系統,用來作為到核心資料結構或正在執行的程序的介面(用於除錯)
/sbin 只有root使用的可執行檔案和只需要引導或安裝/usr的檔案
/tmp 臨時檔案
/usr 為使用者和系統命令使用的可執行檔案、標頭檔案、共享庫、幫助檔案、本地程式(在/usr
/local中)
/var 用於電子郵件、列印、cron等的檔案,統計檔案,日誌檔案
檔案系統有多種型別,unix核心支援如下檔案系統:
1) ext2 固定和可移動磁碟都支援的一種高效能檔案系統,用於linux
2) msdos 由MS-DOS和Windows使用
3) umsdos Linux使用的一種擴充的DOS檔案系統,支援長檔名、許可權設定
4) iso9660 遵從ISO9660標準的CD-ROM檔案系統
5) hpfs High Performance Filesystem,高效能檔案系統,OS/2使用
6) minix 在Minux OS中使用,最早的Linux檔案系統
7) nfs 用來訪問遠端計算機中磁碟的網路檔案系統
8) swap 用作交換的磁碟分割槽
3.1.2.2 檔案許可權
檔案許可權是unix檔案系統安全的關鍵。Unix中的每個使用者有一個唯一的使用者名稱和UID(使用者ID
號),每個使用者屬於一個或多個組。基本分組成員在/etc/passwd中定義,附加的分組成員在
/etc/group中定義。例如,使用者tiger的UID為225,分組為11(students),此外,他還是分組
185(postgraduates)的成員。每個檔案和目錄有三組許可權,一組是檔案的擁有者、一組是文
件所屬組的成員、一組是其他所有使用者。"r"表示可讀,"w"表示可寫,"x"表示可執行。一共
9位(每組3位),合起來稱為模式位(mode bits)。
模式位通常由一列10個字元來表示,每個字元表示一個模式設定,第一個指明檔案型別,如
(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使一個普通檔案,檔案擁有者可以讀寫執行、本組其他成
員可以讀執行、其他使用者可以讀執行。我們可以用chmod和umask命令來改變許可權,這很簡單
,察看相應的幫助就知道怎麼修改許可權。
3.1.2.3 SUID/SGID
為什麼要單獨把他們從檔案許可權中分出來講呢?因為,這是網路入侵者非常愛用的入侵入口
。SUID表示"設定使用者ID",SGID表示"設定組ID"。當用戶執行一個SUID檔案時,使用者ID在程
序執行過程中被置為檔案擁有者的使用者ID。如果檔案屬於root,那使用者就成為超級使用者。同
樣,當一個使用者執行SGID檔案時,使用者的組被置為檔案的組。例如,PS命令以SUID root執行
,他從系統記憶體中讀取,這是一般使用者不能做的。SUID程式代表了重要的安全漏洞,特別是
SUID設為root的程式。
Unix實際上有兩種型別的使用者ID。"real user ID"是在登入過程中建立的使用者ID。 "effect
ive user ID"是在登入後的會話過程中通過SUID和SGID位來修改。當一個使用者執行一條命令
時,程序繼承了使用者登入Shell的許可權,這時"real user ID"和"effective user ID"是相同
的。當SUID位被設定時,程序繼承了命令擁有者的許可權。例如普通使用者執行passwd命令時,
他能夠修改/etc/passwd檔案,儘管檔案是屬於root的。這成為可能是因為passwd命令以roo
t的SUID許可權執行。那麼如何識別SUID程式呢?我們檢查檔案的許可權模式,在它的第四位如果
不是"x",而是"s",就是一個SUID程式。例如,ls -l /bin/su命令顯示:
-rwsr-xr-x 1 root root 14888 Aug 15 1999 /bin/su*
表明su是一個SUID程式。
Unix系統安全的一種典型攻擊就是建立一個SUID是root的shell拷貝,然後把他隱藏。通過調
用後門,攻擊者就獲得了root的權利。例如,某個系統管理員忘了關閉某個root的Shell,一
個壞人經過執行如下命令:

cp /bin/bash /home/badman/.bash; chmod 4777 /home/badman/.bash
badman現在就有了一個bash的SUID root拷貝任其處理。他就有完整的root許可權了。因此,系
統管理員應該定期察看系統中有哪些SUID和SGID檔案。用下面的命令可以實現:find / -ty
pe f /( -perm -4000 -o -perm -2000 /) -ls
當然,攻擊者可以通過修改find命令來逃避檢測,所以要執行專門的檢測軟體(如Tripwire)
來進行檢查。
3.1.2.4 加密與驗證
Tripwire工具提出了使用密碼校驗和來確定檔案是否經過了未認證的修改,加密技術可以用
來保護機密檔案甚至整個檔案系統。加密是通過金鑰將明文轉化為一堆亂碼的密文,從而起
到保護檔案內容的作用。Unix常用的加密演算法有crypt(最早的加密工具)、DES(目前最常用的
)、IDEA(國際資料加密演算法)、RC4、Blowfish(簡單高效的DES)、RSA等等。具體的加密演算法
這裡不再闡明,需要了解請閱讀Bruce Schneier的《應用密碼學》一書。注意單向hash函式
,他處理任意長度的資訊並返回一個固定長度的hash值(128位)。常用的有MD5、SHA、HAVAL
、Snefru等等。單向hash函式經常和公開金鑰演算法一起來建立數字簽名,提供身份證明。與
傳統的簽名相比,數字簽名還可以指出檔案是否被修改過。
PGP是unix下用來保護資訊特別是電子郵件的工具。他使用IDEA演算法為資料加密,使用RSA算
法來進行金鑰管理和數字簽名,使用MD5來作為一個單向hash函式。其特點在於安全:不僅內
容被偽裝,連發送者的簽名也加密。PGP還可以用來加密本地檔案。現在常用的Linux下的PG
P工具為:pgpe(加密)、pgps(簽名)、pgpv(確認/解密)、pgpk(管理金鑰)。請參考相應的幫
助來使用。
"特洛伊木馬"的故事不知道大家聽說過沒有。古希臘人久攻特洛伊城不下,於是假裝求和,
送了一個巨大的木馬作為禮物,向城主Minerva表示和解。特洛伊人將木馬拉入城內,到了夜
晚,藏在木馬中的希臘士兵鑽出來,裡應外合,攻破特洛伊城。在電腦保安領域,這種欺
騙技巧成為攻擊電腦保安的一種標準方式。他藏在你的計算機裡,隨時可能爆發,如果攻
擊者需要的話。因此,一旦一個系統被裝了特洛伊木馬,他就不能在信任了,必須從新安裝
。怎麼避免呢,要養成良好的習慣,例如:限制下載,只從有聲望的站點下載東西;檢驗下
載的檔案;避免執行已編譯好的二進位制程式碼,從原始碼開始編譯;不執行不信任的電子郵件
傳送的程式;不執行從非信任的Web站點得到的Java applets和Java Script。
MD5校驗和有時與軟體一起發行,使用者可以用他來檢驗一個軟體包。使用者可以執行Red Hat L
inux中包含的md5sum工具,例如:md5sum cops.1.04.tar.gz
結果:lfa416872934e5bee99068f9989cb8b0 cops.1.04.tar.gz
和軟體包自帶的校驗和檔案比較,如果不符,則說明檔案在傳輸過程中出了問題,最好從新
下載,本檔案不可靠。md5sum還可以用來檢驗系統檔案,在第一次安裝系統之後對重要的li
lo系統二進位制檔案進行一下校驗:md5sum lilo,其結果應該一直保持不變,除非升級。
3.1.2.5 完整性檢查
完整性是安全系統的核心屬性。使用者需要知道昨天寫的檔案和今天開啟的檔案沒有被改動。
攻擊者可以用很多方法破壞檔案系統,從依靠錯誤配置的許可權獲益到放置特洛伊木馬和病毒
。Linux中用cksum命令對一個特定檔案執行16位校驗和的計算,上面的md5sum也是一個檢驗
的命令。
RPM(Red Hat Package manager)是由Red Hat Software開發幷包含在其Linux產品之中的多功
能軟體安裝管理器。他可以用來建立、安裝、查詢、檢驗、升級和解除安裝獨立的軟體包。
3.1.2.6 加密檔案系統
加密檔案系統是檔案系統安全的一個更引人注目的方法。他根據一個簡單的推斷:如果一個
系統儲存機密資料,那麼就應該以加密形式儲存。加密檔案系統(CFS)的核心思想是: CFS為
目錄和檔案提供一個透明的介面,並自動使用使用者的金鑰加密。一條單獨的命令把一個金鑰
和一個目錄關聯起來,從這時起,目錄的內容在寫時自動加密,在開啟時自動解密。
一個由義大利人開發的透明加密檔案系統(TCFS),使用者甚至不知道他們的檔案倍加密了。從
下面的地址下載:http://tcfs.dia.unisa.it/
3.1.2.7 備份
備份的重要性我想不需要多說了,那麼備份有那些策略呢?常見的有:系統初裝時的備份、
定期備份、增量式備份(只備份改動的)、特別備份(為某些檔案備份)等等。Linux系統提供了
以下備份工具:
1) cp:拷貝,例如把dir1中的所有內容拷貝到dir2:cp -R dir1 dir2
2) tar:可以建立、把檔案新增到或從一個tar檔案中解開檔案。檔案本身也是一個檔案,它
包含其他的許多檔案和有關資訊。Tar最初用於磁帶機。
3) cpio:把檔案拷貝進或拷貝出一個cpio檔案或tar檔案,與tar類似
4) dump:得到整個檔案系統並把他拷貝到備份介質上,一個確保完整備份的正規方式是跟隨
定期增量備份執行一個0級或完全備份,dump支援10個級別並能把上次備份後改動的所有檔案
以更低的級別備份。預設情況dump將備份到磁碟介質。例如,把一個SCSI硬碟(/dev/rsd0a)
以0級備份到磁帶(/dev/rst0)。dump 0f0 /dev/rst0 1500 /dev/sd0a
5) restore:用來恢復整個檔案系統或提取單個檔案。與dump相對。注意,restore命令特別
冒險,因為他執行SUID root,像任何SUID root程式一樣,可以根據自己的風險來執行rest
ore。
3.1.2.8 其他常見系統安全工具導航
1)CRYPT BREAKERS WORKBENCH一個整合多種工具的平臺,幫助一個加密人員讀取BSD4.2加密
的檔案。
ftp://coast.cs.purdue.edu/pub/tools/unix/cbw
2)HOBGOBLIN
ftp://coast.cs.purdue.edu/pub/tools/unix/hobgoblin/
3)TRIPWIRE,強烈推薦,是一個檔案系統完整性檢查工具。
http://www.tripwiresecurity.com/
4)TROJAN,一個可以被任何使用者執行來檢查特洛伊木馬的perl程式。
ftp://coast.cs.purdue.edu/pub/tools/unix/trojan/trojan.pl
5)PGP,流行的郵件和檔案加密程式。
http://rufus.w3.org/linux/RPM/pgp.html
6)LIBDES,建立一個DES加密庫和一個DES加密程式的工具。包括一個crypt(3)的快速實現。

ftp://ftp.psy.uq.oz.au/pub/Crypto/DES/
3.1.3 使用者賬號和環境的安全
3.1.3.1 口令管理增強方法
可以使用如下命令及其引數來增強對使用者密碼的管理:
1)passwd -n 30 user #強迫使用者每30天修改一次密碼;
2)passwd -f user #強迫使用者在下一次登入時修改口令;
3)passwd -n 2 -x 1 user #禁止使用者修改口令;
4)passwd -l user #封鎖使用者賬號,禁止登入。
3.1.3.2 CRACK
Crack可以找出/etc/shadow中那些容易猜測的口令,雖然執行crack將會使CPU的負載加重,
但它在第一次執行時就可以給出10%系統帳號的口令。
URL:ftp://sable.ox.ac.uk/pub/comp/security/software/crackers/
3.1.3.3 取消ROOT的遠端登陸
預設在/etc/default/login里加上 "CONSOLE"行,在/etc/ftpusers里加上root。
3.1.3.4 配置ROOT的環境
1)將umask設為077或者027.
2)檢視你的環境中路徑設定情況,不要有./
3.1.3.5 刪除不必要的帳號
移去或者鎖定那些不是必須的帳號,比如sys/uucp/nuucp/listen等等,簡單的辦法是在/et
c/shadow的password域中放上NP字元。
3.1.3.6 NIS的安全問題
NIS從來就不是一個安全的服務,如果配置得當的話NIS+會更好些,就象暴力破解密碼一樣,
NIS域名如果被猜出來,就會給入侵者提供相當豐富的資訊,要關閉這個漏洞,可以將信任主
機的地址放在/var/yp/securenets中。並且考慮使用NIS+或者secure RPC。
3.1.3.7 取消rlogin/rsh服務
移去/etc/hosts.equiv和/.rhosts以及各home目錄下的.rhosts,並且在/etc/inetd.conf中
把r系列服務都殺掉,然後找出inetd的程序號,重啟它。
3.1.3.8 限制通過網路進入系統
Telnet和ftp守護程序是從inetd程序啟動的,inetd的配置檔案是/etc/inetd.conf,還包含了
其它的各種服務,所以你可以乾脆移去這個檔案,新建一個只包括以下兩行的檔案:
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
當然這是基於你需要telnet及ftp的基礎上的,如果你連這兩個服務都不用的話,你就可以將
它註釋掉或者刪除,這樣在系統啟動的時候inetd就不需要啟動了。
Tcpd的訪問控制是由/etc/hosts.allow和/etc/hosts.deny檔案控制的,tcpd先查詢/etc/ho
sts.allow,如果你在這裡面允許了某幾臺主機的telnet或ftp訪問的話,那麼deny訪問就是
對其它所有機器的了。這是"預設拒絕"的訪問控制策略,下面是一個hosts.allow檔案的樣本

ALL: 172.16.3.0/255.255.255.0
這將允許172.16.3.0網路的主機上任何使用者訪問你的telnet及ftp服務,記住在這裡要放置I
P地址,因為域名比較容易受到欺騙攻擊……
現在我們準備拒絕其餘所有人的連線了,將下面的語句放在/etc/hosts.deny中:
ALL: /usr/bin/mailx -s "%d: connection attempt from %c" [email protected]
這條指令不僅拒絕了其它所有的連線,而且能夠讓tcpd傳送email給root--一旦有不允許的連
接嘗試發生時。
現在你可能希望用syslog記錄下所有的訪問記錄,那麼在/etc/syslog.conf放進如下語句:
auth.auth.notice;auth.info /var/log/authlog
注意兩段語句間的空白是tab鍵,否則syslog可能會不能正常工作。
3.1.3.9 配置S/Key
S/Key是一個用於實現安全的一次性口令方案的軟體,它根據一系列資訊(包括一個祕密口令
)通過MD5處理而形成的初始鑰匙,該初始鑰匙再交給MD4進行處理,資助將128位的數字簽名
縮成64位,該64位資訊再次傳給MD5函式,這個過程一直持續直到達到期望值……
開始使用S/Key時,要建立一個以/usr/local/bin/keysh為shell的帳號:
在/etc/passwd中加入
access:x:100:100:Access Account:/tmp:/usr/local/bin/keysh
並且在/etc/shadow中加入
access:NP:6445::::::
然後使用passwd access命令來設定使用者的訪問密碼。
由於/usr/local/bin/keysh不是一個標準的shell,所以你的/etc/shells檔案中內容如下:
/sbin/sh
/usr/local/bin/keysh
只有使用這兩種login shell的使用者才允許接入。
然後建立一個檔案/etc/skeykeys並賦予一定的許可許可權:
touch /etc/skeykeys
chmod 600 /etc/skeykeys
chown root /etc/skeykeys
chgrp root /etc/skeykeys
使用keyinit access命令來初始化S/Key祕密口令。
現在你可以配置允許使用者通過keysu命令來成為超級使用者,首先改變/etc/group:
root::0:root,access
只有在這裡列出來的使用者才允許通過keysu成為超級使用者。現在可以使用不著keyinit root命
令來初始化超級使用者的S/Key祕密口令,建議該口令要與user的有所區別。
本來你可以將/bin/su刪掉以確定使用者只能使用keysu……,但不幸的是,許多指令碼使用/bin
/su來開啟程序,所以只需用chmod 500 /bin/su來改變它的許可權就行了。
3.1.3.10 X的安全配置
使用SUN-DES-1選項來呼叫Secure RPC來通過X鑑別,可以使用xhost [email protected]來通過訪問
請求。
3.1.3.11 開啟SUN-DES-1鑑別機制
set DisplayManager*authorize: true
set DisplayManager._0.authName: SUN-DES-1
rm ~/.Xauthority
增加對localhost的許可許可權,通過
xauth local/unix:0 SUN-DES-1 [email protected]
xauth local:0 SUN-DES-1 [email protected]
Start X via xinit -- -auth ~/.Xauthority
把你自己加入,並移去其他所有人:
xhost [email protected] [email protected] -local -localhost
賦予使用者foo進入主機"node"的許可權:
允許foo進入node: xhost [email protected]
建立適當的foo的xauthority: xauth add node:0 SUN-DES-1 [email protected]
foo現在就能連上"node"了: xload -display node:0
3.1.4 系統的啟動和關閉
3.1.4.1 更改不必要的啟動檔案
通常情況下,你要檢查所有在/etc/rc2.d和/etc/rc3.d以S開頭的檔案,所有並非必要的裝置
或者服務都可以重新命名(不要再以S開頭),然後你可以重新啟動,從/var/adm/messages中來
觀察自啟動的情況,並且從ps -elf的輸出中加以檢查。
3.1.4.2 系統裡的Strip
在Solaris下,你可以通過對/etc/rc[S0-3].d檔案來修改啟動時自引導的動作。考慮移去/e
tc/rc2.d中在你係統中用不到的服務,我還建議你移除/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
這些檔案可能會與你的不同--這取決於你機器裡的圖形卡/是否使用Solaris DiskSuits等等
。移除/etc/rc3.d裡的檔案........。
3.1.4.3 取消NFS服務
NFS的共享輸出是由/etc/dfs/dfstab檔案管理的.可以刪除它。要將NFS伺服器的守護程序關
閉則可以重新命名/etc/rc3.d/S15nfs.server。要防止一臺機器成為NFS客戶機,可以重新命名文
件/etc/rc2.d/S73nfs.client--當重新命名這些自啟動檔案時,要注意不要將檔案的首字母設
為"S"。
3.1.4.4 rpcbind中的安全問題
Rpcbind是允許rpc請求和rpc服務之間相互連線的程式,但標準的rpc是不安全的:(,它使用的
是"AUTH_UNIX"驗證, 也就是說它依靠的是遠端系統的IP地址和遠端使用者的UID來驗證。一般
的系統可能需要某些rpc存在,但對各種伺服器如Web servers, ftp servers, mail server
s, etc)最好將rpc服務關閉,你也可以通過一些安全工具來確定rpc服務是否會影響到你係統
的安全性。可以通過將/etc/rc2.d/S71RPC改名來禁止rpc。
3.1.4.5 in.finger的安全問題
in.fingerd在過去有一些安全問題,如果你想提供finger工具,用nobody來執行它。
3.1.4.6 sendmail的設定
/usr/lib/sendmail守護程式並沒有開啟,因為你不必總在25埠監聽mail的列表請求,你可
以在root的crontab檔案中增加:
0 * * * * /usr/lib/sendmail -q > /var/adm/sendmail.log 2>&1
這條命令要以每小時呼叫sendmail程序處理排隊中的郵件。
3.1.5 cron 和 at
3.1.5.1 cron任務的注意事項
1) 檢視所有的cron任務--在/var/spool/cron/crontabs檔案中可以找到它們。
2) 必須在/etc/default/cron裡設定了"CRONLOG=yes" 來記錄corn的動作。
3.1.5.2 cron使用者配置
/etc/cron.d/cron.allow和/etc/cron.d/cron.deny兩個檔案決定了一個特定使用者是否可以運
行crontab命令。daemon、bin、smtp、nuucp、listen、nobody、noaccess這些使用者不應該有
執行crontab許可權。
3.1.5.3 at 使用者配置
/etc/cron.d/at.allow和/etc/cron.d/at.deny兩個檔案決定了一個特定使用者是否可以執行a
t命令。daemon、bin、smtp、nuucp、listen、nobody、noaccess這些使用者不應該有執行at權
限。
3.1.5.4 cron和Tripwire
Tripwire應該配置成定期檢查下面檔案和目錄:/etc/cron.d、/etc/default、/var/cron、
/var/spool/cron、/etc/cron.d/cron.allow、/etc/cron.d/at.allow、/etc/cron.d/at.de
ny
3.1.6 系統日誌
建立所有重要的日誌檔案的硬拷貝
保證在“/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
“mail”是接收日誌檔案的計算機主機名。如果有人試圖黑你的計算機並且威脅把所有重要
的系統日誌檔案都刪掉,你就不用怕了,因為你已經打印出來或者在別的地方還有一個拷貝
。這樣就可以根據這些日誌檔案分析出黑客在什麼地方,然後出理這次入侵事件。
authpriv.*;mail.*;local7.*;auth.*;[email protected]
3.1.7 Solaris ndd命令
ndd命令能容易的在不重新配置系統核心和重起系統的情況下,修改核心和TCP/IP的裝置的一
些引數。使用如下命令可看到相應的幫助。
[[email protected] /]> ndd /dev/arp /?
? (read only)
arp_cache_report (read only)
arp_debug (read and write)
arp_cleanup_interval (read and write)
[[email protected] /]> 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)
[[email protected] /]> 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)
[[email protected] /]> 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)
顯示當前值
#ndd /dev/arp arp_debug 0
0: 代表特性禁止
ndd -set /dev/arp arp_debug 1
1: 代表特性允許
由於這些引數一般是經過優化過的,而且一旦改變失誤,可能導致系統的不正常工作。所以
sun不提供文件供人隨意調節。
3.1.8 系統補丁
跟所有的複雜系統一樣,SUN有它的漏洞,其中的一些從性質上來說是相當嚴重的。SUN公司
有向它的客戶甚至是沒有技術支援的客戶提供補丁的優良傳統。這些補丁或者以集合包或者
以單個補丁的形式存在的。不幸的是,要完全修補你的系統,既需要大的補丁集合包,又需
要單個的補丁。然而我們將介紹一種把補丁包和單個補丁結合起來使用的方法。
用patchadd -p 或 showrev -p命令來察看補丁在系統裡的安裝情況,在你想保護的主機以及
大眾都可以訪問的主機上,你應該到SUN公司的主頁上去查詢相關的補丁包來安裝,並且應該
常常檢視最新的補丁釋出情況。
補丁步驟:
1) 變成 root
2) 鍵入 umask 022來設定你的許可模式--給系統打補丁不僅要求所有的補丁被"nobody"用
戶可讀,而且包括補丁之前的所有目錄(不要問為什麼,反正是一般這麼幹的)。
3) 建立一個叫“patch“的目錄,並進入它,我一般是這樣做的:
mkdir /var/tmp/patch
cd /var/tmp/patch
在你建“patch“目錄的檔案系統中要保證有足夠的磁碟空間(提示:你可以試著鍵入:df
-k來看看檔案系統上可用的磁碟空間,不要用/tmp!
4) 用ftp連線sunsolve站ftp sunsolve.sun.com
你的登入使用者名稱是“anonymous“,口令是你的電子郵件地址。
5) 轉到二進位制模式,鍵入: bin
關閉提示,鍵入: prompt
你不需要為下載每個補丁回答是,我需要下那個補丁。
6) 補丁位於sunsolve站的/pub/patches目錄,所以鍵入: cd /pub/patches
7) 得到對應於你作業系統版本的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檔案有不同的補丁報告檔案,sparc版本的是那些沒有“x86“字樣的。
8) 得到一份補丁報告檔案,比如:get Solaris2.6.PatchReport
9) 得到一份對應於你系統版本的推薦補丁集合包和它的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) 在下載推薦檔案的時候,你可以開啟補丁報告檔案看看,裡面會有關於安全修補的一節
可能是這樣的:
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-

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.)
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
“*“標記的補丁沒有包括在推薦補丁集合包裡,我們要把它們包括進來。
11) 當推薦補丁集合包下載完後,你需要下載補丁報告中所標記的單個補丁,最快的方法是
用mget,這樣用: mget 106689* 106905* 106411*
重要:你可能想用一個mget命令得到所有的補丁,但mget的引數的個數是有限制的!而且,
我並沒有指定版本號,這不僅僅是為了少輸入字元和得到相關的README檔案,也是因為在補
丁報告發布過程中,版本號可能是會變化的。
12) 下載完所有的東西后,鍵入:quit來結束ftp會話。
13) 到現在,你已經下載了補丁集合包和單個補丁,因為繼續下去打單個的補丁包太費體力
,我們將先把補丁包和單個補丁合併起來。
首先解壓補丁包:
如果你用的是Solaris 2.6或更早的,
uncompress 2*Recommended.tar.Z
tar -xvf 2*Recommended.tar
如果用的是Solaris 7,
unzip 7*Recommended.zip
其次,把所有的單個補丁移到你的建立的Recommended目錄:
mv 1* *Recommende d
然後,進到儲存有全部補丁的Recommended目錄:
cd *Recommended
14) 現在我們可以把所有單個的補丁加到patch_order檔案中,在這個檔案中列出了所有將被
install_cluster指令碼安裝的補丁,你可以手工把它們加進去(提示:這是錯誤的選擇)或者
用UNIX的命令工具來幫你做這件事。
如果你是Solaris 7,用下面的命令:
ls *.zip | cut -d"." -f1 >> patch_order
如果是Solaris 2.6或以前的:
ls *.tar.Z | cut -d"." -f1 >> patch_order
15) 現在是解壓所有單個補丁包的時候了,因為它們還是壓縮格式的。
如果你用Solaris 7,你可以用unzip一次解壓一個檔案:
unzip 108723.zip
討厭的是,你不能用“unzip *.zip“,因為unzip不能這樣工作,為了避免多次地輸入unzi
p,你可以用下面的UNIX命令讓unzip為你解壓所有的東西:
ls *.zip | xargs -n1 unzip
如果用的是Solaris 2.6或更低的,鍵入:
uncompress *.tar.Z
現在你必須用tar分離出單個的補丁,你可以用以下命令一次處理一個檔案:
tar -xvf 108723.tar
討厭的是,你不能用“tar -xvf *.tar“,因為tar不能這樣工作,為了避免多次地
輸入tar,你可以用下面的UNIX命令讓tar為你分離所有的東西:
ls *.zip | xargs -n1 tar -xvf
16) 到現在所有的補丁都準備好了,關閉計算機:
/usr/sbin/shutdown -y -g0 -i0
啟到到單使用者模式,對sparc: boot -s
對x86, 啟動時, 鍵入:b -s
系統引導後,在提示符後輸入root口令後,鍵入:mountall
來mount所有的檔案系統。
然後輸入:
cd /var/tmp/patch/*Recommended
進到儲存所有補丁的目錄,現在你可以鍵入以下命令來安裝“所有”的補丁了:
./install_cluster
跟著提示做就行了。如果這是個Solaris 2.5.1或是個Solaris 2.6的系統,可以走
開搞杯咖啡喝喝,因為要花點時間的。不要太擔心補丁安裝過程中的錯誤,很多時候出現錯
誤是因為你沒有安裝一個特定的軟體或已經打了某個補丁。
打完補丁後,關機重啟,輸入:
/usr/sbin/shutdown -y -g0 -i6
3.1.9 高階指南
3.1.9.1如何防止在堆疊中執行程式碼?
入侵者常常使用的一種利用系統漏洞的方式是堆疊溢位,他們在堆疊裡巧妙地插入一段程式碼
,利用它們的溢位來執行,以獲得對系統的某種許可權。
要讓你的系統在堆疊緩衝溢位攻擊中更不易受侵害,你可以在/etc/system里加上如下語句:
set noexec_user_stack=1
set noexec_user_stack_log =1
第一句可以防止在堆疊中執行插入的程式碼,第二句則是在入侵者想執行exploit的時候會做記
錄,一旦重啟機器,這些改變就會生效。如果這不是一個你可以關閉的系統,那麼你用adb來
改變一個執行中的系統的引數也是可能的。
當然會有些合法使用可執行堆疊的程式在你做出如上改變後而不能正常執行。所幸的是這樣
的程式的並不多,我們所知的就只有GNU ada 編譯器。
3.1.9.2 ARP
有關ARP協議的細節,在這裡我們就不再詳細介紹了。對於sun的系統,核心預設的ARP表過期
的時間是5分鐘,並且可以調節.另外一張表是ip層的路由表,它和arp表配合記錄動態路由信
息,20分鐘過期,最後一個特性是”無償ARP” ,即系統廣播自己的硬體地址。這個特性用來
診斷是否存在相同的硬體地址,另外也用來生成硬體地址的變動通知。
1)ARP攻擊
針對ARP的攻擊主要有兩種,一種是DOS,一種是Spoof。ARP欺騙往往應用於一個內部網路,我
們可以用它來擴大一個已經存在的網路安全漏洞。
如果你可以入侵一個子網內的機器,其它的機器安全也將受到ARP欺騙的威脅。同樣,利用A
PR的DOS甚至能使整個子網癱瘓。
2)對ARP攻擊的防護
防止ARP攻擊是比較困難的,修改協議也是不大可能。但是有一些工作是可以提高本地網路的
安全性。
首先,你要知道,如果一個錯誤的記錄被插入ARP或者IP route表,可以用兩種方式來刪除:
a. 使用arp -d host_entry
b. 自動過期,由系統刪除
這樣,可以採用以下的一些方法:
1). 減少過期時間
#ndd -set /dev/arp arp_cleanup_interval 60000
#ndd -set /dev/ip ip_ire_flush_interval 60000
60000=60000毫秒 預設是300000
加快過期時間,並不能避免攻擊,但是使得攻擊更加困難,帶來的影響是在網路中會大量的
出現ARP請求和回覆,請不要在繁忙的網路上使用。
2). 建立靜態ARP表
這是一種很有效的方法,而且對系統影響不大。缺點是破壞了動態ARP協議。可以建立如下的
檔案:
test.cnns.net 08:00:20:ba:a1:f2
user. cnns.net 08:00:20:ee:de:1f
使用arp -f filename載入進去,這樣的ARP對映將不會過期和被新的ARP資料重新整理,除非使用
arp -d才能刪除。但是一旦合法主機的網絡卡硬體地址改變,就必須手工重新整理這個arp檔案。這
個方法,不適合於經常變動的網路環境。
3).禁止ARP
可以通過ifconfig interface -arp 完全禁止ARP,這樣,網絡卡不會發送ARP和接受ARP包。但
是使用前提是使用靜態的ARP表,如果不在apr表中的計算機 ,將不能通訊。這個方法不適用
與大多數網路環境,因為這增加了網路管理的成本。但是對小規模的安全網路來說,還是有
效和可行的。
3)IP Forwarding (IP轉發)
IP是用來傳輸資料的底層協議。IP 轉發是在不同網絡卡之間路由包資料的過程。一般是用路由
器來實現,但是擁有多網路介面的主機也可以實現。當有兩個網路介面的時候,Solairs系統
預設開啟ip轉發。
1) 關閉IP轉發
對於多宿主主機,存在可能的安全問題是,攻擊者可能通過ip轉發的方式訪問到私有網路。
在solaisr系統中,包轉發能很的容易關閉。簡單的生成一個檔案 /etc/notrouter,就能在
下次啟動的時候關閉ip轉發。另外通過ndd命令也能在系統執行的時候關閉ip轉發:
#ndd -set /dev/ip ip_forwarding 0
2) 嚴格限定多主宿主機
如果是多宿主機,還可以加上更嚴格的限定防止ip spoof的攻擊
#ndd -set /dev/ip ip_strict_dst_multihoning 1
預設是關閉的(值為0)
3) 轉發包廣播
由於在轉發狀態下預設是允許的,為了防止被用來實施smurf攻擊,關閉這一特性。 (參見c
ert-98.01)
#ndd -set /dev/ip ip-forward_directed_broadcasts 0
4)路由
路由的過程就是檢查路由資訊,從而決定如何從哪個介面傳輸資料包的過程。即使一個桌面
系統,也要有路由設定。路由表需要實時的升級。現在有多種路由協議可以用來路由資料。
Solaris系統使用in.routed守護程式支援RIP version 1,使用in.rdisc守護程序支援ICMP路
由更新。當solairs系統配置成為一個路由裝置來轉發資料包的時候,它通過上面的兩種方式
動態更新路由資訊。
5)攻擊
有多種方法能威脅動態路由協議。攻擊者能偽造虛假的路由更新資訊傳送過來,從而達到DO
S的效果;同樣的方法,還能使資料報文轉發到其他的網路上,使攻擊者能監聽資料。
預設的solairs系統使用系統守護程式動態管理路由資訊。靜態路由很好的防止路由資訊被遠
程動態改變。使用/etc/defaultrouter來設定本地子網的路由。使用route命令來設定其他路
由資訊。
但是對於一個簡單網路來說,使用靜態路由是合適的,一旦網路中有較多的路由裝置,必須
使用動態路由。Solairs系統將來也會繼續支援動態路由協議。
l 轉發源路由包
源路由包中包含了了指定資料如何路由的資訊。因此攻擊者可能使用源路由包繞過某些特定
的路由器和防火牆裝置,也可能用來避開一個已知的IDS系統的監控範圍。在大多數solairs
的應用系統上,是不需要這個特性的。由於solairs在開啟ip轉發以後預設支援源路由轉發,
所以我們必須手動關閉它:
#ndd -set /dev/ip ip_forward_src_routed 0
6)ICMP
ICMP:網路控制資訊協議。下面討論在IP驅動上配置solaris的ICMP特性。
1) 廣播:
ICMP廣播經常會帶來麻煩,這裡有一條原則來防止廣播風暴-控制ICMP的錯誤資訊不被生成
。為來防止攻擊者利用ICMP實施DOS攻擊,最好禁止本地網路對ICMP廣播的響應。Solairs系
統能調節三種ICMP廣播的引數。
2)響應Echo廣播:
Echo廣播通常用來診斷網路主機的存活情況,一旦主機收到一個對廣播地址的echo請求,默
認情況下所有系統會回覆這個廣播要求。當有人惡意定製過量的echo包,系統中的流量將大
為增加。因此我們可以關閉對echo廣播的響應
#ndd -set /dev/ip ip_respond_to_echo_boadcast 0
3)響應時間戳廣播
時間戳通常用來同步兩個不同系統的時鐘,但是系統沒有必要回復對廣播地址傳送的時間戳
請求,所以我們可以關閉這種迴應。
#ndd -set /dev/ip ip_respond_to_timestamp_broadcast 0
4)地址掩碼廣播
地址掩碼請求被用來確定本地掩碼,通常是網路中無盤工作站在啟動的時候傳送。用下面的
命令能禁止對這樣請求的應答
#ndd -set /dev/ip ip_respind_to_address_mask_broadcast 0
7)重定向錯誤
1)重定向錯誤
通常是路由器用來通知主機使用另一個路由器來傳輸資料的指示報文。報文重指定的路由器
必須和傳送路由器一樣連線同一個子網,而收到報文的主機必須在自己的路由表裡新增一條
到那個子網的路由。不像ARP的包,這個路由不會過期也不會自動刪除。很多系統檢測這樣的
報文用來發現錯誤和潛在的問題,從而優先更改自己的路由表。
2)接受重定向錯誤
一個攻擊者能偽造重定向錯誤的報文從而給目標主機裝載一個新的路由,而這個路由也許更
本就是錯誤的,這樣主機就不會和一些特定的主機或網路通訊,這是一種DOS攻擊。雖然重定
向報文字身有一些校驗規則,但是這些規則能很容易的被欺騙。而且目前存在大量的工具來
達到這個目的。大多數只有一條預設路由主機系統是不需要理會這種報文的,因此我們可以
使用ndd命令忽略ICMP重定向錯誤報文。(solairs預設是不忽略的)
#ndd -set /dev/ip ip_ignore_redirect 1
3)傳送重定向錯誤報文
只有路由器才需要重定向錯誤,任何主機即使是多宿主主機也不需要傳送這種報文,因此我
們可以使用ndd來禁止本機發送錯誤重定向報文。
#ndd -set /dev/ip ip_send_redirects 0
4)時間戳響應
就像前面提到的,時間戳廣播報文在大多數環境下是不需要的。而solaris系統還能夠完全不
接受這種報文。
#ndd -set /dev/ip ip_respond_to_timestamp 0
關閉這個特性以後,有些使用rdate系統命令的unix主機將不能再同步時鐘。但是solaris 2
.6和7使用更好的時鐘同步方式-NTP(網路時間協議),請參見xntpd的幫助。
8)SYN_flood攻擊
TCP-SYN flood又稱半開式連線攻擊,每當我們進行一次標準的TCP連線(如WWW瀏覽,下載文
件等)會有一個一個三次握手的過程,首先是請求方向服務方傳送一個SYN訊息,服務方收到
SYN後,會向請求方回送一個SYN-ACK表示確認,當請求方收到SYN-ACK後則再次向服務方傳送
一個ACK訊息,一次成功的TCP連線由此就建立,可以進行後續工作了,如圖所示:
請求方 服務方
---------------------> SYN
SYN-ACK <----------------
----------------------> ACK
而TCP-SYN flood在它的實現過程中只有前兩個步驟,當服務方收到請求方的SYN並回送SYN-
ACK確認訊息後, 請求方由於採用源地址欺騙等手段,致使服務方得不到ACK迴應,這樣,服
務方會在一定時間處於等待接收請求方ACK訊息的狀態,一臺伺服器可用的TCP連線是有限的
,如果惡意攻擊方快速連續的傳送此類連線請求,則伺服器可用TCP連線佇列很快將會阻塞,
系統可用資源,網路可用頻寬急劇下降,無法向用戶提供正常的網路服務。
對於solaris 2.5.1,只有安裝了patch 103582-1(或以上)才能防止syn_flood.在synflood沒
有流行以前,連線佇列和backlog佇列是相同的,solairs 2.6/7和安裝了patch以後的2.5.1
系統,現在存在兩條佇列,一個是已連線的佇列,一條是未連線完成的佇列。SYN攻擊時只能
填充後一條佇列,而且,一旦佇列滿,將隨機丟棄老的syn包。系統還會監控這個佇列被短時
間填充的情況,一旦懷疑是syn_flood,將在系統的messages中記錄下來。
Mar 8 19:24:01 example unix: WARNING: High TCP connect timeout rate!
System (port 80) may be under a SYN flood attack!
新佇列的大小也是可以調節的,繁忙的web伺服器需要提高未連線佇列的大小。預設的大小是
1024,我們可以提高到4096。
#ndd -set /dev/tcp tcp_conn_req_max_q0 4096
當然,一般情況下,核心的佇列增大,系統的記憶體最好也應有相應的增加。
9)連線耗盡攻擊
和SYN flood攻擊不同,連線耗盡攻擊不太常見。因為這種攻擊必須使用真實IP,攻擊的目標
是已連線佇列。許多系統有一個同時連線的上限,取決於核心引數和系統記憶體情況。作為通
常的web伺服器,這個上限值很難達到,因為http的連線是典型的短時連線。但是一個攻擊者
可能快速傳送大量的連線請求,同時保持連線,這樣正常訪問者的連線就可能被伺服器拒絕

我們可以通過優化系統核心和增加記憶體來緩解,但不是根本的方法。因為攻擊者可能同時調
動多臺機器同時攻擊。當然,我們可以在發現攻擊以後,在防火牆或路由器上拒絕這些IP來
源的連線。
如果不通過網路裝置,僅僅通過調節系統引數來緩解攻擊。一方面,可以調節web server,如
apache的timeout引數,減短連線保持時間,另一方面,我們可以將核心以連線佇列引數增大
(預設是128)。
#ndd -set /dev/tcp tcp_conn_req_max_q 1024
以上的方法能阻止大多數連線耗盡的攻擊企圖,除非攻擊者調動更多的資源,發動大規模的D
DOS,但這樣會使攻擊者更容易暴露。
10)IP 欺騙
IP欺騙基本原理:
TCP連線的建立 :為了利用TCP連線交換資料,主機間首先必須建立一個連線。TCP建立連線時
可以分為3個 步驟,稱為三步握手法。如果主機A執行rlogin客戶程式,並且希望連線到主機
B上的rlogin daemon 伺服器程式上,連線過程如圖二所示。
1 A ---SYN---> B
2 A <--SYN/ACK--- B
3 A ---ACK---> B
需要提醒大家的是,主機A和B的TCP模組分別使用自己的序列編號。在時刻1時,客戶端 通過
設定標誌位SYN=1告訴伺服器它需要建立連線。同時,客戶端在其TCP頭中的序列號域SEQ放置
了它的初始序列號(ISN),並且告訴伺服器序列號標示域是有效的,應該被檢查。在時刻2
時,伺服器端在接收了上面的SYN後,作出的反應是將自己的ISN和對客戶端的ACKA發向客戶
端並且告知下一個期待獲得的資料序列號是(ISN+1)。客戶端在第一流時刻,對伺服器的I
SN進行確認。這時,資料傳輸就可以進行了。ISN與序列號的遞增瞭解序數編號如何選擇初始
序列號和如何根據時間變化是很重要的。似乎應該有這種情況,當主機啟動後序列編號初始
化為1,但實際上並非如此。初始序列號是由tcp_init函 數確定的。ISN每秒增加序列號128
000,如果有連接出現,每次連線將反計數器的數值增加 64000。很顯然,這使得用於表示I
SN的32位計數器在沒有連線的情況下每9.32小時復位 一次。之所以這樣,是因為這樣有利於
最大限度地減少舊有連線的資訊干擾當前連線的 機會。這裡運用瞭望2MSL等待時間的概念(
不在本文討論的範圍之內。)如果初始序列 號是隨意選擇的,那麼不能保證現有序列號是不
同於先前的。假設有這樣一種情況,在 一個路由迴路中的資料包最終跳出了迴圈,回到了“
舊有”的連線(此時其實是不同於 前者的現有連線(,顯然會發生對現有連線的干擾。 端
口號 為了提供對TCP模組的並行訪問,TCP提供了叫做埠的使用者介面。埠被作業系統核心
利用來標示不同的網路程序,也就是嚴格區分傳輸層入口的標示(就是說,IP不關心他 們
的存在)。TCP埠與IP地址一起提供網路端到端的通訊。事實上,在任何時刻任何I ntern
et連線都能由4個要素來措述:源IP地址、源地址埠號、目的IP地址和目的地址。取樣目標
主機發出的TCP序列號,猜測出它的資料序列號。然後,偽裝成被信任的主機, 同時建立起
與目標主機基於地址驗證的應用連線。如果成功,黑客可以使用一種簡單的命令放置一個系
統後門,以進行非授權操作。
目前,RFC 1498定義了更好的隨機ISN生成方法,使得這種攻擊很難成功。對於solaris系統
I