任何在連線至網際網路的電腦上使用 MySQL 的人都應閱讀本節,以避免最常見的安全性錯誤。
在討論安全性時,有必要考慮完全保護整個伺服器主機(而不僅僅是 MySQL 伺服器)免受所有類型的適用攻擊:竊聽、竄改、重播和阻斷服務。我們在這裡不涵蓋可用性和容錯的所有方面。
MySQL 對於使用者可以嘗試執行的所有連線、查詢和其他操作,使用基於存取控制清單 (ACL) 的安全性。MySQL 用戶端和伺服器之間也支援 SSL 加密連線。這裡討論的許多概念並非 MySQL 獨有;相同的通用概念幾乎適用於所有應用程式。
執行 MySQL 時,請遵循以下指南
絕對不要讓任何人(MySQL
root
帳戶除外)存取mysql
系統資料庫中的user
表格! 這至關重要。了解 MySQL 存取權限系統如何運作(請參閱 第 8.2 節,「存取控制和帳戶管理」)。使用
GRANT
和REVOKE
陳述式來控制對 MySQL 的存取。不要授予超過必要的權限。絕對不要向所有主機授予權限。檢查清單
嘗試
mysql -u root
。如果您能夠在未要求輸入密碼的情況下成功連線至伺服器,那麼任何人都可以使用完整權限以 MySQLroot
使用者身分連線至您的 MySQL 伺服器!請檢閱 MySQL 安裝說明,特別注意設定root
密碼的相關資訊。請參閱 第 2.9.4 節,「保護初始 MySQL 帳戶安全」。使用
SHOW GRANTS
陳述式來檢查哪些帳戶具有哪些存取權限。然後使用REVOKE
陳述式來移除那些不必要的權限。
請勿將明文密碼儲存在資料庫中。如果您的電腦遭到入侵,入侵者可以取得完整的密碼列表並加以利用。請改用
SHA2()
或其他單向雜湊函數,並儲存雜湊值。為了防止使用彩虹表進行密碼恢復,請勿對明文密碼使用這些函數;相反地,請選擇一個字串作為鹽 (salt),並使用 hash(hash(password)+salt) 的值。
假設所有密碼都會受到自動破解的嘗試,使用已知密碼列表,以及利用公開可用的關於您的資訊(例如社群媒體貼文)進行針對性的猜測。請勿選擇由容易破解或猜測的項目組成的密碼,例如字典中的單字、專有名稱、運動隊伍名稱、縮寫或常用短語,尤其是如果它們與您相關的話。使用大寫字母、數字替換和添加以及特殊字符,如果以可預測的方式使用,也無濟於事。另外,請勿選擇任何您在任何地方看過的範例密碼,甚至是它的變體,即使它被當作強密碼的範例展示。
相反地,請選擇盡可能長且不可預測的密碼。這並不意味著該組合需要是一個難以記憶和重現的隨機字串,儘管如果您有密碼管理器軟體可以生成和填寫此類密碼並安全地儲存它們,這是一個好方法。包含多個單詞的密碼短語易於創建、記憶和重現,並且比典型的使用者選擇的由單個修改過的單詞或可預測的字符序列組成的密碼安全得多。要創建安全的密碼短語,請確保其中的單詞和其他項目不是已知的短語或引語,它們不會以可預測的順序出現,並且最好彼此之間沒有任何先前的關係。
投資購買防火牆。這可以保護您免受任何軟體中至少 50% 的各種漏洞攻擊。將 MySQL 放在防火牆後面或非軍事區 (DMZ) 中。
檢查清單
嘗試使用
nmap
之類的工具從網際網路掃描您的連接埠。MySQL 預設使用連接埠 3306。此連接埠不應從不受信任的主機存取。作為檢查您的 MySQL 連接埠是否開啟的簡單方法,請從一些遠端電腦嘗試以下命令,其中server_host
是執行 MySQL 伺服器的主機的主機名稱或 IP 位址$> telnet server_host 3306
如果 telnet 掛起或拒絕連線,則表示連接埠已封鎖,這就是您想要的狀態。如果您獲得連線和一些垃圾字符,則表示連接埠已開啟,應該在防火牆或路由器上關閉,除非您確實有充分的理由保持其開啟。
存取 MySQL 的應用程式不應信任使用者輸入的任何資料,並且應使用適當的防禦性程式設計技術編寫。請參閱第 8.1.7 節,「用戶端程式設計安全指南」。
請勿透過網際網路傳輸明文(未加密)資料。這些資訊可以被任何有時間和能力攔截並將其用於自己目的的人存取。請改用加密協定,例如 SSL 或 SSH。MySQL 支援內部 SSL 連線。另一種技術是使用 SSH 連接埠轉發來為通訊建立加密(和壓縮)通道。
學習使用 tcpdump 和 strings 工具。在大多數情況下,您可以透過發出類似以下的命令來檢查 MySQL 資料流是否未加密
$> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
這在 Linux 下適用,並且在其他系統下稍作修改也應適用。
警告如果您沒有看到明文資料,這並不總是意味著該資訊實際上已加密。如果您需要高安全性,請諮詢安全專家。