遠程訪問
將端口3306添加到防火牆:
Centos 7爲firewall
firewall-cmd --permanent --add-port=13306/tcp #親測可用
開啓centos 6 防火牆3306端口方法
1)打開防火牆配置文件
vi /etc/sysconfig/iptables
2)增加下面一行
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
service iptables restart
安全配置
mysql中存在4個控制權限的表,分別爲
1. mysql.USER表
2. mysql.DB表
3. mysql.TABLES_PRIV表
4. mysql.COLUMNS_PRIV表
要注意的是,Mysql中有一個數據庫”information_schema”,似乎裏面保存的也是一些權限信息,但是要明白的是,這個數據庫”information_schema”是爲系統管理員提供元數據的一個簡便方式,它實際上是一個視圖,可以理解爲對Mysql中的一個信息的封裝,對於Mysql主程序來說,身份認證和授權的信息的來源只有一個,就是”mysql”。登錄的時候,mysql權限表的驗證過程爲:
1. 先從user表中的:
1) Host
2) User
3) Password 這3個字段中判斷連接的ip、用戶名、密碼是否存在,存在則通過驗證。
2. 通過身份認證後,進行權限分配,按照:
1) user
2) db
3) tables_priv
4) columns_priv 的順序進行驗證。 即先檢查全局權限表user,如果user中對應的權限爲Y,則此用戶對所有數據庫的權限都爲Y,將不再檢查db,tables_priv,columns_priv 如果全局權限表user對應的權限爲N,則到db表中檢查此用戶對應的具體數據庫,並得到db中爲Y的權限 如果db中爲N,則檢查tables_priv中此數據庫對應的具體表,取得表中的權限Y,以此類推。逐級下降
Mysql的賬戶權限優先級順序是:
user->db->tables_priv->columns_pri
對於Mysql中的賬戶權限相關的安全配置,總結如下:
1. 針對每個網站建立一個單獨的賬戶
2. 爲每個網站單獨建立一個專屬數據庫(雖然DEDE、DZ普通採用表前綴的方法來實現"一庫多站",但好的做法還是"一庫一站")
3. 按照user->db->tables_priv->columns_pri的順序進行細粒度的權限控制
4. 爲每個用戶單獨配置一個專屬數據庫,保證當前用戶的所有操作只能發生在它自己的數據庫中,防止SQL注入發生後,黑客通過注入點訪問到系統表
對Mysql的訪問IP的限制,可以從應用層和主機層來分別達到目的
1. 主機層:
1) windows可以通過windows防火牆
2) Linux下可以通過iptables //Centos 6及以下爲iptables 來限制允許訪問mysql端口的IP地址 //只允許指定的IP進行訪問 iptables -A INPUT -p tcp -s xxxx.xxxx.xxxx.xxxx/24 --dport 3306 -j ACCEPT iptables -A INPUT -p tcp -s xxxx.xxxx.xxxx.xxxx/24 --dport 3306 -j ACCEPT .. iptables -P INPUT DROP
可以看到,這種方法的缺點是硬編碼導致靈活性低,如果mysql的默認端口3306被修改了(例如8890),則這條iptables規則也需要相應的修改
對於mysql運行賬號的磁盤ACL配置,我們可以遵循以下原則
1. mysql運行賬號需要給予程序所在目錄的讀取權限,以及data目錄的讀取和寫入權限,保證mysql的正常運行
2. 不容許給予其他目錄的寫入和執行權限,特別是有網站的,這可以有效防禦針對mysql的提權、或者webshell提權
1) udf提權
2) 系統關鍵目錄、註冊表寫入啓動文件
3. 取消mysql運行賬戶對於cmd,sh等一些程序的執行權限,這可以防禦當mysql核心帳號被黑客獲取後進一步提權
1) root賬戶被泄露 由於對cmd、sh等關鍵程序進行了權限控制,黑客無法繼續深入操作系統提權
所以針對mysql程序帳號進行磁盤ACL控制,防止mysql越權讀/寫/執行非mysql目錄下的文件。
目前基於SQL注入檢測、防禦的的數據庫防火牆大概有以下幾個:
1. 安華金和數據庫防火牆系統(Xsecure-DBFirewall)
2. Snort入侵檢測系統 能針對指定端口進行正則特徵匹配方式的SQL注入檢測
3. Java/J2EE 過濾器 對於J2ee的WEB應用來說,可以在HTTP請求上部署過濾器,並將SQL注入檢測規律寫在過濾器中
4. druid-sql-wall開源SQL檢測、阻斷系統
mysqld安全相關啓動選項
1. --local-infile[={0|1}] 如果用–local-infile=0啓動服務器,則客戶端不能使用LOCAL in LOAD DATA語句,防止基於注入的直接文件讀取數據泄漏
2. --old-passwords 強制服務器爲新密碼生成短(pre-4.1)密碼哈希。當服務器必須支持舊版本客戶端程序時,爲了保證兼容性這很有用。
3. (OBSOLETE) –safe-show-database
1) 在MySQL 5.1以前版本的MySQL中,該選項使SHOW DATABASES語句只顯示用戶具有部分權限的數據庫名
2) 在MySQL 5.1中,該選項不再作爲現在的 默認行爲使用,有一個SHOW DATABASES權限可以用來控制每個賬戶對數據庫名的訪問。
4. --safe-user-create 如果啓用,用戶不能用GRANT語句創建新用戶,除非用戶有mysql.user表的INSERT權限。如果你想讓用戶具有授權權限來創建新用戶,你應給用戶授予下面的權限: mysql> GRANT INSERT(user) ON mysql.user TO "user_name"@"host_name";這樣確保用戶不能直接更改權限列,必須使用GRANT語句給其它用戶授予該權限。
5. --secure-auth 不允許鑑定有舊(pre-4.1)密碼的賬戶。
6. --skip-grant-tables 這個選項導致服務器根本不使用權限系統。這給每個人以完全訪問所有的數據庫的權力,這個選項常常在發生了忘記了msyql密碼的情況使用這個方式在本機"無密碼登錄mysql"通過執行mysqladmin flush-privileges或mysqladmin eload命令,或執行FLUSH PRIVILEGES語句,你能告訴一個正在運行的服務器再次開始使用授權表。
忘記密碼操作流程:
a:kill mysql 進行, ps -ef |grep mysql 或是在數據目錄下localhost.localdomain.pid的文件中查看進程號
b:在mysql/bin下啓動mysqld_safe -uroot --skip-grant-tables
c:update mysql.user set password=passwrod('123456') where user='root' and host='%'
d:flush privileges 因是爲直接更新的表,所以需要重新加載權限表
7. --skip-name-resolve 主機名不被解析。所有在授權表的Host的列值必須是IP號或localhost 8. --skip-networking 在網絡上不允許TCP/IP連接。所有到mysqld的連接必須經由Unix套接字進行 9. --skip-show-database 使用該選項,只允許有SHOW DATABASES權限的用戶執行SHOW DATABASES語句,該語句顯示所有數據庫名。不使用該選項,允許所有用戶執行SHOW DATABASES,但只顯示用戶有SHOW DATABASES權限或部分數據庫權限的數據庫名。請注意全局權限指數據庫的權限。
10.--ssl
允許SSL連接,還必須指定--ssl-ca、--ssl-cert 和--ssl-key選項,如果不想啓用,則可以指定爲--skip-ssl或--ssl=0,例如:
grant select on *.* to 'user'@'host' require ssl;
--ssl-ca=file_name含可信ssl ca的清單文件的路徑
--ssl-cert=file_name ssl證書文件名,用於建立安全連接
--ssl-key=file_name ssl密鑰文件名,用於建立安全連接