搜尋此網誌

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年12月25日 星期三

[工具介紹] Apache 模組 mod_log_forensic

Forensic-Science-S_2132330b雖然這幾年 GA (Google Analytics) 等網站流量分析機制逐漸取代了傳統上利用網站日誌來分析網站流量的作法,但是分析網站日誌依舊是系統/網站管理員不可忽視的一個重要工作。以一般的網站服務器而言,主要會提供兩種日誌,一種是存取日誌 (Access Log),另外一種是錯誤日誌 (Error Log)。除了分析網站流量,系統/網站管理員還可以透過分析網站日誌來了解是否發生過攻擊網站的行為 (像是SQL 注入攻擊) 。儘管這些日誌有很大的用處,但是因為這些日誌一直以來都是網站流量分析工具所依賴的資料來源,所以其能儲存的格式與資料也就不太容易改變,也就是說不能應付其他較為特殊的應用。
Apache HTTP 服務器除了上述兩種日誌,另外還提供了一種稱之為 Forensic 的日誌,只是在預設的情況下這個功能是被關閉的。跟原本的日誌相比, Forensic 日誌有下列特點:
  • 每一個請求 (Request) 會有兩筆記錄,一筆是在開始處理請求前,另外一筆則是請求處理結束後。此一特點可以用來分析是否有不正常中斷的請求,這類不正常的請求可能是因為程式或設定的錯誤,也有可能是因為遭受到有心份子的攻擊。如果沒有開啟 Forensic 日誌,這類行為往往僅會在錯誤日誌留下類似 Segement Fault 的訊息,對於釐清問題並沒有太大的幫助
  • Forensic 日誌的格式是固定的,不像存取日誌或錯誤日記可以自定需要記錄的格式與欄位。
  • Forensic 記錄的內容比原本的存取日誌還要詳細,包含標頭的內容也會一併予以記錄,其中甚至包含 Cookie 等可能包含機密資料的標頭。因此對於 Forensic 日誌檔必須予以嚴加保護,以避免有心份子取得不適當的資料。
接下來,我們先看一下在 CentOS 6 的環境下,如何開啟 Forensic 日誌的功能:
  1. 修改 Apache 設定檔,預設為 /etc/httpd/conf/httpd.conf
    載入 mod_log_forensic 模組,也就是將
    #LoadModule log_forensic_module modules/mod_log_forensic.so
    這行改成
    LoadModule log_forensic_module modules/mod_log_forensic.so      
    並設定 Forensic 日誌檔所在位置
    加上下列設定
    ForensicLog logs/forensic_log
    其中 logs/forensic_log 表示儲存的檔案路徑。
  2. 重新載入 Apache 的設定
    指令是
    service httpd reload
設定完成後,我們可以試著讀取網站上的網頁,如果一切正確的話應該可以在 logs/forensic_log 這個檔案內看到類似下列的資訊:
+24178:52ba84d3:0|GET /wordpress/ HTTP/1.1|Host:192.168.0.119|Connection:keep-alive|Cache-Control:max-age=0|Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8|User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36|Accept-Encoding:gzip,deflate,sdch|Accept-Language:zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4|Cookie:wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_fc7f48cee0e7fa37753a2c3c863a3dce=superhero%257C1388125383%257Cdfb3d0e44bc16b8e120138195b9aa229; wp-settings-time-1=1387952591
+24179:52ba84d3:0|GET /wordpress/wp-includes/css/admin-bar.min.css?ver=3.7.1 HTTP/1.1|Host:192.168.0.119|Connection:keep-alive|Cache-Control:max-age=0|Accept:text/css,*/*;q=0.1|If-None-Match:"30e3-3220-4e95d2605fe80"|If-Modified-Since:Tue, 22 Oct 2013 23%3a56%3a26 GMT|User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36|Referer:http%3a//192.168.0.119/wordpress/|Accept-Encoding:gzip,deflate,sdch|Accept-Language:zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4|Cookie:wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_fc7f48cee0e7fa37753a2c3c863a3dce=superhero%257C1388125383%257Cdfb3d0e44bc16b8e120138195b9aa229; wp-settings-time-1=1387952591
-24179:52ba84d3:0
-24178:52ba84d3:0
我們可以發現每一行記錄的開頭都是一串數字,這是用來識別每一個請求的代號。而每一個代號應該會有兩筆記錄,前面分別加上符號 + 或 –。+ 號表示請求開始處理前的紀錄,而 - 號表示請求處理結束後的紀錄如果我們發現特定的請求代號只有 + 號的紀錄,而沒有 - 號的記錄,表示此一請求為不正常的中斷。此時,我們就可以透過日誌內的完整資訊來分析此一請求的各項資訊。
雖然找出不正常中斷請求的原理很簡單,但是如果要靠人工來找出 Forensic 日誌檔中有問題的紀錄,實在是一個不可能的任務。好在 Apache HTTP 服務器提供了一個簡單的腳本 check_forensic,可以用來幫助我們找出 Forensic 日誌檔中有問題的紀錄。不過在 CentOS 6 Apache HTTP 服務器的 RPM 安裝檔當中,並沒有包含此一腳本,所以我們需要自行下載 tarball 並取得當中的腳本 check_forensic 腳本。如果 Forensic 日誌檔沒有任何錯誤,執行腳本 check_forensic 並不會顯現任何資訊。反之,如果有任何不正常中斷的請求,check_forensic 將會列出有問題的紀錄,類似下列結果:
[root@web httpd]# ./check_forensic forensic_log
+24177:52ba84d3:0|GET /wordpress/wp-content/themes/twentythirteen/fonts/genericons.css?ver=2.09 HTTP/1.1|Host:192.168.0.119|Connection:keep-alive|Cache-Control:max-age=0|Accept:text/css,*/*;q=0.1|If-None-Match:"3087-57d7-4e001b3bdeb80"|If-Modified-Since:Tue, 25 Jun 2013 22%3a03%3a42 GMT|User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36|Referer:http%3a//192.168.0.119/wordpress/|Accept-Encoding:gzip,deflate,sdch|Accept-Language:zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4|Cookie:wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_fc7f48cee0e7fa37753a2c3c863a3dce=superhero%257C1388125383%257Cdfb3d0e44bc16b8e120138195b9aa229; wp-settings-time-1=1387952591
[root@web httpd]#
Apache 的 Forensic 日誌檔提供系統/網站管理員有別於標準存取與錯誤日誌的資訊,不管在面對有心或是無意的異常存取行為,都是一項有力的工具。

2013年9月23日 星期一

[工具介紹] 利用 knockd 實現複雜的敲門機制

funny-bear-knocking-door去年我介紹過如何利用 iptables 的 recent 模組來保護如 ssh 之類的網路服務。今天我要介紹的這個服務 – knockd,也可以達成類似的目的。不過不同於 iptables 的作法,knockd 可以輕鬆支援用多個網路埠的組合當做敲門的鑰匙,而且這些網路埠並不會對敲門動作的封包有所回應,可以達到更高的隱密性。此外,如果要保護的服務一多,將保護機制獨立在 iptables 的規則設定之外,也可以簡化 iptables 的複雜度,以避免設定錯誤的情況發生。
在今天的範例中,我們需要兩台 Linux 主機,其中一台當做利用 knockd 機制保護 ssh 服務的主機 (名稱為 knockd.cyril.idv,IP 位址為 192.168.199.103),另外一台用戶端電腦則是用來測試是否可以正常連上受保護的 ssh 服務 (名稱為 client.cyril.idv,IP位址為 192.168.199.102)。採用的 Linux 版本為 32 位元的 CentOS 6.4。為了測試方便,我們在兩台電腦的 /etc/hosts 各加上下列設定:
192.168.199.102 client.cyril.idv client
192.168.199.103 knockd.cyril.idv knockd
接下來,我們就一步步完成今天的範例。

第一階段 安裝與設定 knockd 服務
此階段的操作皆在 ssh 服務主機 (knockd.cyril.idv) 上進行。
  1. 加入對應的 repo
    新增檔案 /etc/yum.repos.d/nux-misc.repo 並加入下列內容
    [nux-misc]
    name=Nux Misc
    baseurl=http://li.nux.ro/download/nux/misc/el6/i386/
    enabled=0
    gpgcheck=1
    gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
  2. 安裝 knock 服務
    指令是
    [root@knockd ~]# yum --enablerepo=nux-misc install knock-server –y
  3. 將目前執行中的防火牆規則導入至檔案
    指令是
    [root@knockd ~]# iptables-save > /tmp/iptables.sav
  4. 修改防火牆規則檔案
    直接修改上述檔案,將內容改為
    # Generated by iptables-save v1.4.7 on Mon Aug 17 21:32:51 2012
    *filter
    :INPUT DROP [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [149:22436]
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT
    # Completed on Mon Dec 17 21:32:51 2012
    除了將 INPUT 的預設動作由 ACCEPT 改為 DROP 之外,也移除掉原本 ssh 服務 (TCP Port 22) 的開放規則。
  5. 匯入新的防火牆規則
    指令是
    [root@knockd ~]# iptables-restore < /tmp/iptables.sav
  6. 移除防火牆規則檔案
    指令是
    [root@knockd ~]# rm –f /tmp/iptables.sav
  7. 確認目前的防火牆規則
    指令是
    [root@knockd ~]# iptables-save
    應可以看到類似下列的訊息:
    # Generated by iptables-save v1.4.7 on Mon Aug 17 21:42:57 2012
    *filter
    :INPUT DROP [17:1672]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [149:22436]
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT
    # Completed on Mon Dec 17 21:42:57 2012
  8. 將目前的防火牆規則寫入系統設定
    指令是
    [root@knockd ~]# service iptables save
  9. 設定 knockd
    knock 服務預設的設定檔是 /etc/knockd.conf,修改成如下:
    [options]
            UseSyslog
    
    [opencloseSSH]
            sequence      = 4567:tcp,5678:tcp,6789:tcp
            seq_timeout   = 15
            tcpflags      = syn
            start_command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport ssh -j ACCEPT      
            cmd_timeout   = 10
            stop_command  = /sbin/iptables -D INPUT -s %IP% -p tcp --dport ssh -j ACCEPT
  10. 設定 knock 服務自動啟動
    指令是
    [root@knockd ~]# chkconfig knockd on
  11. 啟動 knock 服務
    指令是
    [root@knockd ~]# service knockd start

第二階段 安裝 knock 用戶端程式
雖然 knock 使用的敲門技術可以透過許多工具來產生所需的敲門封包,但是使用 knock 內建的工具可以簡化指令的操作。不過如果要進行比較複雜的敲門動作 (也就是送出比較複雜的封包),那就還是必須借助更複雜的封包產生工具了。
此階段的操作皆在 ssh 用戶端電腦 (client.cyril.idv) 上進行。
  1. 加入對應的 repo
    新增檔案 /etc/yum.repos.d/nux-misc.repo 並加入下列內容
    [nux-misc]
    name=Nux Misc
    baseurl=http://li.nux.ro/download/nux/misc/el6/i386/
    enabled=0
    gpgcheck=1
    gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
  2. 安裝 knock 用戶端工具
    指令是
    [root@client ~]# yum install --enablerepo=nux-misc knock –y

第三階段 測試 knock 機制
  1. 直接嘗試連結 ssh 服務
    指令是
    [root@client ~]# ssh knockd
    我們發現指令一直沒有回應,必須透過 Ctrl-C 才能跳脫。
  2. 使用敲門機制
    指令是
    [root@client ~]# knock knockd 4567:tcp 5678:tcp 6789:tcp && ssh knockd
    此時我們應該可以透過 ssh 服務正常連結至主機 knockd (192.168.199.103),並看到類似下列訊息:
    Last login: Mon Aug 17 21:40:42 2012 from client.cyril.idv
    [root@knockd ~]#
  3. 檢查 knock 服務的日誌
    knock 服務預設會將日誌寫入 /var/log/secure 這個檔案中,在 ssh 服務主機 (192.168.199.103) 我們可以看到類似下列的訊息
    Aug 17 21:45:31 knockd knockd: waiting for child processes...
    Aug 17 21:45:31 knockd knockd: shutting down
    Aug 17 21:45:31 knockd knockd: starting up, listening on eth0
    Aug 17 21:45:42 knockd knockd: 192.168.199.102: opencloseSSH: Stage 1
    Aug 17 21:45:42 knockd knockd: 192.168.199.102: opencloseSSH: Stage 2
    Aug 17 21:45:42 knockd knockd: 192.168.199.102: opencloseSSH: Stage 3
    Aug 17 21:45:42 knockd knockd: 192.168.199.102: opencloseSSH: OPEN SESAME
    Aug 17 21:45:42 knockd knockd: opencloseSSH: running command: /sbin/iptables -A INPUT -s 192.168.199.102 -p tcp --dport ssh -j ACCEPT
    Aug 17 21:45:42 knockd sshd[2472]: Accepted publickey for root from 192.168.199.102 port 52920 ssh2
    Aug 17 21:45:42 knockd sshd[2472]: pam_unix(sshd:session): session opened for user root by (uid=0)
    Aug 17 21:45:52 knockd knockd: 192.168.199.102: opencloseSSH: command timeout
    Aug 17 21:45:52 knockd knockd: opencloseSSH: running command: /sbin/iptables -D INPUT -s 192.168.199.102 -p tcp --dport ssh -j ACCEPT
透過 knock 所提供的敲門機制,我們可以建立起複雜的敲門機制。以上述的例子而言,我們必須依序連接 3 個 TCP 埠,才能順利連結 ssh 服務。除了 TCP 埠,我們也可以選擇 UDP 埠。而因為對 knock 機制而言,其實只是在接受到敲門訊息後呼叫特定的指令,所以除了 iptables 的指令外,也可以用來呼叫其他指令,以達成不同的管理目的。

2013年9月17日 星期二

[工具介紹] 利用 glusterfs 達成目錄即時自動同步與高可用性

glusterfs-logo去年我介紹過利用 lsyncd 這個套件來達成目錄的同步備援,今天則要利用 glusterfs 來達成類似的效果。雖說類似,但是 lsyncd 與 glusterfs 相比有下列差別:
  • lsyncd 監測目錄的變動,並定期 (或達到一定的異動次數) 將異動同步到另外一個目錄。因為 lsyncd 採用 inotify 監測技術,所以如果目錄內的檔案或子目錄一多,就可能會產生無法監測的問題。
  • lsyncd 本身並沒有支援高可用性,必須利用其它機制 (如 heartbeat) 來達成高可用性。
  • 被同步的目錄通常僅能當做備援,無法作為負載平衡之用。不但在資源使用上較為浪費,擴充性也比較差。
嚴格來說,拿 lsyncd 與 glusterfs 相比並不是一件公平且合理的事情,因為 glusterfs 本身是一個完整的分散式檔案系統,所以在功能上本就遠比 lsyncd 這類工具來的強大許多。用最簡單的說法,glusterfs 可以將許多不同的儲存空間整合在一起,變成一個分散式的虛擬儲存空間。glusterfs 所管理的虛擬儲存空間除了可以具備分散的特性 (distributed, 也就是將不同的檔案存放在不同的儲存空間) 之外,glusterfs 還提供了複製 (replicated, 也就是同一個檔案存放在兩個以上的儲存空間) 以及分條 (stripped, 也就是將一個檔案打散在多個不同的儲存空間) 的選項。這些選項可以單獨使用,也可以一起套用。今天我要跟大家分享的就是透過複製特性來達成目錄的自動同步與高可用性。
範例需要三台 Linux 系統,其中兩台作為 glusterfs 的服務端,另外一台則作為 glusterfs 的用戶端,所使用的環境皆為 CentOS 6.4。相關架構如下:
glusterfs
為了方便起見,我們讓這三台 Linux 之間可以透過主機名稱進行連結,所以我們在 /etc/hosts 設定如下:
192.168.199.100 server1.cyril.idv server1
192.168.199.101 server2.cyril.idv server2
192.168.199.102 client.cyril.idv client
接下來就讓我們一起一步步完成今天的範例吧。

第一階段:glusterfs 服務端的基本安裝
此階段的步驟必須在 server1 與 server2 上皆予以執行。
  1. 安裝 glusterfs 的 repo
    指令為
    wget http://download.gluster.org/pub/gluster/glusterfs/3.3/LATEST/EPEL.repo/glusterfs-epel.repo -O /etc/yum.repos.d/glusterfs-epel.repo
    註1:雖然目前 glusterfs 的最新版本為 3.4,但是 GA 版本仍為 3.3,所以在這個範例中我選擇使用 3.3 的 repo。
    如果系統已經安裝 EPEL 的 repo,裡面就包含了 glusterfs 3.2 的相關 RPM 套件。但仍建議停用 EPEL 內的 glusterfs 套件,而改採用上述的套件。
  2. 安裝 glusterfs 的服務器套件
    指令為
    yum install glusterfs-server -y
  3. 設定 glusterfs 服務開機後自動啟動
    指令為
    chkconfig glusterd on
  4. 啟動 glusterfs 服務
    指令為
    service glusterd start
  5. 修改防火牆設定
    在 glusterfs 官方文件中提到應該開啟 TCP 111, 24007, 24008, 24009 以及之後的數個埠號,至於要開到幾個埠號,則跟 brick 數量有關。以這個例子而言,應該開啟 TCP 111, 24007, 24008, 24009, 24010, 24011 等埠號。
    修改完後記得確認防火牆規則是否已經生效。指令為
    iptables –L -n
    執行後應可以看到類似下列資訊
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0      
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:111
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:24007
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:24008
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:24009
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:24010
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:24011
    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
    Chain FORWARD (policy ACCEPT)
    target     prot opt ource               destination
    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
    Chain OUTPUT (policy ACCEPT)     
    target     prot opt source               destination

第二階段:glusterfs 服務端的服務設定
此階段的指令僅需在 server1 予以執行即可。
  1. 將 server2 加入可信任的儲存池 (Trusted Stroage Pool)
    指令為
    [root@server1 ~]gluster peer probe server2.cyril.idv
    執行後應可看到下列訊息
    Probe successful
  2. 確認信任關係
    指令為
    [root@server1 ~]gluster peer status
    執行後應可看到類似下面的訊息
    Number of Peers: 1
    
    Hostname: server2.cyril.idv
    Uuid: f44e01c6-e889-432a-8056-cf7174421324
    State: Peer in Cluster (Connected)
  3. 建立 Volume
    在 glusterfs 的架構中,每一個 volume 就代表了單獨的虛擬檔案系統。建立 volume 的指令為
    [root@server1 ~]gluster volume create datavol replica 2 transport tcp server1.cyril.idv:/data server2.cyril.idv:/data
    執行後應可看到下列訊息
    Creation of volume datavol has been successful. Please start the volume to access data.
    註2:glusterfs 會自動建立不存在的 /data 目錄。此外,在建立 volume 時,我們不需要特別指定虛擬檔案系統的屬性 (像是分散與否),glusterfs 會自動根據相關參數 (如 brick 數) 決定此一虛擬檔案系統的屬性。
  4. 啟動 Volume
    指令為
    [root@server1 ~]gluster volume start datavol
    執行後應可看到下列訊息
    Starting volume datavol has been successful
  5. 確認服務之間的連線已經正常連結
    指令為
    [root@server1 ~]netstat –tap | grep glusterfsd
    執行後應可看到類似下列的訊息
    tcp        0      0 *:24009                     *:*                         LISTEN      2343/glusterfsd
    tcp        0      0 server1.cyril.idv:24009     server2.cyril.idv:exp2      ESTABLISHED 2343/glusterfsd
    tcp        0      0 server1.cyril.idv:24009     server1.cyril.idv:1020      ESTABLISHED 2343/glusterfsd
    tcp        0      0 server1.cyril.idv:24009     server2.cyril.idv:1020      ESTABLISHED 2343/glusterfsd
    tcp        0      0 server1.cyril.idv:24009     server1.cyril.idv:1023      ESTABLISHED 2343/glusterfsd
    tcp        0      0 localhost:1020              localhost:24007             ESTABLISHED 2343/glusterfsd
  6. 查詢 volume 的狀態
    指令為
    [root@server1 ~]gluster volume info datavol
    執行後應可看到類似下列訊息
    
    Volume Name: datavol
    Type: Replicate
    Volume ID: 185ef7c6-7c7f-461d-8690-eec24a1a4c38
    Status: Started
    Number of Bricks: 1 x 2 = 2
    Transport-type: tcp
    Bricks:
    Brick1: server1.cyril.idv:/data
    Brick2: server2.cyril.idv:/data
    其中 Type 資訊表示這是一個複製的 (Replicate) 虛擬檔案系統。
  7. 為了增加安全性,我們可以限制只有 client 電腦的 IP 才能連上此一虛擬檔案系統
    指令為
    [root@server1 ~]gluster volume set datavol auth.allow 192.168.199.102
    執行後應可看到下列訊息
    Set volume successful
  8. 再次確認 volume 的狀態
    指令同樣為
    [root@server1 ~]gluster volume info datavol
    執行後應可看到類似下列訊息
    
    Volume Name: datavol
    Type: Replicate
    Volume ID: 185ef7c6-7c7f-461d-8690-eec24a1a4c38
    Status: Started
    Number of Bricks: 1 x 2 = 2
    Transport-type: tcp
    Bricks:
    Brick1: server1.cyril.idv:/data
    Brick2: server2.cyril.idv:/data
    Options Reconfigured:
    auth.allow: 192.168.199.102

第三階段:glusterfs 用戶端的安裝
  1. 安裝 glusterfs 的 repo
    指令為
    [root@client ~]wget http://download.gluster.org/pub/gluster/glusterfs/3.3/LATEST/EPEL.repo/glusterfs-epel.repo -O /etc/yum.repos.d/glusterfs-epel.repo
  2. 安裝 glusterfs 用戶端的套件
    指令為
    [root@client ~]yum install glusterfs-client -y
  3. 建立掛載點
    指令為
    [root@client ~]mkdir /mnt/glusterfs/data –p
  4. 掛載虛擬檔案系統
    指令為
    [root@client ~]mount.glusterfs server1.cyril.idv:/datavol /mnt/glusterfs/data
  5. 確認掛載的結果
    指令為
    [root@client ~]mount –t fuse.glusterfs
    執行後應可看到類似下列訊息
    server1.cyril.idv:/datavol on /mnt/glusterfs/data type fuse.glusterfs (rw,default_permissions,allow_other,max_read=131072)
  6. 設定開機自動掛載
    修改 /etc/fstab,加上下列設定
    server1.cyril.idv:/datavol /mnt/glusterfs/data glusterfs defaults 0 0
  7. 重新開機
    指令為
    [root@client ~]sync; shutdown –r now
  8. 確認開機自動掛載是否成功
    指令同樣為
    [root@client ~]mount –t fuse.gluserfs
    執行後應可看到類似下列訊息
    server1.cyril.idv:/datavol on /mnt/glusterfs/data type fuse.glusterfs (rw,default_permissions,allow_other,max_read=131072)
  9. 測試檔案的操作
    指令為
    [root@client ~]echo "Hello GlusterFS" >> /mnt/glusterfs/data/test0
  10. 確認檔案的同步複製
    我們可以同時在 server1 與  server2 的 /data 下看到 test0 這個檔案,而且內容皆為 "Hello GlusterFS"。
至此,我們已經完成利用 glusterfs 建立目錄即時同步的架構。接下來我們將透過更多的例子,看看此一架構可以提供何種程度的高可用性。
註3:如果我們直接在 server1 或 server2 上針對檔案系統 (也就是 /data) 進行異動的操作 (如新增檔案),將無法對達到同步的效果,甚至連用戶端也無法接受到這些異動。

第四階段:高可用性測試
  1. 關閉 server1
    指令為
    [root@server1 ~]sync;shutdown –h now
  2. 修改檔案內容
    指令為
    [root@client ~]echo "Hello GlusterFS Replication" >> /mnt/glusterfs/data/test0
    雖然 server1 已經關機,但是我們依舊可以對原本掛載的目錄進行讀寫,其讀寫的目的地會自動變成 server2。
  3. 確認 server2 上檔案 test0 的內容
    指令為
    [root@server2 ~]# cat /data/test0
    執行後應可看到下列訊息
    Hello GlusterFS
    Hello GlusterFS Replication
  4. 開啟 server1
  5. 確認 server1 上檔案 test0 的內容
    指令為
    [root@server1 ~]# cat /data/test0
    執行後應可看到下列訊息
    Hello GlusterFS
    Hello GlusterFS Replication
    註4:glusterfs 具備自動修復 (heal) 的功能,如果目錄下的資料較多,自動修復所需的時間也會跟著增長。在自動修復期間雖然服務端的檔案可能會有不一致的現象發生,但是 glusterfs 會確保用戶端只會看到最新的檔案。
  6. 再次關閉 server1
    指令同樣為
    [root@server1 ~]sync;shutdown –h now
  7. 卸載用戶端上的目錄掛載
    指令為
    [root@client ~]umount /mnt/glusterfs/data
  8. 再次掛載目錄
    指令為
    [root@client ~]mount -a
    執行後應可看到下列訊息
    Mount failed. Please check the log file for more details.      
    註5:掛載失敗的原因在於 server1 已經關機,所以用戶端自然無法進行連結。雖然 glusterfs 在掛載後的讀寫具備自動切換的能力,但是掛載時的動作卻無法自動切換。
  9. 修改掛載的參數,使其支援備用掛載主機
    修改 /etc/fstab,將原本
    server1.cyril.idv:/datavol /mnt/glusterfs/data glusterfs defaults 0 0
    修改為
    server1.cyril.idv:/datavol /mnt/glusterfs/data glusterfs defaults,backupvolfile-server=server2.cyril.idv 0 0
  10. 再次掛載目錄
    指令為
    [root@client ~]mount –a
  11. 確認掛載結果
    指令為
    [root@client ~]mount –t fuse.glusterfs      
    執行後應可看到下列訊息
    server2.cyril.idv:/datavol on /mnt/glusterfs/data type fuse.glusterfs (rw,default_permissions,allow_other,max_read=131072)
    註6:在此我們可以看到掛載主機已經從 server1 改為 server2了。透過此一參數,可以避免 glusterfs 在掛載目錄時因為單一主機失效而掛載失敗。
透過 glusterfs,我們可以輕鬆建立一個可自動同步且具備高可用性的目錄。更棒的是,如果未來我們發現這個目錄有空間不足或效能低落的情況發生,只要加上更多的 brick,就可以直接在線上進行擴充的工作,不用再擔心因為資料轉移所造成的過多時間花費與停機時間了。

2013年4月26日 星期五

[個人意見] ALE 了沒 - The Ugly Truth about ALE

3040508093_a66a92cc59_o對資安從業人員來說,一個揮之不去的困擾就是如何評估一個計畫或產品的必要性。必要性除了從功能面著手,更重要的是財務面的考量。把錢花在刀口上是所有員工的責任,更何況當我們要向 CEO 爭取支持時,如果提不出相關的證明,就算 CEO 可以接受"威脅"形式的溝通,到 CFO 那關也往往只能等著被打槍。所以諸如 ROI  (Return on Investment)、TCO (Total Cost of Ownership) 等指標,就變成我們用來將相關需求與財務做整合的可用工具。
除了 ROI 與 TCO,還有一種更常見的評量工具,我們稱之為 Annualized Loss Expectancy,簡稱 ALE。ALE 不但在實務上很常見,更是許多資安認證的必考題。首先,我們來看 ALE 的計算公式:
ALE = SLE * ARO
Annualized Loss Expectancy = Signle Loss Expectancy * Annualized Rate of Occurrence

每年損失的期望值 = 單一事件損失期望值 * 每年發生的機率
舉例來說,假設我們公司平均每五年發生一次中毒事件,每次造成的損失 (人力成本、業務損失) 為 100000 元,那麼病毒這個威脅來源的 ALE 就是
100000 元 * 1/5 = 20000 元
ALE  的觀念與計算都相當簡單。此外,通常安全計畫或產品的導入並不會增加受益,所以 ROI 不容易套用。而 TCO 則因為沒有辦法與"成效"做關連,所以說服力也往往不足。這些因素的加總,使得 ALE 很受到資安從業人士的歡迎。但是當我們認真思考後,就會發現 ALE 的計算往往只是落入無意義的數字遊戲,對事情的判斷並沒有任何幫助。
ALE 本身就是一種根據統計而來的計算。面對統計數據,我們必須先釐清的是何謂有效的數據來源?不管是 SLE 或 ARO,是要參考全世界的企業?還是國內的企業?是要參考所有產業的企業?還是只要參考與企業本身相同產業的企業?甚至只要考慮自己企業本身的歷史數據
當我們選定一個數據來源時,就會發現下一個問題,那就是樣本數不夠多,甚至是無法取得任何實際的樣本數據通常特定種類資安事件的發生次數都不會很頻繁,一個企業可能一年發生個一兩次就很可怕了。高於此發生頻率的問題,我相信不需要採用 ALE 的方式,光用威脅就可以讓 CEO/CFO 屈服了。樣本不夠多,統計數據的參考價值就很低,這就是統計的天性。就算我們拿全世界企業的數據來參考,就真的拿的到真實的數據嗎?有多少企業願意誠實公布這樣的數據?又有多少企業能夠在資安事件發生時都確實掌握了?ARO 如此、SLE 更是如此。別忘了 SLE 可是損失的期望值,必須知道損失的機率分布才能算的出。好吧,就算我們把 SLE 簡化成損失的平均值,問題也沒有變得比較好回答。
所以,SLE 與 ARO 變成了自由心證的數字。而不幸的是,因為 ALE 的計算就是這麼簡單,只要把 SLE 乘上 ARO 就成了。所以一旦"不小心"將 SLE 高估了兩倍,ALE 也就變成兩倍,對於財務可行性的判斷結果可能也因此有了翻盤的影響。
當然,我們也別看輕 ALE。畢竟 ALE 除了在某些場合確實能夠幫助我們分析財務面的可行性,甚至在更多時機能夠成為我們用來說服 CEO/CFO 的溝通工具。只是,在這些數字背後所代表的意義,其實只是我們內心主觀的偏見。而這,正是 ALE 的 Ugly Truth

相關連結:

2013年4月23日 星期二

[從電影看資安] 確實做好 NAC,電腦亂插免驚係 - 空降危機

作為 007 電影系列的第 23 部作品,空降危機中充滿了各種"老"的感覺。007 老了,MI6 也老了。不過老歸老,不放棄的精神卻是未曾減少。M 夫人為了 MI6 的未來,勇敢面對政客的質疑。而 007 也為了維持國家安全,必須面對自己因為受傷與年紀漸長所帶來的技巧生疏。除了無形的老,連片中的道具與武器,也都極力配合著"老"這個觀念。古董車、老式無線電發射器、獵槍、取代被炸毀的 MI6 總部的地下碉堡、007 的老家、甚至是史上年紀最大的 007 女郎,都充滿了濃濃的復古意味。當然,薑是老的辣,007 就利用這群老東西,成功的剷除了他的前輩,也就是曾經最受 M 夫人所器重的前情報員-西法。

電影一開始,007 在進行一項任務時發現一個受傷的情報員。 vlcsnap-2013-04-22-19h35m54s14
更糟的是,內含情報員名單的硬碟被搶了。
vlcsnap-2013-04-22-19h36m16s40
M 夫人指示 007 以追回硬碟為優先任務,情報員就放給他死。不管在哪個產業,人人都是可以被犧牲的棋子。
vlcsnap-2013-04-22-19h36m46s111
尚未從超級老爸破壞中復原的伊斯坦堡,這次 007 只是小意思來點摩托車特技。
vlcsnap-2013-04-22-19h38m40s20
市區還是留給超級老爸來破壞,007 負責破壞火車。
vlcsnap-2013-04-22-21h02m05s90
火車即將進入隧道,再抓不到壞人就等著名單外洩了,但是偽 007 女郎顯然對自己的槍法不是很有信心。 vlcsnap-2013-04-22-19h39m02s245
有1就有2,連無名小卒都可以放棄了,007 算什麼?(呃,好像說反了) vlcsnap-2013-04-22-19h39m37s89
果然打中 007 了!James Bond, KIA!
vlcsnap-2013-04-22-19h41m28s193
M 夫人真是衰到家,不但名單外洩,連總部也在自己眼前被炸了。
vlcsnap-2013-04-22-19h45m38s115
007 不虧是 007,大難不死後第一件事就是幹他最拿手的事。
vlcsnap-2013-04-22-19h46m08s73
出門在外的好夥伴-CNN 頻道。
vlcsnap-2013-04-22-19h46m19s19
007 回到 MI6,工作人員帶他到"新"的 MI6 總部。
vlcsnap-2013-04-22-19h49m59s174
新總部是一個外表低調到不行的古老碉堡。
vlcsnap-2013-04-22-19h50m12s51
你不需要說抱歉,只要…你知道的。 vlcsnap-2013-04-22-19h51m17s168
空降危機中少數真正"新"的東西之一-軍需官 Q。
vlcsnap-2013-04-22-19h52m13s205
007 憑著有限的線索來到了一個賭場,沒想到後續"線索"得來全不費工夫。 vlcsnap-2013-04-22-19h53m40s110
既然是線索,當然要好好"探索"一番。
vlcsnap-2013-04-22-19h54m11s84
007 就是這麼真男人,即使知道是陷阱也要上。
vlcsnap-2013-04-22-19h56m28s198
原來是老前輩啊,對他來說,007 只代表一個字-菜。
vlcsnap-2013-04-22-19h57m59s95
只是老前輩做夢也想不到,菜鳥就靠著一個超復古的無線電發射器,引來了一堆救兵。
vlcsnap-2013-04-22-20h00m09s117
英國的直升機就這麼忽然出現在不知名的小島上。 vlcsnap-2013-04-22-20h00m20s243
M 夫人終於知道自己的老巢是被誰炸掉了。
vlcsnap-2013-04-22-20h01m54s149
原來正是她自己的兒子。 vlcsnap-2013-04-22-20h01m38s230
除了逮人,當然也順道接受了壞蛋的電腦設備。 vlcsnap-2013-04-22-20h03m49s28
嗯,連記憶體內的資料都不爽給你看。 vlcsnap-2013-04-22-20h04m02s158
Q 表示,我有離線恐懼症。
vlcsnap-2013-04-22-20h06m04s77
Q 確實是電腦高手。 vlcsnap-2013-04-22-20h06m21s3
Q 表示,我真的好想破解密碼喔。 vlcsnap-2013-04-22-20h03m15s186
007表示,我才是主角,猜密碼這種功勞還是交給我。
vlcsnap-2013-04-22-21h26m13s39
雖然 007 猜對了密碼,但是沒多久 MI6 的系統就發出警告。vlcsnap-2013-04-22-20h06m43s232
Q 還在一頭霧水中。
vlcsnap-2013-04-22-20h06m50s40
Q:… vlcsnap-2013-04-22-20h06m59s124
就算是天才,也一樣會成為資安防護中的那顆老鼠屎。
vlcsnap-2013-04-22-20h07m09s242
不是他駭入你們,是你放他進來的,傻B。 vlcsnap-2013-04-22-20h07m53s167
經過一連串的追蹤後,007 選擇回到老家 (空降莊園?) 當做最後決戰的地點。
vlcsnap-2013-04-22-20h08m51s236
小鬼當家老灰啊版。
vlcsnap-2013-04-22-20h09m20s7
密密麻麻的壞蛋,但是他們不知道要分散跟尋找掩護嗎?
vlcsnap-2013-04-22-20h09m29s100
一陣熱情如火的纏綿。 vlcsnap-2013-04-22-20h27m03s136
愛你愛到殺死你。
vlcsnap-2013-04-22-21h40m20s13
再冷酷的人,臨死前也難免會感傷。
vlcsnap-2013-04-22-20h10m39s23
果然 M 夫人才是 007 最愛的 007 女郎。(無誤)
vlcsnap-2013-04-22-20h12m01s81
第24、25部 007 作品已經在籌劃中囉,你演不演?
vlcsnap-2013-04-22-20h14m07s62
007表示,有錢賺當然演啊。哈利波特系列已經結束了,你也一起來這邊賺吧。
vlcsnap-2013-04-22-20h14m25s244
在電影中,聰明如軍需官Q也犯下了一個不可原諒的大錯,那就是隨意將壞人的電腦接上內部網路。我們都知道,路邊撿來的隨身碟不可亂插,路邊撿來的電腦 (如果你撿得到的話) 當然也不可以隨意接上內部網路,更何況還是壞人的電腦。除了路邊撿來的電腦,員工、協力廠商、訪客的智慧型手機、平板電腦、筆電,都可能因為防護力不足而成為內部資安威脅的來源。更遑論還有所謂的商業間諜,隨時對藏於企業內部網路當中的珍貴資訊虎視眈眈。
因應這些行動裝置所帶來的方便性與危險性,每個企業都應該訂定完善的 BYOD 政策,以有效管理因這些裝置所帶來的風險。但是政策再好,如果只限於管理上的政策 (如規定不能隨意將個人手機接入公司的網路),終究只能防君子 (而且還是腦袋清楚的君子),而無法防堵小人。所以搭配必要的技術性政策,如導入NAC,將可以大幅提高管理性政策的有效性,達到更即時且全面的效果。正所謂樹多有枯枝,人多有白痴,光依靠管理性政策來保護內部網路的安全,只要一個白痴就可以讓企業產生莫大的資安威脅。如果 MI6 有確實導入 NAC 機制,那麼壞人的電腦根本就無法對 MI6 內部網路進行任何的存取動作,更別說要入侵 MI6 的重要伺服器了。如此一來,後續故事應該會有完全不同的發展,或許 M 先生也只能先回去繼續當他的佛地魔了。

About