晉亮(
[email protected]) 網絡安全工程師 2003 年 1 月 目前隨著網絡的逐漸普及,安全問題越來越引起了人們的注意。Linux作為免費的開放源代碼操作系統,正在被越來越多地用作服務器平台,而且隨著Linux下應用軟件的多樣化,很多人(包括筆者)也喜歡使用Linux作為桌面。在這一系列文章中我們把主要精力放在用Linux搭建安全的服務器上面。我們通過系統設置和一些共享的安全軟件固化我們的系統,使其能做到真正的安全。由於篇幅原因,不可能論述的很詳細,我在這裡只是把我們要注意和關心的地方舉出來,至於一些其他的常識性的細節不再贅述。 第一部分主要從安裝和設置方面闡述 Linux 作為服務器應注意的方面。 1 Linux服務器的安裝 大家一定都安裝過Linux系統,也許您可能已經很熟練了,但是在這裡我們提出一些在安裝過程中應該注意的問題: 首先在分區的時候不要只圖簡單把所有的空間都留給根分區,應該把不同的部分放在不同的分區。強烈的建議您把"/var"和"/tmp"放在不同的分區,如果您的服務器有較多的用戶訪問,這幾乎是您所必須做的。另外最好把"/var"和"/usr"放在不同的分區,這樣可以避免由於日志或用戶的原因是您的硬盤被占滿或直接導致您的服務器性能降低。對分區的最後一點警告就是如果您要提供一種或多種服務,一定要把這個服務有關的東西放在單獨一個分區,例如:您如果要建一台WWW服務器,您在分區時候一定要留一個單獨的分區(例如:"/www"),將來您可以用chroot提高這種服務的安全性。 另外一個重要的問題是安裝時軟件包的選擇。我們用Redhat作為例子,出於安全和性能的考慮,您必須選擇"Select individual package"單選框,這樣您就可以進行軟件包的選擇。有些軟件是您不必安裝的,有些軟件是安裝後必須卸載的,有些是安裝後必須安裝的。我們下面給出清單: 不必安裝的軟件包: Applications/Archiving: dump Applications/File: git Applications/Internet: finger, FTP, fwhois, ncftp, rsh, rsync, talk, telnet Applications/Publishing: Ghostscript, ghostscript-fonts, mpage, rhs-printfilters Applications/System: arpwatch, bind-utils, knfsd-clients, procinfo, rdate, rdist, screen, UCd-snmp-utils Documentation/indexHtml System Environment/Base: chkfontpath, yp-tools System Environment/Daemons: XFree86-xfs, lpr, pidentd, portmap, routed, rusers, rwho, tftp, ucd-snmp, ypbind System Environment/Libraries: XFree86-libs, libpng User Interface/X: XFree86-75dpi-fonts, urw-fonts 安裝後必須卸載的軟件包: pump apmd isapnptools redhat-logos mt-st kernel-pcmcia-cs setserial redhat-release eject linuxconf kudzu gd bc getty_ps raidtools pciutils mailcap setconsole gnupg 安裝後必須安裝的軟件包(有了這些軟件包我們才可以編譯程序): autoconf-2.13-5.noarch.rpm m4-1.4-12.i386.rpm automake-1.4-5.noarch.rpm dev86-0.14.9-1.i386.rpm bison-1.28-1.i386.rpm byacc-1.9-11.i386.rpm cdecl-2.5-9.i386.rpm cpp-1.1.2-24.i386.rpm cproto-4.6-2.i386.rpm ctags-3.2-1.i386.rpm egcs-1.1.2-24.i386.rpm ElectricFence-2.1-1.i386.rpm flex-2.5.4a-7.i386.rpm gdb-4.18-4.i386.rpm kernel-headers-2.2.12-20.i386.rpm glibc-devel-2.1.2-11.i386.rpm make-3.77-6.i386.rpm patch-2.5-9.i386.rpm 在您對您的服務器的所有工作做完以後(以後不再有編譯的需要了),把上面這些軟件包從您的系統中刪除。這樣即使有人侵入了您的系統,他也不能在上面編譯程序,而且這樣還可以使您以後進行完整性檢查的速度加快。您可以把上面這些軟件包保存在活動介質上以便以後使用,可能上面這些不是最新的版本,您可以去下載目前最新最穩定的版本。 2 系統設置 2.1 口令和帳號 首先你必須設置BIOS的口令,現在的個人計算機系統大都支持這種設置。 其次你必須為你的lilo的單用戶模式設置口令限制,在/etc/lilo.conf中第一個引導的image前面加入下面的信息: restricted passwd="your passWord" "your passwd"是您所所要設定的單用戶模式引導的密碼。設置完成用lilo -u使lilo重新讀取/etc/lilo.conf中的信息。 另外就是用戶的密碼包括根用戶的密碼,系統默認的用戶密碼是5位。您可以編輯"/etc/login.defs"文件,把最小口令長度由5改成8。找到 PASS_MIN_LEN 5 這一行,改為:PASS_MIN_LEN 8 。"login.defs"是很重要的配置文件。可以在這個文件中設定一些其它的安全策略,比如:口令的有效期。 口令的選擇不應包括字典中有的詞匯,這樣是十分危險的。正確的口令應該足夠長,比且使用一些特殊字符。 系統中有許多預置帳號,如果你沒有使用,一定要將這些帳號刪掉。這些沒有安全的口令對系統的安全性是一個巨大的挑戰。 一個值得注意的命令是chage.您可以使用它設置帳號的時間限制。(具體見man chage). 對於根用戶而言,您可以設置/etc/securetty.這個文件可以限制根用戶登陸的控制台。您可以用"#"符號注釋掉不許可根用戶登陸的控制台號。 可以通過下面的腳本禁止對控制台的訪問: # !/bin/sh cd /etc/pam.d for i in * ; do sed '/[^#].*pam_console.so/s/^/#/' < $i > foo && mv foo $I done 然後禁止使用所有的控制台程序,如:shutdown和halt。可以運行下面的命令來實現: [root@sound]# rm -f /etc/security/console.apps/servicename 截短您的"~/.bash_history"文件,這個文件中保存著以前使用的命令列表。截短這個文件可以使您以前執行過的命令暴露在別人眼光下的機會減小.(在您的命令中很可能包括象密碼信息這樣的保密信息)。通過編輯/etc/profile的下面兩項可以做到這一點: HISTFILESIZE=20 HISTSIZE=20 __ 通過下面的措施可以防止任何人都可以su為root: 1編輯su文件(vi /etc/pam.d/su)在文件的頭部加入下面兩行: auth sufficient /lib/security/pam_rootok.so debug auth required /lib/security/pam_wheel.so group=wheel 2 然後把您想要執行su成為root的用戶放入wheel組 [root@sound]# usermod -G10 admin 2.2 權限與文件系統 linux的ext2文件系統有屬性功能這個特點。我們可以用lsattr命令列出文件的屬性,用chattr命令改變文件的屬性。文件系統的屬性有很多種,我們在這裡要注意的是兩個屬性: a 只可添加屬性 i 不可改變屬性 對於系統種的配置文件,最好設置不可改變屬性,而對於一些日志文件最好設置只可添加屬性。下面是兩個具體例子: chattr +i /etc/inetd.conf chattr +a /var/log/secure 如果要去掉這些屬性,將上面命令中的"+"號變為"-"號。 另外我們要對mount的文件系統做限制,這個配置在/etc/fstab中。通過設置mount選項我們可以使我們mount上來的文件系統更安全。常用的mount選項有default,nodev,noexec,nosuid,noatime,ro,user等。 我們還可以對系統資源做限制使我們的系統更加安全,看下面的方法: 編輯limits.conf文件(vi /etc/security/limits.conf),加入或改變下面這些行: * hard core 0 * hard rss 5000 * hard nproc 20 這些行的的意思是:"core 0"表示禁止創建core文件;"nproc 20"把最多進程數限制到20;"rss 5000"表示除了root之外,其他用戶都最多只能用5M內存。上面這些都只對登錄到系統中的用戶有效。通過上面這些限制,就能更好地控制系統中的用戶對進程、core文件和內存的使用情況。星號"*"表示的是所有登錄到系統中的用戶。 然後必須編輯"/etc/pam.d/login"文件,在文件末尾加入下面這一行: session required /lib/security/pam_limits.so 2.3 其他一些設置 1 在/etc/inetd.conf中注釋掉不需要的服務 2 在/etc/host.allow和/etc/host.deny中設置可以訪問您的系統的計算機。 3 通過下面的方法使系統對ping沒有反應 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 4_用下面的命令在你的服務器上禁止IP原路徑路由: for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $f done __把上面的命令加到"/etc/rc.d/rc.local"文件中去 5 用下面的方法提高系統防止SYN攻擊的能力: [root@sound]# echo 1 > /proc/sys/net/ipv4/tcp_syncookies 把這個命令加入"/etc/rc.d/rc.local"文件中 6 使Control-Alt-Delete軟關機無效 編輯inittab文件(vi /etc/inittab)把這一行: ca::ctrlaltdel:/sbin/shutdown -t3 -r now 改為: #ca::ctrlaltdel:/sbin/shutdown -t3 -r now 用下面的命令使改變生效: [root@sound]# /sbin/init q 7 去掉用戶提示信息 編輯"/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/issu