:::

Linux的iptables防火牆設定記事

Linux的iptables防火牆設定記事

2011-07-22_160136 view_iptables

iptables是Linux作業系統中常見的防火牆套件,中文的維基百科也有介紹iptables。它可以用來設計靈活的過濾規則,並以簡單的語法進行設定,是Linux的網管人員必須學習操作的套件。架設伺服器時,為了防止被惡意攻擊、入侵,網管人員都必須要一併設定防火牆。但是高靈活性的iptables設定起來門檻也相當的高,往往讓初學者不知該從何設起。

我最近鑽研iptables的設定,參考了Linux網管人員必讀的鳥哥的Linux私房菜中的iptables實際設定,並根據身邊的網路伺服器環境做了些修改,想辦法讓iptables的設定與使用讓人簡單易懂。

這一篇就是分享我設定iptables的腳本檔,介紹安裝與使用方法,供其他人設定iptables時作為參考。


iptables腳本檔防火牆設定概述

這些腳本檔是參考鳥哥的iptables實際設定修改而成,iptables腳本檔可以從以下網址下載:

在pulipuli.iptables.zip裡面有六個檔案。以sh副檔名的三個檔案是可以執行的腳本檔,其他三個則是設定檔。

以下簡單敘述這些腳本檔的目的,稍後會再詳細介紹腳本檔的內容與用法。

  • iptables.rule.sh:設定iptables的主要規則。以下三個檔案是依附此腳本的設定檔:
    • iptables.deny:設定要阻擋的IP。
    • iptables.allow:設定要允許的IP。
    • iptables.service:設定要允許的連接埠。
  • reset_iptables.sh:清除iptables的設定。
  • view_iptables.sh:觀察iptables的設定。
iptables.rule.sh的功用

其中,主要的設定都集中在iptables.rule.sh中,裡面設定了相當多常見的防火牆規則。以下我簡單地敘述它的綱要:

  • 設定核心的網路功能
  • 重設防火牆設定:包括阻擋所有INPUT封包
  • 開放 lo 本機網路卡
  • 開放由本機發出的回應封包
  • 阻擋指定的IP:使用iptables.deny設定檔
  • 允許指定的IP連入:使用iptables.allow設定檔
  • 允許 0 3 3/4 4 11 12 14 16 18 ICMP封包進入
  • 允許指定的連接埠連入:使用iptables.service設定檔
  • 儲存防火牆設定

以下是iptables.rule.sh的內容:

#!/bin/bash

# 請先輸入您的相關參數,不要輸入錯誤了!
EXTIF="eth0" # 這個是可以連上 Public IP 的網路介面
RULE_PATH="/root/iptables" #iptables的設定路徑,最後不要有「/」
export EXTIF RULE_PATH

# 第一部份,針對本機的防火牆設定!##########################################
# 1. 先設定好核心的網路功能:

# 防止SYN Flloding的DoS攻擊
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

# 防止ping的Dos攻擊
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#rp_fileter:啟動逆向路徑過濾(Reverse Path Filtering)
#log_martians:記錄不合法的IP來源到/var/log/meesages
for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians}; do
echo "1" > $i
done

# 以下建議關閉
# accept_source_route:來源路由
# accept_redirects:IP相同時採用最短路徑
# send_redirects:與前者類似,發送ICMP redirect封包
for i in /proc/sys/net/ipv4/conf/*/{,accept_source_route,accept_redirects,send_redirects}; do
if [ -f $i ]; then
echo "0" > $i
fi
done

# 2. 清除規則、設定預設政策及開放 lo 與相關的設定值
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

#接受lo本機介面網路卡
iptables -A INPUT -i lo -j ACCEPT

#接受由本機發出的回應封包
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 3. 啟動額外的防火牆 script 模組
if [ -f $RULE_PATH/iptables.deny ]; then
sh $RULE_PATH/iptables.deny
fi

if [ -f $RULE_PATH/iptables.allow ]; then
sh $RULE_PATH/iptables.allow
fi

# 4. 允許某些類型的 ICMP 封包進入
# 詳細請參考ICMP協定 http://linux.vbird.org/linux_server/0110network_basic.php#tcpip_network_icmp
AICMP="0 3 3/4 4 11 12 14 16 18"
for tyicmp in $AICMP
do
iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
done

# 5. 允許某些服務的進入,請依照你自己的環境開啟
if [ -f $RULE_PATH/iptables.service ]; then
sh $RULE_PATH/iptables.service
fi

# 6. 最終將這些功能儲存下來吧!
/etc/init.d/iptables save

各個指令的意義請參考鳥哥的Linux私房菜 第九章、防火牆與NAT伺服器介紹,在此不贅述。以下我就直接介紹如何安裝、設定與使用這些腳本檔。


1. iptables腳本檔安裝

iptables的設定必須以 root 管理者 的身分操作,因此這一篇所有的動作都請以 root 進行吧。

另外,為了避免防火牆配置錯誤導致伺服器無法遠端連線,建議請在可以直接控制本機的時候再進行設定。以免設定錯誤導致伺服器無法連線的時候,再遠端也無能為力啊。

1-1. 檔案下載與配置

請下載以下檔案:

將該zip檔案上傳到伺服器的指定目錄「/root/」。並以unzip解壓縮。unzip解壓縮的指令如下:

[root@dspace-dlll ~]# unzip pulipuli.iptables.zip -d /root

iptables的腳本檔就會出現在「/root/iptables」目錄中。

當然,你也可以在其他電腦解壓縮之後再上傳到「/root/iptables」目錄。

1-2. 修改sh權限為700

為了要讓副檔名為sh的腳本檔可以執行,必須將他們的權限設為700,意思是只有擁有者root才能執行。

設定權限的指令如下:

[root@dspace-dlll ~]# chmod 700 /root/iptables/*.sh


2. iptables腳本檔設定

在主要設定中,我們會先讓iptables阻擋所有外來連線。因此我們要在以下三個檔案中設定特別阻擋或允許的IP與連接埠設定。以下主要設定的有三個檔案,他們的優先順序也是由先到後:

  1. iptables.deny:設定要阻擋的IP。
  2. iptables.allow:設定要允許的IP。
  3. iptables.service:設定要允許的連接埠。
2-1. iptables.deny 設定要阻擋的IP

檔案的內容如下,紅字的部份是要阻擋的IP

#!/bin/bash

# 這份設定要搭配iptables.rule.sh運作

# 底下填寫的是『你要抵擋的IP!』

# iptables -A INPUT -i $EXTIF -d members.lycos.co.uk -j DROP #不能使用Domain Name,會被iptables轉換成IP
iptables -A INPUT -i $EXTIF -s 213.131.252.251 -j DROP #阻止後門程式連入
iptables -A INPUT -i $EXTIF -d 213.131.252.251 -j DROP #阻止後門程式連出

在此範例中,我將「213.131.252.251」這個IP列為阻擋的對象。一個IP有兩條設定,一個是加上「-s」參數的阻擋連入,一個是加上「-d」參數的阻擋輸出。如果你要擋下其他的IP的話,可以據此依樣畫葫蘆建立相同的設定,然後更換IP即可。

2-2. iptables.allow 設定要允許的IP

檔案的內容如下,藍字的部份是要允許一定範圍的IP紅字部分是要允許的IP

#!/bin/bash

# 這份設定要搭配iptables.rule.sh運作

# 底下則填寫你允許進入本機的其他網域或主機

#iptables -A INPUT -i $EXTIF -s 140.119.61.0/255.255.255.0 -j ACCEPT #140.119.61.*的電腦,不建議開放
iptables -A INPUT -i $EXTIF -s 140.119.61.254 -j ACCEPT #允許指定IP連線

此例中,我設定「140.119.61.0/255.255.255.0」,也就是「140.119.61.*」這個範圍的IP都可以允許連線,不論是用哪種連接埠。(因為連接埠的設定iptables.service是在iptables.allow之後執行)但是這種大範圍的允許規則比較危險,除非你非常信任這個區域網路,否則不建議開放。因此我將此條規則前面加上「#」註解掉,讓它無法生效。

另外我指定「140.119.61.254」這個IP,允許他連線到伺服器,而不論是用哪種連接埠。如果你通常使用固定IP來管理這台伺服器,那麼我比較建議使用這種用法。

2-3. iptables.service 設定要允許的連接埠

檔案的內容如下,紅字的部份是要允許的連接埠藍字的部份是連接埠預設對應的服務名稱

#!/bin/bash

# 這份設定要搭配iptables.rule.sh運作

# 5. 允許某些服務的進入,請依照你自己的環境開啟
#iptables -A INPUT -p TCP -i $EXTIF --dport 21 --sport 1024:65534 -j ACCEPT # FTP
#iptables -A INPUT -p TCP -i $EXTIF --dport 22 --sport 1024:65534 -j ACCEPT # SSH 不建議直接開放,請允許IP即可
#iptables -A INPUT -p TCP -i $EXTIF --dport 25 --sport 1024:65534 -j ACCEPT # SMTP
#iptables -A INPUT -p UDP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS
#iptables -A INPUT -p TCP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS
iptables -A INPUT -p TCP -i $EXTIF --dport 80 --sport 1024:65534 -j ACCEPT # WWW
#iptables -A INPUT -p TCP -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT # POP3
#iptables -A INPUT -p TCP -i $EXTIF --dport 389 --sport 1024:65534 -j ACCEPT # LDAP
#iptables -A INPUT -p TCP -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT # HTTPS SSL
#iptables -A INPUT -p TCP -i $EXTIF --dport 8080 --sport 1024:65534 -j ACCEPT # Tomcat
#iptables -A INPUT -p TCP -i $EXTIF --dport 10000 --sport 1024:65534 -j ACCEPT # Webmin

在iptables.rule.sh中,我們先將所有連線都擋掉,而以白名單的方式設定要允許的連接埠。這邊設定的連接埠,可以讓任何電腦藉此連線到伺服器。

然而,我們一般伺服器開放的服務並沒有這麼多,通常只有開放WWW網頁伺服器而已,因此大部分的服務我都用「#」註解掉不使用。請依照你的需求來決定是否要開放。

必須要注意的是,我並不建議在此開放管理用的連接埠,像是ssh用的22、Webmin用的10000。我建議應該要設定 iptables.allow 指定允許的IP連線即可,這些IP不會受到iptables.service的連接埠設定限制。不要將管理用的連接埠開放到網際網路,是比較安全的作法。


3. 執行iptables腳本檔

3-1. 執行iptables.rule.sh:設定生效

設定完上述三個檔案之後,接下來執行 iptables.rule.sh 腳本檔,設定才會生效。

執行的指令與正常運作的訊息如下:

[root@dspace-dlll ~]# /root/iptables/iptables.rule.sh
正在儲存防火牆規則到 /etc/sysconfig/iptables: [ 確定 ]

3-2. 執行view_iptables.sh:檢查設定

為了確認iptables的設定是否有正常寫入,你可以執行 view_iptables.sh 這個腳本檔。其實它的內容只是「iptables –L –n -v」 ,也就是iptables查詢設定的指令。為了簡便記憶,我把它連同參數一起寫成 view_iptables.sh 這個腳本檔。

執行 view_iptables.sh 的指令與正常運作的訊息如下:

[root@dspace-dlll ~]# /root/iptables/view_iptables.sh
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
65 5564 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
55 3344 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP all -- eth0 * 213.131.252.251 0.0.0.0/0
0 0 DROP all -- eth0 * 0.0.0.0/0 213.131.252.251
0 0 ACCEPT all -- eth0 * 140.119.61.254 0.0.0.0/0
0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 0
0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 3
0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 3 code 4
0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 4
0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 11
0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 12
0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 14
0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 16
0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 18
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp spts:1024:65534 dpt:80

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 98 packets, 8728 bytes)
pkts bytes target prot opt in out source destination

看到設定都有順利存入iptables之後,防火牆設定就大功告成囉!

reset_iptables.sh:清除iptables設定

有時候防火牆設定並不如人意,你又不確定是哪裡設定錯誤的時候,你可以用 reset_iptables.sh 來暫時清除所有防火牆的設定。

reset_iptables.sh的檔案內容如下。

#!/bin/bash

# 清除iptables的所有設定,並允許所有連線
iptables -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# 儲存設定
#/etc/init.d/iptables save #先不儲存,重開機之後就會恢復之前的設定

請注意最後一行,我將儲存設定的指令註解掉,因此清除iptables設定的動作並不會永久儲存,下次重新開機或重新啟動iptables的時候,之前的設定就會恢復。如果你有必要永久儲存的話,請取消這一行的註解吧。

reset_iptables.sh 的執行指令如下:

[root@dspace-dlll ~]# /root/iptables/reset_iptables.sh


結語

網路上對iptables規則設定的討論相當多,由於每台伺服器所在的網路環境都有所不同,因此似乎沒有能夠完美應對所有環境的設定。

我也還在鑽研iptables中,這個腳本檔也可能有些問題。在此歡迎大家多多指教。

(more...)

OSSIM 初步使用之知識管理功能( Knowledge DB)感想

布丁布丁吃布丁

OSSIM 初步使用之知識管理功能( Knowledge DB)感想

2011-07-21_173525 test(mask)

我簡單地利用OSSIM在Asset新增一台伺服器,並馬上掃描這台伺服器上的服務服務,運作很順利。在初步把玩OSSIM的過程中中,我特別關注知識管理功能(Knowledge DB),然後我馬上就遇到了一些問題。

以下我想簡單地敘述一下我遇到的問題,以及我對OSSIM的知識管理功能的看法。


操作問題

基於中文語系的使用者,我當然是先關注OSSIM能不能順利使用中文。

介面沒有中文語系

image

image

在Profile裡面可以設定User language為Traditional Chinese,Configuration裡面也可以設定Language為Traditional Chinese,但是介面仍然是英文,這讓我感到非常奇怪。

Knowledge DB無法上傳檔案

image

知識管理功能可以上傳檔案,但是在上傳檔案的時候出現了以下PHP錯誤:

Warning: mkdir() [function.mkdir]: Permission denied in /usr/share/ossim/www/repository/repository_attachment.php on line 78

Warning: copy(/usr/share/ossim/uploads/2/2_2.jpg) [function.copy]: failed to open stream: No such file or directory in /usr/share/ossim/www/repository/repository_attachment.php on line 79

雖然檔案有存進資料庫,但其實並沒有成功上傳。

後來我調整了一下「/usr/share/ossim/uploads」檔案權限(777全開)、設定php.ini的upload_tmp_dir = /usr/share/ossim/uploads之後,不知為何突然就可以上傳了。總之詳情不太知道為何,網路上也很少人討論到OSSIM這個問題,怪哉。

Knowledge DB刪除檔案問題

如果在知識管理功能上傳的檔案部分檔名包含「-」或某些特殊符號,將會導致OSSIM不能順利刪除該檔案,只能將該檔案從資料庫中移除而已。不過這純粹是PHP寫法的問題就是了。

Knowledge DB無法處理中文

image

雖然文件的標題(Title)、內文(Text)、關鍵字(Keyword)可以輸入中文,但偶爾會出錯,不知道是不是卡到「許功蓋」的PHP萬年老問題。

此外,上傳文件檔案時如果檔名為中文,則會被替換成「?」。因此OSSIM上傳檔案不可以使用英文數字以外的文字。

image

而且搜尋時也無法處理中文,更別提什麼斷詞處理與中文的全文檢索了。


知識管理功能初步評估

初次接觸OSSIM的時候,會被他複雜的操作方式震撼到。它是比Spiceworks還要複雜的管理系統,要操作它並不是這麼容易的一件事情。

不過,比起OSSIM複雜的掃描偵測、記錄、報告、警示功能,我仍然比較在意的是它的知識管理功能(Knowledge DB)是否實用。

除了上述的中文、上傳、刪除問題之外,OSSIM知識管理功能還有分類功能相當薄弱的問題:

  • 他的知識管理功能可以搜尋,但卻沒有分類資料夾可用;
  • 儘管可以Link到指定Host、卻沒辦法反向找到Link的文件,這樣就不能從指定Host找到相關的所有文件,因此不能用Link來進行分類。

相較之下,Spiceworks至少還可以自己編寫入口網站(Portal)來組織內容,以及為每一台主機撰寫筆記跟附加一些文件,知識管理功能比起OSSIM來得強大。

我最近研究幾個類似的網管軟體,大部分的軟體都只實作掃描、偵測、通知等功能,至多只有給被掃描的伺服器簡單的純文字敘述欄位。在這些網管軟體中,Spiceworks跟OSSIM是裡面少數具備可以上傳文件的系統,讓網管人員可以確實地將伺服器的各種細項記錄。然而,這兩個軟體的知識管理功能都還不太實用就是。


結語

也許有人會覺得奇怪,雖然我是在使用一個網路設備管理軟體,但為何我卻如此在意它的知識管理功能呢。

儘管網路掃描工具已經可以掃描伺服器上的大多數資訊,但是仍有許多背後的知識,是靠這些工具無法掃描、記錄的。我需要一個可以為每台伺服器保留額外撰寫記錄的場所,這樣我就可以把一些常用的文件,像是Linux常用指令速查手冊、iptables防火牆規則等資料保留下來,留給後人查閱。

儘管我也可以獨立架設一個知識管理系統,而讓他跟伺服器之偵測、掃描、通知等工具分開設定,但那又覺得不太像是一個管理中心,似乎仍有不少管理上的麻煩。

最近我實在是為此感到苦惱且迷惑,我到底該怎麼做好呢……

(more...)

以VirtualBox安裝OSSIM

以VirtualBox安裝OSSIM

image

Alienvault Open Soucre SIM(簡稱為OOSIM)是一個網路設備掃描、管理工具,類似我之前介紹的Spiceworks,而且是開放原始碼的軟體。OOSIM是一個整合平台,他結合了多種網管工具,包括知名的Nagios,還有知識管理的工具,詳細介紹可以看張百川的介紹

我現在才在剛開始評估OSSIM,弄了好久才用VirtualBox把OSSIM才架設起來。這一篇就簡單記錄一下安裝過程,描述我安裝時發現硬碟分割的選項,以及如何讓OSSIM可以透過VirtualBox的NAT來運作,而不需要給予獨立IP的設定。


安裝環境

OSSIM 2.3.1(32位元)

OSSIM是一個Debain的Linux發行版,必須以光碟安裝成一個完整的作業系統。OSSIM網站可以下載到32位元跟64位元的ISO光碟映像檔。我下載的是32位元的2.3.1版本,ISO檔案大小為690MB。

VirtualBox Version 3.0.8 r53138

VirtualBox由Sun發展的自由軟體,他部分是開放原始碼方式發行。目前被Orcale採購,冠以Orcale VirtualBox的名稱。跟其他的虛擬機器相比,VirtualBox適合初學者、新手、臨時建立虛擬機器之用,相當容易上手,但是長期運作跟大量虛擬機器管理就不是很好用。

image

我使用的VirtualBox是Sun在被Orcale採購之前的版本,不過我想自3版之後的差異應該不大,請下載最新版本來安裝即可。安裝VirtualBox的作業系統是Windows 2003。


安裝步驟中我參考了張百川的OSSIM安裝介紹,不過他使用的是VMware,而且網路設定方式也是固定IP(儘管是區域網路IP),在VirtualBox的安裝中稍微有點有些不一樣。

我先從VirtualBox建立虛擬機器開始介紹,然後將OSSIM安裝中的選項記錄一下。

1. VirtualBox設定

1-1. 建立虛擬機器

在開始安裝OSSIM之前,我們要在VirtualBox建立一個安裝它的虛擬機器。

2011-07-21_154601 vb main (mask)

VirtualBox建立虛擬機器的方式很簡單,可以透過精靈來完成,我的設定請看上圖。以下我只講重要的一些細節:

  • 虛擬機器類型為Debian
  • 虛擬硬碟大小至少20GB以上:OSSIM初始安裝完的大小約3GB,quzaldon使用了一個月之後大概佔用了20GB。請使用動態延伸儲存方式(Dynamically expanding storage)的VDI格式吧。
  • 網路卡設為PCnet-FAST III (NAT):NAT模式是用DHCP分配IP給OSSIM,省下還要給OSSIM配給IP的麻煩。
  • 記憶體:我設定的是1024MB,Hinky說他配了1.5GB都還不夠用,不過我想至少設個256MB左右就能順利安裝了。
  • 光碟機設定映像檔alienvault_ossim_32bits_2.3.1.iso:VirtualBox可以用映像檔當做虛擬機器的光碟機,而不需要燒成實體光碟。
  • 關閉音效:因為用不到。
1-2. VirtualBox設定NAT的連接埠轉遞

NAT模式儘管不需要配給OSSIM一個IP,但是也沒辦法讓外界連線到OSSIM。還好VirtualBox可以使用連接埠轉遞機制(port forwarding)來讓外界可以連線到OSSIM的管理介面。

詳細的VirtualBox連接埠轉遞機制可以看我之前的介紹,在此主要要給OSSIM開放轉遞的連接埠有兩個:

  • 80:OSSIM管理介面。我設定成外面是由61080來連線。
  • 22:OSSIM的SSH指令列管理。我設定成外面是由61022來連線。

你也可以直接在VirtualBox的虛擬機器設定檔中,在<ExtraData>標籤裡面直接加入以下紅字設定:

<ExtraData>
<!-- 其他設定 -->
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/Protocol" value="TCP"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/GuestPort" value="80"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/HostPort" value="61080"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/Protocol" value="TCP"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/GuestPort" value="22"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort" value="61022"/>
</ExtraData>

設定連接埠轉遞的時候,虛擬機器必須關閉,最好連整個VirtualBox都關掉喔。

2. OSSIM安裝

OSSIM的安裝方式是以精靈的方式提供安裝指導,操作起來應該算是很簡單,大部分都按「contiune」就能繼續安裝。以下我只講一些需要注意的選項。

2-1. 選擇「Unattended installation」(無人職守安裝)

image

開機進入OSSIM的光碟選單之後就會有三個選項,請選擇第一個「Alienvault Ossim 2.3.1 (32 bit) Unattended installation」選項,按enter進入。

2-2. 設定網路

image

OSSIM的安裝步驟中沒有提供DHCP設定,必須要現在給予他網路設定。遺憾的是我並不知道VirtualBox的NAT模式到底是給了OSSIM什麼IP,所以這邊我是根據之前的經驗來設定:

  • IP: 10.0.2.2
  • Netmask: 255.255.255.0(OSSIM自動配置)
  • Gateway: 10.0.2.1 (OSSIM自動配置)
  • Name Server address: 10.0.2.1 (OSSIM自動配置)

這樣子的設定是無法透過VirtualBox連到網際網路,稍後安裝完成之後我們可以再把它設定成DHCP的連線,以適應VirtualBox的NAT模式。

2-3. 硬碟分割成LVM

image

接著OSSIM會要求配置硬碟分割。在此我選擇第二個選項「Guide - use entire disk and set up LVM」,這樣子安裝完之後才能順利啟動。

張百川是選擇「Guide - use entire disk」,我一開始也是用這種方式安裝,但安裝完成開機之後卻無法正常啟動。

image

然後選擇要安裝的硬碟。這一顆是剛剛在建立VirtualBox虛擬機器時一併建立的虛擬硬碟。

image

OSSIM會要你確認硬碟分割的設定,選擇「Yes」,然後按「Continue」,並進入漫長的硬碟分割與安裝程序。

2-4. 設定root密碼

image

接著OSSIM會要求你設定root的密碼。這個密碼與實際上使用OSSIM管理介面時使用的密碼並不相同,是管理整個OSSIM伺服器的密碼。

填入兩次相同的密碼之後,再按「Continue」繼續。

2-5. 不要更新

image

OSSIM會問你要不要確認更新。這個動作需要網路連線,但目前我們的網路並沒有正確的設定,所以在此請選擇「NO」不更新,然後按「Continue」進入最後的設定過程。

未來如果要更新OSSIM更新的話,可以再安裝完成的OSSIM伺服器的指令列模式中輸入「ossim-update」指令來更新即可。

image

最後再經過一個確認畫面,OSSIM就安裝完成,並直接重開機進入OSSIM作業系統。

3. OSSIM網路設定

進入OSSIM作業系統之後會是Linux的命令列。

因為網路並沒有設定好,所以不時會出現以下錯誤訊息:

* Starting Network Intrusion Detection System  snort_eth0
...done.

請先不用理會它,讓我們先登入、設定網路吧。

3-1. root登入

請在登入訊息中輸入「root」,按下enter,然後再輸入你剛剛設定的密碼。

如果順利登入的話,就會出現像上圖一樣的訊息。

3-2. 修改網路設定

接著是來將OSSIM的網路改成DHCP設定。請輸入以下指令開啟網路設定的檔案:

opensourcesim:~# vim /etc/network/interfaces

這邊使用的是VIM編輯器。如果你不太熟VIM怎麼使用,請參考鳥哥的VIM介紹

我將原始的靜態網路設定註解掉,然後加入DHCP的設定。最後的設定檔如下,注意紅字的部份:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
#iface eth0 inet static
# address 140.119.61.252
# netmask 255.255.255.0
# network 140.119.61.252
# broadcast 140.119.61.255
# gateway 140.119.61.254
# # dns-* options are implemented by the resolvconf package, if installed
# dns-nameservers 140.119.1.110
# dns-search alienvault

# DHCP configuration
auto eth0
iface eth0 inet dhcp


編輯完之後,儲存後離開設定檔即可。

3-3. 重新啟動網路

編輯完網路設定檔之後,還要重新啟動網路才能生效。

重新啟動網路的指令如下:

opensourcesim:~# /etc/init.d/networking restart

順利的話會出現以下訊息:

* Reconfiguring network interfaces...                                                                There is already a pid file /var/run/dhclient.eth0.pid with pid 1657
illed old client process, removed PID file
nternet Systems Consortium DHCP Client V3.1.1
opyright 2004-2008 Internet Systems Consortium.
ll rights reserved.
or info, please visit http://www.isc.org/sw/dhcp/

istening on LPF/eth0/08:00:27:4f:6b:e2
ending on LPF/eth0/08:00:27:4f:6b:e2
ending on Socket/fallback
HCPRELEASE on eth0 to 10.0.2.2 port 67
nternet Systems Consortium DHCP Client V3.1.1
opyright 2004-2008 Internet Systems Consortium.
ll rights reserved.
or info, please visit http://www.isc.org/sw/dhcp/

istening on LPF/eth0/08:00:27:4f:6b:e2
ending on LPF/eth0/08:00:27:4f:6b:e2
ending on Socket/fallback
HCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
HCPOFFER from 10.0.2.2
HCPREQUEST on eth0 to 255.255.255.255 port 67
HCPACK from 10.0.2.2
ound to 10.0.2.15 -- renewal in 40340 seconds.
[ OK ]

3-4. 重新啟動OSSIM伺服器

設定網路之後,為了確保OSSIM順利運作,最後再來重新啟動OSSIM伺服器。重新啟動的指令如下:

opensourcesim:~# reboot

3-5. 更新OSSIM

image

在安裝步驟因為沒有設定好網路連線,所以無法進行更新。現在設定好網路連線之後,我們就可以來幫OSSIM更新了。更新的指令如下:

opensourcesim:~# ossim-update

在更新的過程中OSSIM會要你確認許多資料。根據OSSIM的統計,要先下載292MB的資料來準備更新,更新之後會額外安裝27MB的檔案,因此整個更新要花上非常長的一段時間。

4. 登入OSSIM管理介面

4-1. 開啟OSSIM管理介面

OSSIM的管理介面可以直接用HTTP連線開啟它的網頁。預設是使用瀏覽器輸入OSSIM的IP,就能夠打開它的管理介面。但是由於我們是使用VirtualBox的NAT模式,並設定了連接埠轉遞,將80轉成61080,所以實際上要加上轉遞過的連接埠。

舉例來說,假如我現在的IP是「140.119.61.254」,而我以連接埠轉遞設定61080轉到OSSIM的80,那麼連線網址就是「http://140.119.61.254:61080」。

4-2. 登入OSSIM

開啟後的畫面如下圖所示。

 2011-07-21_145436 login (mask)

第一次登入時,請輸入以下資訊:

  • User: admin
  • Password: admin

然後按下「Login」登入。奇怪的是,OSSIM好像會用JavaScript幫我在密碼上動點手腳,不知道是不是我的錯覺。

4-3. 設定管理者密碼

2011-07-21_153350 password (mask)

第一次登入時OSSIM會要求我們設定密碼。請輸入兩次相同的密碼再繼續。

4-4. 進入OSSIM主介面

2011-07-21_153904 main (mask)

好,終於順利登入OSSIM了,接下來就可以開始使用OSSIM囉!


結語:不一定能順利安裝成功

image

因為寫這篇文章要截圖,所以我重灌了幾次OSSIM。但是最近一次重灌卻沒有辦法順利成功,儘管都是用一樣的設定方式,卻出現了硬碟找不到的錯誤訊息:

fsck.ext2: No such file or directory while trying to open /dev/hda1

雖然這不太像是數位檔案該有的行為,但可能安裝的時候也要有點運氣吧。

原本我在這篇寫了一些知識管理功能(Knowledge DB)的評估與討論,但是寫一寫覺得這樣會讓這篇文章太過雜亂,所以後來就讓這些討論獨立成一篇文章了。

不管怎麼說,光是這些東西就花了我一整天的時間,而且OSSIM的知識管理功能也沒有達到我希望的程度,不禁令人有種白費工夫的無奈感啊。

(more...)

FileZilla快速連線到SFTP

布丁布丁吃布丁

FileZilla快速連線到SFTP

image

FileZilla Client是一個開放原始碼的FTP、SFTP連線軟體。我常常使用FileZilla Portable作為操控伺服器檔案的主要工具,他的功能與File Zilla一樣,而且設定還可以存在隨身碟裡面帶著跑。以下我將FileZilla Client跟FileZilla Portable統稱為 FileZilla

我常常使用FileZilla來管理伺服器檔案,而這些伺服器通常不使用FTP通訊協定,而是使用SSH通訊協定中傳送檔案的SFTP。FileZilla預設的連線設定都是FTP,如果要以SFTP連線到伺服器,通常需要額外新增站台。

2011-07-20_142950 filezilla (mask)

不過後來我才發現到,原來FileZilla的 快速連線 也能連到SFTP伺服器。上圖是FileZilla快速連線的工具列,通常是位於FileZilla主視窗上面一排。如果要連線到SFTP伺服器,那麼只要在「主機」欄位中填入「sftp://<伺服器的IP>」即可。

這樣子就不用刻意跑去新增站台,也能快速連線到SFTP伺服器囉。

(more...)

CentOS安裝fail2ban記事

CentOS安裝fail2ban記事

image 

fail2ban是Linux上的一個以Python寫成的套件,主要功用是當有人登入時使用的帳號密碼錯誤達到指定次數之後,就將該IP擋住一定時間。這個方法可以用來阻止嘗試以暴力法猜測帳號密碼的攻擊,而且可以避免伺服器被DDoS(分散式阻斷服務攻擊)

然而我在安裝fail2ban的過程十分不順利,不像大部分網頁寫得如此輕鬆,我不確定是哪裡出了問題,但是現在我終於讓fail2ban順利運作了。

以下先做一些雜談,然後再來敘述整個安裝過程。


為什麼伺服器的SSH服務需要fail2ban?

現今Linux的管理工具以SSH為主,預設的連接埠是22、允許root可以登入、每次連線都可以嘗試5次錯誤。這個意思是,只要有心人以這個設定不斷地去做SSH連線,總有一天可以猜到你的root密碼,進而取得伺服器的終極管理權。

我之前的伺服器換過連接埠、也禁止root登入(透過修改/etc/ssh/sshd_config的Port設定跟PermitRootLogin no設定),但很遺憾的,它還是被駭客入侵了。不僅修改了我的SSH設定,也把防火牆全部清得一乾二淨,整臺伺服器變成了殭屍伺服器。我對於自己的天真感到非常慚愧,也深深地體會到光是改連接埠跟禁止root登入是不夠的。

fail2ban是搭配Linux的防火牆套件iptables一起運作。當有人猜測密碼達到預設的6次時,就在iptables中設定阻擋他的IP,讓他連連線都連不進來、無法繼續猜測密碼。預設的阻擋時間為10分鐘,更徹底一點可以讓登入失敗的人永遠都進不來。

fail2ban還可以用來阻擋FTP、Apache等其他需要登入的軟體,不過我的伺服器仍是以SSH連線為主,此篇也主要是講如何用fail2ban來強化SSH連線的安全。


安裝環境

Linux發行套件差異非常大,安裝、設定方式也有相當多的不同,敘述安裝的環境是非常重要的一件事情。

  • 發行版本:CentOS Linux release 6.0 (Final)
    這是RedHat系列的發行版本,與Fedora同系。
    (發行版本的資料會記錄在 /etc/redhat-release
  • yum.noarch 3.2.27-14.el6.centos @anaconda-centos-201106051823.i386/6.0
    CentOS的套件安裝主要是以yum為主。在此也是以yum來安裝fail2ban。他會在安裝fail2ban時自動安裝所相依的相關套件,例如python、tcpwrappers等,在此就不列出那些相依套件。
  • fail2ban.noarch 0.8.4-27.e16 @atrpms
    fail2ban的版本。網路上相當多設定都有些分歧,早期似乎是主要將設定寫在fail2ban.conf裡面,但這個版本是寫在 jail.conf 為主。稍後會講到設定的細節。
  • gamin.i686 0.1.10-9.el6 @anaconda-centos-201106051823.i386/6.0
    執行fail2ban的額外必要元件之一。
SSH環境

這個伺服器調整過SSH設定,SSH的連接埠改成了64022。請記住你修改過的SSH連接埠號碼,這在稍後設定fail2ban的時候會用到。


fail2ban的安裝與設定

接下來就要進入fail2ban的安裝與設定手續了。以下步驟都是以root帳戶的身分進行喔。

1. 用yum安裝fail2ban
1-1. 安裝fail2ban

利用yum安裝fail2ban的指令如下:

[root@server ~]# yum -y install fail2ban

yum會列出與fail2ban所有相依套件,並直接確認安裝。如果你想要一一確認哪些套件是否要安裝,請省略 -y 參數。

yum安裝的歷程會記錄在 /var/log/yum 中。如有需要確認已安裝的套件,可以回頭查詢這個記錄檔。

1-2. 設定套件庫atrpms

如果上述步驟不能安裝fail2ban、yum顯示找不到該套件的時候,你需要進入這個步驟。

yum會掃描套件庫來決定要如何安裝套件。然而由於fail2ban並不在預設的套件庫中,所以我們必須手動加入含有fail2ban的套件庫atrpms。

請編輯 /etc/yum.repos.d/CentOS-Base.repo

[root@server ~]# vim /etc/yum.repos.d/CentOS-Base.repo

在最後加入以下設定:

[atrpms]
name=Red Hat Enterprise Linux $releasever - $basearch - ATrpms
baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/stable
gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms
gpgcheck=1
enabled=1

這樣就可以利用1-1的語法來安裝fail2ban了。

2. 設定fail2ban

fail2ban的設定檔都在 /etc/fail2ban/ 目錄中,主要有兩個檔案:fail2ban.confjail.conf。以下各別說明需要設定的部份。

2-1. 設定fail2ban.conf

fail2ban.conf的位置在 /etc/fail2ban/fail2ban.conf 當中,請以以下指令開啟:

[root@server ~]# vim /etc/fail2ban/fail2ban.conf

這個設定檔需要調整的部份不多,請修改 logtarget 的參數如下:

#預設的參數
#logtarget = SYSLOG
#調整後的參數
logtarget = /var/log/fail2ban.log

這樣子fail2ban在執行時就會將記錄檔記錄到 /var/log/fail2ban.log 中。

在其他發行版本裏,似乎可以用預設的SYSLOG參數讓fail2ban記錄到指定位置,但是在CentOS中則需要手動指定絕對位置才行。

2-2. 設定jail.conf的backend

fail2ban主要的設定檔是jail.conf,位於 /etc/fail2ban/jail.conf 當中,請以以下指令開啟:

[root@server ~]# vim /etc/fail2ban/jail.conf

jail.conf需要設定的地方頗多,這邊我分成兩個部分來講解。首先先找到 [DEFAULT] 開頭的區塊,並找到backend參數進行設定:

#預設的參數
#backend = auto
#調整後的參數
backend = gamin

我原本使用預設的參數backend = auto,但是這樣fail2ban無法正常啟動。根據Fail2ban的說明,Fedora系的發行版本(包括此篇使用CentOS)如果在記錄中發現了「 fail2ban.comm   : WARNING Invalid command: ['add', 'ssh-iptables', 'auto'] 」錯誤訊息,那就得將backend參數從預設的 auto 改成 gamin

gamin是Linux的套件之一。你可以用yum來安裝它,指令如下:

[root@server ~]# yum -y install gamin

2-3. 設定jail.conf的[ssh-iptables]區塊

位於jail.conf中的 [ssh-iptables] 是用iptables來阻擋SSH嘗試錯誤連線的設定。以下我先列出我的設定,然後再來講述要修改的參數:

[ssh-iptables]
#是否啟用
enabled = true
#過濾名稱,使用預設的即可
filter = sshd
#iptables設定
action = iptables[name=SSH, port=64022, protocol=tcp]
#發生阻擋時的寄信設定
sendmail-whois[name=SSH, dest=pulipuli.chen@gmail.com, sender=root@server.nccu.edu.tw]

#需要掃描的記錄檔
logpath = /var/log/secure
#最高嘗試錯誤次數
maxretry = 2
#阻擋的時間,-1表示永久阻擋
bantime = -1

其中,跟預設值不一樣、需要調整的參數如下:

  • action中的port:預設值是 ssh ,也就是22。但是由於我修改的伺服器的SSH設定,目前的連接埠是64022,所以在此要設定為64022
  • sendmail-whois中的dest:預設是寄到 root ,也就是本機端的root帳戶的信箱。但是由於我並不是常常登入到此伺服器檢查root信箱,這個設定比較沒有意義,所以在此我設定為我自己的信箱位置。當fail2ban啟動、關閉、發生阻擋的時候,它都會寄通知信到這個位置。
  • sendmail-whois中的sender:這個設定會顯示在寄信的來源位置,預設是 fail2ban@mail.com 。為了辨識這個通知是來自於哪一台伺服器,在此最好給予它一個明確的名稱,包括這台伺服器的Domain Name跟目前執行fail2ban的帳戶,例如 root@server.nccu.edu.tw
  • logpath:預設值是 /var/log/sshd.log 。每個Linux發行版的SSH服務記錄登入訊息的位置都不太一樣,CentOS是將登入訊息記錄在 /var/log/secure 中,因此參數必須設置成此路徑。
  • maxretry:最高嘗試錯誤次數。一旦登入錯誤超過這個次數,fail2ban就會發生阻擋事件,將該IP擋在門外。預設是使用 [DEFAULT] 區塊中的maxretry = 5,在此我設定是更為嚴謹的 2。實際上,嘗試登入時可以比maxretry還多一次,例如maxretry = 5,那麼登入時可以錯誤6次才會被擋下。
  • bantime:發生阻擋事件之後,阻擋該IP的時間。預設是用 [DEFAULT] 區塊中的 bantime = 600,單位是秒,也就是10分鐘。但是這個阻擋時間實在太短,有人設定為 86400,也就是一整天。在此我設定為更嚴謹的 -1 ,表示永久阻擋。

jail.conf裡面還有許多其他服務的設定,但是預設都是關閉的,只有ssh-iptables預設開啟。如果你想利用fail2ban阻擋ftp、apache之類的嘗試登入攻擊,那麼你可以修改jail.conf的設定來達成這些目的。但是由於每個Linux發行版本都有所差異,因此參數設定都有些許不同,其他的服務就請上網找尋別人的討論吧。

2-4. 讓fail2ban重新啟動時不會重設阻擋IP規則

在預設的設定中,fail2ban每次重新啟動時都會遺忘被阻擋的IP設定。舉例來說,如果我的電腦因為登入失敗被fail2ban擋掉,那麼只要fail2ban重新啟動,那麼我的電腦又可以繼續去嘗試登入伺服器。

如果要讓fail2ban重新啟動時,不會重設阻擋的IP規則,則可以參考Vinnie Vedi的作法,修改 /etc/init.d/fail2ban 的內容。

修改的指令如下:

[root@server ~]# vim /etc/init.d/fail2ban

首先先找到start()的區塊,加入以下紅字的設定:

start() {
echo -n $"Starting fail2ban: "
getpid
if [ -z "$pid" ]; then
rm -rf /var/run/fail2ban/fail2ban.sock # in case of unclean shutdown
$FAIL2BAN -x start > /dev/null
RETVAL=$?
fi
if [ $RETVAL -eq 0 ]; then
touch /var/lock/subsys/fail2ban
echo_success
/sbin/service iptables restart # reloads previously banned ip's
else
echo_failure
fi

echo
return $RETVAL
}

再來找到stop()區塊,加入以下紅字的設定:

stop() {
echo -n $"Stopping fail2ban: "
getpid
RETVAL=$?
if [ -n "$pid" ]; then
/sbin/service iptables save # saves banned ip's
$FAIL2BAN stop > /dev/null
sleep 1
getpid
if [ -z "$pid" ]; then
rm -f /var/lock/subsys/fail2ban
echo_success
else
echo_failure
fi
else
echo_failure
fi
echo
return $RETVAL
}

這樣就大功告成了。

3. 設定fail2ban開機順序

網路上大部分的說法,都是使用 chkconfig 指令來將fail2ban加入開機自動啟動的設定之中。語法如下:

[root@server ~]# chkconfig --add fail2ban

設定好之後可以重開機測試看看,指令如下:

[root@server ~]# reboot

以下額外講述我在找尋fail2ban設定時,別人遇到的兩種無法正常啟動fail2ban情況:

fail2ban開啟順序必須在iptables之後

由於fail2ban是設定iptables以實作阻擋的功能,所以fail2ban必須比iptables更晚啟動。預設安裝的情況的確是如此運作。

有時候,有人會將iptables防火牆的規則寫在 /etc/rc.local,這是開機時最後執行的指令檔。而這些規則會蓋掉開機時fail2ban的設定。hondap遇到了這種情況,並提出了修改開機順序的方法,但是我覺得並不是很妥當。

我認為iptables的規則不應該寫在/etc/rc.local當中,而應該用以下指令來永久儲存iptables的規則檔:

[root@server ~]# /etc/init.d/iptables save

詳請請看鳥哥的iptables教學

Ubuntu無法正常開啟fail2ban的問題

使用Ubuntu系的使用者可能會遇到開機無法正常啟動fail2ban的問題,這是由於 /var/run/fail2ban/ 目錄在重開機的過程中被移除掉而導致fail2ban無法正常啟動的緣故。詳細的處理方法請看TECH BLOG的Fail2ban does not start after reboot這篇。

4. 啟動fail2ban

啟動fail2ban的語法如下:

[root@server ~]# service fail2ban start

如果你的service指令無法順利運作,也可以利用以下指令啟動fail2ban:

[root@server ~]# /etc/init.d/fail2ban start

需要注意的是,每次fail2ban的關閉、啟動,都會洗掉之前被阻擋的IP設定。舉例來說,如果我的電腦因為登入失敗被fail2ban擋掉,那麼只要fail2ban重新啟動,那麼我的電腦又可以繼續去嘗試登入伺服器。要保留fail2ban阻擋的IP規則的話,請參考2-4的方法修改 /etc/init.d/fail2ban

5. 檢查fail2ban是否運作

檢查fail2ban是否正常運作的方法有許多種,在此舉出三種:一種是用status指令檢查fail2ban的運作狀況,一種是檢查log記錄檔,最後一種則是觀察iptables的設定。

5-1. 檢查fail2ban的stauts

檢查fail2ban的狀態指令如下,而指令後面是正常狀態下的回應訊息:

[root@server ~]# service fail2ban status
Fail2ban (pid 1106) is running...
Status
|- Number of jail: 1
`- Jail list: ssh-iptables

其中 Number of jail: 1 這個訊息指出了我們在上面設定的一個阻擋規則:ssh-iptables,表示我們的設定正確,而fail2ban也有正常運作。

相反的,如果發生了 ERROR  Unable to contact server. Is it running? 錯誤訊息,那麼請依照Fail2ban的FAQ指示一一檢查吧。

5-2. 檢查fail2ban.log的記錄

如果你在上面的2-1步驟中設定了 /etc/fail2ban/fail2ban.conf ,並且正常啟動fail2ban,那麼應該可以找到 /var/log/fail2ban.log 這個檔案。

開啟指令如下:

[root@server ~]# vim /var/log/fail2ban.log

如果正常開啟的話,裡面會有記載以下資料(時間日期會有所不同):

2011-07-20 01:25:46,776 fail2ban.server : INFO   Changed logging target to /var/log/fail2ban.log for Fail2ban v0.8.4
2011-07-20 01:25:46,791 fail2ban.jail : INFO Creating new jail 'ssh-iptables'
2011-07-20 01:25:46,820 fail2ban.jail : INFO Jail 'ssh-iptables' uses Gamin
2011-07-20 01:25:46,955 fail2ban.filter : INFO Added logfile = /var/log/secure
2011-07-20 01:25:46,956 fail2ban.filter : INFO Set maxRetry = 2
2011-07-20 01:25:46,961 fail2ban.filter : INFO Set findtime = 600
2011-07-20 01:25:46,962 fail2ban.actions: INFO Set banTime = -1
2011-07-20 01:25:47,117 fail2ban.jail : INFO Jail 'ssh-iptables' started

相反的,如果fail2ban沒有正常啟動,那麼也可以檢查這個記錄檔,找找看有什麼問題。

5-3. 檢查iptables的規則

如果fail2ban有正常啟動的話,它應該會在iptables中加入fail2ban設定的規則。

觀察iptables規則的指令與結果如下:

[root@server ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:64022

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain fail2ban-SSH (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0

標示紅字的部分是fail2ban加入的規則,這條規則是根據上述2-3裏在jail.conf的[ssh-iptables]的action參數來設定的。

規則會將所有來源IP、目的IP的tcp封包,指定目的連接埠64022的封包轉移到fail2ban-ssh規則鏈(Chain)中,未來如果要阻擋某個指定IP,fail2ban會將阻擋的規則加入fail2ban-SSH規則鏈中。


實際操作fail2ban與應用

安裝與設定完fail2ban之後,接下來就是要測試看看它能不能正常運作。同時我也補充一些其他fail2ban教學比較少講的清除阻擋的方法,以及將要阻擋的IP永久加入iptables防火牆的方法。

5. 測試fail2ban

fail2ban的指令操作大部分可以靠 fail2ban-client 來進行。

5-1. 初始狀態

首先我們先看一下fail2ban中阻擋SSH連線的ssh-iptables的狀態:

[root@server ~]# fail2ban-client status ssh-iptables
Status for the jail: ssh-iptables
|- filter
| |- File list: /var/log/secure
| |- Currently failed: 0
| `- Total failed: 0
`- action
|- Currently banned: 0
| `- IP list:
`- Total banned: 0

上面的訊息表示目前沒有任何IP被阻擋。

5-2. 登入錯誤

接著我在某台電腦利用PieTTY進行SSH連線登入,故意輸入錯誤的帳號與密碼。

2011-07-20_105103 登入錯誤(mask2)

由於我們設定maxretry = 2,所以當錯誤輸入第三次時,這台電腦就被擋下來了。而且錯誤訊息是「Network error: Software caused connection abort」,而不是SSH的登入錯誤訊息。

5-3. 阻擋之後的狀態
[root@server ~]# fail2ban-client status ssh-iptables
Status for the jail: ssh-iptables
|- filter
| |- File list: /var/log/secure
| |- Currently failed: 0
| `- Total failed: 2
`- action
|- Currently banned: 1
| `- IP list: 140.***.***.***
`- Total banned: 1

從狀態中可以看到,剛剛連線的IP已經被列入阻擋項目中。

5-4. 通知信

2011-07-20_111122 gmail (mask)

由於我們在2-3中設置了 sendmail-whois 參數,讓fail2ban在發生阻擋時自動寄送通知信,所以測試中被阻擋的電腦資訊就會自動地寄到我的信箱,如上圖。

fail2ban寄來的信件中,主旨都會以 [Fail2Ban] 開頭,因此可以搭配Gmail的篩選器(filter)功能來管理這些郵件。

6. 清除fail2ban的阻擋

如果有管理者手滑輸入錯誤密碼而被fail2ban擋住,那麼可以透過以下方法來刪除被fail2ban阻擋的IP。

假如來源IP「140.119.1.110」是正常的使用者,而他不小心被fail2ban阻擋了。那麼你應該可以在iptables看到fail2ban加入的阻擋規則(藍字是規則鏈名稱紅字是IP):

[root@server ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:64022

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain fail2ban-SSH (1 references)
target prot opt source destination
DROP all -- 140.119.1.110 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0

我們可以用iptables的語法來刪除被阻擋的IP:

[root@server ~]# iptables -D fail2ban-SSH -i eth0 –s 140.119.1.110 -j DROP

其中,fail2ban是規則鏈(Chain)的名稱,請看上面iptables規則訊息中的藍字;紅字的140.119.1.110就是你要刪除的IP。(感謝網友提醒,原本誤寫為-d,表示目標,應該改成-s才對)

需要注意的是,就算用iptables的語法刪除了被阻擋的IP,這個IP依舊會在fail2ban的狀態中留下記錄喔。

網卡代號eth0

如果你有多張網卡,而你設定iptables防火牆阻擋的網卡並不是第一張的「eth0」,那麼你可能需要修改一下這張網卡的參數。關於iptables防火牆詳細的設定教學,請參考鳥哥的網站

7. 重設fail2ban的狀態

只要重新啟動fail2ban就能重置狀態的記錄。

重新啟動fail2ban的語法是:

[root@server ~]# service fail2ban restart

需要注意的是,如果你沒有做過上述2-4的動作、修改 /etc/init.d/fail2ban 的話,那麼在重新啟動fail2ban的時候,被阻擋的IP規則也會一併被清除,這樣該IP又能夠再次嘗試登入你的伺服器了。

8. 在iptables設定永久阻擋的IP

當有人時常要嘗試登入你的伺服器,而多次被fail2ban阻擋在外時,你可以將該IP設定到iptables防火牆的規則中,讓他永久被阻擋在外。

詳細的設定可以參考鳥哥的iptables教學,在此我僅介紹在iptables中加入與刪除阻擋指定IP的語法。舉例來說,「213.131.252.251」這個IP老是要嘗試登入我的伺服器,而我主要的連線網卡代號是「eth0」,那麼我可以設定以下規則,把它永久阻擋在外:

[root@server ~]# iptables -A INPUT -i eth0 -s 213.131.252.251 -j DROP
[root@server ~]# iptables -A INPUT -i eth0 -d 213.131.252.251 -j DROP

如果想要刪除誤加的規則的話,請將 -A 改成 -D,其他語法相同:

[root@server ~]# iptables -D INPUT -i eth0 -s 213.131.252.251 -j DROP
[root@server ~]# iptables -D INPUT -i eth0 -d 213.131.252.251 -j DROP

題外話,「213.131.252.251」就是上次攻擊我伺服器的駭客電腦,這是真的建議要擋掉的一個IP啊!


結語

雖然目前不知道fail2ban是否真的能夠抵擋駭客的攻擊,但是我覺得這是非常重要的一個套件,也希望架設Linux伺服器的網管人員最好都幫你的伺服器安裝一下。

(more...)

「布丁布丁吃什麼?」變更記事

布丁布丁吃布丁

「布丁布丁吃什麼?」變更記事

image

以下記錄這段期間「布丁布丁吃什麼?」blog的零星變更。


更名為「布丁布丁吃什麼?」

有鑑於大家都不會念這個blog的原名「布丁布丁吃?(什麼)」,那我乾脆把它改成「布丁布丁吃什麼?」好了。改名字之後有好一段時間了,有人發現到這個變更嗎?

編輯網站小圖示

最近也發現到Blogger提供了編輯網站小圖示的功能,比起以前那種從語法自訂網站圖示,這個編輯網站小圖示的功能似乎更穩定。詳細內容請見這篇的介紹。

加上Google +1按鈕與Facebook的傳送

image

所謂的隨波逐流,差不多就是這種感覺。

原本我在blog中安裝了Facebook的「讚」,而這個按鈕為我之前寫的Zotero介紹帶來相當大的點閱量。後來Facebook改版,加上了「傳送」的功能,可以讓人指定要分享的對象。我參考重灌狂人的介紹,也將他安裝到這個blog中。

後來Google模仿Facebook的讚,也推出了「+1」按鈕,而這個+1更是會影響到搜尋引擎的排行,對於時常使用Google檢索的人來說是相當實用的功能。這也是參考重灌狂人的介紹來加入的。

不過,我感到棘手的是,這兩個功能都必須要有各自的帳號登入才能啟用。沒有登入的人就不能使用+1或讚的功能,有點違背我對於網站自由平等的期望。而且引用這兩個功能,都會對網頁造成極大的負荷,這讓我時常感到難以取捨。

此外,星等評分功能我就取消了,畢竟那也是拖慢網頁速度的元兇之一。

更新AddThis功能

image

AddThis是集合許多社群網站於一身的分享功能,用簡單的方式就能建置Facebook的like、Goolge+1、分享到噗浪、推特等功能的按鈕。

由於舊版的AddThis被我搞得時常無法正常運作,所以我重新設置了AddThis功能,加入了後來才提供的「偏好按鈕」。在AddThis左邊四個按鈕會依照你使用習慣而動態改變,例如你常常分享到Plurk,那麼該按鈕就會將噗浪設置在前面。

image

如果找不到你要分享的功能,則可以按下最右邊橘黃色的「image」(+圖示),以顯示更多的分享位置。

image

如果你還是找不到你要的,則可以再按下最後的「More」,AddThis會列出它所有的全部分享位置。

取消Blogger內建的e-mail分享按鈕

image

既然有AddThis了,那麼原本的分享按鈕我就不再使用。要使用e-mail分享,請善用AddThis。

題外話,我一直無法使用Blogger內建的分享按鈕,可能是我範本改太多的問題吧orz

調整社交分享與回饋功能的顯示頁面

現在評分、反應等各種社交分享、回饋的功能,全部只會在文章全文中才會出現。首頁、搜尋等條列文章的頁面中,均不會有這類型的功能,以加快網頁的開啟速度。

範本網頁類型調整

自能從範本辨別出首頁、文章列表與文章全文等網頁類型的不同之後,「布丁布丁吃什麼?」的瀏覽速度應該比較快了。

之前測試的時候用了Dropbox的空間,可是後來發現Dropbox空間非常不穩定,樣式表時常下載失敗。後來換回Google Site的空間之後,似乎就穩定多了。儘管Google Site空間需要跳轉,在一些網站速度評比上被視為應該改善的弱點,但還是比Dropbox快上許多。

因為網頁類型可以正確辨識,所以CSS跟JavaScript的使用也更有效率了。

創用CC宣告調整

image

現在縮成一排,而且字體縮小,也比較不會影響到版面。應該是比較順眼吧。

導覽列(sidebar)修正

image

以前導覽列的標籤錯位,還傻傻地用JavaScript去調整。現在直接從範本裡面修正程式碼,整個導覽列的位置就不會錯誤了。

另外,導覽列在文章全文中將會直接隱藏,而不會像以前文章全文中導覽列是以動畫隱藏起來的。

新增功能:CSS Sprties、無限卷頁、圖片延緩載入

CSS Sprites是合併零星圖片、加速圖片下載的技術。

無限卷頁(infinite scroll)會讓使用者讀到文章列表最後的時候自動載入下一頁的內容。

圖片延緩載入則是讓圖片的讀取動作稍緩,等使用者真正要看到這張圖片時才進行載入。

這些都是近期學習並應用的功能,詳細內容請看各篇文章的介紹。

同時也加入了Selenium的功能測試,時常確認功能是否有正確運作。

CSS與JavaScript程式碼壓縮

因為一邊在作最佳化,就想起來還可以作程式碼壓縮這件事情。

程式碼壓縮之後,會刪掉多餘的空行、註解,盡可能降低字句。CSS壓縮後只剩下1/3,JavaScript也有壓縮到1/2的程度。

不過最主要的,還是藉由壓縮來檢查程式碼的錯誤。很多時候寫起來,靠斷行來蒙混過關的程式碼錯誤,在壓縮之後就都造成無法執行的嚴重錯誤。這次也經由程式碼壓縮來把這些小問題修正了。

至於CSS selector最佳化什麼的……以後有空再來研究吧。

Windows Live Writer調整

image

我一向使用Windows Live Writer(以下簡稱WLW)來寫blog,儘管最新已經到WLW 2011版了,但是我現在在用的WLW 2008還是挺好用的,所以沒有升級的打算。

不過之前都很懶得調整WLW的一些細節,寫起文章來總是怪怪的。現在做了以下調整,讓寫blog的時候更有效率:

  1. 跟「布丁布丁吃什麼?」的樣式統一:「布丁布丁吃什麼?」陸陸續續有微調樣式,但是WLW並沒有跟著修正。所以其實很多時候我是在並沒有真的所見即得的情況下寫文章。但是還好,我寫的東西大多時候都結構簡單就是。
  2. 改用新的水平線。以前的水平線會寫死奇怪的樣式設定,讓人難以調整。現在用Dynamic Template Plugin for Windows Live Writer來輸出<hr />,只用class name與搭配CSS來設定,這樣管理起來就方便許多。

其他主要的調整還有:

使用Code Snippet來輸出程式碼

image

值得一提的是,目前我使用Plugin Collection for Windows Live Writer這個外掛來輸出程式碼。作為程式寫作愛好者的我,在文章中時常需要輸出CSS、JavaScript、HTML、Java、PHP、Shell等程式碼。

image

WLW程式碼輸出外掛很多,Code Snippet是我目前看過自訂性較高的外掛。他的主要特色是連CSS的內容都可以自訂。這些CSS樣式直接寫在程式碼中,而不需要引用外部樣式表檔案,速度上比較快,也不容易干擾其他文章的內容。

我之前也用過Syntax Highlighter,它可是相當漂亮的輸出工具,但它是以使用者端的JavaScript去剖析輸出,對使用者來說負擔不小。「布丁布丁吃什麼?」已經夠慢了,就不要再拖慢使用者的閱讀效率吧。

使用Table Plugin來製作表格

image

WLW原始的插入表格功能相當陽春,而且表格寬度只能指定px,不能用百分比來設定。因此我改用了Table Plugin,它可以設定的項目就豐富多了,請見上圖。

Dropbox備份WLW

回想起來,如果沒有WLW,我幾乎就不太想寫blog。現在甚至連Blogger既有的編輯器我都不想開,新增撰寫、草稿、修改文章,全部都仰賴WLW。因為WLW是如此重要,所以現在我還用了Dropbox來備份WLW Portable的資料。也多虧如此,前幾天當我因為多開WLW導致資料毀損之後,又可以從Dropbox輕易地復原了。

其他版面細節調整

  1. 字體大小調整到12pt:這是我自己覺得最適合閱讀的文字大小,預設的10pt讀起來有點辛苦。
  2. 有序項目符號(<ol>,ordered list)省略掉圖示。
    • 可以跟這個無序項目符號(<ul>,unordered)相比較
  3. 壓縮範本中的CSS設定,將不需要參數設定的其他CSS語法移到外部檔案。
  4. 自動目錄大綱也針對水平線進行調整。
  5. 最新回應正確地移除掉換行造成的<br />語法,但是<a>或<img>等語法則就無法移除。
  6. 表格內<p>的縮排取消,表格內字型大小為10pt。
  7. 縮減Plurk跟訪客留言板的高度,讓導覽列不要太長。
  8. JavaScript置底載入,加快網站讀取速度。


結語

這次的修整花了蠻多時間。

很多東西明明覺得只是個小問題,應該可以很快就修好,可是卻還是意外地花了非常多的時間。不過在這段期間也學了很多以前就想學的技術,也不算是在蹉跎時光啦。

這次調整之後,應該有段時間不會再大幅更動了。如果操作上有任何問題,歡迎大家多多提出。

(more...)