對于開放式的操作系統---Linux,系統的安全設定包括系統服務最小化、限制遠程存取、隱藏重要資料、修補安全漏洞、采用安全工具以及經常性的安全檢 查等。本文主要從用戶設置、如何開放服務、系統優化等方面進行系統的安全配置,以到達使Linux服務器更安全、穩定。

2.用戶管理
在 Linux系統中,用戶帳號是用戶的身份標志,它由用戶名和用戶口令組成。系統將輸入的用戶名存放在/etc/passwd文件中,而將輸入的口令以加密 的形式存放在/etc/shadow文件中。在正常情況下,這些口令和其他信息由操作系統保護,能夠對其進行訪問的只能是超級用戶(root)和操作系統 的一些應用程序。但是如果配置不當或在一些系統運行出錯的情況下,這些信息可以被普通用戶得到。進而,不懷好意的用戶就可以使用一類被稱為“口令破解”的 工具去得到加密前的口令。

2.1 刪除系統特殊的的用戶帳號和組帳號:
#userdel username

userdel adm

userdel lp

userdel sync

userdel shutdown

userdel halt

userdel news

userdel uucp

userdel operator

userdel games

userdel gopher

以上所刪除用戶為系統默認創建,但是在常用服務器中基本不使用的一些帳號,但是這些帳號常被黑客利用和攻擊服務器。

#groupdel username

groupdel adm

groupdel lp

groupdel news

groupdel uucp

groupdel games

groupdel dip

同樣,以上刪除的是系統安裝是默認創建的一些組帳號。這樣就減少受攻擊的機會。

2.2 用戶密碼設置:
安裝linux時默認的密碼最小長度是5個字節,但這并不夠,要把它設為8個字節。修改最短密碼長度需要編輯login.defs文件(vi /etc/login.defs)

PASS_MAX_DAYS 99999 ##密碼設置最長有效期(默認值)

PASS_MIN_DAYS 0 ##密碼設置最短有效期

PASS_MIN_LEN 5 ##設置密碼最小長度

PASS_WARN_AGE 7 ##提前多少天警告用戶密碼即將過期。

2.3 修改自動注銷帳號時間:
自 動注銷帳號的登錄,在Linux系統中root賬戶是具有最高特權的。如果系統管理員在離開系統之前忘記注銷root賬戶,那將會帶來很大的安全隱患,應 該讓系統會自動注銷。通過修改賬戶中“TMOUT”參數,可以實現此功能。TMOUT按秒計算。編輯你的profile文件(vi /etc/profile),在"HISTSIZE="后面加入下面這行:
TMOUT=300
300,表示300秒,也就是表示5分鐘。這樣,如果系統中登陸的用戶在5分鐘內都沒有動作,那么系統會自動注銷這個賬戶。

2.4 給系統的用戶名密碼存放文件加鎖:
chattr +i /etc/passwd

chattr +i /etc/shadow

chattr +i /etc/gshadow

chattr +i /etc/group

注:chattr是改變文件屬性的命令,參數i代表不得任意更動文件或目錄,此處的i為不可修改位(immutable)。查看方法:lsattr /etc/passwd

3.服務管理
在Linux系統的服務管理方面,如果想做到服務的最好安全,其中主要的就是升級服務本身的軟件版本,另外一個就是關閉系統不使用的服務,做到服務最小化。

3.1 關閉系統不使用的服務:
cd /etc/init.d ##進入到系統init進程啟動目錄

在這里有兩個方法,可以關閉init目錄下的服務,一、將init目錄下的文件名mv成*.old類的文件名,即修改文件名,作用就是在系統啟動的時候找不到這個服務的啟動文件。二、使用chkconfig系統命令來關閉系統啟動等級的服務。

注:在使用以下任何一種方法時,請先檢查需要關閉的服務是否是本服務器特別需要啟動支持的服務,以防關閉正常使用的服務。

第一種:修改文件名的方法

Cd /etc/init.d/

mv apmd apmd.old ##筆記本需要

mv netfs netfs.old ## nfs客戶端

mv yppasswdd yppasswdd.old ## NIS服務器,此服務漏洞很多

mv ypserv ypserv.old ## NIS服務器,此服務漏洞很多
mv dhcpd dhcpd.old ## dhcp服務

mv portmap portmap.old ##運行rpc(111端口)服務必需

mv lpd lpd.old ##打印服務

mv nfs nfs.old ## NFS服務器,漏洞極多

mv sendmail sendmail.old ##郵件服務, 漏洞極多

mv snmpd snmpd.old ## SNMP,遠程用戶能從中獲得許多系統信息

mv rstatd rstatd.old ##避免運行r服務,遠程用戶可以從中獲取很多信息

mv atd atd.old ##和cron很相似的定時運行程序的服務

第二種:使用chkcofig命令來關閉不使用的系統服務

chkconfig --level 35 apmd off

chkconfig --level 35 netfs off

chkconfig --level 35 yppasswdd off

chkconfig --level 35 ypserv off

chkconfig --level 35 dhcpd off

chkconfig --level 35 portmap off

chkconfig --level 35 lpd off
chkconfig --level 35 cups off

chkconfig --level 35 nfs off

chkconfig --level 35 sendmail off

chkconfig --level 35 snmpd off

chkconfig --level 35 rstatd off

chkconfig --level 35 atd off

注:以上chkcofig 命令中的3和5是系統啟動的類型,3代表系統的多用啟動方式,5代表系統的X啟動方式。

3.2 給系統服務端口列表文件加鎖
主要作用:防止未經許可的刪除或添加服務

chattr +i /etc/services

3.3 修改ssh服務的root登錄權限
修改ssh服務配置文件,使的ssh服務不允許直接使用root用戶來登錄,這樣建設系統被惡意登錄攻擊的機會。

vi /etct/ssh/sshd_config

PermitRootLogin yes

將這行前的#去掉后,修改為:PermitRootLogin no

4.系統文件權限
Linux 文件系統的安全主要是通過設置文件的權限來實現的。每一個Linux的文件或目錄,都有3組屬性,分別定義文件或目錄的所有者,用戶組和其他人的使用權限 (只讀、可寫、可執行、允許SUID、允許SGID等)。特別注意,權限為SUID和SGID的可執行文件,在程序運行過程中,會給進程賦予所有者的權 限,如果被黑客發現并利用就會給系統造成危害。

4.1 修改init目錄文件執行權限:
chmod -R 700 /etc/init.d/*

4.2 修改部分系統文件的SUID和SGID的權限:
chmod a-s /usr/bin/chage

chmod a-s /usr/bin/gpasswd

chmod a-s /usr/bin/wall

chmod a-s /usr/bin/chfn

chmod a-s /usr/bin/chsh

chmod a-s /usr/bin/newgrp

chmod a-s /usr/bin/write

chmod a-s /usr/sbin/usernetctl

chmod a-s /usr/sbin/traceroute

chmod a-s /bin/mount

chmod a-s /bin/umount

chmod a-s /bin/ping

chmod a-s /sbin/netreport

4.3 修改系統引導文件
chmod 600 /etc/grub.conf

chattr +i /etc/grub.conf

5.系統優化
5.1 虛擬內存優化:
一般來說,linux的物理內存幾乎是完全used。這個和windows非常大的區別,它的內存管理機制將系統內存充分利用,并非windows無論多大的內存都要去使用一些虛擬內存一樣。

在/proc/sys/vm/freepages中三個數字是當前系統的:最小內存空白頁、最低內存空白頁和最高內存空白。

注 意,這里系統使用虛擬內存的原則是:如果空白頁數目低于最高空白頁設置,則使用磁盤交換空間。當達到最低空白頁設置時,使用內存交換。內存一般以每頁4k 字節分配。最小內存空白頁設置是系統中內存數量的2倍;最低內存空白頁設置是內存數量的4倍;最高內存空白頁設置是系統內存的6倍。

以下以 1G內存為例修改系統默認虛擬內存參數大小:

echo "2048 4096 6444" >/proc/sys/vm/freepages














6.日志管理
6.1 系統引導日志:
dmesg
使用 dmesg 命令可以快速查看最后一次系統引導的引導日志。通常它的

內容會很多,所以您往往會希望將其通過管道傳輸到一個閱讀器。

6.2 系統運行日志:
A、Linux 日志存儲在 /var/log 目錄中。這里有幾個由系統維護的日志文件,但其他服務和程序也可能會把它們的日志放在這里。大多數日志只有 root 才可以讀,不過只需要修改文件的訪問權限就可以讓其他人可讀。

以下是常用的系統日志文件名稱及其描述:

lastlog 記錄用戶最后一次成功登錄時間

loginlog 不良的登陸嘗試記錄

messages 記錄輸出到系統主控臺以及由syslog系統服務程序產生的消息

utmp 記錄當前登錄的每個用戶

utmpx 擴展的utmp

wtmp 記錄每一次用戶登錄和注銷的歷史信息 wtmpx 擴展的wtmp

vold.log 記錄使用外部介質出現的錯誤

xferkig 記錄Ftp的存取情況 sulog 記錄su命令的使用情況

acct 記錄每個用戶使用過的命令

aculog 撥出自動呼叫記錄

B、/var/log/messages
messages 日志是核心系統日志文件。它包含了系統啟動時的引導消息,以及系統運行時的其他狀態消息。IO 錯誤、網絡錯誤和其他系統錯誤都會記錄到這個文件中。其他信息,比如某個人的身份切換為 root,也在這里列出。如果服務正在運行,比如 DHCP 服務器,您可以在 messages 文件中觀察它的活動。通常,/var/log/messages 是您在做故障診斷時首先要查看的文件。

C、/var/log/XFree86.0.log
這個日志記錄的是 Xfree86 Xwindows 服務器最后一次執行的結果。如果您在啟動到圖形模式時遇到了問題,一般情況從這個文件中會找到失敗的原因。

D、 在/var/log 目錄下有一些文件以一個數字結尾,這些是已輪循的歸檔文件。日志文件會變得特別大,特別笨重。Linux 提供了一個命令來輪循這些日志,以使您的當前日志信息不會淹沒在舊的無關信息之中。 logrotate 通常是定時自動運行的,但是也可以手工運行。當執行后,logrotate 將取得當前版本的日志文件,然后在這個文件名最后附加一個“ .1”。其他更早輪循的文件為“ .2”、“ .3”,依次類推。文件名后的數字越大,日志就越老。

可以通過編輯 /etc/logrotate.conf 文件來配置 logrotate 的自動行為。通過 man logrotate 來學習 logrotate 的全部細節。

其中:

# rotate log files weekly

weekly

這里代表每個日志文件是每個星期循環一次,一個日志文件保存一個星期的內容。

# keep 4 weeks worth of backlogs

rotate 4

這里代表日志循環的次數是4次,即可以保存4個日志文件。

E、定制日志

可以通過編輯 /et/syslog.conf 和 /etc/sysconfig/syslog 來配置它們的行為,可以定制系統日志的存放路徑和日志產生級別。

6.3 系統各用戶操作日志:
last

單獨執行last指令,它會讀取位于/var/log目錄下,名稱為wtmp的文件,并把該給文件的內容記錄的登入系統的用戶名單全部顯示出來。

history

history 命令能夠保存最近所執行的命令。如果是root命令所保存的命令內容在/root/.bash_history文件中,如果是普通用戶,操作所命令保存在 這個用戶的所屬目錄下,即一般的/home/username/.bash_history。這個history的保存值可以設置,編輯/etc /profile文件,其中的HISTSIZE=1000的值就是history保存的值。

7.防火墻
7.1 iptables類型防火墻:
7.1.1 iptables概念:
Iptalbes(IP包過濾器管理)是用來設置、維護和檢查Linux內核的IP包過濾規則的。

可以定義不同的表,每個表都包含幾個內部的鏈,也能包含用戶定義的鏈。每個鏈都是一個規則列表,對對應的包進行匹配:每條規則指定應當如何處理與之相匹配的包。這被稱作'target'(目標),也可以跳向同一個表內的用戶定義的鏈。

通 過使用用戶空間,可以構建自己的定制規則,這些規則存儲在內核空間的信息包過濾表中。這些規則具有目標,它們告訴內核對來自某些源、前往某些目的地或具有 某些協議類型的信息包做些什么。如果某個信息包與規則匹配,那么使用目標 ACCEPT 允許該信息包通過。還可以使用目標 DROP 或 REJECT 來阻塞并殺死信息包。對于可對信息包執行的其它操作,還有許多其它目標。

根據規則所處理的信息包的類型,可以將規則分 組在鏈中。處理入站信息包的規則被添加到 INPUT 鏈中。處理出站信息包的規則被添加到 OUTPUT 鏈中。處理正在轉發的信息包的規則被添加到 FORWARD 鏈中。這三個鏈是基本信息包過濾表中內置的缺省主鏈。另外,還有其它許多可用的鏈的類型(如 PREROUTING 和 POSTROUTING),以及提供用戶定義的鏈。每個鏈都可以有一個策略,它定義“缺省目標”,也就是要執行的缺省操作,當信息包與鏈中的任何規則都不 匹配時,執行此操作。

建立規則并將鏈放在適當的位置之后,就可以開始進行真正的信息包過濾工作了。這時內核空間從用戶空間接管工作。當信息包到達防火墻時,內核先檢查信息包的頭信息,尤其是信息包的目的地。我們將這個過程稱為路由。

如 果信息包源自外界并前往系統,而且防火墻是打開的,那么內核將它傳遞到內核空間信息包過濾表的 INPUT 鏈。如果信息包源自系統內部或系統所連接的內部網上的其它源,并且此信息包要前往另一個外部系統,那么信息包被傳遞到 OUTPUT 鏈。類似的,源自外部系統并前往外部系統的信息包被傳遞到 FORWARD 鏈。

7.1.2 iptables實例1:
#!/bin/sh

# 禁止系統的轉發包功能

echo 0 > /proc/sys/net/ipv4/ip_forward

# 清楚iptables原有規則,并設置iptables默認規則

iptables -t nat -F POSTROUTING

iptables -t nat -F PREROUTING

iptables -t nat -F OUTPUT

iptables -F

iptables -P INPUT DROP

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

# 在input規則中需要打開的tcp、upd端口

iptables -A INPUT -j ACCEPT -p tcp --dport 80

iptables -A INPUT -j ACCEPT -p tcp --dport 22

iptables -A INPUT -j ACCEPT -p tcp --dport 25

iptables -A INPUT -j ACCEPT -p tcp --dport 1352

iptables -A INPUT -p udp --destination-port 53 -j ACCEPT

# 在input規則中狀態為:STATE RELATED 的包都接受

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 啟用系統ip轉發功能

echo 1 > /proc/sys/net/ipv4/ip_forward

< --end-- >

7.1.3 iptables實例2:
注:這個實例中,只需要設置tcp、udp端口和服務器網絡段ip范圍即可,其他已經默認設置好。

#!/bin/sh

# make:yongzhang

# time: 2004-06-18

# e-mail: yongzhang@wiscom.com.cn








PATH=/sbin:/bin:/usr/sbin:/usr/bin

##tcp allow ports

TPORTS="80 22"

##udp allow ports

UPORTS="53"

##internal server_ip range

SERVER_IP="172.18.10.0/24"

##disable forwarding

echo 0 > /proc/sys/net/ipv4/ip_forward

##reset default policies

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

iptables -t nat -P PREROUTING ACCEPT

iptables -t nat -P POSTROUTING ACCEPT

iptables -t nat -P OUTPUT ACCEPT

## del all iptables rules

iptables -F INPUT

iptables -F FORWARD

iptables -F OUTPUT

##clean all non-default chains

iptables -X

iptables -t nat -X

##iptables default rules

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT ACCEPT

##allow ping packets

iptables -A INPUT -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT

iptables -A INPUT -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT

iptables -A INPUT -p ICMP -s 0/0 --icmp-type 5 -j ACCEPT

iptables -A INPUT -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT

iptables -A INPUT -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

#iptables -A INPUT -p ICMP -s 0/0 --icmp-type 11 -m limit --limit 5/s -j ACCEPT

iptables -A FORWARD -p ICMP -j ACCEPT

##enable forwarding

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

##STATE RELATED for router

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

##accept internal packets on the internal i/f

iptables -A INPUT -s $SERVER_IP -p tcp -j ACCEPT

##open ports on router for server/services

##TCP PORTS

for ATP in $TPORTS

do

iptables -A INPUT ! -s $SERVER_IP -d $SERVER_IP -p tcp --destination-port $ATP -j ACCEPT

iptables -A FORWARD -p tcp --destination-port $ATP -j ACCEPT

done

##UDP PORTS

for AUP in $UPORTS

do

iptables -A INPUT -p udp --destination-port $AUP -j ACCEPT

iptables -A FORWARD -p udp --destination-port $AUP -j ACCEPT

done

##bad_packets chain

##drop INVALID packets immediately

iptables -A INPUT -p ALL -m state --state INVALID -j DROP

##limit SYN flood

#iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

##deny all ICMP packets,eth0 is external net_eth

#iptables -A INPUT -i eth0 -s 0.0.0.0/0 -p ICMP -j DROP

##allow loopback

iptables -A INPUT -i lo -p all -j ACCEPT

iptables -A OUTPUT -o lo -p all -j ACCEPT

##enable forwarding

echo 1 > /proc/sys/net/ipv4/ip_forward

< --end-- >

7.2 ipchains類型防火墻:
7.2.1 ipchains概念:
Ipchains 被用來安裝、維護、檢查Linux內核的防火墻規則。規則可以分成四類:IP input鏈、IP output鏈、IP forward鏈、user defined 鏈。

一 個防火墻規則指定包的格式和目標。當一個包進來時, 核心使用input鏈來決定它的命運。 如果它通過了, 那么核心將決定包下一步該發往何處(這一步叫路由)。假如它是送往另一臺機器的, 核心就運用forward鏈。如果不匹配,進入目標值所指定的下一條鏈,那有可能是一條user defined鏈,或者是一個特定值: ACCEPT,DENY,REJECT,MASQ,REDIRECT,RETURN。

ACCEPT意味著允許包通過,DENY 扔掉包就象沒有受到過一樣,REJECT也把包扔掉,但(假如它不是 ICMP 包)產生一個 ICMP 回復來告訴發包者,目的地址無法到達(請注意DENY和REJECT對于ICMP包是一樣的)。
MASQ 告訴核心偽裝此包,它只對forward 鏈和user defined鏈起作用,想讓它起作用, 編譯核心時必需讓 IP Masquerading 起作用。
REDIRECT只對input鏈和user defined鏈起作用。它告訴核心把無論應送到何處的包改送到一個本地端口. 只有 TCP 和 UDP 協議可以使用此指定. 任意用 '-j REDIRECT' 指定一個端口(名字或編號)可以使送往此的包被重定向到某個特殊的端口, 即使它被標記為送到其它端口。想讓它起作用,編譯內核時,必須讓CONFIG_IP_TRANSPARENT_PROXY起作用。
最后的一個目標指定是 RETURN, 它跳過它下面的所有規則, 直到鏈的末尾。
任何其它的目標指定表示一個用戶自定義的鏈。包將在那個鏈中通過. 假如那個鏈沒有決定此包的命運, 那么在那個鏈中的傳輸就完成了,包將通過當前鏈的下一個規則。

7.2.2 ipchains實例:
##清除input規則的規則,并改變input默認的規則鏈策略為REJECT

-F input

-P input REJECT

##以下是允許input規則鏈的tcp端口為:80 81 22 123

-A input -s 0/0 -d 0/0 80 -p tcp -y -j ACCEPT

-A input -s 0/0 -d 0/0 81 -p tcp -y -j ACCEPT

-A input -s 0/0 -d 0/0 22 -p tcp -y -j ACCEPT

-A input -s 0/0 -d 0/0 123 -p udp -j ACCEPT



##設置除了以上允許的input規則鏈以為,拒絕0-1023、2049、6000-6009、7100的tcp和upd端口,

-A input -p tcp -s 0/0 -d 0/0 0:1023 -y -j REJECT

-A input -p tcp -s 0/0 -d 0/0 2049 -y -j REJECT

-A input -p udp -s 0/0 -d 0/0 0:1023 -j REJECT

-A input -p udp -s 0/0 -d 0/0 2049 -j REJECT

-A input -p tcp -s 0/0 -d 0/0 6000:6009 -y -j REJECT

-A input -p tcp -s 0/0 -d 0/0 7100 -y -j REJECT

##允許系本身統網卡上發生的所有包通過

-A input -s 0/0 -d 0/0 -i lo -j ACCEPT

-A input -s 0/0 -d 0/0 -i eth0 -j ACCEPT

-A input -s 0/0 -d 0/0 -i eth1 -j ACCEPT

##清除output規則的規則,并改變output默認的規則鏈策略為ACCEPT

-F output

-P output ACCEPT

##清除forward規則的規則,并改變forward默認的規則鏈策略為DENY,設置了forward規則鏈允許對 10.10.11.0/24網段的包可以轉發并且做偽裝處理。

-F forward

-P forward DENY

-A forward -s 10.10.11.0/24 -j MASQ