Unix高級安全設置


文章閱讀 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" root@mydomain.com
這條指令不僅拒絕了其它所有的連接,而且能夠讓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 +user@host來通過訪問
請求。
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 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進入主機"node"的權限:
允許foo進入node: xhost +foo@
建立適當的foo的xauthority: xauth add node:0 SUN-DES-1 unix.node@nisdomain
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.*;daemon.info@mail
3.1.7 Solaris ndd命令
ndd命令能容易的在不重新配置系統內核和重起系統的情況下,修改核心和TCP/IP的設備的一
些參數。使用如下命令可看到相應的幫助。
[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)
顯示當前值
#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系統
ISN生成有三種方式。
0: 可預測的ISN
1: 增強的ISN 隨機生成
2: RFC 1948描述的ISN生成方式
所有版本的solaris默認生成方式值是1。2.5.1只有 0,1兩種方式,2.6/7擁有0,1,2三種ISN
生成方式。
我們可以修改/etc/default/inetinit文件來提高ISN的生成強度。將 TCP_STRONG_ISS=1改為
TCP_STRONG_ISS=2重起系統使他生效。對於solair 2.5.1,此方法無效。
11)增加私有端口
一般的情況下,1-1024端口被稱為私有端口,只允許具有根權限的進程連接。但是有些大於1
024的端口,即使需要這樣的限制,卻無法定義,如NFS的服務器端口2049,當然還有一些其
他定義的高於1024的私有端口。
在solairs2.5.1/2.6/7下使用如下方式,可以自定義最小的非私有端口
ndd -set /dev/tcp tcp_smallest_nonpriv_port 205
這樣以來,0-2049都被定義為私有端口。在solaris 2.6/7下,還能使用另一個參數單獨指
定私有端口。
#ndd /dev/tcp tcp_extra_priv_ports
2049
4045
用來顯示已經定義的擴展私有端口
#ndd -set /dev/tcp tcp_extra_priv_ports_add 6112
來增加新的私有端口定義。
使用 ndd -set /dev/tcp tcp_extra_priv_ports_del 來刪除定義。
要注意的是,不要隨便定義私有端口,因為有些非根權限的進程會使用這些端口。特別是改
變最小非私有端口這個參數,經常會引起問題。應仔細分析你的需求再用擴展私有端口定義
的方式單獨增加。
3.2 Linux 系列
3.2.1物理安全
3.2.1.1 BIOS安全,設定引導口令
禁止從軟盤啟動,並且給BIOS加上密碼。每次啟動的時候都手工檢查一下BIOS,這樣可以提
高系統的安全性。禁止從軟盤啟動,可以阻止別人用特殊的軟盤啟動你的計算機;給BIOS加
上密碼,可以防止有人改變BIOS的參數,比如:允許從軟盤啟動或不用輸入口令就可以引導
計算機。
3.2.1.2 安全策略
有一點很重要而且必須指出的是:如果你不知道要保護什么,那么更本沒有辦法保證系統的
安全。所以必須要有一個安全策略,基於這樣的一個策略才可以決定哪些東西允許別人訪問
,哪些不允許。如何制定一個安全策略完全依賴於你對於安全的定義。下面的這些問題提供
一些一般性的指導方針:
1)如何定義保密的和敏感的信息?
2)重點防范
3)遠程用戶有必要訪問你的系統嗎?
4)系統中有保密的或敏感的信息嗎?
5)如果這些信息被泄露給你的競爭者和外面的人有什么后果?
6)口令和加密能夠提供足夠的保護嗎?
7)你想訪問Internet嗎?
8)你允許系統在Internet上有多大的訪問量?
8) 如果發現系統被黑客入侵了,下一步該怎么做?
這個列表很短,真正的安全策略可能包含比這多得多的內容。可能你要做的第一件是:評估
一下自己的偏執程度。任何一個安全策略多少都有一定程度的“偏執”:確定到底在多大程
度上相信別人,包括內部的人和外部的人。安全策略必須在允許用戶合理地使用可以完成工
作所必須的信息和完全禁止用戶使用信息之間找到平衡點。這個平衡點就是由系統策略決定
的。
3.2.1.3 口令
這章的Linux安全概要就從口令的安全開始講起。許多人都把所有的東西保存在計算機上,防
止別人查看這些信息的方法就是用口令把計算機保護起來。沒有什么東西是絕對安全的。與
常識相反的是:無法破解的口令是不存在的。只要給足時間和資源,所有的口令都能用社會
工程(譯者注:原文是social engineering,找不出更好的翻譯,大致的意思是用社會和心理
學的知識,而不是用純粹的技術手段)或強行計算的方法猜出來。
通過社會工程或其它方法獲得服務器的口令是最簡單和最流行的入侵服務器的方法。決大多
數的技術支持人員很容易獲得其他用戶的口令,因為用戶的安全意識很差而且很輕易就相信
自己的同事,特別是幫助自己解決問題的人。有很多登記在案的成功入侵就是因為一些別有
用心的人利用安全管理上的松懈而獲得成功的。有時候,在特定的時間在特定的地點,上級
或老板對員工喊話就有可能泄露機密,導致可怕的后果。
因為破解口令是一項很耗時間和資源的工作,所以應該使得口令文件難於破解,這樣即使黑
客獲取了口令文件也不能輕易破解。作為一個系統管理員,自己在每個周末運行一下口令破
解程序,是保證系統安全的好方法。這有利於盡早地發現和替換那些很容易被猜出來的口令
。而且,還要有一個好的口令檢查機制,在用戶選擇新口令或改變舊口令的時候,來排除那
些有安全隱患的口令。那些字典里的單詞、或者全是大寫或全是小寫的以及沒有包含數字或
特殊字符的字符串是不能用來做口令的。我建議用下面的規則選擇有效的口令:
口令至少要有6個字符,最好包含一個以上的數字或特殊字符。
口令不能太簡單,所謂的簡單就是很容易猜出來,也就是用自己的名字,電話號碼、生日、
職業或者其它個人信息作為口令。
口令必須是有有效期的,在一段時間之后就要更換口令。
口令在這種情況下必須作廢或者重新設定:如果發現有人試圖猜測你的口令,而且已經試過
很多次了。
安裝完Linux系統之后默認的最小口令長度為5。這就是說一個新的用戶可以訪問服務器,那
么他的口令必須多於5字符。但是這樣是不夠安全的,最好口令的長度能夠大於8。可以強制
用戶使用8個字符以上的口令。編輯“/etc/login.defs”文件,把最小口令長度由5改成8。
找到PASS_MIN_LEN 5 這一行,改為:PASS_MIN_LEN 8 。“login.defs”是很重要的配置文
件。可以在這個文件中設定一些其它的安全策略,比如:口令的有效期。
3.2.1.4 root帳號
“root”帳號是Unix系統中享有特權的帳號。“root”帳號是不受任何限制和制約的。因為
系統認為root知道自己在做些什么,而且會按root說的做,不問任何問題。因此,可能會因
為敲錯了一個命令,導致重要的系統文件被刪除。用root帳號的時候,要非常非常小心。因
為安全原因,在不是絕對必要的情況下,不要用root帳號登錄。特別要注意的是:不在自己
的服務器上的時候,千萬不要在別的計算機上用“root”登錄自己的服務器。這是非常非常
非常糟糕的一件事。
3.2.1.5 加密
加密時要用到密匙,密匙是一個特殊的數字,把密匙和需要加密的信息經過加密算法加密之
后,只有知道密匙的人才能把信息讀出來。如果所有的計算機主機都在你的控制下,加密當
然是一個好方法,但是,如果其中一台“被信任的”主機被黑客控制了,你馬上就有危險了
。這就不僅僅是用戶的帳號和口令有危險了。在通常情況下,加密是用來保證機密信息在系
統中傳送的安全。如果一台計算機被控制了,那么這些加密信息就會讓人知道或是泄密了。
有一個好的安全策略,這種危險的可能性會降到最低,但是如果某台主機的密匙被泄露出去
,那么危險始終存在。
3.2.2 安全配置
3.2.2.1 “/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是允許訪問這個目錄的計算
機。代表只讀,代表不允許對根目錄進行寫操作。使這些改變生效,你還
要運行“/usr/sbin/exportfs -a”命令。
注意:在服務器上裝NFS服務是會有安全隱患的,就我個人而言,不建議你使用NFS。
3.2.2.2 “/etc/inetd.conf”文件
Inetd,也叫作“超級服務器”,根據網絡請求裝入網絡程序。“inetd.conf”文件告訴ine
td監聽哪些網絡端口,為每個端口啟動哪個服務。把Linux系統放在任何的網絡環境中,第一
件要做的事就是了解一下服務器到底要提供哪些服務。不需要的那些服務應該被禁止掉,最
好卸載掉,這樣黑客就少了一些攻擊系統的機會。查看“/etc/inetd.conf”文件,了解一下
inetd提供哪些服務。用加上注釋的方法(在一行的開頭加上#號),禁止任何不需要的服務,
再給inetd進程發一個SIGHUP信號。
第一步:把文件的許可權限改成600。
[root@cnns]# chmod 600 /etc/inetd.conf
第二步:確信文件的所有者是root。
[root@cnns]# 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
Access: 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),禁止所有不需要的服務,如:ft
p、 telnet、 shell、 login、 exec、talk、ntalk、 imap、 pop-2、pop-3、finger、au
th,等等。如果你覺得某些服務有用,可以不禁止這些服務。但是,把這些服務禁止掉,系
統受攻擊的可能性就會小很多。改變后的“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 -H
UP inetd)。
[root@cnns /root]# killall -HUP inetd
第四步: 為了保證“inetd.conf”文件的安全,可以用chattr命令把它設成不可改變。把
文件設成不可改變的只要用下面的命令:
[root@cnns]# chattr +i /etc/inetd.conf
這樣可以避免“inetd.conf”文件的任何改變(意外或是別的原因)。一個有“i”屬性的文件
是不能被改動的:不能刪除或重命名,不能創建這個文件的連接,不能往這個文件里寫數據
。只有系統管理員才能設置和清除這個屬性。如果要改變inetd.conf文件,你必須先清除這
個不允許改變的標志:
[root@cnns]# chattr -i /etc/inetd.conf
3.2.2.3 TCP_WRAPPERS
在默認情況下,RedHat Linux允許所有的服務請求。用TCP_WRAPPERS來保護服務器的安全,
使其免受外部的攻擊,比想象的要簡單和輕松得多。在“/etc/hosts.deny”文件中加入“A
LL: 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@cnns]
# tcpdchk
3.2.2.4 “/etc/aliases”文件
Aliases文件如果管理錯誤或管理得太粗心了就會造成安全隱患。例如:很多的軟件產商都把
“decode”這個別名放在aliases文件里。這樣做的目的是為了方便通過email傳送二進制文
件。在發送郵件的時候,用戶把二進制文件用“uuencode”轉成ASCII文件,然后把結果發給
接收端的“decode”。由這個別名讓郵件信息通過“/usr/bin/uuencode”程序把二進制文件
重新轉換成ASCII文件。如果允許“decode”出現在aliases文件中,可以想象將會有什么樣
的安全隱患。
把定義“decode”這個別名的行從aliases文件中刪除。同樣地,每一個會運行程序的別名都
要好好查看一下,很有可能要把它們刪除掉。要使改動生效,還必須運行:
[root@cnns]# /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”使改變生效。
3.2.2.5 防止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=CN L=JL”,代表中國,吉林。這個改變不會
對sendmail有什么影響,但是news.admin.net-abuse.email新聞組的人建議這么做,主要是
為了預防法律上的問題。
3.2.2.6 不要顯示系統提示信息
如果你不想讓遠程登錄的用戶看到系統的提示信息,你可以改變“/etc/inetd.conf”文件中
的telnet設置:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
在末尾加上“-h”參數可以讓daemon不顯示任何系統信息,只顯示登錄提示。當然,只有在
服務器上裝了telnet服務器才有這樣做的必要。
3.2.2.7 “/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。
3.2.2.8 路由協議
路由和路由協議會導致一些問題。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防火牆,就不必用這些命令了,因為在防火牆
的腳本文件中已經包含這些命令了。
3.2.2.9 使TCP SYN Cookie保護生效
“SYN Attack”是一種拒絕服務(DoS)的攻擊方式,會消耗掉系統中的所有資源,迫使服務
器重新啟動。拒絕服務(這種攻擊方式用巨大的信息流來消耗系統的資源,以至於服務器不能
夠響應正常的連接請求)是很容易被黑客利用的。在2.1系列的內核中,“syn cookie”只是
一個可選項,並沒有使其生效。想要使其生效必須用下面的命令:
[root@cnns]# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
把這個命令加入“/etc/rc.d/rc.local”文件中,等下次系統重新啟動的時候就不必重新敲
一遍了。如果打算安裝IPCHAINS防火牆,你就沒有必要用這個命令,因為它已經包含在防火
牆的腳本文件里了。
3.2.2.10 防火牆
安全問題的另一個解決方案是把計算機主機和內部計算機間的信息傳送同外部的網絡隔離開
,只讓內部網絡與外部網絡之間的信息交流,通過一個安全的網關進行。這樣一個網關叫做
防火牆,在下面的一些章節我們會用很大的篇幅介紹防火牆。
3.2.2.11 “/etc/services”文件
端口號和標准服務之間的對應關系在RFC 1700 “Assigned Numbers”中有詳細的定義。“
/etc/services”文件使得服務器和客戶端的程序能夠把服務的名字轉成端口號,這張表在每
一台主機上都存在,其文件名是“/etc/services”。只有“root”用戶才有權限修改這個文
件,而且在通常情況下這個文件是沒有必要修改的,因為這個文件中已經包含了常用的服務
所對應的端口號。為了提高安全性,我們可以給這個文件加上保護以避免沒有經過授權的刪
除和改變。為了保護這個文件可以用下面的命令:
[root@cnns]# chattr +i /etc/services
3.2.2.12 “/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”。
3.2.2.13 特殊的帳號
禁止操作系統中不必要的預置帳號(每次升級或安裝完都要檢查一下)。Linux系統中就提供這
樣一些你可能不需要的預置帳號。如果確實不需要這些帳號,就把它們刪掉。系統中有越多
的帳號,就越容易受到攻擊。
我們假定你已經在系統中使用shadow口令。如果不是這樣,最好在系統中加上shadow口令的
支持,因為這樣系統會更安全。如果你是按照上一章介紹的方法安裝服務器,那么在“安全
驗證配置”這一步就已經選上“Enable Shaow Passwords”這個選項了。
在系統中刪除一個用戶可以用這個命令:
[root@cnns]# userdel username
在系統中刪除一個組可以用這個命令:
[root@cnns]# groupdel username
第一步 用下面的命令刪除一些不必要的用戶:
[root@cnns]# userdel adm
[root@cnns]# userdel lp
[root@cnns]# userdel sync
[root@cnns]# userdel shutdown
[root@cnns]# userdel halt
[root@cnns]# userdel news
[root@cnns]# userdel uucp
[root@cnns]# userdel operator
[root@cnns]# userdel games (如果不用X Window服務器,可以刪除這個用戶)
[root@cnns]# userdel gopher
[root@cnns]# userdel ftp (如果沒安裝匿名ftp服務器,可以刪除這個用戶)
第二步 輸入下面的命令刪除一些不必要的組:
[root@cnns]# groupdel adm
[root@cnns]# groupdel lp
[root@cnns]# groupdel news
[root@cnns]# groupdel uucp
[root@cnns]# groupdel games (delete this group if you don’t use X Window Server
).
[root@cnns]# groupdel dip
[root@cnns]# groupdel pppusers
[root@cnns]# groupdel popusers (delete this group if you don’t use pop server f
or email).
[root@cnns]# groupdel slipusers
第三步 在系統中加入必要的用戶:
在系統中添加用戶,用這個命令:
[root@cnns]# useradd username
給系統中的用戶添加或改變口令,用這個命令:
[root@cnns]# passwd username
例如:
[root@cnns]# useradd admin
[root@cnns]# 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@cnns]# chattr +i /etc/passwd
[root@cnns]# chattr +i /etc/shadow
[root@cnns]# chattr +i /etc/group
[root@cnns]# chattr +i /etc/gshadow
注意:如果將來要在口令或組文件中增加或刪除用戶,就必須先清除這些文件的不可改變位
,否則就不能做任何改變。如果沒有清除這些文件的不可改變位,安裝那些會自動在口令文
件和組文件中加入新用戶的rpm軟件包的時候,在安裝過程中就會出現出錯的提示。
3.2.2.14 防止任何人都可以用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/securet
ty”文件》中介紹的方法結合起來,可以更好地加強系統的安全性。
第二步:如果在“/etc/pam.d/su”配置文件中定義了“wheel”組,現在介紹一下怎樣讓一
些用戶可以用“su”命令成為“root”。下面是一個例子,讓admin用戶成為“wheel”組的
成員,這樣就可以用“su”命令成為“root”:[root@cnns]# usermod -G10 admin
“G”是表示用戶所在的其它組。“10”是“wheel”組的ID值,“admin”是我們加到“whe
el”組的用戶。用同樣的命令可以讓其他的用戶可以用su命令成為root。
3.2.2.15 資源限制
限制用戶對系統資源的使用,可以避免拒絕服務(如:創建很多進程、消耗系統的內存,等等
)這種攻擊方式。這些限制必須在用戶登錄之前設定。例如,可以用下面的方法對系統中用戶
加以。
第一步:
編輯limits.conf文件(vi /etc/security/limits.conf),加入或改變下面這些行:
* hard core 0
* hard rss 5000
* hard nproc 20
這些行的的意思是:“core 0”表示禁止創?ore文件;“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
3.2.2.16 更好地控制mount上的文件系統
可以用一些選項,如:noexec、nodev和nosuid,更好地控制mount上的文件系統,如:“/h
ome”和“/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,等等。
3.2.2.17 把rpm程序轉移到一個安全的地方,並改變默認的訪問許可
一旦在Linux服務器上用rpm命令安裝完所有需要的軟件,最好把rpm程序轉移到一個安全的地
方,如:軟盤或其它你認為安全的地方。因為如果有人入侵了你的服務器,他就不能用rpm命
令安裝那些有害的軟件。當然,如果將來要用rpm安裝新的軟件,你就要把rpm程序拷回原來
的目錄。
把rpm程序移到軟盤上,用下面的命令:
[root@cnns]# mount /dev/fd0 /mnt/floppy/
[root@cnns]# mv /bin/rpm /mnt/floppy/
[root@cnns]# umount /mnt/floppy
注意:千萬不要把rpm程序從系統中卸載掉,否則以后就不能重新安裝它,因為安裝rpm程序
或其它軟件包本身就要用rpm命令。
還有一點要注意的是,把rpm命令的訪問許可從默認的755改成700。這樣非root用戶就不能使
用rpm命令了。特別是考慮到萬一在安裝完新軟件之后忘了把rpm程序移到一個安全的地方,
這樣做就更有必要了。
改變“/bin/rpm”默認的訪問權限,用下面這個命令:
[root@cnns]# chmod 700 /bin/rpm
3.2.2.18 登錄shell
為了方便重復輸入很長的命令,bash shell可以在“~/.bash_history”文件(“~/”是家目
錄,每個用戶都是不一樣的)中存500個曾經輸入過的命令。每一個有自己帳號的用戶,在自
己的家目錄中,都會有“.bash_history”文件。可能會有這種情況,用戶在不該輸入口令的
地方輸入了口令,而輸入的口令會在“.bash_history”文件中保存下來。而且“.bash_his
tory”文件越大這種可能性也越大。
在“/etc/profile”文件中HISTFILESIZE和HISTSIZE這兩行決定了系統中所有用戶的“.bas
h_history”文件可以保存多少命令。我建議把“/etc/profile”文件中的HISTFILESIZE和H
ISTSIZE都設成一個比較小的值,如:20。
編輯profile文件(vi /etc/profile),把這些行改成:
HISTFILESIZE=20
HISTSIZE=20
這樣每個用戶家目錄下的“.bash_history”就最多只能存20個命令。如果黑客試圖在用戶的
“~/.bash_history”文件中發現一些口令,他就沒有什么機會了。
3.2.2.19 “/etc/lilo.conf”文件
LILO是Linux上一個多功能的引導程序。它可以用於多種文件系統,也可以從軟盤或硬盤上引
導Linux並裝入內核,還可以做為其它操作系統的“引導管理器”。根(/)文件系統對LILO來
說很重要,有下面這兩個原因:第一:LILO要告訴內核到那里去找根文件系統;第二:LILO
要用到的一些東西,如:引導扇區、“/boot”目錄和內核就存放在根文件系統中。引導扇區
包括LILO引導程序的第一部分,這個部分在引導階段的后半部分還要裝入更大的引導程序。
這兩個引導程序通常存在“/boot/boot.b”文件中。內核是由引導程序裝入並啟動的。在Re
dHat Linux系統中,內核通常在根目錄或“/boot”目錄下。
因為LILO對Linux系統非常重要,所以我們要盡可能地保護好它。LILO最重要的配置文件是“
/etc”目錄下的“lilo.conf”文件。用這個文件我們可以配置或提高LILO程序以及Linux系
統的安全性。下面是LILO程序的三個重要的選項設置。
1)加入:timeout=00
這項設置設定LILO在引導默認的系統之前,等候用戶輸入的時間。C2安全等級規定這個時間
間隔必須設成0,因為多重引導會使系統的安全措施形同虛設。除非想用多重引導,否則最好
把這項設成0。
2)加入:restricted
當LILO引導的時候,輸入參數linux single,進入單用戶(single)模式。因為單用戶模式沒
有口令驗證,所以可以在LILO引導時,加上口令保護。“restricted”選項只能和“passwo
rd”合起來用。注意要給每個內核都要加上口令保護。
3)加入: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= ? 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@cnns]# chmod 600 /etc/lilo.conf (will be no longer world readable).
第三步
使改變后的“/etc/lilo.conf”配置文件生效:
[root@cnns]# /sbin/lilo -v (to update the lilo.conf file).
第四步
為了更安全一點,可以用chattr命令給“lilo.conf”文件加上不可改變的權限。讓文件不可
改變用下面的命令:
[root@cnns]# chattr +i /etc/lilo.conf
這樣可以避免“lilo.conf”文件因為意外或其它原因而被改變。如果想要改變“lilo.conf
”文件,必須先清除它的不可改變標志。
清除不可改變的標記用下面的命令:
[root@cnns]# chattr -i /etc/lilo.conf
3.2.2.20 使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@cnns]# /sbin/init q
3.2.2.21 改變“/etc/rc.d/init.d/”目錄下的腳本文件的訪問許可
改變啟動和停止daemon的腳本文件的權限。
[root@cnns]# chmod -R 700 /etc/rc.d/init.d/*
這樣只有root可以讀、寫和執行這個目錄下的腳本。我想一般用戶沒有什么必要知道腳本文
件的內容。
注意:如果你安裝或升級了一個程序,要用到“/etc/rc.d/init.d/”中system V腳本,不要
忘記再檢查一下改變和檢查這個腳本文件的許可。
3.2.2.22 “/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@cnns]# rm -f /etc/issue
[root@cnns]# rm -f /etc/issue.net
注意:“/etc/issue.net”文件是用戶從網絡登錄計算機時(例如:telnet、SSH),看到的登
錄提示。同樣在“/etc”目錄下還有一個“issue”文件,是用戶從本地登錄時看到的提示。
這兩個文件都是文本文件,可以根據需要改變。但是,如果想刪掉這兩個文件,必須向上面
介紹的那樣把“/etc/rc.d/rc.local”腳本中的那些行注釋掉,否則每次重新啟動的時候,
系統又會重新創建這兩個文件。
3.2.2.23 帶“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@cnns]#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.0050
3
-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@cnns]# chmod a-s /usr/bin/chage
[root@cnns]# chmod a-s /usr/bin/gpasswd
[root@cnns]# chmod a-s /usr/bin/wall
[root@cnns]# chmod a-s /usr/bin/chfn
[root@cnns]# chmod a-s /usr/bin/chsh
[root@cnns]# chmod a-s /usr/bin/newgrp
[root@cnns]# chmod a-s /usr/bin/write
[root@cnns]# chmod a-s /usr/sbin/usernetctl
[root@cnns]# chmod a-s /usr/sbin/traceroute
[root@cnns]# chmod a-s /bin/mount
[root@cnns]# chmod a-s /bin/umount
[root@cnns]# chmod a-s /bin/ping
[root@cnns]# chmod a-s /sbin/netreport
如果你想知道這些程序到底有什么用,可以用man命令查看幫助。
例如:[root@cnns]# man netreport
3.2.3 高級安全
3.2.3.1 使系統對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"
3.2.3.2 禁止使用控制台程序
一個最簡單而且最常用的保證系統安全的方法就是禁止使用所有的控制台程序,如:shutdo
wn和halt。可以運行下面的命令來實現:
[root@cnns]# rm -f /etc/security/console.apps/servicename
這里servicename是你要禁止的控制台程序名。除非你使用xdm,否則不要把xserver文件刪掉
,如果這樣除了root之外,沒有人可以啟動X服務器了。(如果使用xdm啟動X服務器,這時ro
ot是唯一需要啟動X服務器的用戶,這才有必要把xserver文件刪掉)。例如:
[root@cnns]# rm -f /etc/security/console.apps/halt
[root@cnns]# rm -f /etc/security/console.apps/poweroff
[root@cnns]# rm -f /etc/security/console.apps/reboot
[root@cnns]# rm -f /etc/security/console.apps/shutdown
[root@cnns]# rm -f /etc/security/console.apps/xserver (如果刪除,只有root可以啟動
X).
這些命令就可以禁止所有的控制台程序:halt、poweroff、reboot和shutdown。記住,只有
裝了Xwindow,刪除xerver文件才會有效果。
注意:根據我們前一章的介紹安裝服務器,Xwindow是沒有安裝上的,上面說的那些文件可能
不會出現在“/etc/security”目錄下的,如果這樣就可以不管這一節介紹的方法。
3.2.3.3 禁止控制台的訪問
為了禁止所有的控制台訪問,包括程序和文件,請在“/etc/pam.d/”目錄下的所有文件中,
給那些包含pam_console.so的行加上注釋。這一步是上一節《禁止使用控制台程序》的延續
。下面的腳本可以自動完成這項工作。轉成root身份,創建disabling.sh腳本文件(touch d
isabling.sh),接着加入下面這些行:
# !/bin/sh
cd /etc/pam.d
for i in * ; do
sed '/[^#].*pam_console.so/s/^/#/' < $i > foo && mv foo $I
done
用下面的命令使腳本有可執行的權限,並執行它:
[root@cnns]# chmod 700 disabling.sh
[root@cnns]# ./disabling.sh
這樣“/etc/pam.d”目錄下所有文件中包含“pam_console.so”的行都被加上注釋。這個腳
本運行完之后,可以把它從系統中刪掉。
3.2.3.4 創建所有重要的日志文件的硬拷貝
保證在“/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@cnns]# /etc/rc.d/init.d/syslog restart
又例如:
記錄下服務器上所有的telnet、mail、引導信息和ssh連接,並打印到本地網絡中其它服務器
上連接的打印機,要在這台接收日志文件的服務器的“/etc/syslog.conf”文件中加入一行
。如果本地網中沒有打印機,可以把所有的日志文件拷貝到別的服務器上,只要忽略下面第
一步,把“/dev/lp0”加到其它服務器的“syslog.conf”文件中,直接跳到在其它服務器上
設置“-r”參數那一步。把所有日志文件拷貝到其它計算機上,使你可以在一台計算機上管
理多台計算機的日志文件,從而簡化管理工作。
編輯接收日志文件的服務器(例如:mail.openarch.com)上的syslog.conf文件(vi /etc/sys
log.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@cnns]# /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@cnns]# /etc/rc.d/init.d/firewall restart
這個防火牆的規則允許發送日志文件的服務器通過端口514(syslog端口)發送UDP包。
注意:千萬不要用網關服務器來收集和管理所有的系統日志信息。有關syslogd程序的其它一
些參數和策略,可以用man命令查看幫助:syslogd(8)、syslog(2)和syslog.conf(5)。
3.2.4 系統補丁
http://www.redhat.com網站提供了最新的內核和應用程序的升級或補丁包。可以把.rpm包下
載到服務器的/var/tmp里面然后用命令 rpm –ivh soft.pkg.rpm來升級軟件包,或者用rpm ?CUvh soft.pkg.rpm ?蔥薏瓜低忱錈媧新┒吹娜

砑?3.2.5 附錄 Linux上面各種常用軟件的下載網址
1)FTP:
ftp://ftp.wu-ftpd.org/pub/wu-ftpd/
2)SSH:
ftp://ftp.ssh.com/pub/ssh/
3)DNS:
ftp://ftp.isc.org/isc/bind/
4)dhcp:
ftp://ftp.isc.org/isc/dhcp/dhcp-3.0b2pl18-solaris-2.6.tar.gz
5)SMTP:
ftp://ftp.sendmail.org/pub/sendmail/
6)SSL:
ftp://ftp.openssl.org/source/
7)IMAP/POP:
ftp://ftp.cac.washington.edu/imap/
8)inn:
ftp://ftp.isc.org/isc/inn/inn-2.3.1.tar.gz
9)Linux MM:
http://www.engelschall.com/sw/mm/
10)pine:
ftp://ftp.cac.washington.edu/pine/
11)samba:
http://us1.samba.org/samba/download.html
12)openLDAP:
http://www.openldap.org/software/download/
13)PostgreSQL Db:
ftp://ftp.postgresql.org/pub/
14)Squid Proxy:
http://www.squid-cache.org/Versions/
15)Apache:
http://httpd.apache.org/dist/
16)Mod_ssl:
http://www.modssl.org/source/
17)Perl:
http://perl.apache.org/dist/
18)PHP:
http://www.php.net/downloads.php
19)MySQL
http://www.mysql.com/Downloads/MySQL-3.23/mysql-3.25.13-pc-linux-gnu-i686.tar.gz

20)SXID
ftp://marcus.seva.net/pub/sxid/
21)tripwire:
http://www.tripwiresecurity.com/downloads/index.cfml?dl=asr&
22)GUN PG
http://www.gnupg.org/download.html
? 第四部分 總結
沒有絕對安全的網絡系統,網絡信息對抗是一個長期的研究課題,安全問題是多種多樣,且
隨着時間技術的變化而變化,而黑客的侵入手段也隨之不斷變化,所以安全防護也是非常重
要的,保持清醒正確的認識,同時掌握最新的安全問題情況,再加上完善有效的安全策略,
是可以阻止大部分的網絡入侵,從而保持最小程度的經濟損失。
? 第五部分 附錄
5.1 Free BSD系列
FreeBSD 是一個非常安全的操作系統。也正因為它的 source code 是可以免費的取得,這個
OS 長久以來不斷的有人改進加強。盡管 FreeBSD 一出廠就非常安全, 但是仍然有更多加強
安全性的措施,這份 HOW-TO 會教你一些步驟, 以更加強你機器的整體安全。
5.1.1 網絡
5.1.1.1 inetd (Inet Daemon)
網絡在系統安全上扮演了一個很重要的角色。FreeBSD 的根基是有着內建網絡功能, 且具有
最穩最快的 TCP/IP stacks 的 4.4BSD。這個 stack 支持了非常多的協議像是telnet, ftp
, talk, rsh 等... 這些 service 的的主設定檔便是 /etc/inetd.conf。要編輯這個檔, 請
輸入 "vi /etc/inetd.conf" (在這個例子里, 我使用 vi 。你可以使用其它你較為上手的編
輯器。或許你可以試試 pico)。如果你要使用 pico, 請在啟動它時加上 -w 選項:
-w 關掉自動斷行。(因此可以容許超過 80 字符的行存在)
這選項在編輯 /etc/inetd.conf 時非常有用。
當然了, 你也可以使用 ee - 它隨着 FreeBSD 一起 "出廠" 的, 而且也是 root 預設的編輯
器。不過, 請再 "echo $EDITOR" 確認一次。 開啟了這個檔案后, 你可以看到里面怎么描
述每個 service 怎么激活, 要以那位使用者執行等等的信息。(man 5 inetd.conf)既然這個
檔案是許多 internet service 的主要設定檔, 好好的設定它便是一件十分重要的事。你要
關掉一個 service的話,只消在那一行前面加個 "#" 符號。基本的概念是, 關掉些你不熟悉
的 services - 如果你不知道那個 service 是啥, 或者不知道它可以干啥。理想狀態下, 你
不須要把所有的 service 都打開。例如, 你的器只是要跑 web server。這種情況下, 你只
要激活 ssh 和 httpd 便夠了。關於啥是ssh, 下面會說明。如果你啥 service 都不想跑,
最直接干脆的方法是-關掉 inetd。做法很簡單, 只要編輯 /etc/rc.conf 並且把
inetd_enable="YES"改成inetd_enable="NO"就可以了。
如此一來沒人可以 telnet, rlogin, 或 ftp 到計算機中。如果你決定要激活你的 inetd 的
話, 記得激活 log 選項, 並提高一個 service 每分鍾激活的上限數目。(默認值是 256, 我
建議提高到 1024-自行參照下面解說調整吧!)為什么要這么做呢...? 就 modem user 或是低
速專線用戶是沒什么差別。但高速線路的人, 上限值太低會蹦出一個 DoS attack(Denial o
f Service)。某個壞心的人可以簡單的用一個 shell script 同時搞出超過 256 個 connec
tions, 這么一來你的 inetd會很不幸的陣亡。換句話說, 如果你想讓每分鍾每個 service
可接受的connection 數多點, 記得做如下的設定, 不然來個壞心的人就可以搞垮你的計算機
。因此, 在這行inetd_enable="YES"
下面的:
inetd_flags=""
要改成:
inetd_flags="-l -R 1024"
這會將聯機的動作都 log 下來(-l 參數)而且將同時最大聯機數從預設的 256 增加到1024。
你還須要對你的 /etc/syslog.conf 作些修改, 這些等會兒會提到。
5.1.1.2 SSH
在以下提到的案例中, 你完全不須要 run inetd。例如, 如果你只有跑 web, news, 或是 n
fs server, 那么就沒有必要在你的機器上再跑其它的services。但是你一定會問,"我要怎么
控制我的機器啊!?" 嗯嗯, 所以現在要介紹 SSH。你可以透過 SSH (SecureShell) 來登入你
的機器。Secure Shell 當初便是設計來取代 rsh, rlogin 等其它的Berkeley r* 命令。相
信你很快就會了解 SSH 是如何有用,而且開始使用它,來代替其它的程序像是 telnet 和 ft
p。SSH 具有很多功能,但是最為人知的是, 它的加密通訊方式, 也就是防止你的密碼和資料
以明碼的方式在網絡上傳輸。如果你使用 telnet,你的通訊內容可能會被"竊聽": 傳輸中的
資料被改變, 通訊內容被看到。(不是有 S/Key可以解決嗎? 很不幸的, 它還是有着插入資料
和連接時被破解的問題) 我希望你可以完全的關掉 inetd 而使用 SSH。如果你認為完全不靠
inetd 來激活某些 services,是完完全全不可能的事, 那么希望你至少激活 log 功能, 而
且要增加每分鍾同一個 servi-ce 可激活的次數。 (原因上面有提到)
你可以從 ftp://ftp.funet.fi/pub/unix/security/login/ssh 下載 SSH。
若你想要更簡單的方法:
# cd /usr/ports/security/ssh
# make install
5.1.1.3 inetd (part II)
好吧, 你仍然執意要使用 inetd。那么我們來看看在 inetd.conf 有那些選項, 可以增進你
的系統安全。在攻擊某系統之前, 攻擊者都會先收集該系統的相關信息。就 telnetd 而言,
你可以試試在 telnetd 那行后面加個 -h:
telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h
從 telnetd 的 man page 可以知道:
-h Disable the printing of host-specific information before login
has been completed.
當有很多管道可以獲得系統信息的同時, 這招和下面的那招是個不錯的解決方案。如果你認
為跑 telnet daemon 是沒有必要的, 那么只消加個 "#" 在該行的最前面就行了:
#telnet stream tcp nowait root /usr/libexec/telnetd telnetd
有個極不錯的措施是, 你可以拒絕沒有完整 FQDN 的人來聯機。要做到這點, 也只要加個 -
U 選項到 telnetd 后面:
telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h -U
這是個小動作, 但是對你的系統安全有莫大的助益。
5.1.1.4 ftpd
現在來看看 ftp。 對於 ftp FreeBSD 已經做了一些 log 的動作 。 可以看到在/etc
/inetd.conf 里面 ftpd 那一行已經加了 "-l"。然而, 你還是要設定你的syslogd, 使它可
以接受 ftp daemon 產生的 log。從 man page 可以得知:
每個成功或是失敗的 ftp 登入嘗試, 都會以 LOG_FTP 機制紀錄起來。如果這個選項被指定
了兩次, 所有的下載 (get), 上載(put), 新增, 刪除,建立目錄, 及更名的動作和文件名字
都會被紀錄下來。 又: LOG_FTP 訊息預設是不會被 syslogd(8) 紀錄下來的。你還要在 s
yslogd(8) 的設定文件里面激活這個功能才行。
讓我們開啟 syslogd 紀錄 ftpd log 的功能吧~ 這個檔案是 /etc/syslog.conf (別忘了順
便看看 man 5 syslog.conf)。把下面這一行加到這個設定檔里:
ftp.* /var/log/ftpd
也不要忘了執行這個指令 "touch /var/log/ftpdlog", 因為 syslogd 不能寫入到一個沒有
被開啟過的檔案。如果你想要你的 ftpd 提供你更多的 log 訊息, 那么就在 ftp那一行多加
個 "-l" 吧:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l
如果你想要確定你的使用者們都用 scp (Secure Copy, 附屬在 SSH 里面), 但是又想要提供
anonymous ftp 服務, 也只消加個 "-A" 在 ftp 那行后面就行了:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -A
你也可以編輯 /etc/ftpwelcome, 說明目前接受 anonymous ftp 登入, 但是系統內的使用者
就得使用 rcp 了。如果你有提供 anonymous ftp, 你可以使用 -S 選項來記錄傳輸的情形:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -A -S
5.1.1.5 fingerd
Finger 服務默認值還算安全: 它不容許不帶 user name 的 query。這是一件不錯的事(tm)
。然而, 就是有些人無論如何也不想 run fingerd。這種情形下, 你只要簡單的給它加個 "
#" 在這行的最前面就可以了。又, 你想要 log 住誰來 finger 的話, 加個"-l" 也就行了
:
finger stream tcp nowait nobody /usr/libexec/fingerd fingerd -s -l
Fingerd 產生的 log 信息預設是寫到 /var/log/messages。如果你想要這些信息寫入到特定
的檔案里去, 那么就在 /etc/syslog.conf 加入這一行:
daemon.notice /var/log/fingerd
/* !fingerd anyone? */
$ man 5 syslog.conf
除了 ftp, telnet 和 finger 之外, 你實在不須要在 /etc/inetd.conf 中再多激活任何東
西了。通常我都會關掉 talk 及 comsat等我個人不須要的東西。如同我之前講的,如果你不
知到某個 servcie 是干嘛用的, 而且你也不須要它, 那么就關掉它。一些和網絡有關而且很
有用的 man page 是: inetd, ftpd, telnetd, fingerd, syslogd,comsat, talkd, rshd,
rlogind, inetd.conf。並且記得要看 man page 的"SEE ALSO"部份, 以獲得更多的相關信息

5.1.1.6 ipfw (IP FrewWall)
IP FireWall 做的是 packet 過濾的工作。沒錯, 就是只有這樣。然而, 你要考慮的事是,
你的 kernel 要有支持 ipfw。 通常在我管的機器上, 我都會重編核心使其支持ipfw。大
概看起來是這樣:
options IPFIREWALL #finger the net
options IPFIREWALL_VERBOSE #log the net
options IPFIREWALL_DEFAULT_TO_ACCEPT
第一行表示最其本的 IP FireWall 支持。第二行讓 ipfw 可以把接受或拒絕 packets的紀
錄 log 起來。第三行非常重要, 讓 ipfw 默認值是接受任何地方來的 packets 。如果你不
這樣做, 默認值拒絕任何地方來的 packets。我個比比較喜歡后者, 但我又認為在我自己的
工作站上, 或一個讓人登入的工作站, 預設拒絕任何 packets 不是一件太好的事。如果你搞
不清楚自己在做啥事, 那就不要用這個選項。
就設定 firewall 而言, 這是不甚正確的。預設任何東西都該被擋掉才是正確的。如果你是
要建置一台高安全性的系統, 或一台 firewall 的話,那就千萬不要加入這個選項:
options IPFIREWALL_DEFAULT_TO_ACCEPT
記住一件事: 要預設拒絕任接受任何 packets, 然后再加入 rule 來設定你想要 接受那
些 packets。查看 /etc/rc.firewall 以得到更多的信息。再一次提醒你, 不要使用這個 o
ption, 除非你只是想要防止 DoS attacks 或暫時把某些 port/network ban掉。
5.1.1.7 log_in_vain
你也可以透過 sysctl 命令, 來改變一些有用的系統變量:
# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1
這會把嘗試向你的機器要求你沒有的服務的 connections log 起來。例如, 如果你在你的機
器沒有跑 DNS server, 而又有個人想要向你的機器要求 DNS 服務, 這時候你就會看到
Connection attempt to UDP yourIP:53 from otherIP:X
(X 是某個 high port #)
用 "dmesg" 命令就可以看到這一行。Dmesg 秀出的是系統的 kernel messagebuffer。
然而, 這個 buffer 的空間是有限的, 所以系統也會把這些訊息寫入到/var/log/messa
ges 里面去:
# tail -1 /var/log/messages
Jun 12 19:36:03 ugh /kernel: Connection attempt to UDP yourIP:53 from otherIP:X
5.1.1.8 final notes
理論上呢, 你的系統現在已經比你裝好它時更安全些了。你現在可以做一些事來確定你目前
的更動:
$ netstat -na | grep LISTEN
這會告訴你那些 service 在那些 port 跑。越少越好 :) 又, 再跑一些其它的 port scann
ers (strobe, nmap) 來找出你開了那些 port。
而要確要你的 syslogd 已經開始紀下你剛剛想要 log 的事件, 可以這么做:
# cd /var/log
# tail -10 fingerd ftpd messages
在 log 檔里面沒看到任何東西的話, 記得重新激活 inetd 和 syslogd:
# kill -HUP `cat /var/run/syslog.pig` `cat /var/run/inetd.pid`
5.1.1.9 Filesystem
既然 Unix 把什么東西都當作檔案來看待, 好好的保護你的檔案系統便是很重要的事。有件
事是在你安裝操作系統前便要完成的: 必須要計划並設計好你的 partition 該怎么切割。有
幾個很重要的原因讓你要這么做: 一個是你可以 mount 不同的檔案系統以賦與不同的選項
(下面有幾個例子)。別一個是,如果你想要把你的 filesystem export出去, 你須要更加細微
的控制。如果你是一個從 Linux 轉入 FreeBSD 的使用者, 你會發現 Linux 是把任何東西都
往 root partition "/" 塞, 而 FreeBSD 預設便要 "/","/usr", 和 "/var"。這也使得要使
用如 dump 般的工具較容易。且讓我們來討論 security 吧! 有一件事我通常會做的是, 我
會把一般 users 可以寫入的 partition 分開來割, 而這些 partitons 便可以用 "nosuid"
的方式來 mount。從 mount 的 man page 可以知道:讓 suid 或 sgid bit 失效。對於像
suidperl 這些公開使用的程序, 設這個選項便沒用。
因此你會有個 partition 給一般使用者使用: /home 或 /usr/home。然后你可以另外
開個 partion 給 /var/tmp 然后再把你的 /tmp 指到這里:
# rm -rf /tmp
# ln -s /var/tmp /tmp
你可以參考這個例子:
# cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/sd0s1b none swap sw 0 0
/dev/sd0s1a / ufs rw 1 1
/dev/sd0s1g /usr ufs rw 2 2
/dev/sd0s1h /usr/home ufs rw 2 2
/dev/sd0s1f /var ufs rw 2 2
/dev/sd0s1e /var/tmp ufs rw,nosuid 2 2
proc /proc procfs rw 0 0
現在你可以確定一般 users 可以寫入的目錄不是以 "-nosuid" 的方式被 mount, 就是
沒有可以寫入。現在你還要關心的就是 /var/spool/uucppublic"。
你可以把 "/var" 以 "-nosuid" 的方式來 mount , 或下這個命令:
# chmod o-w /var/spool/uucppublic
如果你想要找出你所有的可寫入目錄, 下這個命令:
# find / -perm -0777 -type d -ls
如同 man page 指出的, 具有 suid/sgid 的程序會讓你的 nosuid 失效。找出那些程式
是 suid 或 sgid 的吧:
# find / -perm -2000 -ls
# find / -perm -4000 -ls
同時你不止可以用 "-ls" 而只是知道有那些程序。你可以把不是很有用的程序 "chmod
000"。像是 uustat, uucico 等, 如果你從來不碰 uucp 的話。或是 ppp 和 pppd, 如果你
絕不會用到他們。又, 你不會去用到打印機的話, 把 lpr lprd 也 chmod 000 吧!也許改天
會有個人寫個 shell script 來問你那些東西要 chmod 000 掉。
現在你也許想問, 有什么方式可以防止攻擊者重新以非 "-nosuid" 的方式 mount 你的
filesystem ? Well, 沒有, 除非你改變你的 securelevel。
5.1.1.10 securelevel
FreeBSD kernel 有個觀念叫 securelevel。當還有人在爭論這是不是夠完美時,這個機
制已經夠防止大部份的 "script kiddiez"。Securelevel 是指你的 kernel 在執行時的安全
等級。每一個等級具有不同的保護和檢查機制。這些是 init(8) 的 man page:
Kernel 可以以四種不同的安全等級來執行。任何 superuser process 可以提高安全等級,
但是只有 init 可以降低它。這四種等級分別是:
-1 永遠不安全模式 - 切換到 level 0 吧!
0 不安全模式 - "不可更動"和"只能附加"這兩個旗標(flag)可以被改變。所有的
devices 可以照着它們的讀寫權限被讀寫。
1 安全模式 - "不可更動"和"只能附加" 的旗標不能被取消; mount 上來的檔案系
統, /dev/mem, 和 /dev/kmem 不能寫入。
2 高安全模式 - 和安全模式一樣, 又多加了不管硬盤有沒有被 mount 起來,除了
mount(2) 之外都不能寫入。它防止一個檔案系統在 umount 的時候被搞亂。而且在這個等級
也禁止在 multi-user 時執行 newfs(8)。
如果安全等級最初是 -1, 那么 init 就會保持原狀。否則在 single user mode 時,in
it 會把安全等級調到 0, 而在 multiuser mode 時會以 1 來跑。如果你希望在multiuser
模式是以等級 2 在跑, 你可以先進入 single user mode, 編輯 /etc/rc,使用 sysctl 來更
動。
若是你的系統只拿來跑 web server 之類的, 你可以放心的將 securelevel調高到2。但
若是你要跑 X server, 把你的 securelevel 調至 1 或更高會導致一些問題。因為X serve
r 必須要寫入 /dev/mem 和 /dev/kmem, 而 securelevel 1 不允許你這么做。有一個解決的
方法是, 在激活 X server 后再調高 securelevel。但我的意見是, 如果你跑 X server 的
話, 你已經有了其它的安全問題須要考量, 而不止是 securelevel。以下這個指令會顯示出
你目前的 securelevel 設定值。
# sysctl kern.securelevel
如果要提高你的 securelevel:
# sysctl -w kern.securelevel=X
X 可以是 0, 1 或 2。
又在 securelevel 是 1 的話, 你在 "make world" 時也會有些問題。因為 "make ins
tall" 時會在 kernel 上加上 immutable flag:
# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel
"schg" flag 會防止你安裝新的 kernel:
nfr# id
uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem)
nfr# sysctl kern.securelevel
kern.securelevel: 2

nfr# rm -rf /kernel
rm: /kernel: Operation not permitted

nfr# mv /kernel /tmp/
mv: rename /kernel to /tmp//kernel: Operation not permitted

如果你在 securelevel 1 或 2, 那么 schg flag 是不能被改變的。

# chflags noschg /kernel
chflags: /kernel: Operation not permitted
值得留意的是, /boot.config 可以改變你開機時的系統設定,要預防有心人篡改你應該
這么做:
# touch /boot.config
# chflags schg /boot.config
你可以看看系統預設還有那些執行檔是有 schg flag 的。
# ls -lo /sbin | grep schg
-r-x------ 1 bin bin schg 204800 Jul 19 20:38 init
# ls -lo /bin | grep schg
-r-sr-xr-x 1 root bin schg 192512 Jul 19 20:36 rcp
再回過頭來談談鎖定系統這件事吧! 既然剛剛談到了 immutable flags, 何不試着把整
個 /sbin 和 /bin 都設成 schg flag 呢 !? 這會給想 crack你系統的人一點小挫折。(假設
你的系統也正以適當的 securelevel 運作中)
# chflags schg /bin/*
# chflags schg /sbin/*
不過 /sbin 可能被改成別的名字,再重新創造一份新的 /sbin ,所以改變 /sbin 與/bi
n 的 schg flag 是很合理的想法,我們可以依照以下的方式改變 /sbin 和 /bin 的 schg f
lag:
# chflags schg /bin/*
# chflags schg /sbin/*
這些 schg flag 的檔案會讓你在 "make world" 時有問題。
("make installworld" 也是)
無論如何 ,最好是以 single user 模式來 "make world"。有關 "makr world" 的相信
息, 還有為什么要這么做, 到下面這個網頁來看看:
http://www.nothing-going-on.demon.co.uk/FreeBSD/make-world/make-world.html
現在你已經適當的鎖定你的系統, 也以只跑必要的的 service, 而檔案系統也適當的mo
unt 上來, 且也以適合的 kernel securelevel 運作中。
與以上所述的相關 man pages 有: init(8), chflags(1), sysctl(8)。
5.1.1.11 Logging
系統紀錄是很重要的。如果你的統被人攻擊, 透過它你可以找到一些蛛絲馬跡。Unix的
標准 log 動作是透過 syslogd(8) 來達成的。它從 /etc/rc 中被激活, 一直執行到系統關
機為止。你可以用以下的方式確定你的系統上是否正在執行 syslogd:
$ ps -axu | grep syslogd
Syslogd 會在激活時讀取 /etc/syslogd.conf。這個檔案很重要, 因為它告訴 syslogd
要紀錄那些東西, 而這些東西又該放在那里。你也許想看看 syslod 和 syslod.conf的 m
an pages:
$ man syslogd ; man 5 syslog.conf
既然 Unix 當初就是設計作為網絡操作系統, syslogd 可以而且默認值也接受其它系統
的紀錄。它自己也是可以把紀錄透過網絡送到其它的計算機去。想當然耳, 它可以紀錄下 自
己系統發生的每件事 - 而這也正是默認值。因為 syslogd 使用 UDP - 所以資料是可以被
偽造的。你至少可以作一件事: 不要讓你的 syslogd 接受來自其它計算機的紀錄訊息。在
/etc/rc.conf 加個 "-s" 就可以了:
syslogd_flags="-s" # Flags to syslogd (if enabled).
如果你有接受特定機器之紀錄的必要 (像是你的 router, 或是 web server), 使用
"-a" 來指定特定的 hosts, domains, 或 subnets。
下次你重新激活你的系統時, syslogd便會拒絕來自其它地方的紀錄訊息。如果有人嘗試
送資料進來, syslogd 將會加以紀錄。
如果你不想重新激活你的系統, 那么只要把 syslogd kill -9, 然后再以 root 的身份
激活 syslogd 便可以了。記得加上 "-s"這個參數。
如果有人嘗試攻擊你的系統而且失敗了, 你的系統紀錄便不會被偽造。但如果你的系統
己經被攻陷了, 而且 /var/log 整個被干掉了呢 !?還是有方法可以防止的。 其一便是在你
的網絡系統中再架一台機器拿來紀錄整個網絡中發生的事, 而且也不要再干其它的事了。除
了 UDP port 514 之外, 其它的也都不用再開了。這樣子一來你便可以紀錄下所有機器 (ro
uters, firewalls, serves, workstations) 發生的所有事。你可以只送敏感的訊息給它,
或者任何你覺得重要的。這台機器可以是老舊 486, 但有顆大大的硬碟。記得要設定好正確
的 "-a" 選項, 免得搞出沒收到紀錄的烏龍事。你也可以接台老舊的點陣打印機給它, 以印
出敏感的事件(像是失敗的登入嘗試)。如果你把系統紀錄印到紙上, 一位攻擊者要清除它是
很困難的。還有其它的方法,例如透過 serial port (cuaaN) 或是 parallel port (lpN) 送
出紀錄到別台機器上。
每個人都有不同的記錄需求。但是有一件事我通常會做的是在 /etc/syslog.conf 加入
這一行:
auth.* /var/log/authlog
FreeBSD 出廠時便包含了 newsyslog。這玩意會定時壓縮紀錄文件並清除掉舊的紀錄。
設定檔位於 /etc/newsyslog.conf - 請看一下 man page 以得到更多的信息:
% man newsyslog
不像 syslogd, newsyslog 不是一直都在執行的。它是從 crontab 激活的:
% grep newsyslog /etc/crontab
0 * * * * root /usr/sbin/newsyslog
%
你可以修改 /etc/newsyslog.conf 以符合你的需求。我通常會改變它預設的檔案模式,
從 664 改成 660 - 因為沒有必要讓一般的使用者去查看你的系統紀錄。你應該這么做:
# cd /var/log
# chmod g-w,o-r * ; chmod a+r wtmp
這會防止一般使用者讀取紀錄文件, 除非它們在適當的 group (wheel 或之類的)。還有
,記得把記錄文件的 group 都改成 wheel -- 這純粹只是為了方便: 如果你是在 wheel 這個
group; 你當然是可以 su(1) 到 root 然后讀記錄文件。但是這么做以后你便可以直接讀
記錄文件了, 豈不方便乎!?你還要在 /etc /newsyslog.conf 中加入 "root.wheel":
/var/log/maillog root.wheel 640 7 100 * Z
/var/log/authlog root.wheel 640 7 100 * Z
/var/log/messages root.wheel 640 7 100 * Z
這會在記錄文件達到 100K 時將它壓縮並加以編號, 將 mode 改成 640, chown
成root.wheel, 並將舊的記錄文件干掉 - 這就是我們要的。
當然,標准的 Unix 還有其它不同的 syslog 程序可供選擇,其中之一是 CORE EDI 的ss
yslog (secure syslog). 可以在以下的地方找到:
http://www.core-sdi.com/ENGLISH/CoreLabs/ssyslog/download.html
另外還有 nsyslog (new syslog),這是寫 bpfilter 那一伙人寫出來的,你可以在
http://cheops.anu.edu.au/~avalon/nsyslog.html 找到這個程序。
不管你選用那一種程序 (標准的 syslog , ssyslog ,或 nsyslog),你應該也去看看一些
幫你分析系統 log 的程序,幫你省下去用 grep 查詢 log file 的麻煩。
其中之一是 logcheck , 可以在這個地方下載:
http://www.psionic.com/abacus/abacus_logcheck.html
另外一個類似的程序叫做 logsurfer , 你可以從這個網頁下載:
http://www.cert.dfn.de/eng/team/wl/logsurf/
5.1.2 Misc. hints and tips
5.1.2.1 LKM
在正式提供服務的系統上, 也許該關掉 LKM。為什么? 請看:
Phrack Magazine Volume 7, Issue 51 September 01, 1997, article 09
要關掉 LKMs, 在 kernel 設定檔中加入這一行:
options NOLKM
5.1.2.2 Portmap
FreeBSD 出廠的默認值會將 portmap 這項功能打開。如果你不需要它的話,把它關掉。
如果你沒有跑任何需要呼叫 RPC 的程序的話,你就不需要跑這個程序。如果要關掉portmap
這個程序,你可以去修改 /etc/rc.conf , 把
portmap_enable="YES" # Run the portmapper service (or NO).
改成
portmap_enable="NO" # Run the portmapper service (or NO).
5.1.2.3 Sendmail
FreeBSD 出廠的默認值也會執行 sendmail 的功能。從很久以前 sendmail 就以不安全
且漏洞百出聞名。最近人們努力的將 sendmail 中的錯誤清除,但是由於 sendmail是一個很
肥大的程序,要將所有的錯誤都抓出來相當的困難。換句話說:如果你不需要它的話,最好把它
關掉。如果你真的需要它的話,最好到 sendmail 的網站去看看有沒有新的patches 或是 ha
cks, sendmail 的網站在 http://www.sendmail.org
此外,如果你的 sendmail 版本是 8.8 以后的版本,請設定好你的系統,以防止 spammer
利用你的系統去干壞事。設定 anti-spam 的信息可以在
http://www.sendmail.org/antispam.html 下找到。
如果你決定要把 sendmail 關掉的話,只要去修改 /etc/rc.conf (沒錯,又是它)中的:
sendmail_enable="YES" # Run the sendmail daemon (or NO).
改成
sendmail_enable="NO" # Run the sendmail daemon (or NO).
5.1.2.4 Ports and Packages
在一台高安全性的系統上, 最好不要使用 ports 或 packakges。 你不會真正知道是不
是安裝 suid 的程序進你的系統 -- 而且你不會想再多這些 suid 的東西了, 相信我。盡管
你在 pkg_add 時可以使用不同的選項(如 "-v" 或 "-n"), 最好還是自己來: 抓回它的 sou
rce code, 自己 compile, 再手動安裝完成。
5.1.2.5 Filesystem quota
如果你的系統是 "shell" type server,你可能希望設定使用者的 quota (可用空間)。
如此一來可以保護你的系統免受 Denial of Service 攻擊方式的侵擾(不論是有意或是無意
的)。在未設定 quota 的系統上使用者可以隨意的灌爆你的硬盤。要把 quota這項功能打開
,你可以修改 /etc/rc.conf 中的這項設定:
check_quotas="NO" # Check quotas (or NO).
改成
check_quotas="YES" # Check quotas (or NO).
請先看看以下的 man page,這些文件說明如何使用 quota 的各項設定,並且有一些設定
的范例: quotaon, edquota, repquota, quota
請確定在 /etc/fstab 中有加入 "userquota" , 詳見 man 5 fstab。
5.1.2.6 Crontab
如果你使用了 /etc/crontab 的話,這項功能有可能提供入侵者一些額外的信息。
請確定你做過 "chmod 640 /etc/crontab"
5.1.2.7 BPF
BPF 是 berkeley packet filter 的縮寫,要使用這項功能前你必須修改 kernel,以達成
監聽網絡的目的。像 tcpdump 和 NFR 這些程序都使用 BPF。然而 BSD的監聽程序也都透過
BPF 來達成,如果有人拿到你系統的 root 權限的話,在系統上設定 BPF 功能反而幫助他們
更容易的監聽你的網絡。如果沒有必要的話,不要設定 kernel 中 BPF的功能。 FreeBSD 出
廠的設定值是將這個功能關閉起來的。
5.1.2.8 CVSup, CVS, 等等
如果你是使用 CD-ROM 安裝你的系統的話,很有可能當你拿到你的 CD-ROM時,已經發現某
些程序有錯誤存在了。在大部份的情況下(我們希望如此),這些錯誤與系統安全無關。然而,
我建議你將你的系統升級到最新的 -current (或是 -stable,視你的喜好而定) 版本。如此
你可以確定你系統上的的是最新版本的系統原始碼。
你需要的信息在這邊可以找到:
http://www.freebsd.org/handbook/handbook264.html#508
在更新你操作系統的原始碼后你必須去 "make world",詳細的文件在:
http://www.nothing-going-on.demon.co.uk/FreeBSD/make-world/make-world.html
5.1.2.9 SSH
使用 ssh 以代替 telnet, ftp, rlogin, rsh 等的重要性, 再怎么強調都是不夠的。
對於使用慢速線路的人 (dial-up, 56K frame), ssh 有 -C 選項:
-C 將數據壓縮后再傳出去, 包括了 stdin, stdout, stderr還有透過 X11 還有
TCP/IP。壓縮的算法同 gzip, 而且可以指定壓縮的 level。對於 moden users 和使用慢速
線路的人, 這功能是不錯的。 但有高速線路的人, 這么搞只會拖慢速度。在主機對連時可以
設默認值, 請再參照文件。
這會讓你用起來快一點 :) 總之就是用 SSH 就對了啦! 拜托, 拜托, 使用 ssh。 如果
你硬是不信邪, 再也沒什么安全措施可以幫助你了 !!
5.1.2.10 Related URLs
1) FreeBSD Hardening Project:
http://www.watson.org/fbsd-hardening/
2) FreeBSD ipfw Configuration Page:
http://www.metronet.com/~pgilley/freebsd/ipfw
3) FreeBSD Security advisories:
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/
4) FreeBSD Security web page:
http://www.freebsd.org/security/security.html
5) Security tools in FreeBSD:
http://www.samag.com/archive/0705/feature.html
5.2 sco 系列
5.2.1 抓好網內主機的管理是網絡安全管理的前提
用戶名和密碼管理永遠是系統安全管理中最重要的環節之一,對網絡的任何攻擊,都不
可能沒有合法的用戶名和密碼(后台網絡應用程序開后門例外)。但目前絕大部分系統管理
員只注重對特權用戶的管理,而忽視對普通用戶的管理。主要表現在設置用戶時圖省事方便
,胡亂設置用戶的權限(id)、組別(group)和文件權限,為非法用戶竊取信息和破壞系統
留下了空隙。
金融系統UNIX的用戶都是最終用戶,他們只需在具體的應用系統中工作,完成某些固定
的任務,一般情況下不需執行系統命令(shell)。以農業銀行全國電子匯兌為例,用戶名為
dzhd,它在/etc/passwd文件中描述如下:
dzhd:x:200:50: :/usr/dzhd:/bin/sh
它的.profile內容大致如下:
COBSW=+R+N+Q-10
DD_PRINTER=“1p-s”
PATH=/etc:/bin:/usr/bin:$HOME/bin:/usr/dzhd/obj:
MAIL=/usr/spool/mail/logname
umask 007
eval`test -m ansi:ansi -m:/?ansi -c -s -Q`
export PATH MAIL COBSW DD_PRINTER
cd usr/dzhd/obj
runx hdg
exit
用戶正常登錄后,如果按下中斷鍵“delete”,關掉終端電源,或同時鍵入“Ctrl”“
/”,那么用戶將進入shell命令狀態。例如他可以在自己的目錄不斷創建子目錄而耗盡系統
的I節點號、或用yes>aa創建一個其大無比的垃圾文件而耗盡硬盤空間等導致系統的崩潰、癱
瘓;如果文件系統的權限設置不嚴密,他可運行、窺視甚至修改它;還可通過su等命令竊取
更高的權限;還可登錄到其它主機上去搗亂……令你防不勝防,危險性可想而知。這一些問
題都與用戶設置有關。所以,盡量不要把用戶設置成上述形式。如果必須這樣,可根據實際
需要,看看能否把用戶的sh變成受限sh,如rsh等,變成如下形式:
dzhd:x:200:50: :/usr/dzhd/obj:/bin/rsh
或如下形式:
dzhd:x:200:50: :/usr/dzhd:./main
在main(.porfile)首部增加如下一行:
trap' ' 0 1 2 3 5 15
那么上述一切問題都可避免。
此外定期檢查你的/etc/passwd文件,看看是否有來歷不明的用戶和用戶的權限;定期修
改用戶密碼,特別是uucp、bin等不常用的用戶的密碼,以防有人在此開個活動的天窗--一個
可自由進出的用戶;刪除所有睡眠用戶等。
5.2.2設置好自己的網絡環境是阻止非法訪問的有效途徑
網上訪問的常用工具有telnet、ftp、rlogin、rcp、rcmd等網絡操作命令,對它們的使
用必須加以限制。最簡單的方法是修改/etc/services中相應的服務端口號。但這樣做會使網
外的一切訪問都被拒絕,即使是否法訪問也不例外。這種閉關自守的做法不值得提倡,因為
這樣會使本網和網外隔絕開,也會給自己帶來不便。通過對UNIXt系統的分析,我們認為有可
能做到有條件限制(允許)網上訪問。
5.2.2.1 建立etc/ftpusers文件(不受歡迎的ftp用戶表)。
與之相關的命令是ftp。配置如下:
#用戶名
dgxt
dzhd

以上都是本機內的一些用戶,侵入者使用以上用戶名ftp訪問本網會被拒之門外。
5.2.2.2 保存.netrc文件
注意保存好.netrc文件(遠程注冊數據文件)。與之有關的命令是ftp。.netrc包含注冊到網
絡上用ftp作文件轉移的遠程主機的數據。通常駐留在用戶當前目錄中,文件權限必須為060
0。格式如下:
machine對方主機名login對方主機內用戶名password對方用戶密碼macdef init ftp的操
作命令集。
5.2.2.3 創建匿名ftp
所謂匿名ftp,是指其他主機的用戶能以ftp或anonymous用戶進行數據收發而不要任何密碼。
建立方法如下:
1) 用sysadmsh創建ftp用戶,在passwd文件表示為:
ftp:x:210:50: :/usr/ftp:/bin/sh
.profile中的路徑為:
PATH=$HOME/bin:$HOME/etc
2) 在/usr/ftp目錄:
#創建匿名ftp所用的目錄
#mkdir bin etc dev pub shlib
#改變pub以外所有目錄權限
#chmod 0555 bin etc dev shlib
#改變pub目錄的所有者和同組者
#chown ftp pub
#chgrp ftp pub
#復制匿名ftp所執行文件
#cp/bin/rsh/bin/pwd/bin/1s bin
#改變所需執行文件權限
#chmod 011 bin/*
#查看所需偽設備的情況
#1/dev/socksys
#1/dev/null
#建立所需偽設備的驅動程度
#cd/usr/ftp/dev
#mkond null c 4 2
#mkond socksys c 26 0
#改變偽設備驅動程序的所有者、同組者
#chown ftp ftp/*
#chgrp ftp ftp/*
#復制共享文件
#cp/shlib/ilbe_s shlib
注意不要復制/etc/passwd、/etc/proup到etc下,這樣對安全具有潛在的威脅。此外給
ftp用戶加上密碼,不要告訴其他任何人。
5.2.2.4 限制.rhosts用戶等價文件(又叫受托用戶文件)
與之有關命令有rlogin、rcp、rcmd等。
所謂用戶等價,就是用戶不用輸入密碼,即可以相同的用戶信息登錄到另一台主機中。
用戶等價的文件名為.rhosts,存放在根下或用戶主目錄下。它的形式如下:
#主機名 用戶名
ash020000 root
ash020001 dgxt

如果用戶名為空,是所有用戶均等價。
5.2.2.5 限制hosts.equiv主機等價文件,(又叫受托主機文件)
有關的命令為rlogin、rcp、rcmd等。主機等價類似於用戶等價,在兩台計算機除根目錄外的
所有區域有效,主機等價文件為hosts.equiv,存放在/etc下,它的形式如下:
#主機名 用戶名
ash020000
ash020001

當遠程使用ftp訪問本系統時,UNIX系統首先驗證用戶名和密碼,無誤后查看ftpusers文
件,一旦其中包含登錄所用用戶名則自動拒絕連接,從而達到限制作用。因此我們只要把本
機內除匿名ftp以外的所有用戶列入ftpusers文件中,即使入者獲得本機內正確的用戶信息,
無法登錄系統。需對外發布的信息,放到/usr/ftp/bub下,讓遠方通過匿名ftp獲取。使用匿
名ftp,不需密碼,不會對本機系統的安全構成威脅,因為它無法改變目錄,也就無法獲得本
機內的其他信息。使用.netrc配置,需注意保密,防止泄露其他相關主機的信息。
使用用戶等價和主機等機這類訪問,用戶可以不用口令而像其他有效用戶一樣登錄到遠
程系統,遠程用戶可使用rlogin直接登錄而不需密碼,還可使用rcp命令向或從本地主機復制
文件,也可使用rcmd遠程執行本機的命令等。因此主種訪問具有嚴重的不安全性,必須嚴格
控制或在非常可靠的環境下使用。1998年美國發現的著名的“蠕蟲”病毒,由一個叫英爾(
morris)的年青人編寫的,在Internet網上流傳開,造成許多UNIX系統的癱瘓,損失達數億
美元,其重要的傳播手段之一就是利用了用戶等價和主機等價的配置。慎重使用(最好不用
)和經常檢查上述文件,會有效加強系統安全。
UNIX系統沒有直接提供對telnet的控制。但我們知道,/etc/profile是系統默認shell變
量文件,所有用戶登錄時必須首先執行它。如果我們在該文件首部增加如下幾條shell命令:
#設置中斷變量
trap' ' 0 1 2 3 4 5 15
umask 022
#獲取登錄終端名
dc=“'who am i |awk‘[prin $2]’`”
#檢查是否受限
grep $de /etc default/aaa >dev/null 2>&1
#如果受限
if [$?=“0”]
then
echo“請輸入密碼:/c”
read abc
#獲取正確密碼
dd=“grep root /etc/edfault/aaa|awk’[pint $2]’`”
#非法用戶發出警告信息到主控台
法[“$abc”!=$dd]
then
echo “非法用戶!”
echo“有非法用戶試圖登錄!”>tev/tty01
logname>/dev/tty01
#同時記載日記文件
echo“有非法用戶試圖登錄!/c”> >/usr/tmp/err
echo $dc> >/usr/tmp/err
logname > >/usr/tmp/err
exit;
fi;
fi

其中/etc/default/aaa是受限終端名的一個文本文件,root后為密碼,它的內容如下:

root qwerty
ttyp0
ttyp1
ttyp2
ttyp3
ttypa
ttypb

這樣非法用戶即例獲得了合法的用戶名和密碼,也無法遠程使用。系統管理員定時閱讀
日記文件,注意控制台信息,就能獲得被非法訪問的情況,及時采取措施。如果用c語言實現
上述過程,把接受愛變成不可顯示,效果更佳。
5.2.3 加強對重要資料的保密
它主要包括hosts表、X.25地址、路由、連接調制解調器的電腦號碼及所用的通信軟件的
種類、網內的用戶名等,這些資料都應采取一些保密措施,防止隨意擴散。如可向電信部門
申請通信專用的電話號碼不刊登、不供查詢等。由於公共的或普通郵電交換設備的介入,信
息通過它們后可能被篡改或泄露。
5.2.4 加強對重要網絡設備的管理
路由器在網絡安全計划中是很重要的一環。現在大多數路由器已具備防火牆的一些功能
,如禁止telnet的訪問、禁示非法的網段訪問等。通過網絡路由器進行正確的存取過濾是限
制外部訪問簡單而有效的手段。
有條件的地方還可設置網關機,將本網和其他網隔離,網關機上不存放任何業務數據,
刪除除系統正常運行所必須的用戶外所用的用戶,也能增強網絡的安全性。
總之,只要我們從現在做起,培養網絡安全意識,並注意經驗的積累和學習,完全可能
保證我們信息系統的安全、正常運行。

 

 

--

        你佛慈悲
※ 來源:.The Big GreenWWW BBS.Dartmouth.Edu. [FROM: 129.170.29.245]

 

--------------------------------------------------------------------------------
主選單 本討論區 主題模式 上一篇 下一篇 登錄


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com