搜尋此網誌

顯示具有 迷你好兔 標籤的文章。 顯示所有文章
顯示具有 迷你好兔 標籤的文章。 顯示所有文章

2014年1月7日 星期二

[迷你好兔] 利用 CMAN+Pacemaker 建立不中斷的網路

3410-24-hours-services閘道器是一種很常見的網路裝置,包含路由器與代理伺服器都可算是閘道器的一種。以下圖而言,標示為 Gateway 的設備提供了包含內部 IP 上網用 NAT 機制 (SNAT)、HTTP Reverse Proxy 與 Virtual Server (DNAT) 等功能,可說是一台多功能的閘道器。這些功能對於一個網管人員來說,並不是什麼新奇的概念與技術。但是這個架構有一個致命的缺點,那就是閘道器 Gateway 掌管了所有資料的交換,所以一旦 Gateway 出了問題,那可就真是一場大災難了。而這正是所謂的單點失效 (Single Point of Failure, 簡稱SPF) 問題。
cluster - before
為了解決這個問題,許多中高階的網路設備都提供了高可用性的備援機制 (High Availablity, 簡稱 HA),其中比較簡單的一種架構稱之為 Active/Passive 模式。在此模式中,至少會佈署兩台提供相同功能的設備,其中一台為主 (Active),另外一台為輔 (Passive)。當主要的設備失效時,輔助的設備會自動接手繼續提供服務,以確保服務不會因為設備失效而中斷。而當主要的設備恢復運作後,可以選擇繼續由輔助的設備提供服務,或是自動切換回主要的設備。可惜的是,這樣的功能通常只見於中高階的設備,而這些設備本來就所費不貲,所以採用此架構往往不但成本相對高昂,而且平常備用的設備並沒有提供服務,再再降低了設備的使用效率。
在今天在範例中,我將利用 CentOS 6 內建的 CMAN+Pacemaker 建立一個高可用性的閘道器,用低廉的成本解決單點失效的網路問題。與原本的架構相較,需要增加為兩台主機以提供 Active/Passive 模式,而且每個主機僅需配置一個內部用的 IP 位址。本範例假設兩台主機原本就已經分別設定好 Routing/DNAT/SNAT/Reverse Proxy 等網路功能,以下就讓我們一步步完成今天的範例吧。
cluster - after
  1. 設定主機的網路 (Gateway01 與 Gateway02)
    兩台主機的 IP 位址分別為 192.168.10.21 (Gateway01) 與 192.168.10.22 (Gateway02)。此兩台主機各配置兩張網卡,在範例中內部網路皆連結至網路介面 eth1。在此架構中,我們不需要設定外部網卡 (也就是 eth0) 的 IP 位址,所以請設定成手動指定但不輸入 IP 位址等資訊。
  2. 設定 /etc/hosts 檔 (Gateway01 與 Gateway02)
    在兩台主機的 /etc/hosts 分別加上下列兩行設定
    192.168.10.21 gateway01
    192.168.10.22 gateway02
  3. 安裝所需套件 (Gateway01 與 Gateway02)
    在兩台主機分別安裝所需套件,指令為
    yum install ccs cman pacemaker pcs resource-agents
  4. 設定 CMAN 參數 (Gateway01 與 Gateway02)
    分別在兩台主機執行下列指令
    echo "CMAN_QUORUM_TIMEOUT=0" >> /etc/sysconfig/cman
  5. 設定防火牆 iptables (Gateway01 與 Gateway02)
    我們需要用到 UDP Port 5404, 5405 與 TCP Port 11111,請在兩台主機分別進行設定,以便兩台主機能夠順利進行溝通。
  6. 設定預設路由 (Gateway01 與 Gateway02)
    因為在此架構中,備援主機本身不具備對外的 IP 位址,因此與其他內部設備一樣必須透過配置於主要主機的 IP 位址 192.168.0.254 進行網際網路的連結。為了避免當備援主機身分轉換成為主要主機後兩個路由產生衝突,所以我們降低此路由的優先順序,使其轉換成主要主機後,可以順利使用對外 IP 位址作為預設路由。我們在兩台主機分別執行下列指令
    route add default gw 192.168.0.254 metric 99
  7. 設定開機自動新增預設路由 (Gateway01 與 Gateway02)
    分別在兩台主機的 /etc/rc.local 加上下列設定
    route add default gw 192.168.0.254 metric 99
  8. 設定 Cluster (Gateway01)
    在 gateway01 執行下列指令
    ccs -f /etc/cluster/cluster.conf --createcluster pacemaker1
    ccs -f /etc/cluster/cluster.conf --addnode gateway01
    ccs -f /etc/cluster/cluster.conf --addnode gateway02
    ccs -f /etc/cluster/cluster.conf --addfencedev pcmk agent=fence_pcmk
    ccs -f /etc/cluster/cluster.conf --addmethod pcmk-redirect gateway01
    ccs -f /etc/cluster/cluster.conf --addmethod pcmk-redirect gateway02
    ccs -f /etc/cluster/cluster.conf --addfenceinst pcmk gateway01 pcmk-redirect port=gateway01
    ccs -f /etc/cluster/cluster.conf --addfenceinst pcmk gateway02 pcmk-redirect port=gateway02
  9. 同步 Cluster 設定 (Gateway01)
    將 gateway01 下的 /etc/cluster/cluster.conf 同步至 gateway02,指令為
    rsync /etc/cluster/cluster.conf gateway02:/etc/cluster/
  10. 啟動 cman 服務 (Gateway01 與 Gateway02)
    在兩台主機分別執行下列指令
    service cman start
  11. 啟動 pacemaker 服務 (Gateway01 與 Gateway02)
    在兩台主機分別執行下列指令
    service pacemaker start
  12. 設定 cman 與 pacemaker 開機自動執行 (Gateway01 與 Gateway02)
    在兩台主機分別執行下列指令
    chkconfig cman on
    chkconfig pacemaker on
  13. 關閉 fencing 與 STONITH (Gateway01)
    執行下列指令
    pcs property set stonith-enabled=false
    pcs property set no-quorum-policy=ignore
  14. 確認 Cluster 狀態 (Gateway01)
    執行指令
    pcs status
    應可以看到類似下列資訊
    Cluster name: pacemaker1
    Last updated: Tue Jan  7 17:27:30 2014
    Last change: Tue Jan  7 12:55:21 2014 via crm_attribute on gateway01
    Stack: cman
    Current DC: gateway01 - partition with quorum
    Version: 1.1.10-14.el6_5.1-368c726
    2 Nodes configured
    0 Resources configured
    
    
    Online: [ gateway01 gateway02 ]
  15. 設定網路資源 (Gateway01)
    執行下列指令
    pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.0.254 cidr_netmask=24 nic=eth1 op monitor interval=3s
    pcs resource create ClusterPublicIP ocf:heartbeat:IPaddr2 ip=168.95.10.10 cidr_netmask=28 nic=eth0 op monitor interval=3s
    pcs resource create ExternalDefaultRoute ocf:heartbeat:Route destination="0.0.0.0/0" gateway="168.95.10.1"
    其中網路相關參數 (192.168.0.254/24, 168.95.10.10/28 與 168.95.0.1) 請依據實際的環境加以調整。
  16. 設定 Email 通知 (Gateway01)
    如果我們希望知道何時發生資源轉移 (如從 gateway01 轉移到 gateway02),可以執行下列指令
    pcs resource create EmailNotification ocf:heartbeat:MailTo email=cyril.hcwang@gmail.com op monitor timeout=10 interval=3s
  17. 設定資源群組 (Gateway01)
    利用資源群組的設定,我們可以確保所有的資源同時進行轉移,而不會出現內部 IP 位址 192.168.0.254 配置於 Gateway01 但外部 IP 168.95.10.10 位址卻配置於 Gateway02 的錯誤狀況。指令如下
    pcs resource group add Gateway ClusterIP CusterPublicIP ExternalDefaultRoute EmailNotification
  18. 設定資源啟用順序 (Gateway01)
    指令如下
    pcs constraint order ClusterIP then ClusterPublicIP
    pcs constraint order ClusterPublicIP then ExternalDefaultRoute
    pcs constraint order ExternalDefaultRoute then EmailNotification
    設定完畢後我們可以透過下列指令確認啟用順序
    pcs constraint order show --full
  19. 設定主要設備 (Gateway01)
    在此範例中,我希望主要由 Gateway01 提供服務,因此需設定其擁有較高的優先權。指令如下
    pcs constraint location Gateway prefers gateway01=10
    pcs constraint location Gateway prefers gateway02=5
    設定完畢後我們可以透過指令
    pcs constraint location show --full
    確認是否有其他的優先權設定會影響到此一判斷,並在必要時透過指令
    pcs constraint location Gateway remove [resource-id]
    加以移除。
  20. 確認設定
    除了透過上述指令進行單一項目的顯示與確認,我們還可以透過指令
    pcs config
    顯示全部的設定,執行後應可以看到類似下列訊息
    Cluster Name: pacemaker1
    Corosync Nodes:
    
    Pacemaker Nodes:
     gateway01 gateway02
    
    Resources:
     Group: Gateway
      Resource: ClusterIP (class=ocf provider=heartbeat type=IPaddr2)
       Attributes: ip=192.168.0.254 cidr_netmask=24 nic=eth1
       Operations: monitor interval=3s (ClusterIP-monitor-interval-3s)
      Resource: ClusterPublicIP (class=ocf provider=heartbeat type=IPaddr2)
       Attributes: ip=168.95.10.10 cidr_netmask=28 nic=eth0
       Operations: monitor interval=3s (ClusterPublicIP-monitor-interval-3s)
      Resource: ExternalDefaultRoute (class=ocf provider=heartbeat type=Route)
       Attributes: destination=0.0.0.0/0 gateway=168.95.10.1
       Operations: monitor interval=60s (ExternalDefaultRoute-monitor-interval-60s)
      Resource: EmailNotification (class=ocf provider=heartbeat type=MailTo)
       Attributes: email=cyril.hcwang@gmail.com
       Operations: monitor interval=3s timeout=10 (EmailNotification-monitor-interval-3s)
    
    Stonith Devices:
    Fencing Levels:
    
    Location Constraints:
      Resource: Gateway
        Enabled on: gateway01 (score:10) (id:location-Gateway-gateway01-10)
        Enabled on: gateway02 (score:5) (id:location-Gateway-gateway02-5)
    Ordering Constraints:
      start ClusterIP then start ClusterPublicIP (Mandatory) (id:order-ClusterIP-ClusterPublicIP-mandatory)
      start ClusterPublicIP then start ExternalDefaultRoute (Mandatory) (id:order-ClusterPublicIP-ExternalDefaultRoute-mandatory)
      start ExternalDefaultRoute then start EmailNotification (Mandatory) (id:order-ExternalDefaultRoute-EmailNotification-mandatory)
    Colocation Constraints:
    
    Cluster Properties:
     cluster-infrastructure: cman
     dc-version: 1.1.10-14.el6_5.1-368c726
     no-quorum-policy: ignore
     stonith-enabled: false
  21. 確認 Cluster 執行狀態
    再次執行指令
    pcs status
    應可看到類似下列資訊
    Cluster name: pacemaker1
    Last updated: Tue Jan  7 17:52:42 2014
    Last change: Tue Jan  7 12:55:21 2014 via crm_attribute on gateway01
    Stack: cman
    Current DC: gateway01 - partition with quorum
    Version: 1.1.10-14.el6_5.1-368c726
    2 Nodes configured
    4 Resources configured
    
    
    Online: [ gateway01 gateway02 ]
    Full list of resources:
     Resource Group: Gateway
         ClusterIP  (ocf::heartbeat:IPaddr2):       Started gateway01
         ClusterPublicIP    (ocf::heartbeat:IPaddr2):       Started gateway01
         ExternalDefaultRoute       (ocf::heartbeat:Route): Started gateway01
         EmailNotification  (ocf::heartbeat:MailTo):        Started gateway01
  22. 測試資源的轉移 (Gateway01)
    因為目前資源配置於 Gateway01,因此測試時我們需要將資源轉移至 Gateway02。方法有二,一個是直接將 Gateway01 進行關機的動作,另外一個更為方便的方式則是將 Gateway01 設為備用,指令如下
    pcs cluster standby gateway01
    我們再次執行指令
    pcs status
    可以看到類似下列資訊
    Cluster name: pacemaker1
    Last updated: Tue Jan  7 18:10:31 2014
    Last change: Tue Jan  7 18:10:22 2014 via crm_attribute on gateway01
    Stack: cman
    Current DC: gateway01 - partition with quorum
    Version: 1.1.10-14.el6_5.1-368c726
    2 Nodes configured
    4 Resources configured
    
    Node gateway01: standby Online: [ gateway02 ] Full list of resources:  Resource Group: Gateway      ClusterIP  (ocf::heartbeat:IPaddr2):       Started gateway02      ClusterPublicIP    (ocf::heartbeat:IPaddr2):       Started gateway02      ExternalDefaultRoute       (ocf::heartbeat:Route): Started gateway02      EmailNotification  (ocf::heartbeat:MailTo):        Started gateway02
  23. 測試 Gateway01 重新上線 (Gateway01)
    透過指令
    pcs cluster unstandby gateway01
    可以重新讓 Gateway01 上線,因為我們已經設定 Gateway01 擁有較高的優先權,所以再次執行指令
    pcs status
    應可以看到類似步驟 21 的訊息,表示資源配置再次回到  Gateway01。
  24. 確認通知信
    因為我們剛剛做了兩次資源轉移的動作,所以你應該會收到相關的通知信。
透過 CMAN+Pacemaker,我們就可以輕鬆建立一個不中斷的網路連線服務。其實 CMAN+Pacemaker 所支援的服務不僅於此,有興趣的人可以透過指令
pcs resource list
列出所有支援的項目,進一步找出適合你的支援項目。

2013年12月28日 星期六

[迷你好兔] 利用 SSH Tunnel 保護你的 MySQL 連線 (三)

BundSightseeingTunnel2在前面兩篇文章裡,我提到如何利用 SSH Tunnel 的技術來保護遠端的 MySQL 連線。在第二種作法中,使用者利用自己的電腦達成 SSH Tunnel 的功能。因為大多數的使用者為 Windows 環境,所以在這篇文章中,我將示範如何在 Windows 的環境下設置 SSH Tunnel 以提供遠端 MySQL 連線。範例中使用的工具為 Putty,其他類似的 SSH Client 工具多也提供同樣的功能。

ssh proxy 2

  1. 開啟 Putty
  2. 新增 Putty 設定
    image
  3. 完成設定
    按下按鈕「Save」即可完成設定。
    image
  4. 對 SSH 主機進行連結並登入系統
  5. 進入設定畫面
    在連線視窗按下右鍵,並選取 Change Settings…
    image
  6. 開啟 Tunnel 選項畫面
    位置是 Connection –> SSH –>Tunnels。
    image
  7. 輸入 Tunnel 設定
    Source Port 與 Destination 分別輸入 3307 與 192.168.0.20:3306。同樣的,我們選用 3307 當做 SSH Tunnel 的連結埠,以與 MySQL 預設埠號 3306 做一區別。 
    image
  8. 按下按鈕 「Add」 完成新增動作
    應可看到下列畫面
     image
  9. 完成設定
    按下按鈕「Apply」即可完成設定。
    image

進行至此,我們就可以利用 MySQL Client 端工具來進行遠端的 MySQL 連線了。後面的例子我將以 MySQL Query Browser 為例。

  1. 開啟 MySQL Query Browser
  2. 設定 MySQL 連線資訊
    Server Host 與 Port 分別填入 127.0.0.1 與 3307。此外,請填入 MySQL 的帳號/密碼。
    image
  3. 進行連線
    按下按鈕「OK」就可以連線到遠端的 MySQL 資料庫。雖然畫面上顯示是本機的 IP (127.0.0.1),但是實際上卻是連到遠端站台的資料庫主機,也就是 192.168.0.20。
    image
  4. 確認 MySQL 的權限
    因為 MySQL 的權限會根據帳號以及登入 IP 的不同而改變,所以需要特別注意原本的權限設定。以上述的例子而言,登入的 IP 會是 192.168.0.10,也就是 SSH 主機的內部網段 IP。如果有所不確定,可透過 MySQL 指令 show full processlist 來確認連結的帳號與 IP。也就是說,在這個作法下內部網路的資料傳輸是沒有經過加密的。

利用 Putty 的 SSH Tunnel 功能,我們就可以在 Windows 下利用各式各樣的管理工具來操作 MySQL 資料庫,而且不用再擔心資料外洩的問題。

2013年12月27日 星期五

[迷你好兔] 利用 SSH Tunnel 保護你的 MySQL 連線 (二)

Secret-Train-Tunnel-of-Love-In-Ukraine-7在前一篇的文章中,我分享了如何利用 SSH Tunnel 連結遠端的 MySQL 服務。作法雖然可行,但是有一些小問題。首先就是你必須擁有遠端 SSH Tunnel 主機的管理權限,以便取消防火牆的限制。如果 SSH Tunnel 主機之前還有其他的防火牆或安全設備加以保護,同樣也必須予以開放。此外,這樣的作法會導致遠端站台多開啟一個原本不必要的網路服務埠號。即使透過類似敲門機制加以保護,終究還是增加了一定程度的風險。
對此,我們可以稍微調整原本的作法,改由使用者的電腦執行 SSH Tunnel 的工作。SSH Client 工具通常就具備建立 SSH Tunnel 的能力,因此不管使用者使用的是 Windows 或 Linux 環境,都可以運用此一作法。
ssh proxy 2
在這次的範例中,我們假設使用者的電腦是 Linux 環境,所需步驟如下:
  1. 在使用者的電腦開啟 SSH Tunnel 服務
    指令如下
    ssh -N -L 3307:192.168.0.20:3306 root@210.59.0.10
  2. 我們同樣使用 3307 作為 SSH Tunnel 的連結埠,以便與 MySQL 預設服務埠號 3306 做一個區隔。
  3. 連結 SSH Tunnel
    在使用者的電腦利用 MySQL Client 工具連結 TCP Port 3307。如果是 MySQL CLI 工具,指令為
    mysql –p –h 127.0.0.1 –P 3307
    輸入密碼後我們就可以進入 MySQL。因為指令 mysql 預設為透過 socket 連結資料庫,所以必須加上 –h 127.0.0.1 這組參數。
  4. 確認 MySQL 權限
    因為 MySQL 的權限會根據帳號以及登入 IP 的不同而改變,所以需要特別注意原本的權限設定。以上述的例子而言,登入的 IP 會是 192.168.0.10,也就是 SSH 主機的內部網段 IP。如果有所不確定,可透過 MySQL 指令 show full processlist 來確認連結的帳號與 IP。也就是說,在這個作法下內部網路的資料傳輸是沒有經過加密的。
此一作法不似前一個作法,對原本站台不需做任何設定的調整,所以適用範圍更廣。儘管有資料在內部網路為明文傳輸的缺點,但是通常原本的架構在內部網路即為明文傳輸,所以實際上也算不上是缺點了。

2013年12月26日 星期四

[迷你好兔] 利用 SSH Tunnel 保護你的 MySQL 連線 (一)

toddler-crawls-through-tunnel在網路的世界裡,Tunnel (通道) 是一個很有用卻也同時很可怕的技術。透過 Tunnel 的技術,內部員工可以任意連上公司所禁止連結的 IP 或服務。如果再加上加密的技術,公司幾乎可說是很難有所作用。Tunnel 技術不只可能遭受內部員工的濫用,更往往是駭客喜愛的手法。今天我們利用 Tunnel 來做一件比較正面的事情,那就是用 SSH Tunnel 來連結/管理遠端的 MySQL 服務。
在常見的網站架構中,我們會把網路分成多個網段 (可能是實體區域網路或虛擬區域網路)。對於一些重要且不需直接提供對外服務的主機,我們會選擇佈署在內部的隔離網段,以限制其他網段 (包含網際網路) 的設備直接加以存取。而這類需要保護的主機中,資料庫主機算是最常見的一種。透過這樣的架構,我們可以直接從網路架構上限制同一個內部隔離網段內的設備才能連結至資料庫的服務,以確保資料庫主機與服務的安全性。
這樣的架構雖然相對安全,但是卻衍生一個問題,那就是如果我們需要從外部管理資料庫服務,似乎就變得有點棘手。針對這個問題,我們可以透過目的地 NAT 的技術來達到從網際網路直接連結資料庫服務的目的,只是這個解法有一個很嚴重的安全問題:那就是一般的資料庫連線都是未加密。一方面是因為考慮到效能,另一方面則是因為內部資料傳輸也相對較為安全,所以通常不需要使用加密的傳輸方式。所以如果直接透過目的地 NAT 的技術來連結資料庫,不但資料可能全被看光,帳號密碼往往也同樣不保。而利用 SSH Tunnel 的方式,不但可以解決連結內部資料庫主機的問題,也可以確保在網際網路上傳輸帳號密碼等資訊時是經過加密的。
在下圖的例子裡,我們透過一台 CentOS 6 當做 SSH Tunnel 主機,以提供管理者透過網際網路連結內部 MySQL 服務。ssh proxy 1
步驟如下:
  1. 開啟 SSH Tunnel 選項
    要利用 SSH 服務當做 Tunnel,首先必須在 SSH Tunnel 主機的設定檔 (CentOS 6 為 /etc/ssh/sshd_config) 設定 AllowTcpForwarding 為 yes。因為 CentOS 6 的預設值即為 yes,所以除非之前曾經修改過此一設定,否則不需要進行此動作。
  2. 開啟防火牆的埠號
    MySQL  服務使用 TCP 3306,為了區分方便,我們選定 TCP 3307 當做 SSH Tunnel 的連結埠。所以我們必須在 SSH Tunnel 主機的防火牆 (iptables) 開放 TCP 3307。
  3. 執行 SSH Tunnel
    在 SSH Tunnel 主機開啟 Tunnel 服務,指令是
    ssh -N -L 210.59.0.10:3307:192.168.0.20:3306 root@192.168.0.20
    如果我們已經設定好  ssh 的金鑰登入,此時就不需要輸入密碼。否則,就會出現輸入密碼的提示。如果需要輸入密碼,請輸入資料庫主機 (也就是 192.168.0.20) 內帳號 root 的密碼。
  4. 連結 SSH Tunnel
    在使用者的電腦利用 MySQL Client 工具連結 SSH Tunnel 主機的外部 IP 與 TCP Port 3307。如果是 MySQL CLI 工具,指令為
    mysql –p –h 210.59.0.10 –P 3307
    輸入密碼後我們就可以進入 MySQL。
  5. 確認 MySQL 權限
    因為 MySQL 的權限會根據帳號以及登入 IP 的不同而改變,所以需要特別注意原本的權限設定。以上述的例子而言,登入的 IP 會因為指令最後面的 root@192.168.0.20 而成為 192.168.0.20。如果有所不確定,可透過 MySQL 指令 show full processlist 來確認連結的帳號與 IP。也因為這樣的關係,所以不只資料在網際網路傳輸時是經過 SSH Tunnel 的加密保護,連 SSH Tunnel 主機與資料庫主機之間的資料傳遞也是經過加密保護。
利用一個簡單的 ssh 指令,我們就可以透過網際網路安全地連結至遠端的 MySQL 服務。不過也因為過於方便,最好不要讓這個 SSH Tunnel 一直運行著,等到有需要再執行會是比較安全的作法。如果搭配像是 iptables 的敲門機制,那也是不錯的選擇。
其實透過 SSH Tunnel 的技術,不只可以用來保護遠端的 MySQL 連線,其他像是 ftp 或是 pop3 等服務,也常見被包裝在 SSH Tunnel 之中。透過 SSH Tunnel 的包裝,可以讓這些原本使用明文傳輸的協定達到加密的效果,以避免資料在傳輸過程中遭到窺視,大大提昇了傳輸時的安全性。

2013年4月12日 星期五

[迷你好兔] 如何利用 Nagios/Icinga 來監測 CentOS 下的 Adaptec Raid 控制卡

icon-raid-monitor256Raid 控制卡對伺服器來說,可說是很常見也很重要的一個元件。雖然主機本身通常都會有燈號可以顯示硬碟的狀態,甚至在硬碟出問題時發出警示聲響,但是這種方式對於遠端管理來說沒有多大的幫助,更何況並不是所有機器都有專業保母 24 小時隨時看著呢。至於 Raid 控制卡的狀態,光從主機外觀可就是更加不容易掌握了。
在這次的分享中,我將示範如何利用 Nagios 來監測安裝於 CentOS 下的 Adaptec Raid 控制卡,其型號為 6405/5405。




  1. 下載 Adaptec 命令列工具 (Command Line Utility)
    以 6405 為例,可以從產品頁面下的 Storage Manager Downloads 連結,找到最新版本的命令列工具。
    目前提供的最新版本是 Adaptec ARCCONF Command Line Utility v1.1.20324。雖然這個版本是從 6405 的頁面中下載,但是一樣支援 5405 這個型號。
  2. 選擇合適的執行檔
    解開下載的壓縮檔後可以看到11個目錄,各自代表不同系統的執行檔。以 64 位元的 CentOS 為例,所需的執行檔就是 linux_x64/arcconf。我們將這個檔案放置於系統內的 /opt/Adaptec 目錄下,並加上執行權限。
  3. 測試 Command Line Tool
    輸入指令
    /opt/Adaptec/arcconf GETCONFIG 1 AL
    如果看到下列資訊表示指令運作正常
    Controllers found: 1
    ----------------------------------------------------------------------
    Controller information
    ----------------------------------------------------------------------
       Controller Status                        : Optimal
       Channel description                      : SAS/SATA
       Controller Model                         : Adaptec 6405
    …
  4. 下載 Nagios/Icinga 監測所需腳本
    可以從這裡下載所需腳本 check-aacraid.py
    https://www.ip6.li/cms/tiki-download_file.php?fileId=46
    下載完後請將檔案放置於 nagios plugins 的目錄,並加上執行權限。以 64 位元的 CentOS 為例,此一目錄為 /usr/lib64/nagios/plugins/。
    如果監測的 Raid 控制卡是 6405,必須修改 check-aacraid.py,將
    if bstatus.group(1) == "Not Installed":
    改為
    if bstatus.group(1) == "ZMM not installed":
  5. 測試監測腳本 check-aacraid.py
    執行
    /usr/lib64/nagios/plugins/check-aacraid.py
    如果出現下列資訊表示腳本執行成功
    Logical Device 0 Optimal,Controller Optimal
    在安裝 ZMM 的情況下,顯示資訊則為
    Logical Device 0 Optimal,Controller Optimal,Battery Status ZMM Optimal
  6. 設定 nagios 帳號權限
    因為 arcconf 需要 root 權限才能正常執行,所以我們需要加上 sudo 的設定。新增 sudo 設定檔 /etc/sudoers.d/nagios,並輸入下列內容
    nagios ALL=(root) NOPASSWD: /opt/Adaptec/arcconf GETCONFIG 1 *
    Defaults:nagios !requiretty
  7. 測試 nagios 權限
    切換為帳號 nagios 後,再次執行步驟 5,應該不用輸入 root 密碼就可以得到相同的結果。
  8. 設定 nrpe
    修改 nrpe 設定檔 /etc/nagios/nrpe.cfg,加上下列設定
    command[check_aacraid]=/usr/lib64/nagios/plugins/check-aacraid.py
  9. 重新啟動 nrpe
    指令
    service nrpe restart
  10. 設定 Ngaios/Icinga
    之前所有動作皆在安裝 Adaptec 控制卡的主機上進行,後面幾個動作則在  Nagios/Icinga 監測主機上進行。以 Icinga 為例,所需修改之設定檔為 /etc/icinga/objects/localhost.cfg,加上下列設定
    define service{      
           use                              local-service      
           host_name                        hostname      
           service_description              AACRaid [Adaptec] Status      
           check_command                    nrpe!check_aacraid      
    }
    其中 hostname 是安裝 Adaptec Raid 控制卡的主機名稱。
  11. 重新讀取設定檔
    以 Icinga 為例,指令是
    service icinga reload
透過幾個簡單的步驟,我們就可以利用 Naigos/Icinga 隨時監控 Adaptec Raid 控制卡與硬碟的狀態,晚上睡覺也可以睡得更安穩囉。

2012年8月28日 星期二

[迷你好兔] 利用 Host Profile 確保 VMware vSphere 5 ESXi 主機的設定狀態

Podtech_VMware_Disaster_Recovery_Datac
在上一篇的文章中,我分享了如何修改 ESXi 主機上的 syslog 設定。由於 syslog 設定是存在於各 ESXi 主機上,所以如何有效地設定所有 ESXi 主機並確認無所錯誤,就成了一件很重要的事情。在這一篇文章中,我將利用 Host Profile 的功能,幫助我們確保所有的 ESXi 主機都有相同的 syslog 設定。

不囉嗦,馬上就開始進行:
  1. 因為 Host Profile 屬於 VMware vCenter Server 的功能,所以我們需要使用 VMware Client 連結 VMware vCenter Server。直接連結 ESXi 主機無法使用 Host Profile 的功能。
  2. 選取 "Inventory" –> "Hosts and Clusters"。
  3. 選取一個已經修改好 syslog 設定的 ESXi 主機,並在右鍵選單中選取 "Host Profile" –> "Create Profile from Host…"。0001
  4. 輸入 Host Profile 的 Name (名稱) 與 Description (描述),輸入完畢後按下 "Next >"。
    0002
  5. 確認輸入無誤後,按下 "Finish"。
    0003
  6. 選取另外一台尚未修改 syslog 設定的 ESXi 主機,並在右鍵選單中選取 "Host Profile" –> "Manage Host Profile…"。
    0004
  7. 選取我們剛剛新增的 Host Profile,選取完畢後按下 "OK"。Host Profile 必須附加 (Attach) 於 ESXi 主機才有作用,而且一台 ESXi 主機僅能附加一個 Host Profile。
    0005
  8. 在右鍵選單中選取 "Host Profile" –> "Check Compliance" 以開始檢查作業。
    0006
  9. 檢查完畢後我們可以在 Summary 這個頁籤看到此主機的設定並不符合規範 (Host is not in compliance with the attached profile)。
    0007
  10. 在 Summary 這個頁籤的下方可以找到相關資訊。
    0009
  11. 點選連結後可以看到詳細資訊,顯示 Syslog.global.logHost 這個設定值不符合規範 (Option Syslog.global.logHost doesn’t match the specified criteria)。
    0008
  12. 我們可以透過右鍵選單中的 "Host Profile" –> "Apply Profile…",將相關設定自動套用到選取的 ESXi 主機。
    0010
  13. 不過在使用 Host Profile 自動套用的功能時,ESXi 主機必須先進入維護模式 (Maintenance mode) 方可進行。對於不適合進入 Maintenance mode 的 ESXi 主機,可以使用手動的方式進行設定。
    0011
Host Profile 除了可以幫助我們簡化設定的作業,更重要的是 Host Profile 可以幫助我們確保設定的正確性。Host Profile 可有效地避免因為人為疏失或其他因素所造成的設定值不正確,進而危害到整個虛擬作業的有效性或/與安全性。

2012年8月27日 星期一

[迷你好兔] 啟用 VMware vSphere 5 syslog 並整合至 Splunk

Podtech_VMware_Disaster_Recovery_Datac在前一篇 VMware vSphere 5 ESXi 安全建議事項的文章 中,我提到應該啟用 ESXi 主機的 syslog 機制,並將這些重要的資訊統一集中至公司原本的日誌管理機制中。儘管 VMware vCenter Server 包含了一個 syslog daemon 可供安裝與使用,但是我並不建議使用此一套件。我之前與各位分享過一個功能強大的日誌管理系統 – Splunk,因此我今天要跟各位分享如何讓 ESXi 的主機透過 syslog 機制將資訊遞送到 Splunk,並利用 Splunk 即時警示登入錯誤的資訊。

好了,同樣讓我們一步步完成今天的任務吧:

  1. 我們必須擁有一個正常運作的 Splunk,而且接受來自 syslog (UDP:514) 的資料輸入。
    0005
  2. 設定 Splunk 主機的防火牆,允許 syslog (UDP:514) 封包進入。
  3. 使用 VMware vSphere Client 連結主機或是 VMware vCenter Server。
  4. 如果你是連結至 VMware vCenter Server,請選擇 "Inventory" –> "Hosts and Clusters"。
  5. 點選你想要開啟 syslog 機制的主機。
  6. 點選 Configuration 的頁籤 (Tab)。
  7. 點選 "Security Profile",並按下連結 "Properties…" 以設定主機的防火牆。
    0003
  8. 開啟 syslog 封包的傳送規則,設定完成後按下 "OK"。
    0004
  9. 點選 "Advanced Settings"。
    0001
  10. 打開 Syslog –> Global 的設定。在 Syslog.global.logHost 此一欄位輸入 syslog 主機的 IP 位址,此時我們應該指定為 Splunk 主機的 IP 位址。輸入完畢後按下 "OK"。
    0002
  11. 故意使用錯誤的帳號/密碼嘗試登入此一 ESXi 主機。
  12. 至 Splunk 主機下 "Hostd: Rejected password" 此一查詢語法。我們可以看到登入錯誤訊息出現在查詢結果當中。
    0006

透過 Splunk 的儀表板與即時通知功能,我們可以把嘗試登入 ESXi 主機的錯誤訊息做更有效率與更即時的應用。當然,ESXi 所遞送過來的資訊很多,並不局限於此一應用。不過以登入錯誤資訊而言,光取得 ESXi 主機上的 syslog 資訊依舊不夠完整。如果我們採用 VMware vCenter Server 來管理虛擬化環境,大多時候我們是登入至 VMware vCenter Server ,而非直接登入主機。而不幸的是,VMware vCenter Server 本身並沒有將相關訊息透過 syslog 遞送至遠方的功能。關於此點,我們可以在 VMware vCenter Server 主機上安裝 Splunk 的 forwarder,並即時監測 VMware vCenter Server 相關日誌的目錄,如果一來 Splunk 就可以獲得 VMware vCenter Server 的日誌記錄了。VMware vCenter Server 在 Windows 2008 下將日誌存放於 C:\Program Files\VMware\VMware VirtualCenter\Logs 這個目錄之內,至於在其他作業下的目錄可以參考 VMware 的官方文件。

就跟大多數的 ESXi 主機設定值一樣,syslog 的設定也必須一台台 ESXi 主機分別進行。這對管理大量 ESXi 主機的管理者而言,是一件費時而且容易出錯的工作。在下一篇文章中,我將跟各位分享如何利用 VMware vCenter Server 的 Host Profile 功能,來簡化 ESXi 主機的設定作業。

2012年6月8日 星期五

[迷你好兔] 利用 syslog/rsyslog + 腳本即時監測 Linux 帳號的登入

login_large之前我提過如何利用 Fail2Ban 來避免系統遭受暴力破解的危害,而 Fail2Ban 與其他類似的機制大多著眼於錯誤的行為 (如輸入密碼錯誤)。但是在系統運作的過程中,不但這些錯誤的行為必須加以注意,很多看似"正常"的行為,更是輕忽不得。其中一種絕對不可忽視的行為,就是帳號的登入,尤其是所謂特權帳號 (root 或是 administrator) 的登入。特權帳號的登入,是一個很重要的行為,而成功的登入甚至比錯誤登入更必須加以注意。如果沒有做好相關的監測,哪天忽然發現系統多了一些莫名其妙的檔案,也沒什麼好大驚小怪的了。

有一些事後日誌的分析工具,可以針對這些成功登入的事件加以設定並提出報告。但是事後分析再好,終究無法挽回已經發生的遺憾。如果能夠在第一時間就知道登入的行為,就可以減少遺憾發生的機會。據我所知,目前並沒有很方便的小工具可以達到這個需求,所以我們只好自己動手。有不少方式可以完成這個目標,今天我要跟各位分享一個相當簡單的方式,那就是利用 syslog/rsyslog 將訊息送到 named pipe 的功能,然後撰寫一個簡單的腳本將相關訊息從 named pipe 中讀出並透過電子郵件即時通知管理者。

我今天選擇的環境是 CentOS 6.2,至於其他的環境,只要依據實際的狀況做調整就可以了。好了,馬上就開始我們今天的目標吧:
  1. 建立 named pipe
    指令是
    mkfifo /var/run/secure.pipe

  2. 限制 named pipe 的權限
    將群組與全域的權限予以關閉,指令是
    chmod og-rwx /var/run/secure.pipe

  3. 修改 syslog/rsyslog 的設定檔
    CentOS 6.2 內建的套件是 rsyslog,其設定檔是 /etc/rsyslog.conf 。打開檔案後找到相關位置並加上最後一行
    # The authpriv file has restricted access.
    authpriv.*                                              /var/log/secure
    authpriv.*                                              |/var/run/secure.pipe

    如果你的環境使用 syslog 套件,設定上也沒有多大的差別,只要找到相關的設定檔即可。

  4. 重新啟動 syslog/rsyslog 服務
    指令是
    service rsyslog restart 

  5. 撰寫腳本
    建立一個名稱為 monitor.pl 的腳本,內容如下
    #!/usr/bin/perl
    
    my $named_pipe = '/var/run/secure.pipe';
    my $sender = 'SWatchDog<cyril.hcwang@gmail.com>';
    my $receiver = 'cyril.hcwang@gmail.com';
    my @ip_whitelist = ('127.0.0.1', '192.168.1.1');
    
    open (SYSLOG, "+<$named_pipe")
        or die "Couldn't open $named_pipe: $!\n";
    
    while (<SYSLOG>) {
        if ($_ =~ m/(.*) (\S*) sshd\[(\d*)\]: Accepted (\S*) for (\S*) from (\S*)/) {
            if (!ip_in_whitelist($6)) {
                $message = <<END;
    $5 在 $1 從 $6 登入 $2;
    END
                $subject = "[SWatchDog] Session activation report for ".$2;
                print "sending email to ".$receiver." with message \"".$message."\"";
                &email($subject, $message);
            }
        }
    }
    
    close (SYSLOG);
    
    sub email
    {
        ($subject, $message) = @_;
        open(SENDMAIL, "|sendmail -t") or die "Cannot open $sendmail: $!";
        print SENDMAIL "From: ".$sender."\n";
        print SENDMAIL "Subject: ".$subject."\n";
        print SENDMAIL "To: ".$receiver."\n";
        print SENDMAIL "Content-type: text/plain\n\n";
        print SENDMAIL $message;
        close (SENDMAIL);
    }
    
    sub ip_in_whitelist
    {
       ($ip) = @_;
       for ($i=0; $i<=$#ip_whitelist; $i++) {
          if ($ip eq $ip_whitelist[$i]) {
              return 1;
          }
       }
       return 0;
    }
    這個腳本有三個必須注意的地方,第一個當然就是信件通知的對象 ($receiver),另外一個則是哪些 IP 的登入資訊不要通知 (@ip_whitelist) 。最後則是關於訊息的比對指令。 在 CentOS 6.2 上,成功登入的訊息類似如下:
    Jun  1 16:22:38 xxx sshd[28516]: Accepted publickey for root from 127.0.0.1 port 60873 ssh2 
    而比對指令 $_ =~ m/(.*) (\S*) sshd\[(\d*)\]: Accepted (\S*) for (\S*) from (\S*)/ 就是根據這些訊息而撰寫的。如果在你的環境下訊息格式有所不同,可能就必須調整比對的指令了。

  6. 增加執行的權限
    指令是
    chmod +x monitor.pl 

  7. 執行腳本
    指令是
    nohup ./monitor.pl >> /var/log/monitor.log 2>&1 &

    nohup 可以避免我們登出後程式的執行就被中斷。

  8. 嘗試登入系統
    當我們成功登入系統後應該就可以在設定的信箱收到通知訊息,以下是 gmail 信箱的畫面。

    swatchdog

  9. 加入開機自動執行

    我選擇放在 /etc/rc.local 這個檔案,加上下列設定
    /path_to_monitor.pl/monitor.pl >> /var/log/monitor.log 2>&1 
透過 syslog/rsyslog、named pipe 以及 mail,我們輕鬆完成即時監控成功登入系統的事件。這個腳本還有一些可以改進的地方,像是使用其他更即時的通知方式 (msn、簡訊)、提供登入 IP 位址更詳細的資訊(例如這個 IP 位址在哪個地方) 等。只是這種方式雖然簡單,卻有幾個問題必須加以面對,其中一個是每台主機都必須執行這個腳本,在管理上會增加不少負擔。另外一個問題則是腳本一旦停止執行 (或根本沒有執行) 就失去了監測的能力。此外,如果有其他的程式也在讀取這個 named pipe,那麼寫入這個 named pipe 的資料可就不保證會被我們的腳本讀到。所以,named pipe 的權限設定就很重要。

當然,這幾個問題也不是不能解決,只是每台主機自我管理終究還是不夠方便。解決方式之一就是利用 syslog/rsyslog 遠端遞送的功能,把所有相關事件集中到同一台主機,然後在那台主機執行監測的腳本,如此一來就可以減少許多管理的負擔。至於如何將 syslog/rsyslog 事件遞送到遠端,就請有需要的朋友自行參考之前的另外一篇文章了。

2012年6月7日 星期四

[迷你好兔] 啟用 vSphere 5 的 snmp 功能

VMware對於 vSphere 這麼一套應用於大量服務環境下的虛擬化系統,雖然使用 vSphere Client 就可以看到資源的使用狀況,但是缺乏歷史紀錄的功能,讓管理時總覺得缺了那麼些東西。沒關係,我們都知道有 snmp 這個老朋友可以幫助我們主機進行主機或網路設備的管理。幸運的是,vSphere 本身支援 snmp 的功能,只不過預設是關閉的。
不過是啟動個 snmp ,應該是很容易的事情吧?經過一番搜尋後,我查到啟動 vSphere 的 snmp 功能主要有兩種方式,一種是登入 host 後直接修改設定,另外一種則是透過 VMware vSphere Infrastructure Managemenet SDK 從遠端加以設定。二話不說,我當然是選利用 SDK 從遠端加以設定啊,不然一台一台設定多蠢累啊。沒想到這是一個錯誤的選擇,花了我好一陣子才順利的啟動 vSphere 的 snmp 功能,所以也才有這篇文章的出現。

廢話不多說,同樣一步一步來完成今天的目標吧。
  1. 準備一台 Ubuntu 10.4 (或其他支援的系統) 的機器。
    這是卡關的第一步。我一開始採用 CentOS 6.2 的機器,在排除某狀況後,直到出現 uuid 引入檔錯誤 (路徑關係) 的那一刻我就決定放棄 CentOS 6.2,直接安裝一台 Ubuntu 10.4 的機器。反正使用 vSphere 後,什麼不多,就是機器多。我安裝的是 64 位元的 server 版。

  2. 安裝其他需求的套件
    有兩個額外套件需要安裝,分別是 perl-doc 與 uuid-dev。指令是
    apt-get install –y perl-doc 
    apt-get install –y uuid-dev

  3. 下載 vSphere SDK for Perl
    網址是
    http://www.vmware.com/download/download.do?downloadGroup=SDKPERL50U1
    請記得選擇 64 位元的版本。

  4. 解開壓縮檔 指令是
    tar xvfz VMware-vSphere-Perl-SDK-5.0.0-422456.x86_64.gz

  5. 修改 vmware-install.pl
    這是卡關的第二步,安裝程式會檢查是否已經設定 http 與 ftp 的代理伺服器,沒有設定還不給裝。但是現在一般的網路環境應該是不需要設定這些參數,所以我們要修改相關的程式碼。

    指令是
    cd vmware-vsphere-cli-distrib/ 
    vi vmware-install.pl

    將下列程式註解掉或直接刪除都可,註解的方式就是在每行前面加上 # 這個符號。
    if ( direct_command("env | grep -i http_proxy") ) {
        $httpproxy = 1; 
    } else {
        print wrap("http_proxy not set. please set environment variable 'http_proxy' e.g. export http_proxy=http://myproxy.mydomain.com:0000 . \n\n", 0); 
    } 
    if ( direct_command("env | grep -i ftp_proxy") ) {
        $ftpproxy = 1; 
    } else {
        print wrap("ftp_proxy not set. please set environment variable 'ftp_proxy' e.g. export ftp_proxy=http://myproxy.mydomain.com:0000 . \n\n", 0); 
    } 
    
    if ( !( $approx && $httpproxy)) {
        uninstall_file($gInstallerMainDB);
        exit 1; 
    }

  6. 進行安裝
    指令是
    ./vmware-install.pl

    看完版權宣告後請輸入 "yes",開始安裝的準備動作,準備完後會問你要安裝到哪個路徑下。預設是安裝到 /usr/bin 這個路徑,但是我選擇安裝到 /usr/local/bin 這個路徑。

  7. 確認已經正常安裝完畢
    最好的方式就是實際進行 snmp 的操作,我們先來查看 host 的 snmp 設定。指令是
    vicfg-snmp --server host_ip –s

    接著輸入你的帳號跟密碼。
    Enter username: 輸入你的帳號 
    Enter password: 輸入你的密碼 
    Current SNMP agent settings: 
    Enabled  : 0 
    UDP port : 161 
    Communities : 
    Notification targets : 
    Options : 
    EnvEventSource=indications

    看到這些資訊表示你已經連上了 host,而且 snmp 預設是關閉的。

  8. 設定並啟用 snmp
    指令是
    vicfg-snmp --server host_ip -E -c public

    其中 public 是你想要設定的社群 (community) 名稱。建議改成你自己知道的名稱,而不要使用 public 這種菜市場名字。
    Enter username: 輸入你的帳號 
    Enter password: 輸入你的密碼 
    Changing community list to: public... 
    Complete. 
    Enabling agent... 
    Complete.

  9. 再次確認
    指令是
    vicfg-snmp --server host_ip –s
    Enter username: 輸入你的帳號 
    Enter password: 輸入你的密碼
    Current SNMP agent settings: 
    Enabled  : 1 
    UDP port : 161 
    Communities : 
    public

  10. 透過 snmpwalk 讀取 snmp 的資料
    指令是
    snmpwalk –v 2c –c public host_ip

    順利的話,你會看到類似下列的資訊。
    SNMPv2-MIB::sysDescr.0 = STRING: VMware ESX 5.0.0 build-469512 VMware, Inc. x86_64 
    SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.6876.4.1 
    DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (188729027) 21 days, 20:14:50.27 
    SNMPv2-MIB::sysContact.0 = STRING: not set 
    ...
嚴格說來,除了兩個小卡關點必須注意之外,整個過程並不複雜。如果你很有好奇心,還是可以登入 host (透過 ssh),找到相關的設定檔 (位置是 /etc/vmware/snmp.xml)。裡面的內容應該如下:

<config>
   <snmpSettings>
     <communities>public</communities>
     <enable>true</enable>
     <targets/>
   </snmpSettings> 
</config>

你沒看錯,就是這麼簡單。如果你直接修改這個檔案,記得要執行 services restart 這個指令才會生效。

vSphere 的 snmp 功能在設定很簡單,所以有些進階設定也就無法進行,像是加密、支援不同的view等。此外,snmp 所能提供的資訊也不是很多。vmware 的 snmp 比較強調在 snmp trap 的能力,以提供一個當異常發生時的通知方式。儘管如此,用來當做基本的監控,還是已經足夠了。例如,下圖就是利用 CACTI 來監控 host 的網卡流量:

esxi1

透過 snmp 的支援,可以讓我們把 vSphere 納入現有的網管工具一併加以管理,著實方便多了,不是嗎?

About