[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 安全技術 > 系統 > 正文
Unix高級安全設置 三、常見Unix安全設置方案-1.Solaris系列
本文出自:http://sinbad.zhoubin.com 作者: KCN (2002-12-02 06:02:01)
第三部分 常見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 來刪除定義。
要注意的是,不要隨便定義私有端口,因為有些非根權限的進程會使用這些端口。特別是改
變最小非私有端口這個參數,經常會引起問題。應仔細分析你的需求再用擴展私有端口定義
的方式單獨增加。 (http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
Unix高級安全設置 一、Unix歷史與發展 二、Unix典型安全隱患 (2002-11-29 06:02:00)
 

★  樊強制作 歡迎分享  ★