資料庫系統的安全性涵蓋多個層面,特別是當資料庫伺服器允許客戶端透過網路連線時,客戶端連線的安全性直接影響MySQL整體防護能力。本文將系統性探討密碼管理、連線加密、服務帳號權限、資料目錄保護及關鍵啟動參數等核心安全議題。
使用mysql、mysqladmin等客戶端工具連線MySQL伺服器時,需提供密碼。雖然可在命令列直接帶入密碼(如mysql -u root -pmypass),但這極度危險:在Unix系統下執行ps -aux | grep mysql,或在Windows開啟工作管理員,皆可在進程列表中明文看到密碼。
正確做法:僅使用-p參數讓客戶端提示輸入密碼(mysql -u root -p),或透過選項檔案僅指定password選項而不存儲實際密碼,由客戶端互動式輸入。
為防止網路傳輸被竊聽,建議使用SSH隧道加密客戶端與遠端MySQL伺服器的連線。操作步驟:
localhost此方式將MySQL流量封裝在SSH加密通道中,有效防禦中間人攻擊與流量嗅探。
切勿以Unix root使用者身分運行mysqld。MySQL可由任何使用者啟動,建議建立專用mysql系統帳號。此舉不影響MySQL內部root帳號(MySQL用戶名與系統用戶名無關)。可修改mysql.server啟動腳本或使用選項檔案指定非root用戶啟動。
MySQL透過mysql資料庫授權表實現靈活權限系統,但若伺服器主機其他使用者擁有資料目錄直接存取權,資料仍面臨風險。核心原則:僅允許運行mysqld的專用帳號擁有資料目錄讀寫權限。
GRANT、SET PASSWORD等語句會記錄至一般/更新日誌,攻擊者若具日誌讀取權,可搜尋GRANT或PASSWORD關鍵字獲取明文密碼.MYD、.MYI、.frm檔案至另一MySQL實例即可輕易讀取資料# 切換root
su
# 設定擁有者為mysql:root(遞迴)
chown -R mysql:root DATADIR
# 僅擁有者可讀寫執行
chmod -R go-rwx DATADIR
需平衡服務自動啟動與安全性:資料目錄授予Administrators群組讀寫權(支援服務啟動),同時授予SYSTEM帳號讀寫權(確保網路連線正常)。建議生產環境優先部署Linux以獲更佳安全性與授權彈性。
| 參數 | 安全影響 |
|---|---|
--secure(--skip-name-resolve反義) | 驗證IP反向解析一致性,防止主機偽裝;MySQL 3.22+預設啟用並快取主機名 |
--skip-grant-tables | 極度危險:完全繞過權限系統,所有人擁有所有資料庫完全存取權 |
--skip-name-resolve | 停用主機名解析,授權表Host欄僅接受IP或localhost |
--skip-networking | 禁用TCP/IP連線,僅允許Unix Socket連線(不適用MIT-pthreads系統) |
生產環境建議:啟用--secure、避免--skip-grant-tables、視網路架構決定是否啟用--skip-networking。