目前隨著網路的逐漸普及,安全問題越來越引起了人們的注意。Linux作為免費的開放原始碼作業系統,正在被越來越多地用作伺服器平台,而且隨著Linux下應用軟體的多樣化,很多人(包括筆者)也喜歡使用Linux作為案頭。在這一系列文章中我們把主要精力放在用Linux搭建安全的伺服器上面。我們通過系統設定和一些共用的安全軟體固化我們的系統,使其能做到真正的安全。由於篇幅原因,不可能論述的很詳細,我在這裡只是把我們要注意和關心的地方舉出來,至於一些其他的常識性的細節不再贅述。
第一部分主要從安裝和設定方面闡述 Linux 作為伺服器應注意的方面。
1 Linux伺服器的安裝
大家一定都安裝過Linux系統,也許您可能已經很熟練了,但是在這裡我們提出一些在安裝過程中應該注意的問題:
首先在分區的時候不要只圖簡單把所有的空間都留給根分區,應該把不同的部分放在不同的分區。強烈的建議您把"/var"和"/tmp"放在不同的分區,如果您的伺服器有較多的使用者訪問,這幾乎是您所必須做的。另外最好把"/var"和"/usr"放在不同的分區,這樣可以避免由於日誌或使用者的原因是您的硬碟被佔滿或直接導致您的伺服器效能降低。對分區的最後一點警告就是如果您要提供一種或多種服務,一定要把這個服務有關的東西放在單獨一個分區,例如:您如果要建一台WWW伺服器,您在分區時候一定要留一個單獨的分區(例如:"/www"),將來您可以用chroot提高這種服務的安全性。
另外一個重要的問題是安裝時軟體包的選擇。我們用Redhat作為例子,出於安全和效能的考慮,您必須選擇"Select individual package"單選框,這樣您就可以進行軟體包的選擇。有些軟體是您不必安裝的,有些軟體是安裝後必須卸載的,有些是安裝後必須安裝的。我們下面給出清單:
不必安裝的軟體包:
Applications/Archiving: dumpApplications/File: gitApplications/Internet: finger, ftp, fwhois, ncftp, rsh, rsync, talk, telnetApplications/Publishing: ghostscript, ghostscript-fonts, mpage, rhs-printfiltersApplications/System: arpwatch, bind-utils, knfsd-clients, procinfo, rdate, rdist, screen, ucd-snmp-utilsDocumentation/indexhtmlSystem Environment/Base: chkfontpath, yp-toolsSystem Environment/Daemons: XFree86-xfs, lpr, pidentd, portmap, routed, rusers, rwho, tftp, ucd-snmp, ypbindSystem Environment/Libraries: XFree86-libs, libpngUser Interface/X: XFree86-75dpi-fonts, urw-fonts
安裝後必須卸載的軟體包:
pump apmd isapnptools RedHat-logos mt-st kernel-pcmcia-cs setserialRedHat-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.rpmdev86-0.14.9-1.i386.rpm bison-1.28-1.i386.rpm byacc-1.9-11.i386.rpmcdecl-2.5-9.i386.rpm cpp-1.1.2-24.i386.rpm cproto-4.6-2.i386.rpmctags-3.2-1.i386.rpm egcs-1.1.2-24.i386.rpm ElectricFence-2.1-1.i386.rpmflex-2.5.4a-7.i386.rpm gdb-4.18-4.i386.rpm kernel-headers-2.2.12-20.i386.rpmglibc-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前面加入下面的資訊:
restrictedpasswd="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/shcd /etc/pam.dfor i in * ; dosed '/[^#].*pam_console.so/s/^/#/' < $i > foo && mv foo $Idone
然後禁止使用所有的控制台程式,如:shutdown和halt。可以運行下面的命令來實現:
[root@sound]# rm -f /etc/security/console.apps/servicename
截短您的"~/.bash_history"檔案,這個檔案中儲存著以前使用的命令列表。截短這個檔案可以使您以前執行過的命令暴露在別人眼光下的機會減小.(在您的命令中很可能包括象密碼資訊這樣的保密資訊)。通過編輯/etc/profile的下面兩項可以做到這一點:
HISTFILESIZE=20HISTSIZE=20
__
通過下面的措施可以防止任何人都可以su為root:
1編輯su檔案(vi /etc/pam.d/su)在檔案的頭部加入下面兩行:
auth sufficient /lib/security/pam_rootok.so debugauth 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.confchattr +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; doecho 0 > $fdone
__把上面的命令加到"/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/issue.net#echo >> /etc/issue--
然後刪除"/etc"目錄下的"issue.net"和"issue"檔案: "/etc/issue.net"檔案是使用者從網路登入電腦時(例如:telnet、SSH),看到的登入提示。同樣在"/etc"目錄下還有一個"issue"檔案,是使用者從本地登入時看到的提示。這兩個檔案都是文字檔,可以根據需要改變。但是,如果想刪掉這兩個檔案,必須向上面介紹的那樣把"/etc/rc.d/rc.local"指令碼中的那些行注釋掉,否則每次重新啟動的時候,系統又會重新建立這兩個檔案。
資源
www.redhat.com―――紅帽linux的主站
www.debian.org―――debian linux發行版的主站
www.linuxforum.net―――中國最大的linux論壇
www.linuxbyte.net―――國內整合比較好的linux網站
www.nsfocus.com―――綠盟的網站
www.securityfocus.com―――國外整合很好的安全網站
關於作者
晉亮,網路安全工程師, 可以通過 sound810@sina.com 和他聯絡。