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