linux伺服器安全
linux伺服器安全
1 伺服器賬號口令的安全1.1 伺服器賬號安全伺服器系統的賬號、應用服務的賬號要儘量少,刪除一些不必要的賬號和應用服務的賬號,應該禁止所有預設的被作業系統本身啟動的並且不必要的賬號,當你第一次安裝系統時就應該這麼做,Linux提供了很多預設賬號,而賬號越多,系統就越容易受到攻擊。應用服務的賬號的儘量限制在本機登入,拒絕遠端連線,例如mysql,oracle等服務。1.1.1 root使用者安全
Root在類unix中是最最重要,應該儘可能的保護,下面的規則必須注意:除非必要,避免用root登入,如果必須用root,首先用自己的普通賬號登入,然後使用/bin/su-成為root
此命令要求使用者steven兩天內不能更改密碼,並且密碼最長的存活期為30天,並在密碼過期前5通知他1.3.3 記錄不成功的登陸企圖所有的UNIX系統都能夠記錄非成功的登陸企圖。在LINUX中,登陸的失敗是由syslog守護程序記錄在/var/log/messages檔案裡。可以用下列命令來查詢相關資訊 $ grep login /var/log/messages
1.3.4 Ssh安全在使用ssh連線linux伺服器的時候,如果一段時間在終端上沒有動作,就會被伺服器端踢掉.
在/etc/ssh/sshd_config中加入
ClientAliveInterval
ClientAliveCountMax
然後,/etc/rc.d/init.d/sshd restart重啟服務可以解決此問題.
2 系統服務的安全2.1 禁止所有不必要的服務。用ps –ef 命令可以看到當前系統所有已經開啟的服務。檢視是否有可以的服務程序。還可以用ntsysv命令來關閉一些不用的服務。2.2 設定伺服器執行級別一般類unix伺服器不建議安裝圖形介面,這樣可以提高伺服器的效能,如果有介面的需求,安裝x-windows也可以,我們先了解一下linux的執行級別的區別:
# 0 - halt (Do NOT set initdefault to this) 為停機,機器關閉
# 1 - Single user mode為單使用者模式,就像Win9x下的安全模式類似
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 為多使用者模式,但是沒有NFS支援。
# 3 - Full multiuser mode為完整的多使用者模式,是標準的執行級
# 4 - unused進入控制檯登入的多使用者模式在一些特殊情況下可以用它來做一些事情。
# 5 - X11進到X Window系統了。
# 6 - reboot (Do NOT set initdefault to this) 執行init 6機器就會重啟。2.3 保障系統的最低服務原則關閉一些服務:關閉的方法有很多,通常我是使用/usr/sbin/setup來關閉的,只是用這樣的方式來關閉的話,需要重新啟動Linux ,比較麻煩一些些,如果您是使用我們這個網頁的RedHat6.1系統的話,那就執行/usr/sbin/setup吧!然後選擇System services,將所有的服務啟動專案開到剩下如下的幾個:
crond
iptables
keytable
kudzu
network
random
sendmai(如果你有開啟e-mail服務的話)
smb(如果你有開啟SAMBA服務的話)
syslog
xfs(如果你有執行X-windows的話)其他的服務就是你的要求來開啟囉,其實,除非你真的瞭解該服務是作何用的,否則可以先予以關閉之,但是上面的幾個專案則必須要開啟的!
3 伺服器埠安全3.1 關閉無用的埠 任何網路連線都是通過開放的應用埠來實現的。如果我們儘可能少地開放埠,就使網路攻擊變成無源之水,從而大大減少了攻擊者成功的機會。例如,希望Linux成為的Web伺服器,可以取消系統內所有非必要的服務,只開啟必要服務。這樣做可以儘量減少後門,降低隱患,而且可以合理分配系統資源,提高整機效能3.2 檢查伺服器埠開放情況。Netstat –anp
3.2.1 Port scan簡介
port Scan的方法介紹 port Scan就是一種通過檢測對方伺服器的開放埠,偵測對方伺服器服務的方法。一般可分為主動式和被動式兩種。主動式就是通過向對方伺服器的特定埠傳送資料包,根據應答來判斷。以nmap 為代表被動式,不主動發出資料包,而是在網路上長時偵聽,分析網上的transaction,來分析,嚴格的來被動式不應該被稱作是埠掃描。以nwatch為代表優缺點比較主動式的優點主動式只要在對方沒有把通訊阻斷的情況下,可以在較短的時間內獲得結果
3.2.2 nmap的安裝
debian apt-get install nmap
fedora core yum install nmap
others 下載原始碼,編譯
3.2.3 nmap的使用方法下面是Nmap支援的四種最基本的掃描方式:
* TCP connect()埠掃描(-sT引數)。
* TCP同步(SYN)埠掃描(-sS引數)。
* UDP埠掃描(-sU引數)。
* Ping掃描(-sP引數)如果要勾畫一個網路的整體情況,Ping掃描和TCP SYN掃描最為實用。
* Ping掃描通過傳送ICMP(Internet Control Message Protocol,Internet控制訊息協議)迴應請求資料包和TCP應答(Acknowledge,簡寫ACK)資料包,確定主機的狀態,非常適合於檢測指定網段內正在執行的主機數量。
* TCP SYN掃描一下子不太好理解,但如果將它與TCP connect()掃描比較,就很容易看出這種掃描方式的特點。在TCP connect()掃描中,掃描器利用作業系統本身的系統呼叫開啟一個完整的TCP連線也就是說,掃描器打開了兩個主機之間的完整握手過程(SYN, SYN-ACK,和ACK)。一次完整執行的握手過程表明遠端主機埠是開啟的。
* TCP SYN掃描建立的是半開啟的連線,它與TCP connect()掃描的不同之處在於,TCP SYN掃描傳送的是復位(RST)標記而不是結束ACK標記(即,SYN,SYN-ACK,或RST):如果遠端主機正在監聽且埠是開啟的,遠端主機用 SYN-ACK應答,Nmap傳送一個RST;如果遠端主機的埠是關閉的,它的應答將是RST,此時Nmap轉入下一個埠。
-sS 使用SYN+ACK的方法,使用TCP SYN,
-sT 使用TCP的方法, 3次握手全做
-sU 使用UDP的方法
-sP ICMP ECHO Request 送信,有反應的埠進行調查
-sF FIN SCAN
-sX
-sN 全部FLAG OFF的無效的TCP包送信,根據錯誤程式碼判斷埠情況
-P0 無視ICMP ECHO request的結果,SCAN
-p scan port range 指定SCAN的目埠的範圍
1-100, 或者使用25,100的方式
-O 偵測OS的種類
-oN 檔名通常格式檔案輸出
-oX 檔名通過DTD,使用XML格式輸出結果
-oG 檔名,grep容易的格式輸出
-sV 服務的程式名和版本SCAN
3.2.4 例項:
nmap -v target.com
這樣對target.com上所有的保留TCP埠做了一次掃描,-v表示用詳細模式。
nmap -sS -O target.com/24
這將開始一次SYN的半開掃描,針對的目標是target.example.com所在的C類子網,它還試圖確定在其上執行的是什麼系統。這需要root許可權,因為用到了半開掃描以及系統偵測。3.2.5 結果例項:
debianlinux:/etc/init.d# nmap 192.168.1.1
Starting nmap 3.81 () at 2005-08-30 00:01 JST
Interesting ports on 192.168.1.1
(The 1658 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
1720/tcp filtered H.323/Q.931
3128/tcp open squid-http
5。nwatch的安裝 nwatch 需要的包
Perl 5.005_03以上
Net::Pcap
Ndiff 0.05 bata2 以上
libpcap
debian: apt-get install nwatch
6.nwatch的使用方法
-d 網路裝置名,預設為eth0
-h host/network[:port][t,u]
t,u 可以指定TCP或UDP 預設為TCP
-o 輸出檔名
-fi 時間(秒)把資料寫盤時間,預設為300秒
-si 資料Break時間(秒),預設為86400(一天)
LINK
nmap
資料寫盤時間,預設為300秒-si 資料Break時間(秒),預設為86400(一天)LINKnmap
4 Iptables的配置4.1 IPTABLES基礎Iptables語法:Iptables [-t TABLE] ACTION [PATTERN] [-j TARGET]
TABLE:
有filter,nat,mangle;若無指定,預設為filter table.
ACTION(對Chains執行的動作):
ACTION 說明-L Chain 顯示Chain中的所有規則-A Chain 對Chain新增一條規則-D Chain 刪除Chain中的一條規則-I Chain 在Chain中插入一條規則-R Chain 替換Chain中的某一條規則-P Chain 對Chain設定的預設的Policy
-F Chain 清除Chain中的所有規則-N Chain 自訂一個Chain
-X 清除所有的自訂Chain
CHAINS:
Iptables 有五條預設的Chains(規則鏈),如下表:Chains 發生的時機PREROUTING 資料包進入本機後,進入Route Table前INPUT 資料包通過Route Table後,目地為本機OUTPUT 由本機發出,進入Route Table前FORWARD 通過Route Table後,目地不是本機時POSTROUTING 通過Route Table後,送到網絡卡前PATTERN(設定條件部份):
引數內容說明-p Protocol 通訊協議,如tcp,udp,icmp,all等……
-s Address 指定的Source Address為Address
-d Address 指定的Destination Address為Address
-I Interface 指定資料包進入的網絡卡-o Interface 指定資料包輸出的網絡卡-m Match 指定高階選項,如mac,state,multiport等……
TARGET(常用的動作):TARGET 說明ACCEPT 讓這個資料包通過DROP 丟棄資料包RETURN 不作對比直接返回QUEUE 傳給User-Space的應用軟體處理這個資料包SNAT nat專用:轉譯來源地址DNAT nat專用:轉譯目地地址MASQUERADE nat專用:轉譯來源地址成為NIC的MAC
REDIRECT nat專用:轉送到本機的某個PORT
4.2 公司伺服器iptables配置例項
#! /bin/sh
#
# firewall starting firewall
#
# chkconfig: 2345 98 01
# description: setting firewall
##########################################################################
# 設定引數
##########################################################################
INNER_NET={network}/24 # LAN 區域網自由設定
FWALL_IP={localAddr} # 防火牆的IP 你的機器的真實IP
INNER_PORT={interface} # 區域網端IP
#OUTER_PORT={interface} # Wan端IP
IPTABLES="/sbin/iptables" # iptables 命令
MODPROBE="/sbin/modprobe" # modprobe 命令
##########################################################################
# 模組的載入和設定為核心工作
##########################################################################
$MODPROBE ip_tables
$MODPROBE iptable_filter
$MODPROBE ip_conntrack
$MODPROBE iptable_nat
$MODPROBE ip_nat_ftp
$MODPROBE ip_conntrack_ftp
$MODPROBE ipt_state
$MODPROBE ipt_MASQUERADE
$MODPROBE ipt_LOG
$MODPROBE ipt_REJECT
$MODPROBE ipt_limit
echo "3 4 1 7" > /proc/sys/kernel/printk
# 允許IP masquerade(變換)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 忽視ping的broadcast
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# 檢查源IP
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done
# 記錄不可能的(虛假)IP
for f in /proc/sys/net/ipv4/conf/*/log_martians; do echo "1" > $f; done
# 忽視ICMP redirect message
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 1 > $f; done
##########################################################################
# 初始化規則
##########################################################################
$IPTABLES -P INPUT DROP # 清空INPUT原始定義
$IPTABLES -P OUTPUT DROP # 清空OUPUT原始定義
$IPTABLES -P FORWARD DROP # 清空FORWARD原始定義
$IPTABLES -F # flash chain
$IPTABLES -F -t nat
$IPTABLES -X # 刪除使用者定義的Chain
##########################################################################
# 使用者定義的chain
##########################################################################
#
# 記錄並丟棄非法的包
#
$IPTABLES -N DROPPACKET # DROPPACKT chain的生成
$IPTABLES -A DROPPACKET -j LOG --log-prefix "INVALID_PACKET: " \
--log-level=6 -m limit --limit 1/s --limit-burst 10
$IPTABLES -A DROPPACKET -j DROP
#
# 檢查SYNFlood攻擊的chain
#
$IPTABLES -N SYNFLOOD # SYNFLOOD chain的生成
# 沒有超過限定值的話返回
$IPTABLES -A SYNFLOOD -m limit --limit 10/s --limit-burst 20 -j RETURN
# 超過限定值,就視為SYNFLOOD攻擊,記錄並丟棄
$IPTABLES -A SYNFLOOD -m limit --limit 1/s --limit-burst 10 -j LOG \
--log-level=1 --log-prefix "SYNFLOOD: "
$IPTABLES -A SYNFLOOD -j DROP
#
# 記錄非法的Flag TCP,並丟棄
#
$IPTABLES -N DROPFLAGS # DROPFLAGS chain的生成
$IPTABLES -A DROPFLAGS -j LOG --log-prefix "INVALID_FLAGS: " \
--log-level=6 -m limit --limit 1/s --limit-burst 10
$IPTABLES -A DROPFLAGS -j DROP
#
# 檢查TCP Flag的非法組合
#
$IPTABLES -N CHKFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ACK,FIN FIN -j DROPFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ACK,PSH PSH -j DROPFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ACK,URG URG -j DROPFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags FIN,RST FIN,RST -j DROPFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROPFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags SYN,RST SYN,RST -j DROPFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ALL ALL -j DROPFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ALL NONE -j DROPFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ALL FIN,PSH,URG -j DROPFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROPFLAGS
$IPTABLES -A CHKFLAGS -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROPFLAGS
#
# 拒絕 Microsoft 網路相關的FORWARD
#
$IPTABLES -N CHKMSNET
$IPTABLES -A CHKMSNET -p tcp --dport 42 -j DROP # wins dup
$IPTABLES -A CHKMSNET -p tcp --dport 135 -j DROP # MS-RPC
$IPTABLES -A CHKMSNET -p udp --dport 135 -j DROP # MS-RPC
$IPTABLES -A CHKMSNET -p udp --dport 137:138 -j DROP # MS browse
$IPTABLES -A CHKMSNET -p udp --dport 137:138 -j DROP # MS browse
$IPTABLES -A CHKMSNET -p tcp --dport 139 -j DROP # SMB
$IPTABLES -A CHKMSNET -p tcp --dport 445 -j DROP # DHSMB
##########################################################################
# INPUT Chain
##########################################################################
# Localhost的話,全部許可
$IPTABLES -A INPUT -i lo -j ACCEPT
# 檢查包的正確性
$IPTABLES -A INPUT -m state --state INVALID -j DROPPACKET
# 檢查包是否是SYN攻擊
$IPTABLES -A INPUT -p tcp --syn -j SYNFLOOD
# TCP FLAG的檢查
$IPTABLES -A INPUT -p tcp -j CHKFLAGS
# 許可LAN內的連線
$IPTABLES -A INPUT -i $INNER_PORT -s $INNER_NET -j ACCEPT
# 許可已經建立的連線
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 檢查是否是IP偽裝
#$IPTABLES -A INPUT -i $OUTER_PORT -s $INNER_NET -j DROP
#
# 許可的服務(對外部公開的服務,在下面記述)
#
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT # ssh
$IPTABLES -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT # HTTP
$IPTABLES -A INPUT -p tcp --dport 9090 -m state --state NEW -j ACCEPT # JManage
$IPTABLES -A INPUT -p tcp --dport 81 -m state --state NEW -j ACCEPT # HTTP
#$IPTABLES -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT # HTTPS
#$IPTABLES -A INPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT # DOMAIN(DNS)
{DNS}
# 拒絕AUTH請求
$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
# icmp (IN)
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -s $INNER_NET -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type echo-reply -s $INNER_NET -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
# 除了上面以外所有的包,都記錄下來,並通過Default Policy丟棄
$IPTABLES -A INPUT -j LOG --log-prefix "UNDEFIND_INPUT: " \
--log-level=6 -m limit --limit 1/s --limit-burst 10
##########################################################################
# OUTPUT Chain
##########################################################################
# 許可由localhost出來的包
$IPTABLES -A OUTPUT -o lo -j ACCEPT
# TCP FLAG的檢查
$IPTABLES -A OUTPUT -p tcp -j CHKFLAGS
# 許可從伺服器到Lan的連線
$IPTABLES -A OUTPUT -o $INNER_PORT -s $FWALL_IP -j ACCEPT
# 檢查Microsoft網路
$IPTABLES -A OUTPUT -j CHKMSNET
# 許可已經連線的包
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 許可由伺服器到網際網路的新加連線
$IPTABLES -A OUTPUT -m state --state NEW -j ACCEPT
# icmp(OUT)
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type source-quench -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type parameter-problem -j ACCEPT
# 除了上面以外所有的包,都記錄下來,並通過Default Policy丟棄
$IPTABLES -A OUTPUT -j LOG --log-prefix "UNDEFIND_ICMP: " --log-level=6 \
-m limit --limit 1/s --limit-burst 10
##########################################################################
# IP變換
##########################################################################
# 檢查Microsoft網路
$IPTABLES -A FORWARD -j CHKMSNET
# 許可Lan內機器的IP變換
#$IPTABLES -t nat -A POSTROUTING -o $OUTER_PORT -s $INNER_NET -j MASQUERADE
# 從外部到Lan的連線,許可已經連線的FROWARD
#$IPTABLES -A FORWARD -i $OUTER_PORT -o $INNER_PORT -d $INNER_NET -m state \
# --state ESTABLISHED,RELATED -j ACCEPT
# 許可LAN到外部的連線
#$IPTABLES -A FORWARD -i $INNER_PORT -o $OUTER_PORT -s $INNER_NET -m state \
# --state NEW,ESTABLISHED,RELATED -j ACCEPT
exit 0
5 常用的伺服器安全診斷工具5.1 防範Rootkit病毒
rootkit是攻擊者用來隱藏自己的蹤跡和保留root訪問許可權的工具。通常,攻擊者通過遠端攻擊獲得root訪問許可權,或者首先密碼猜測或者密碼強制破譯的方式獲得系統的訪問許可權。進入系統後,如果他還沒有獲得root許可權,再通過某些安全漏洞獲得系統的root許可權。接著,攻擊者會在侵入的主機中安裝rootkit,然後他將經常通過rootkit的後門檢查系統是否有其他的使用者登入,如果只有自己,攻擊者就開始著手清理日誌中的有關資訊。通過rootkit的嗅探器獲得其它系統的使用者和密碼之後,攻擊者就會利用這些資訊侵入其它的系統5.2 部署chkrootkit 入侵監測系統安裝:
wget
tar zxvf chkrootkit.tar.gz
cd chkrootkit-*
make sense (編譯,注意不是./configure)
cd ..
cp -r chkrootkit-* /usr/local/chkrootkit (將編譯好的目錄複製到...)
rm -rf chkrootkit (刪除遺留原始碼)
測試:
cd /usr/local/chkrootkit
./chkriitkit | grep INFECTED(沒有顯示INFECTED 一切正常)
執行監測:在/usr/local/chkrootkit目錄下./chkrootkit
讓監測自動化
cd ~
vi chkrootkit (建立chkrootkit在裡面輸入如下內容)
#!/bin/bash
PATH=/usr/bin:/bin
TMPLOG=`mktemp`
# Run the chkrootkit
/usr/local/chkrootkit/chkrootkit > $TMPLOG
# Output the log
cat $TMPLOG | logger -t chkrootkit
# bindshe of SMTPSllHow to do some wrongs
if [ ! -z "$(grep 465 $TMPLOG)" ] && \
[ -z $(/usr/sbin/lsof -i:465|grep bindshell) ]; then
sed -i '/465/d' $TMPLOG
fi
# If the rootkit have been found,mail root
[ ! -z "$(grep INFECTED $TMPLOG)" ] && \
grep INFECTED $TMPLOG | mail -s "chkrootkit report in `hostname`" root
rm -f $TMPLOG
chmod 700 chkrootkit
mv chkrootkit /etc/cron.daily/ ( 將指令碼移動到每天自動執行的目錄中)
為了防止被入侵後chkrootkit命令被黑客更改將命令備份
cd ~
mkdir /root/commands
cp `which --skip-alias awk cut echo egrep find head id ls netstat ps strings sed uname` /root/commands/
/usr/local/chkrootkit/chkrootkit -p /root/commands|grep INFECTED (測試用備份命令執行)
為了安全,將命令打包壓縮之後下載到本地,再將伺服器端刪除
cd ~
tar cvf commands.tar commands
gzip commands.tar
將commands.tar.gz 下載到本機後
rm-rf commands
若伺服器端被更改,將本機commands.tar.gz上傳到伺服器解壓
/usr/local/chkrootkit/chkrootkit -p /root/commands|grep INFECTED
chkrootkit的引數
Usage: ./chkrootkit [options] [testname ...]
Options:
-h show this help and exit
-V show version information and exit
-l show available tests
-d