Mysql 安全加固經驗總結

本文為部落客原創,轉載請註明出處:

1.內網部署Mysql

  mysql 資料庫在使用過程中,需要給服務提供連接和訪問的許可權,而不需要進行公網連接和訪問,所以在安全環境和現網環境部署mysql 的時候,在沒有公網許可權的主機上進行部署,讓服務通過內網的地址進行連接和訪問;

  部署在無公網的好處,可以避免了公網的攻擊;MySQL只對內網開放

2. 使用獨立用戶運行msyql

  絕對不要作為使用root用戶運行MySQL伺服器。這樣做非常危險,因為任何具有FILE許可權的用戶能夠用root創建文件(例如,~root/.bashrc)。mysqld拒絕使用root運行,除非使用–user=root選項明顯指定。應該用普通非特權用戶運行mysqld。正如安裝過程一樣,為資料庫建立獨立的linux中的mysql賬戶,該賬戶用來只用於管理和運行MySQL。

  要想用其它用戶啟動mysqld,,增加user選項指定/etc/my.cnf選項文件或伺服器數據目錄的my.cnf選項文件中的[mysqld]組的用戶名。

#vim /etc/my.cnf
[mysqld]
user=mysql
該命令使伺服器用指定的用戶來啟動,無論你手動啟動或通過mysqld_safe或mysql.server啟動,都能確保使用mysql的身份。也可以在啟動資料庫加上user參數。
# /usr/local/mysql/bin/mysqld_safe --user=mysql &

  作為其它linux用戶而不用root運行mysqld,你不需要更改user表中的root用戶名,因為MySQL賬戶的用戶名與linux賬戶的用戶名無關。確保mysqld運行時,只使用對資料庫目錄具有讀或寫許可權的linux用戶來運行。

3.為不同業務創建不同的用戶,並設置不同的密鑰

  永遠不要使用管理員許可權的資料庫連接,為每個應用使用單獨的許可權有限的資料庫連接。

  添加用戶,並設置用戶登錄密碼;

  且密碼需要滿足複雜度的要求:盡量並且不要使用固定密碼,實行每個用戶單獨密碼;長度在16位以上 ,包含大小寫字母,數字,特殊符號等;且需要包含三種類型;

create user user_name@'ip'  identified by 'user-password';

  查看用戶,ip 及 密鑰

 SELECT user, host, authentication_string FROM user; 

4.指定mysql可訪問用戶ip和許可權

Grant 【privileges】 ON databasename.tablename TO 'username'@'host';

  參數說明:

    1、privileges:用戶的操作許可權,如SELECT,INSERT,UPDATE等,如果要授予所的許可權則使用ALL;

    2、databasename:資料庫名;

    3、tablename:表名,如果要授予該用戶對所有資料庫和表的相應操作許可權則可用表示,如.*。

  用以上命令授權的用戶不能給其它用戶授權,如果想讓該用戶可以授權,用以下命令:

GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

  查看mysql 可訪問的用戶,ip

 SELECT user, host FROM user; 

5. 防sql注入

  永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和 雙”-“進行轉換等。

  永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。

6. 線上操作

  修改或刪除數據前先備份,先備份,先備份(重要事情說三遍)

  線上變更一定要有回退方案

7.架構

  選擇合適的高可用架構

8.其他

  DDL操作要謹慎,對於大表的alter操作最好使用 pt-online-schema-change

  具體可看這篇: //www.cnblogs.com/zjdxr-up/p/15564339.html