:::

學校實驗室的伺服器虛擬化方案評比(一):背景需求

學校實驗室的伺服器虛擬化方案評比(一):背景需求

2011-08-08_215458 manage virtual machine

我所在的教學單位實驗室中一直有著大量伺服器的需求,因此我最近開始研究起虛擬機器技術。這一篇事先敘述為什麼實驗室需要伺服器虛擬化方案來解決伺服器的需求,以及一些基本的虛擬機器相關技術名詞。

本篇要講的內容頗多,我預計拆成三篇文章來敘述,這一篇主要描述背景需求與相關名詞解釋。

背景需求

我們實驗室在進行實驗時,往往會需要伺服器來安裝網站、提供服務,主要使用的作業系統是Windows(因為很多系統是以ASPMSSQL實作),此外普通架站時常常使用的則是Linux。另一方面,在學生畢業之後,我們也要典藏學校畢業論文的系統,供後續研究發展的用途。

但是不管實驗室經費再多,伺服器的數量也不能滿足永無止盡的實驗、典藏需求。所以我們需要借助伺服器虛擬化方案的力量,將不常用、測試用的伺服器需求轉換成虛擬機器來運作,以達到節省經費成本、機器空間的效益。

具體來說,這種伺服器虛擬化的需求有兩種:一種是實驗用的短時間伺服器,可以讓人在虛擬機器裡面胡搞瞎搞,搞壞了也不會影響到其他虛擬機器的運作;另一種是展示用的長時間伺服器,這是在偶爾需要展示系統功能一下時才會連線使用的系統,效能不是第一考量,但需要長時間保持運作、易於備份才行。

由於我們是教育單位的實驗室,人力跟經費都不比外面的企業公司,因此方案的考量點都是開放原始碼、免費的方案為主。

目前我打算將虛擬機器架在一台老舊的伺服器上,它連VT-x / AMD-V的硬體協助虛擬化技術都沒有,這會造成之後選擇虛擬化方案上的限制。

在網路環境方面,這邊要配置獨立、公開的IP才能連線到網際網路。然而大部分伺服器虛擬化方案的前提,都在於已經有大量IP可以使用,或是已經架設在有DHCP服務的內部網路中、可透過NAT路由器進行連接埠轉遞。這些差異在之後評比時會再進行說明。

最後,最麻煩的是人力方面。這邊並不是理工科系,不太能期待學生能擁有網管的技能。學生一屆一屆地交替,複雜的管理技術也會難以轉交。因此整個伺服器虛擬化方案必須簡單,能夠有圖形化介面進行操作,盡量不用記憶文字型指令。

基於以上背景需求,我大概花了一週多的時間研究、比較各種伺服器虛擬化方案的運作方式。比較其優缺點,並從中決定最後要採用的最佳方案。

而接下來幾篇也就是記錄各種伺服器虛擬化方案的評比過程。


名詞解釋

由於本篇會用到一些虛擬機器與網路技術的專有名詞,在此先解釋一下常用名詞的意思。

主端電腦 / 客端電腦 (HostOS / GuestOS)

在虛擬機器的角色中,用來安裝虛擬機器軟體的作業系統稱為主端電腦(Host OS),被模擬出來、安裝在虛擬機器上的作業系統,稱為客端電腦(Guest OS)。我們通常是在一個主端電腦上建立多個客端電腦的虛擬機器提供服務。

而在伺服器虛擬化方案中,常常會將多台主端電腦結合成一個集叢(Cluster),以進行即時遷移、高可用等技術的實作。

名詞解釋:虛擬化技術

本篇評比的方案中,大致上會用到幾種虛擬化技術。

全虛擬化(Full-Virtualization)

虛擬機器軟體模擬出所有硬體設備與可操作的指令,客端電腦安裝在虛擬機器時就像是安裝在一個普通的機器硬體上。VMware、VirtualBox都是採用這種全虛擬化技術。

客端電腦發出的硬體指令會經過擷取、轉換,並於主端電腦上實作,虛擬化的效能較差。相對的,全虛擬化可以模擬出完整的電腦環境,可以安裝的客端電腦種類也比較多,不論是Linux或Windows都可以安裝。

半虛擬化(Para-Virtualization)

虛擬機器軟體模擬出部分硬體設備與指令,而部分硬體不進行模擬、客端電腦會直接使用主端電腦的硬體。因為這種部分硬體模擬的方式,所以中文常以「半虛擬化」稱之。英文原名的意思是「在旁邊的虛擬化」,意思是客端電腦的執行實際上是部分仰賴於主端電腦的虛擬化。

為了讓客端電腦能夠順利融入主端電腦中並進行半虛擬化的作業,通常需要修改客端電腦的核心。這通常是半虛擬化為人所詬病的缺點。但有人認為半虛擬化中客端電腦可以直接操作硬體,因此虛擬化損耗的效能較低、運作效率較高。

硬體協助虛擬化 Intel VT-x / AMD-V

在x86虛擬化的硬體支援中,Intel跟AMD都個別開發出虛擬化擴充的功能。他們彼此並不直接相容,但大部分功能卻都相同。VT-x / AMD-V技術可以讓主端電腦擷取客端電腦發出的低特權態部件的敏感指令,因此半虛擬化技術就不需要修改客端電腦的核心、全虛擬化也不用轉換客端電腦的執行代碼,這種硬體協助技術在某些方面來說可視為已經抵消了這兩種虛擬化技術的差別,而都可以視為全虛擬化技術。

藉由VT-x / AMD-V的協助,XenKVM等多種虛擬機器就能夠以全虛擬化模擬或是支援64位元的客端電腦。

然而,由於VT-x / AMD-V允許客端主機對記憶體的直接取用(Direct Memory Access,DMA),容易造成安全管理上的問題。因此Citrix XenServerMicorsoft Hyper-VVMware ESX等不同虛擬化方案會在系統服務安全上有著不同的性質,這也是他們之間會有明顯差異的地方。

容器虛擬化(Container-based virtualization)

容器虛擬化是在主端電腦中將部分資源、程序區隔成獨立的虛擬環境。容器中的客端電腦與主端電腦一樣的硬體設備,但是與主端電腦、其他客端電腦之間有很好的隔離性與安全性。

OpenVZ是容器虛擬化技術中相當知名的開放原始碼專案,它不需依賴硬體虛擬化技術VT-x / AMD-V的支援,可攜性也很高,而且允許你在客端電腦執行中直接動態調整客端電腦的資源(硬碟大小、記憶體等)。有不少人認為容器虛擬化的效能相當地高。

容器虛擬化技術要建立虛擬機器時,通常是要從虛擬裝置(Virtual Appliance),或是樣板(Template)中建立。例如你可以下載一個CentOS作業系統的虛擬裝置,然後基於這個虛擬裝置來建立一個全新、可以馬上執行的CentOS──大概只要三分鐘。

容器虛擬化最大的限制在於支援的作業系統很少、可選擇的類型不多,OpenVZ就只能從Linux主端電腦去模擬Linux客端電腦,並不能使用Windows。

      名詞解釋:虛擬機器應用

      有些與虛擬機器安裝、建立、操作時的相關技術名詞,在此也先解釋定義。

      空機安裝(Bare-metal installer)

      空機安裝是指在電腦上透過光碟或網路直接進行安裝,架設起一個包含作業系統與虛擬機器的完整電腦,這樣就不需要仰賴其他作業系統。

      為了讓伺服器虛擬化能夠穩定運作,主端電腦盡量是精簡服務、專心在虛擬機器運作上就好。空機安裝採用了預先規劃好的作業系統與虛擬機器服務設定,提供必要的功能,也減少安裝時額外設定的麻煩。

      許多方案都有提供空機安裝的ISO光碟映像檔。就像安裝普通的作業系統一樣,你可以把空機安裝的ISO檔燒成光碟、放到實體電腦光碟機上安裝,也可以掛載到虛擬機器上、在虛擬機器進行空機安裝。

      空機安裝的系統通常包括作業系統與虛擬機器軟體。有些開放原始碼專案的作業系統是採用常見的CentOS、Debian等Linux發佈版,允許使用者能再作業系統上加工。也有的作業系統單一功能的精簡版,除了虛擬化工作與基本設定之外沒有什麼能夠調整的地方,就像安裝了一個嵌入式系統一樣,例如VMware ESXi。

      虛擬裝置 / 樣板(Virtual Appliance / Template)

      將虛擬機器打包之後供人下載、使用,這就是一個「虛擬裝置」(Virtual Appliance),通常翻譯成「虛擬設備」。虛擬裝置就像是一台完整的、可以獨立運作的客端電腦,你只需要把它放到主端電腦中,以虛擬機器開啟、設定一下參數與網路,就能夠直接使用。

      在容器虛擬化的OepnVZ或半虛擬化的Xen中,通常是稱之為「樣板」(Template)。使用者可以以一個樣板為基礎產生多台同時運作的客端電腦。

      VMware的虛擬裝置市場有著1799個虛擬裝置可供下載,OpenVR也有許多Linux作業系統的樣板,而Proxmox也提供了各種網站伺服器的虛擬裝置

      利用虛擬裝置快速建立客端電腦,比起從光碟安裝作業系統更有效率。有些對應的技術也可將客端電腦轉換成虛擬裝置或樣板,供大量配置使用。

      虛擬機器主控台(Virtual Machine Console)

      2011-08-09_150658 console - mask

      VMware vShpere Client的虛擬機器主控台,裡面是一個Windows的虛擬機器。

      虛擬機器的操作介面稱為主控台(Console)。有些虛擬機器會模擬顯示卡,因此主控台可以看到漂亮的圖形化操作介面,類似平常我們在實體機器與螢幕上操作電腦一樣。但也有些虛擬機器並不模擬顯示卡,操作全部都以無頭模式(Headless Mode)進行,你只能在僅有鍵盤的情況以文字指令操作客端電腦。雖然這大致上跟Linux的指令列模式差不多。

      而主端電腦虛擬機器顯示客端電腦主控台畫面的方式有很多種,通常可以在虛擬機器管理介面開啟,VirtualBox可以用特有的VRDP虛擬遠端桌面協定,用Windows的遠端桌面開啟客端電腦的主控台。

      主控台為了模擬真實的操作環境,有時候會在開啟時捕捉鍵盤與滑鼠的操作。被捕捉的鍵盤與滑鼠只能在客端電腦主控台中進行操作,要脫離捕捉狀態時必須按下特殊按鍵組合,以VMware來說就是「Ctrl + Alt」。而虛擬機器無法捕捉特殊的按鍵組合「Ctrl + Alt + Del」(這會在Windows伺服器登入時使用),因此會有一些功能按鈕可以讓使用直接送出這個組合。

      似乎很少虛擬機器相關技術會在意這個基本的功能,但我真的覺得不同方案的主控台技術之間有很大的差異。

      名詞解釋:虛擬機器與網路

      虛擬內部網路(Virtual Intranet Network)

      許多方案都能夠建立虛擬的網路環境,就像是建立一個虛擬的交換器(switch),讓虛擬機器的網路卡與他連線,進而構築出複雜的網路結構。VMware及某些方案稱之為「vSwitch」,VirtualBox稱之為「Internal Network」(intnet),使用起來差不多都是類似的概念。

      橋接網路(Bridged Network)

      在這種網路型態之下,客端電腦會透過虛擬橋接器與主端電腦的實體網卡相連接。在這個網域中,主端電腦跟客端電腦都會被視為兩台獨立的電腦,可以各別配給IP、連上網路。

      NAT (Network Address Traslation)

      NAT是路由器常使用的技術,通常會搭配DHCP服務、連接埠轉遞機制一起使用。

      VirtualBox提供了NAT的網路模式,客端電腦會連到VirtualBox建立的虛擬路由器上,由虛擬路由器透過DHCP配給客端電腦內部IP,客端電腦責是透過虛擬路由器連線到網際網路。當網際網路的電腦要連到客端電腦時,則需要搭配連接埠轉遞機制,將指定的連接埠轉移到客端電腦中。

      NAT的網路功能不僅在個人使用時很容易就能建立一個可以連上網際網路的客端電腦(相較之下,其他模式都要自行指定IP),更可以讓你只要用一個IP、多個不同的連接埠,就能同時讓許多客端電腦提供服務。但是在伺服器虛擬化方案中,幾乎看不到內建NAT網路的功能。

      名詞解釋:伺服器虛擬化應用

      要進行大量虛擬機器的管理時,必須配合多種網路技術搭配,才能做到服務穩定、容易管理的目標,也是各個方案都想要實作的技術。在此舉兩個常見的技術:

      遷移(migration)

      遷移是讓伺服器管理者將虛擬機器轉移到不同的實體主端電腦上。當主端電腦需要維修、停機時,遷移功能可以快速將虛擬機器轉移到其他主端電腦再繼續執行。

      要進行遷移的先決條件是要有多台具有虛擬機器軟體的主端電腦。大部分的伺服器虛擬化方案中,遷移是在特定的管理介面中進行。你必須要先將多台主端電腦都結集成叢集,而且需要準備一個遷移時暫存的空間,這樣才能進行遷移的動作。

      即時遷移(Live migration)則強調遷移過程中虛擬機器運作不會中斷,而客戶端的網路服務也不會因此斷線。由於這還牽涉到網路技術,因此並不只是單純的虛擬化技術就能完成。許多伺服器虛擬化方案都會強調他們具有即時遷移的功能,而成為各家競爭的賣點之一。

      高可用性(High Availability,簡稱HA)

      高可用性是指為了縮短日常維護操作和突發系統崩潰的停機時間,配置多個相同的系統,而在其中某些停機的時候短時間內轉移到其他可用的系統中。

      在網路架構中,高可用性通常會與負載平衡、同步備份、服務監控與故障排除等技術一起使用。而在虛擬機器應用上,可以輕易地部屬多台相同功能與內容的虛擬機器,而以低成本實現高可用性的優勢。在伺服器虛擬化方案中,高可用性也是各家主打的賣點之一。

      (more...)

      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...)