文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  安全指南

8.1.1 安全指南

任何在連線至網際網路的電腦上使用 MySQL 的人,都應閱讀本節,以避免最常見的安全錯誤。

在討論安全性時,必須考量完全保護整個伺服器主機(而不僅僅是 MySQL 伺服器)免受所有類型的適用攻擊:竊聽、變更、重播和阻斷服務。我們在這裡不涵蓋可用性和容錯的所有方面。

MySQL 對於使用者可能嘗試執行的所有連線、查詢和其他操作,使用基於存取控制列表 (ACL) 的安全性。MySQL 用戶端與伺服器之間也支援 SSL 加密連線。這裡討論的許多概念並非 MySQL 所特有;相同的通用概念幾乎適用於所有應用程式。

執行 MySQL 時,請遵循這些指南

  • 絕對不要讓任何人(MySQL root 帳戶除外)存取 mysql 系統資料庫中的 user 表格! 這點至關重要。

  • 了解 MySQL 存取權限系統如何運作(請參閱第 8.2 節「存取控制與帳戶管理」)。使用 GRANTREVOKE 陳述式來控制對 MySQL 的存取。不要授與超過必要的權限。絕不將權限授與所有主機。

    檢查清單

    • 嘗試 mysql -u root。如果您能夠在未被要求輸入密碼的情況下成功連線至伺服器,任何人都可以以具有完整權限的 MySQL root 使用者身分連線至您的 MySQL 伺服器!請查看 MySQL 安裝說明,特別注意關於設定 root 密碼的資訊。請參閱第 2.9.4 節「保護初始 MySQL 帳戶安全」

    • 使用 SHOW GRANTS 陳述式來檢查哪些帳戶可以存取哪些內容。然後使用 REVOKE 陳述式來移除那些不必要的權限。

  • 請勿將明文密碼儲存在您的資料庫中。如果您的電腦遭到入侵,入侵者可以取得完整的密碼列表並加以利用。相反地,請使用 SHA2() 或其他單向雜湊函數,並儲存雜湊值。

    為了防止使用彩虹表還原密碼,請勿直接對明文密碼使用這些函數;而是選擇一些字串作為鹽值 (salt),並使用 hash(hash(密碼)+鹽值) 的值。

  • 假設所有密碼都會受到使用已知密碼列表的自動破解嘗試,以及利用關於您的公開資訊(例如社群媒體貼文)的針對性猜測。請勿選擇容易破解或猜測的項目作為密碼,例如字典中的單字、專有名詞、運動隊伍名稱、縮寫或廣為人知的片語,特別是如果它們與您相關。使用大寫字母、數字替換和添加以及特殊字元,如果以可預測的方式使用,也沒有幫助。此外,請勿選擇您在任何地方看過的範例密碼,或其變體,即使它被當作強密碼的範例。

    相反地,請選擇盡可能長且不可預測的密碼。這並不表示組合必須是難以記住和重現的隨機字元字串,儘管如果您有密碼管理軟體可以產生和填寫此類密碼並安全地儲存它們,這是一個好方法。包含多個單字的密碼短語易於創建、記住和重現,並且比典型的使用者選定的、由單個修改過的單字或可預測的字元序列組成的密碼安全得多。若要建立安全的密碼短語,請確保其中的單字和其他項目不是已知的片語或引言,不會以可預測的順序出現,最好彼此之間完全沒有任何關聯。

  • 投資購買防火牆。這可以保護您免受任何軟體中至少 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 連接埠轉送來建立用於通訊的加密(和壓縮)通道。

  • 學習使用 tcpdumpstrings 實用程式。在大多數情況下,您可以透過發出如下命令來檢查 MySQL 資料串流是否未加密

    $> tcpdump -l -i eth0 -w - src or dst port 3306 | strings

    這在 Linux 下有效,並應在其他系統下稍作修改即可運作。

    警告

    如果您沒有看到明文資料,並不總是表示資訊實際上已加密。如果您需要高安全性,請諮詢安全專家。