Linux系統服務器安裝後的安全配置方法

安裝完成以後,應該馬上採取哪些措施來增強服務器的安全性。對於其他的Linux發佈或者版本,這些方法也是適用的。

 

一、關閉不必要的服務

 

Linux的服務分爲兩種,一種是由inetd超級服務器來啓動的,如:ftp、telnet等;對於這些服務來說,系統並不總是運行telnetd、 ftpd等服務進程,而是由inetd進程監聽這些服務的服務端口,一旦有服務請求到達就啓動對應的服務進程(如:telnetd等)來提供服務。另外一種是獨立的服務器,系統一直運行有對應的服務進程。

 

關閉這兩種服務的方法是不同的,對於inetd啓動的進程:

 

inetd超級服務器的配置文件爲/etc/inetd.conf,該文件指示了inetd應該監聽哪些服務請求,並在請求時啓動對應的服務。因此只要通過編輯/etc/inetd.conf文件就可以實現關閉不需要的服務,例如希望關閉pop3服務,則在編輯/etc/inetd.conf文件以前文件中有如下的內容:

 

pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d

 

要關閉pop3服務則在該行前添加註釋符即可:

 

#pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d

 

通過編輯該文件,實現關閉不需要的服務(例如我的系統我僅僅開放了telnet和ftp服務)以後,則需要重新啓動inetd超級服務器。首先找到inetd的進程號:

 

[root@aid /etc]# ps ax|grep inetd

 

358 ? S 0:00 inetd

 

然後重新啓動inetd服務器:

 

[root@aid /etc]# kill -HUP 358

 

最後因爲inetd.conf應該不允許普通用戶讀寫,因此設置其訪問權限爲600:

 

chmod 600 /etc/inetd.conf

 

而且該文件應該不被任何用戶修改,包括root用戶。因此爲了防止用戶錯誤的修改該文件,爲該文件添加不可修改位:

 

chattr i /etc/inetd.conf

 

對於獨立服務器,則需要通過/usr/sbin/ntsysv命令來修改:

 

只需要服務前面通過空格鍵來選擇是否在系統啓動時啓動該服務就可以實現關閉某個服務器,如:希望系統關閉dhcpd服務,則通過上下鍵選中該服務器,然後通過空格鍵去掉該服務前[ ]內的星號即表示系統啓動時不開放該服務。若希望瞭解某個服務的具體含義,可以選擇該服務以後按F1鍵來查看該服務的含義。

 

設置完畢以後,只有希望打開的服務前的[ ]內纔會有星號。然後通過Tab鍵選擇OK,按空格鍵。重新啓動機器。

 

重新啓動機器以後,可以通過下面的命令來察看系統打開了哪些服務,來決定是否已經關閉了不需要的服務,例如我僅僅希望提供telnet服務則:

 

[ideal@aid ideal]$ netstat -ln

 

Active Internet connections (only servers)

 

Proto Recv-Q Send-Q Local Address Foreign Address State

 

tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN

 

raw 0 0 0.0.0.0:1 0.0.0.0:* 7

 

raw 0 0 0.0.0.0:6 0.0.0.0:* 7

 

Active UNIX domain sockets (only servers)

 

Proto RefCnt Flags Type State I-Node Path

 

從上面的命令輸出可以看到系統僅僅開放了23號端口,也就是telnet服務。

 

二、控制使用開放的服務的用戶

 

在上面提到的/etc/inetd.conf的配置文件中,我們看到pop3服務配置一行的最後兩個字段爲:

 

/usr/sbin/tcpd ipop3d

 

很顯然,pop3的服務器程序爲ipop3d,那麼/usr/sbin/tcpd又是什麼含義呢?這是一個稱爲Tcp wrapper的安全程序。該程序用來在啓動某個服務以前查看兩個配置文件來決定該用戶是否允許使用該服務。在/etc目錄下,有兩個文件: hosts.deny hosts.allow。

 

通過配置這兩個文件,你可以指定哪些客戶機允許使用這些服務。配置這兩個文件是通過一種簡單的訪問控制語言來實現的,訪問控制語句的基本格式爲: 程序名列表,主機名/IP地址列表。

 

程序名列表指定一個或者多個提供相應服務的程序的名字,名字之間用逗號或者空格分隔,可以在inetd.conf文件裏查看提供相應服務的程序名:如上面的文件示例中,pop所在行的最後一項就是所需的程序名:ipop3d。

 

主機名/IP地址列表指定允許或者禁止使用該服務的一個或者多個主機的標識,主機名之間用逗號或空格分隔。程序名和主機地址都可以使用通配符,實現方便的指定多項服務和多個主機。 當服務請求到達服務器時,訪問控制軟件就按照下列順序查詢這兩個文件,直到遇到一個匹配爲止:

 

1. 當在/etc/hosts.allow裏面有一項與請求服務的主機地址項匹配,那麼就允許該主機獲取該服務

 

2. 否則,如果在/etc/hosts.deny裏面有一項與請求服務的主機地址項匹配,就禁止該主機使用該項服務

 

3. 若均沒有匹配,則允許使用該服務。若相應的配置文件不存在,訪問控制軟件就認爲是一個空文件,所以可以通過刪除或者移走配置文件實現對所有主機關閉所有服務。

 

在文件中,空白行或者以#開頭的行被忽略,你可以通過在行前加 # 實 現註釋功能。Linux提供了下面靈活的方式指定進程或者主機列表:

 

1. 一個以"."起始的域名串,如 .amms.ac.cn 那麼www.amms.ac.cn就和這一項匹配成功

 

2. 以.結尾的IP串如 202.37.152. 那麼IP地址包括202.37.152.的主機都與這一項匹配

 

3. 格式爲n.n.n.n/m.m.m.m表示網絡/掩碼,如果請求服務的主機的IP地址與掩碼的位與的結果等於n.n.n.n 那麼該主機與該項匹配。

 

4. ALL表示匹配所有可能性

 

5. EXPECT表示除去後面所定義的主機。如:list_1 EXCEPT list_2 表示list_1主機列表中除去List_2所列 出的主機

 

6. LOCAL表示匹配所有主機名中不包含.的主機

 

上面的幾種方式只是Linux提供的方式中的幾種,但是對於我們的一般應用來說是足夠了。我們通過舉幾個例子來說明這個問題:

 

例一:我們只希望允許同一個局域網的機器使用服務器的ftp功能,而禁止上面的ftp服務請求,本地局域網由 202.39.154. 、202.39.153. 和202.39.152. 三個網段組成。在hosts.deny文件中,我們定義禁止所有機器請求所有服務: ALL:ALL 在hosts.allow文件中,我們定義只允許局域網訪問ftp功能:

 

in.ftpd: 202.39.154 202.39.153. 202.39.152.

 

這樣,當非局域網的機器請求ftp服務時,就會被拒絕。而局域網的機器可以使用ftp服務。

然後重新啓動你的 inetd進程:

 

/etc/rc.d/init.d/inet restart

 

但是hosts.deny|allow文件只控制/etc/inetd.conf文件中包含的服務的訪問這些服務有/usr/bin/tcpd管理,監聽接入的網絡請求,然後與在hosts.allow和hosts.deny的中的服務比較,然後做出允許或拒絕的決定。

 

最後因爲hosts.allow|hosts.deny應該不允許普通用戶讀寫,因此設置其訪問權限爲600:

 

chmod 600 /etc/hosts.*

 

並且該文件應該不被任何用戶修改,包括root用戶。因此爲了防止用戶錯誤的修改該文件,爲該文件添加不可修改位:

 

chattr i /etc/hosts.*

 

三、"/etc/exports"文件設置

 

如果通過NFS把文件共享出來,那麼一定要配置"/etc/exports"文件,使得訪問限制儘可能的嚴。這就是說,不要用通配符,不允許對根目錄有寫權限,而且儘可能只給只讀權限。編輯exports文件(vi /etc/exports)加入:

 

例如:

 

/dir/to/export host1.mydomain.com(ro,root_squash)

 

/dir/to/export host2.mydomain.com(ro,root_squash)

 

"/dir/to/export"是你想共享出來的目錄,host.mydomain.com是允許訪問這個目錄的計算機。

 

代表只讀,代表不允許對根目錄進行寫操作。使這些改變生效,你還要運行 "/usr/sbin/exportfs -a"命令。

 

注意:在服務器上裝NFS服務是會有安全隱患的,就我個人而言,不建議你使用NFS。

 

四、禁止使用控制檯程序

 

一個最簡單而且最常用的保證系統安全的方法就是禁止使用所有的控制檯程序,如:shutdown和halt。可以運行下面的命令來實現:

 

[root@aid /]# rm -f /etc/security/console.apps/servicename

 

這裏servicename是你要禁止的控制檯程序名。除非你使用xdm,否則不要把xserver文件刪掉,如果這樣除了root之外,沒有人可以啓動 X服務器了。(如果使用xdm啓動X服務器,這時root是唯一需要啓動X服務器的用戶,這纔有必要把xserver文件刪掉)。例如:

 

[root@deep]# rm -f /etc/security/console.apps/halt

 

[root@deep]# rm -f /etc/security/console.apps/poweroff

 

[root@deep]# rm -f /etc/security/console.apps/reboot

 

[root@deep]# rm -f /etc/security/console.apps/shutdown

 

[root@deep]# rm -f /etc/security/console.apps/xserver (如果刪除,只有root可以啓動X).

 

這些命令就可以禁止所有的控制檯程序:halt、poweroff、reboot和shutdown。記住,只有裝了Xwindow,刪除xerver文件纔會有效果。

 

五、"/etc/aliases"文件

 

aliases文件可能會造成安全隱患。例如:很多的軟件產商都把 "decode"這個別名放在aliases文件裏。這樣做的目的是爲了方便通過email傳送二進制文件。在發送郵件的時候,用戶把二進制文件用 "uuencode"轉成ASCII文件,然後把結果發給接收端的"decode"。由這個別名讓郵件信息通過"/usr/bin/uuencode"程序把二進制文件重新轉換成ASCII文件。如果允許"decode"出現在aliases文件中,可以想象將會有什麼樣的安全隱患。

 

把定義"decode"這個別名的行從aliases文件中刪除。同樣地,每一個會運行程序的別名都要好好查看一下,很有可能要把它們刪除掉。要使改動生效,還必須運行:

 

[root@deep]# /usr/bin/newaliases

 

編輯aliases文件(vi /etc/aliases),刪除或註釋掉下面這些行:

 

# Basic system aliases -- these MUST be present.

 

MAILER-DAEMON: postmaster

 

postmaster: root

 

# General redirections for pseudo accounts.

 

bin: root

 

daemon: root

 

#games: root

 

#ingres: root

 

nobody: root

 

#system: root

 

#toor: root

 

#uucp: root

 

# Well-known aliases.

 

#manager: root

 

#dumper: root

 

#operator: root

 

# trap decode to catch security attacks

 

#decode: root

 

# Person who should get roots mail

 

#root: marc

 

最後記得運行"/usr/bin/newaliases"使改變生效。

 

六、使系統對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"

 

七、不要顯示系統提示信息

 

如果你不想讓遠程登錄的用戶看到系統的提示信息,你可以改變"/etc/inetd.conf"文件中的telnet設置:

 

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h

 

在末尾加上"-h"參數可以讓daemon不顯示任何系統信息,只顯示登錄提示。當然,只有在服務器上裝了telnet服務器纔有這樣做的必要。

八、"/etc/host.conf"文件

 

Linux用解析器(resolver)庫把主機名翻譯成IP地址。"/etc/host.conf"文件定義主機名是怎樣解析的。"/etc/host.conf"文件中的項告訴解析器庫用什麼服務,以什麼順序解析主機名。

 

編輯"host.conf"文件(vi /etc/host.conf)加入下面這些行:

 

# Lookup names via DNS first then fall back to /etc/hosts.

 

order bind,hosts

 

# We have machines with multiple IP addresses.

 

multi on

 

# Check for IP address spoofing.

nospoof on

 

order選項指明的是選擇服務的順序。上面"order bind, hosts"說的是解析器庫解析文件名的時候先查詢域名服務器,然後再查看"/etc/hosts"文件。因爲性能和安全上的原因,最好將解析器庫的查找順序設成先查域名服務器(bind)。當然也要先安裝了DNS/BIND軟件,否則這樣配置根本沒有任何作用。

 

multi選項決定在"/etc/hosts"文件中出現的主機能不能有多個IP地址(多個網絡界面)。具有多個IP網絡界面的主機被稱爲具有多個網絡界面(multiomed),因爲同時有多個IP地址也就意味着這臺主機有多個網絡界面。例如:網關服務器就有多個IP地址,必須把這個選項設成ON。

 

nospoof選項指明不允許IP僞裝。IP僞裝是把自己僞裝成別的計算機去欺騙其它的計算機,獲得它的信任。這種攻擊方法把自己僞裝成別的服務器,並且與其它客戶機、服務器和大型數據存儲系統建立網絡連接或其它類型的網絡活動。不管對任何類型的服務器,這個選項都要設成ON。

 

九、防止源路由

 

路由和路由協議會導致一些問題。IP源路徑路由(IP source routing),也就是IP包包含到達底目的地址的詳細路徑信息,是非常危險的,因爲根據RFC 1122規定目的主機必須按原路徑返回這樣的IP包。如果黑客能夠僞造原路徑路由的信息包,那麼它就能截取返回的信息包,並且欺騙你的計算機,讓它覺得正在和它交換信息的是可以信任的主機。我強烈建議你禁止IP原路徑路由以避免這個安全漏洞。

 

用下面的命令在你的服務器上禁止IP原路徑路由:

 

for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do

 

echo 0 > $f

 

done

 

把上面的命令加到"/etc/rc.d/rc.local"文件中去,你就不用在系統重新啓動之後再把這些命令敲一遍。注意,上面的命令將禁止所有的網絡界面(lo、ethN、pppN,等等)的源路徑路由包。

 

十、使TCP SYN Cookie保護生效

 

"SYN Attack"是一種拒絕服務(DoS)的攻擊方式,會消耗掉系統中的所有資源,迫使服務器重新啓動。拒絕服務(這種攻擊方式用巨大的信息流來消耗系統的資源,以至於服務器不能夠響應正常的連接請求)是很容易被黑客利用的。在2.1系列的內核中,"syn cookie"只是一個可選項,並沒有使其生效。想要使其生效必須用下面的命令:

 

[root@aid /]# echo 1 > /proc/sys/net/ipv4/tcp_syncookies

 

把這個命令加入"/etc/rc.d/rc.local"文件中,等下次系統重新啓動的時候就不必重新敲一遍了。如果打算安裝IPCHAINS防火牆,你就沒有必要用這個命令,因爲它已經包含在防火牆的腳本文件裏了。

 

十一、特殊的帳號

 

禁止中不必要的預置帳號(每次升級或安裝完都要檢查一下)。Linux系統中就提供這樣一些你可能不需要的預置帳號。如果確實不需要這些帳號,就把它們刪掉。系統中有越多的帳號,就越容易受到攻擊。

 

我們假定你已經在系統中使用shadow口令。如果不是這樣,最好在系統中加上shadow口令的支持,因爲這樣系統會更安全。如果你是按照上一章介紹的方法安裝服務器,那麼在"安全驗證配置"這一步就已經選上"Enable Shaow Passwords"這個選項了。

 

在系統中刪除一個用戶可以用這個命令:

 

[root@deep]# userdel username

 

在系統中刪除一個組可以用這個命令:

 

[root@deep]# groupdel username

 

第一步 用下面的命令刪除一些不必要的用戶:

 

[root@deep]# userdel adm

 

[root@deep]# userdel lp

 

[root@deep]# userdel sync

 

[root@deep]# userdel shutdown

 

[root@deep]# userdel halt

 

[root@deep]# userdel news

 

[root@deep]# userdel uucp

 

[root@deep]# userdel operator

 

[root@deep]# userdel games (如果不用X Window服務器,可以刪除這個用戶)

 

[root@deep]# userdel gopher

 

[root@deep]# userdel ftp (如果沒安裝匿名ftp服務器,可以刪除這個用戶)

 

第二步 輸入下面的命令刪除一些不必要的組:

 

[root@deep]# groupdel adm

 

[root@deep]# groupdel lp

 

[root@deep]# groupdel news

 

[root@deep]# groupdel uucp

 

[root@deep]# groupdel games (delete this group if you don use X Window Server).

 

[root@deep]# groupdel dip

 

[root@deep]# groupdel pppusers

 

[root@deep]# groupdel popusers (delete this group if you don use pop server for email).

 

[root@deep]# groupdel slipusers

 

第三步

 

"不允許改變"位可以用來保護文件使其不被意外地刪除或重寫,也可以防止有些人創建這個文件的符號連接。刪除"/etc/passwd"、 "/etc/shadow"、"/etc/group"或"/etc/gshadow"都是黑客的攻擊方法。給口令文件和組文件設置不可改變位,可以用下面的命令:

 

[root@deep]# chattr i /etc/passwd

 

[root@deep]# chattr i /etc/shadow

 

[root@deep]# chattr i /etc/group

 

[root@deep]# chattr i /etc/gshadow

 

注意:如果將來要在口令或組文件中增加或刪除用戶,就必須先清除這些文件的不可改變位,否則就不能做任何改變。如果沒有清除這些文件的不可改變位,安裝那些會自動在口令文件和組文件中加入新用戶的rpm軟件包的時候,在安裝過程中就會出現出錯的提示。

 

十二、防止任何人都可以用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"組是系統中用於這個目的的特殊帳號。不能用別的組名。

 

第二步

 

在"/etc/pam.d/su"配置文件中定義有"wheel"組,現在介紹一下怎樣讓一些用戶可以用"su"命令成爲"root"。下面是一個例子,讓admin用戶成爲"wheel"組的成員,這樣就可以用"su"命令成爲"root":

 

[root@deep]# usermod -G10 admin

 

"G"是表示用戶所在的其它組。"10"是"wheel"組的ID值,"admin"是我們加到"wheel"組的用戶。用同樣的命令可以讓其他的用戶可以用su命令成爲root。

 

十三、 把rpm程序轉移到一個安全的地方,並改變默認的訪問許可

 

一旦在上用rpm命令安裝完所有需要的軟件,最好把rpm程序轉移到一個安全的地方,如:軟盤或其它你認爲安全的地方。因爲如果有人入侵了你的服務器,他就不能用rpm命令安裝那些有害的軟件。當然,如果將來要用rpm安裝新的軟件,你就要把rpm程序拷回原來的目錄。把rpm程序移到軟盤上,用下面的命令:

 

[root@deep]# mount /dev/fd0 /mnt/floppy/

 

[root@deep]# mv /bin/rpm /mnt/floppy/

 

[root@deep]# umount /mnt/floppy

 

注意:千萬不要把rpm程序從系統中卸載掉,否則以後就不能重新安裝它,因爲安裝rpm程序或其它軟件包本身就要用rpm命令。

 

還有一點要注意的是,把rpm命令的訪問許可從默認的755改成700。這樣非root用戶就不能使用rpm命令了。特別是考慮到萬一在安裝完新軟件之後忘了把rpm程序移到一個安全的地方,這樣做就更有必要了。

 

改變"/bin/rpm"默認的訪問權限,用下面這個命令:

 

[root@deep]# chmod 700 /bin/rpm

 

十四、登錄shell

 

爲了方便重複輸入很長的命令,bash shell可以在"~/.bash_history"文件("~/"是家目錄,每個用戶都是不一樣的)中存500個曾經輸入過的命令。每一個有自己帳號的用戶,在自己的家目錄中,都會有".bash_history"文件。可能會有這種情況,用戶在不該輸入口令的地方輸入了口令,而輸入的口令會在 ".bash_history"文件中保存下來。而且".bash_history"文件越大這種可能性也越大。

 

在"/etc/profile"文件中HISTFILESIZE和HISTSIZE這兩行決定了系統中所有用戶的 ".bash_history"文件可以保存多少命令。我建議把"/etc/profile"文件中的HISTFILESIZE和HISTSIZE都設成一個比較小的值,如:20。

 

編輯profile文件(vi /etc/profile),把這些行改成:

 

HISTFILESIZE=20

 

HISTSIZE=20

 

這樣每個用戶家目錄下的".bash_history"就最多隻能存20個命令。如果黑客試圖在用戶的"~/.bash_history"文件中發現一些口令,他就沒有什麼機會了。

 

十五、改變"/etc/rc.d/init.d/"目錄下的腳本文件的訪問許可

 

改變啓動和停止daemon的腳本文件的權限。

 

[root@deep]# chmod -R 700 /etc/rc.d/init.d/*

 

這樣只有root可以讀、寫和執行這個目錄下的腳本。我想一般用戶沒有什麼必要知道腳本文件的內容。

 

注意:如果你安裝或升級了一個程序,要用到"/etc/rc.d/init.d/"中system V腳本,不要忘記再檢查一下改變和檢查這個腳本文件的許可。

 

十六、"/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@deep]# rm -f /etc/issue

 

[root@deep]# rm -f /etc/issue.net

 

注意:"/etc/issue.net"文件是用戶從網絡登錄計算機時(例如:telnet、SSH),看到的登錄提示。同樣在"/etc"目錄下還有一個"issue"文件,是用戶從本地登錄時看到的提示。這兩個文件都是文本文件,可以根據需要改變。但是,如果想刪掉這兩個文件,必須向上面介紹的那樣把 "/etc/rc.d/rc.local"腳本中的那些行註釋掉,否則每次重新啓動的時候,系統又會重新創建這兩個文件。

發佈了39 篇原創文章 · 獲贊 4 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章