歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix教程 >> Unix高級安全設置(2)

Unix高級安全設置(2)

日期:2017/2/27 17:40:39   编辑:Unix教程
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/M ... nux-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.demo ... rld/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.demo ... rld/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的訪問、禁示非法的網段訪問等。通過網絡路由器進行正確的存取過濾是限
制外部訪問簡單而有效的手段。
有條件的地方還可設置網關機,將本網和其他網隔離,網關機上不存放任何業務數據,
刪除除系統正常運行所必須的用戶外所用的用戶,也能增強網絡的安全性。
總之,只要我們從現在做起,培養網絡安全意識,並注意經驗的積累和學習,完全可能
保證我們信息系統的安全、正常運行。
Copyright © Linux教程網 All Rights Reserved