搜尋此網誌

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 日誌檔提供系統/網站管理員有別於標準存取與錯誤日誌的資訊,不管在面對有心或是無意的異常存取行為,都是一項有力的工具。

About