1、安裝完MySQL後
修改root用戶密碼
5.5以前,rpm包安裝完MySQL後,root用戶密碼爲空
5.6中,rpm包安裝完MySQL後,會隨機生成一個root密碼,保存在/root/.mysql_secret
5.7以後,使用mysqld --initialize初始化時,默認會自動生成隨機密碼,並且不創建除root@localhost 外的其他賬號,也不創建test庫;
2、正確授權
mysql庫中有4張權限表,user、db、tables_priv、columns_priv,分別對應用戶密碼、用戶對數據庫的權限、對錶的權限、對列的權限。
當一個用戶向MySQL發起請求時,首先會從user表中驗證host、user、password,然後再依次驗證db、tables_priv、columns_priv,驗證過程中,如果db表中對應權限爲Y,則此用戶對某個庫的權限全爲Y,將不再驗證tables_priv和columns_priv。
對於MySQL中的賬戶權限相關的安全配置,總結如下:
針對每個網站建立一個單獨的賬戶
爲每個網站單獨建立一個專屬數據庫
按照user->db->tables_priv->columns_pri的順序進行細粒度的權限控制
爲每個用戶單獨配置一個專屬數據庫,保證當前用戶的所有操作只能發生在它自己的數據庫中,防止SQL注入發生後,***通過注入點訪問到系統表
如果有必要,改變MySQL的root用戶的用戶名(在user表中更改)
3、MySQL網絡完全配置
禁止root用戶遠程登錄
防火牆設置
更改默認端口(默認3306),可以從一定程度上防止端口掃描工具的掃描
限制單個用戶的連接數量:
[mysqld]
max_user_connections 20
4、文件權限及文件安全
使用非root用戶啓動MySQL服務
限制啓動MySQL的用戶的文件權限,同時確保該用戶對MySQL的數據文件等有讀寫權限
可以使用chroot更改根目錄,防止非root用戶訪問到一些敏感文件,比如:/etc/passwd
不要給非root用戶授予process和super權限,mysqladmin processlist和show processlist命令會查看到任何用戶執行的命令,這可能看到其他用戶執行的update user set password=...;命令,super權限可以終止會話、更改系統參數等
不要對錶使用軟連接(--skip-symbolic-links參數用來禁用這一功能),表的軟連接只有MyISAM支持,因爲開啓表軟連接後(尤其是對於使用系統root用戶啓動MySQL服務的),MySQL用戶就可以使用mysqld來刪除、重命名數據文件所在位置以外的文件了
如果plugin文件夾可以被MySQL server寫,那麼用戶就可以使用select ... into dumpfile命令把可執行代碼寫入到裏面,可以通過把plugin_dir參數對應的路徑設爲只讀以及調整--secure-file-priv參數來提高安全性
不要給非root用戶授予文件讀寫權限,防止使用load data local infile來提取本地文件(比如提取/etc/passwd裏的信息,會對系統安全造成威脅)
[mysqld]
local-infile=0
5、如果有必要,可以刪除~/.bash_history文件,防止讀取歷史命令
# rm .bash_history .mysql_history
# ln -s /dev/null .bash_history
# ln -s /dev/null .mysql_history