搜尋此網誌

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 的包裝,可以讓這些原本使用明文傳輸的協定達到加密的效果,以避免資料在傳輸過程中遭到窺視,大大提昇了傳輸時的安全性。

About