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