安全運維必備:五個頂級Linux安全工具

火星人 @ 2014-03-03 , reply:0


安全運維必備:五個頂級Linux安全工具

首先,沒有哪個程序能做到讓你的網路或伺服器永久地安全,安全是一個不斷改進、評估、再改進的持續過程,幸運的是,在linux下有許多好的工具在這個過程中能幫助你,在這篇文章中,我將向你推薦5款我最喜愛的安全工具,它們能幫助你預防,檢查,響應入侵行為。儘管它更容易預防隨時可能發生的問題,但某些時候你遇到問題時,你還是需要檢查和響應的,這就意味著在形式危及你需要它們之前,你得先熟悉它們的用法。
1、Nmap
為了評估一個機器的是否容易遵守攻擊,你需要知道有多少服務是暴露給攻擊者的。有一個優秀的工具就是Fyodor的網路映射器Nmap,Debian用戶可以通過apt-get install nmap來獲取它,務必要運行它檢查伺服器上究竟運行了些什麼服務—即使你認為你已經知道了也要運行,很明顯,如果ssh埠已經關閉,那麼通過ssh密碼猜測就對你沒什麼影響。
Nmap最簡單的用法就是在你本地的網路上探測主機,在這個實例中,我們要求nmap發送ICMP echo請求包(ping)到某段ip地址範圍內的所有主機:
$ nmap -sP 10.0.0.1-254Starting nmap 3.81 ( http://www.insecure.org/nmap/ )       at 2006-11-01 14:46NZDTHost 10.0.0.25 appears to be up.MAC Address: 00:0C:F1:AE:E6:08 (Intel)Host 10.0.0.51 appears to be up.MAC Address: 08:00:09:9A:1A:AA (Hewlett Packard)Host 10.0.0.70 appears to be up.MAC Address: 00:0F:EA:64:4E:1E (Giga-Byte Tech Co.)...

不過nmap最常用的是用來探測哪個服務正在運行。因為TCP建立一個連接使用了3次握手,我們能檢查到無真實連接到它們但又被打開的埠,這就是著名的SYN或半打開掃描,當用root登陸執行時這是默認的模式,如果作為一個正常用戶執行,nmap嘗試全連接來測試是否每個埠是否是打開的。(題外話:在半打開模式下,我們發送初始化SYN數據包並監聽響應,RST表明埠是關閉的,SYN+ACK表示埠是打開的,如果沒有收到響應,nmap標記這個埠是被過濾了,某些防火牆會丟掉不該有的數據包,產生一個過濾狀態標記,其他的將發送RST使得埠看起來是關閉的)典型地,如果一個伺服器正在監聽你不希望監聽的埠,你應該仔細檢查一下:
#nmap -sS 10.0.0.89Starting nmap 3.81 ( http://www.insecure.org/nmap/ )          at 2006-11-01 14:52NZDTInteresting ports on 10.0.0.89:(The 1637 ports scanned but not shownbelow are in state: closed)PORT      STATE SERVICE21/tcp    open  ftp22/tcp    open  ssh42/tcp    open  nameserver80/tcp    open  http110/tcp   open  pop3...

Fyodor也添加了許多服務的指紋,你可以要求nmap標識出特定的服務,在命令后加上-sV選項即可:
# nmap -sV 10.0.0.89Starting nmap 3.81 ( http://www.insecure.org/nmap/ )        at 2006-11-01 14:47NZDTInteresting ports on 10.0.0.89:(The 1637 ports scanned but not shownbelow are in state: closed)PORT      STATE SERVICE           VERSION21/tcp    open  ftp?22/tcp    open  ssh               OpenSSH 3.8.1p1Debian-8.sarge.4 (protocol 2.0)42/tcp    open  nameserver?80/tcp    open  http              Apache httpd 1.3.33((Debian GNU/Linux) mod_gzip/1.3.26.1a PHP/4.3.10-16)110/tcp   open  pop3?...

其他難以置信的用法是操作系統的探測,在命令后加上-O參數即可,如果這個機器有至少一個埠打開和至少一個埠關閉的話,你就能準確地獲取操作系統的信息:
# nmap -O -sS 10.0.0.89Starting nmap 3.81 ( http://www.insecure.org/nmap/ )         at 2006-11-02 09:02NZDTInteresting ports on 10.0.0.89:(The 1637 ports scanned but not shownbelow are in state: closed)PORT      STATE SERVICE21/tcp    open  ftp...Device type: general purposeRunning: Linux 2.4.X|2.5.X|2.6.XOS details: Linux 2.5.25 - 2.6.3 orGentoo 1.2 Linux 2.4.19 rc1-rc7), Linux 2.6.3 - 2.6.8Uptime 30.906 days (since Mon Oct  2 11:18:59 2006)

因此,請使用nmap在你的網路上檢查所有機器,看是否存在有臨時安裝的但又被忘記刪除的服務,你也可以用它從你的網路範圍之外來檢查你的防火牆是否正確地配置了。
《解決方案》

2、OpenSSH

當你關心你的網路時,你需要一個安全的辦法來管理你的機器,這就意味著不能使用telnet或rcp,或其他任何無保護措施進行數據和密碼傳輸的協議,OpenSSH是大多數人選擇用來替代telnet/rcp的協議,它在傳輸過程中對所有數據都進行加密處理,並且在連接的另一端校驗每一個數據包是否被欺騙,Debian用戶可以通過apt-get install openssh-server來獲取它。

首先,我建議轉換到另一個埠,僅使用密語,不是密碼,或者用基礎規則審核你的密碼,記住sshd保護數據的傳輸—這就意味著如果你的訪問控制非常弱的話,攻擊者能夠用一個安全的方法控制你的機器,這應該不是你想要的,我見過太多的Linux通過臨時帳戶被泄密,如upload/upload。要改變這個埠,編輯/etc/ssh/sshd_config文件,修改#Port 22為Port 12345,然後重新啟動服務。

在下面的例子中,我們展示如何用密語替代密碼,你在這裡要做的是允許你客戶端機器用戶帳戶能讀取和寫入遠程機器的任何文件。

你可以忽略密語和不使用ssh-agent(ssh-add命令),登陸客戶端兵輸入下面的命令:

client% ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key【譯者註:輸入密鑰保存的位置路徑】
(/usr/local/sss/jriden/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):【譯者註:輸入密語】
MY PASSPHRASE
Enter same passphrase again: MY PASSPHRASE【譯者註:再輸入一次密語】
Your identification has been saved in
/usr/local/sss/jriden/.ssh/id_rsa.
Your public key has been saved in
/usr/local/sss/jriden/.ssh/id_rsa.pub.
The key fingerprint is:
75:65:36:2b:ed:38:9f:4a:6d:c4:d8:ec:25:ed:ff:31
jriden@its-dev2
client% ssh-add
Enter passphrase for /usr/local/sss/jriden
/.ssh/id_rsa:【譯者註:給你的證書輸入密語】
MY PASSPHRASE
Identity added: /usr/local/sss/jriden/.ssh/id_rsa
(/usr/local/sss/jriden/.ssh/id_rsa)
client%



現在,取得~/.ssh/id_rsa.pub,將其內容添加到伺服器上~/.ssh/authorized_keys中或者~/.ssh/authorized_keys2中,確保移除了無關的新行,它們可能導致複製和粘貼變慢:

client% scp server:~/testfile .
The authenticity of host 'server (130.123.128.86)'
can't be established.
RSA key fingerprint is
97:7b:e0:12:c2:f8:8e:05:cc:2b:74:50:9b:00:28:0e.
Are you sure you want to continue connecting
(yes/no)? yes
Warning: Permanently added 'server,130.123.128.86'
(RSA) to the list
of known hosts.
testfile
|***************************************************|
81940       00:00



這裡之所以出現提示是因為伺服器是一個不認識的主機,這是ssh嘗試與主機欺騙的格鬥,下一次連接的時候就不會出現這個提示了。

3、Tcpdump

tcpdump可能是檢查網路通訊原始數據構成最著名的應用程序了,Debian用戶可以通過apt-get install tcpdump來獲取,tcpdump文件就是著名的pcap文件,因為pcap是實現包捕獲的庫。

在這個例子中,我們dump來自源埠53或目標埠53的所有通訊,意味著,所有的DNS通訊,我使用的-n參數,如果你想更詳細一點,你可以使用src port 53或者dst port 53,除此之外,tcpdump嘗試ip地址到域名的解析,以便於列印出比較友好的名字,那些DNS請求也將在我們的捕獲中顯示出來:

# tcpdump -n 'port 53'
tcpdump: verbose output suppressed,
use -v or -vv for full protocol
decode
listening on eth0, link-type EN10MB (Ethernet),
capture size 96 bytes
11:19:58.302298 IP 192.168.0.8.1037 >
192.168.128.1.53:  36224+ A?
www.slashdot.org. (34)
11:19:58.360227 IP 192.168.128.1.53 >
192.168.0.8.1037:  36224 1/5/5 A
66.35.250.151 (239)
...



在其他事情中,snort能存儲tcpdump格式的捕獲數據,你需要用-r <文件名>和-w <文件名>參數來讀取和寫入存儲的文件。
《解決方案》

4、Snort

snort是一款最重要的開源網路入侵檢測系統,基本上意味著它留意壞的通訊並給你提供警告,它始終保存你讀取原始tcpdump內容的輸出,Debian用戶可以通過apt-get install snort來獲取它,默認情況下,它將網路介面設置為混雜模式,也就是說,所有在線路上的數據包都被檢查。

如果你正在嘗試保護一個網路,通常你的snort感測器應該放在主路由器的SPAN埠上,這樣它就能查看到所有經過那個路由器的網路通訊內容。(SPAN埠提供了所有經過路由器的通訊的一個總和)如果你正在嘗試保護一個單獨的主機,只需要在主機上簡單地按照它即可。

Snort依靠一個規則資料庫來檢查數據包,/etc/snort/rules/bad-traffic.rules中有一個例子標記出了一個tcp埠號為0的無效通訊:

alert tcp $EXTERNAL_NET any <> $HOME_NET 0
(msg:"BAD-TRAFFIC tcp port 0 traffic"; flow:stateless;
  classtype:misc-activity; sid:524; rev:8;)



snort將它的警告信息記錄到一個文件中,典型地是/var/log/snort/alert,看起來象是這樣,表明一個策略規則已經生效,因為來自Google Desktop用戶代理的web通訊被觀察到了:

[**] BLEEDING-EDGE WEB
Google Desktop User-Agent Detected
[**]
[Classification: Potential Corporate Privacy
Violation]
11/02-11:27:58.855143 10.0.0.82:3449 ->
66.35.250.209:80
TCP TTL:128 TOS:0x0 ID:35935 IpLen:20
DgmLen:399 DF
***AP*** Seq: 0x847921EE  Ack: 0x1A7D5C20
Win: 0xFFFF  TcpLen: 20
http://news.com.com/2100-1032_3-6038197.html]
Snort也能被配置為記錄匹配tcpdump格式的數據包,如下:
# log_tcpdump: log packets in binary tcpdump format
# -------------------------------------------------
# The only argument is the output file name.
#
output log_tcpdump: tcpdump.log



當上面的選項生效后,snort將記錄與tcpdump文件匹配的數據包並將其保存到警告文件中,這樣就允許你更容易地判斷哪個警告是需要擔心的哪個警告是錯誤的警告,你可以象下面這樣來閱讀它們:

# tcpdump -r /var/log/snort/tcpdump.log.1161106015
reading from file /var/log/snort/
↪tcpdump.log.1161106015, link-type
EN10MB (Ethernet)
06:37:50.839942 IP 10.0.0.82.1410 >
10.10.218.95.www: P
2352360050:2352360119(69) ack 1723804156 win 65535
06:53:07.792492 IP 10.0.0.82.1421 >
10.10.218.95.www: P
2124589760:2124589829(69) ack 2684875377 win 65535
...



如果你象查看數據包的內容,使用-X參數,tcpdump –X –r /var/log/snort/tcpdump.log.1161106015,snort也有一些功能來中斷基於規則匹配(靈活的響應)的連接,也有許多第三方的規則。

5、Iptables

iptables是一款狀態防火牆幾乎集成到所有Linux發行版中了,這就意味著你可以使用它基於ip地址的規則來控制遠程機器訪問你的伺服器,以及連接請求的類型。(舊的無狀態的防火牆讓你只能根據數據包的內容來做出判斷,因此你被埠號限制,不能跟蹤會話的存在,如FTP數據流),Debian用戶可以通過apt-get install iptables conntrack來獲取它。

當你從終端登陸到機器上時請完成你的初始化測試,用一個錯誤的規則將你自己鎖在外面,然後你親自恢復,當所有數據包被允許通過,因此這如果不被接受,觀察iptables-save和iptables-restore命令,這裡有一個加上註釋的例子腳本,它非常基礎,但是基本上它可以告訴你iptables是如何工作的:

#!/bin/bash
# example iptables script
# flush the old rules
iptables -F
# set the default policy of the chain to accept
iptables -P INPUT ACCEPT
# create a new table for logging and discarding
# unwanted packets
iptables -N LOGDROP
# use rate limiting on the logging, and
# add a prefix of 'filter: '
iptables -A LOGDROP -m limit -j LOG
↪--log-prefix "filter: "
# drop unwanted TCP connections with a
# TCP ReSeT packet
iptables -A LOGDROP -p tcp -j REJECT
↪--reject-with tcp-reset
# drop other packets by sending an ICMP
# port unreachable in response
iptables -A LOGDROP -j REJECT
↪--reject-with icmp-port-unreachable
# now drop the packet
iptables -A LOGDROP -j DROP
#allow anything on the local interface
iptables -A INPUT -i lo -j RETURN
# allow packets that are related to
# an on-going conversation
iptables -A INPUT -p tcp -m conntrack
↪--ctstate RELATED,ESTABLISHED -j
RETURN
iptables -A INPUT -p udp -m conntrack
↪--ctstate RELATED,ESTABLISHED -j
RETURN
# allow SSH traffic
iptables -A INPUT -p tcp -m tcp
↪--dport 22 -j RETURN
# allow HTTP and HTTPS traffic
iptables -A INPUT -p tcp -m tcp
↪--dport 443 -j RETURN
iptables -A INPUT -p tcp -m tcp
↪--dport 80 -j RETURN
# accept the following ICMP types -
# echo, echo reply, source quench,
ttl exceeded,
# destination unreachable - and drop the rest
iptables -A INPUT -p icmp -m icmp
↪--icmp-type 0 -j RETURN
iptables -A INPUT -p icmp -m icmp
↪--icmp-type 3 -j RETURN
iptables -A INPUT -p icmp -m icmp
↪--icmp-type 4 -j RETURN
iptables -A INPUT -p icmp -m icmp
↪--icmp-type 8 -j RETURN
iptables -A INPUT -p icmp -m icmp
↪--icmp-type 11 -j RETURN
# if we haven't accepted it, drop and log it.
iptables -A INPUT -j LOGDROP



如果你正在疑惑日誌在哪裡,象什麼樣子,這裡有一個例子,來自系統日誌/var/log/messages,一個來自192.168.50.40的UDP數據包,源埠30766,目標伺服器是192.168.0.8,目標埠是1026,這個數據包被丟掉了,它可能是windows機器上了信使服務發出的垃圾信息:


Nov 22 06:24:00 localhost kernel: filter: IN=eth0
OUT=MAC=00:0a:e6:4e:6d:49:00:14:6c:67:cc:9a:08:00
SRC=192.168.50.40 DST=192.168.0.8 LEN=402
TOS=0x00 PREC=0x00 TTL=47 ID=3345 PROTO=UDP
SPT=30766 DPT=1026 LEN=382




日誌輸出看起來有點恐怖,但是你能容易地揀出你想要的信息,首先,你看到的是日期和主機名,IN和OUT描述了數據包是來自哪個埠和通過哪個埠出去的,MAC給出了源和目標MAC地址,SRC和DST是源和目標ip地址,PROTO是UDP,TCP,ICMP等等,SPT和DPT是源和目標埠號,例如:大部分到服務的連接如ssh都有一個臨時的源埠,如35214,和一個目標埠22,那麼象前面說道的windows機器的信使服務數據包,你可以安全地忽略它。

當你安裝號防火牆后,務必再從另外一台機器上運行一次nmap,來檢查是否只打開了正確的埠。
《解決方案》

總結

安全是不斷提高、評估你的保護尺度的一個循環過程,上面的工具允許你保護你的伺服器,確保它按需要進行工作,分析意外事件的網路通訊,記住,意外總是讓人不愉快的!正如Larry Niven說的:「你不理解的任何事情都是危險的除非你理解了它」。

當你正在使用這些工具時,嘗試思考安全的3個步驟:預防,檢查和響應。如果可能你最好預防事情的發生,發生入侵后清除的代價是昂貴的,並且你可能丟失掉有用的數據,無論如何,你將理解一些入侵的知識,因此盡你所能做好預防工作。

TCP 3次握手

UDP是一個無連接的協議,相反,TCP在傳輸失敗時會重新再發送一次數據,它的設置比UDP更複雜,以3次握手開始,初始化一個連接,客戶端發送一個SYN(開始同步)數據包,伺服器然後用一個SYN+ACK數據包進行響應(如果埠是打開的情況下),然後客戶端響應一個ACK(告知收到)數據包,連接就這樣建立了,這些數據包攜帶數據序列號,它允許協議檢查和重新發送丟失的數據包,如果埠是關閉的或被防火牆過濾了,響應可能是RST或沒有響應,更多信息可以查看nmap文檔。
《解決方案》

:em30:
《解決方案》

頂你~




[火星人 via ] 安全運維必備:五個頂級Linux安全工具已經有512次圍觀

http://www.coctec.com/docs/service/show-post-2330.html