Mysql的默認安裝參數是mysql性能最好的配置方法,但會造成數據部安全,且服務器也面臨被***的風險,也有可能會在短時間內,出現一些性能的問題
這邊文章從不同的角度去配置mysql的參數,提高安全的方法,你不能去限制別人而已***你的mysql db server,但你可以讓他***和破解浪費更多的時間
一:用戶和密碼設置
剛安裝好的mysql是沒有密碼的,只要能登陸到server主機的都可以無限制的訪問和操作mysql 數據庫,所以設置密碼,是管理mysql數據庫的第一步
Mysqladmin -u root password “密碼”
因爲mysql中的root是超級用戶,很多***者都是想要獲取root的密碼,根據這點可以更改root的用戶名,降低風險
mysql> update user set user='biao' where user='root';
Query OK, 1 row affected (0.22 sec)
Rows matched: 1 Changed: 1 Warnings: 0
也就是說將root的用戶名更改爲biao,密碼和host都是不變的,之後如果再使用root賬戶登錄,就是會提示你被拒絕的
二:增加用戶和權限的設置
如果需要給開發或者維護人員添加賬號,對權限進行處理,能賦予只讀的就賦予只讀的權限,或者對特定數據庫名給寫的權限,以及對登錄IP也可以進行限制
GRANT ALL ON *.* TO 'root'@'%'; 這樣是對所有的主機都可以訪問,只要root的密碼是正確的
也可以是域名
GRANT ALL ON *.* TO 'root'@'aaa.bbb.com';會解析域名的主機,主機可以訪問mysql db
也可以是網段
GRANT ALL ON *.* TO 'root'@’192.168.1.%';表示192.168.1.1~254的IP地址都可以訪問mysql db
也可以通過linux的iptables 定義訪問策略
三:刪掉mysql的測試庫
[root@test02 ~]# mysql -D test
不需要驗證即可登錄到庫
mysql> drop database test;
Query OK, 1 row affected (0.13 sec)
Test庫不需要任何驗證都可以登錄,不安全,且是測試庫,可以刪掉
四:禁用LOCAL INFILE
禁用”LOAD DATA LOCAL INFILE”命令,這有助於防止非授權用戶訪問本地文件。在PHP應用程序中發現有新的SQL注入漏洞時,這樣做尤其重要。
此外,在某些情況下,LOCAL INFILE命令可被用於訪問操作系統上的其它文件(如/etc/passwd),應使用下現的命令:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1
更簡單的方法是:
mysql> SELECT load_file("/etc/passwd")
爲禁用LOCAL INFILE命令,應當在MySQL配置文件的[mysqld]部分增加下面的參數:
set-variable=local-infile=0
五:移除匿名賬戶和不用的賬戶
有些mysql中,數據庫的用戶名爲空,對應host主機的任何人都可以連接到數據庫,使用命令檢查:
mysql> select user,host from mysql.user where user='';
+------+-----------+
| user | host |
+------+-----------+
| | localhost |
| | test02 |
+------+-----------+
2 rows in set (0.00 sec)
刪除這些存在安全隱患的用戶名
mysql> delete from mysql.user where user='';
Query OK, 2 rows affected (0.00 sec)
如果需要給相應的主機賦予權限,使用grant語句就可以
六:系統權限的管理
在安裝和配置mysql的時候,mysql的主要的配置目錄/data/mysql 數據存儲目錄,/usr/local/mysql是mysql的程序安裝目錄,一般都是將二者的屬主和屬組 賦予給 mysql用戶和mysql組,再設置權限的時候:chmod -R 774 即可,注意:mysql用戶要設置密碼
七:mysql的命令歷史
在用戶訪問的mysql控制檯中,所有的歷史命令都被記錄在~/.mysql_history,如果***者訪問這個文件,就可以獲取到mysql的結構信息
Cat ~/.mysql_history
爲了移除和禁用這個文件,可以將日誌發送到/dev/null
$export mysql_histfile=/dev/null
八:安全補丁
經常關注mysql官網的相關信息,進行補丁的查看和修復
九:mysql啓用日誌
用來記錄mysql實例對某種條件作出響應時寫入的文件,如錯誤日誌文件、二進制日誌文件、慢查詢日誌文件、查詢日誌文件
錯誤文件:通過 show variables like ‘log_error' 查看日誌的放置路徑
Mysql中經常用到的是二進制日誌和redo log,二者簡單的區別在於:
二進制日誌文件會記錄所有與mysql相關的日誌記錄,包括innodb、myisam、bdb等其他存儲引擎日誌,而innodb的redo log只存儲有關的本身事務日誌。
二進制日誌文件,不管日誌的記錄格式是statement或者ROW或者mixed,其記錄的都是一個事務的具體操作。而innodb的redo log記錄的關於每個頁的更改的物理情況
日誌的寫入時間:二進制日誌寫入是在事務提交前進行記錄的,而事務進行的過程中,不斷有重做日誌條目被寫入到redo log中
啓用二進制日誌:
log-bin=mysql-bin 一般是放在了mysql的datadir下
十:mysql的數據備份
Mysql的備份方式有:mysqldump,直接copy文件,以及在線備份工具:xtrabackup
Mysqldump和直接copy文件對 myisam的存儲引擎比較方便,
借用工具:xtrabackup 可以在線備份innodb的數據文件
簡單的描述下二者的操作原理
Mysqldump 採用SQL級別的備份機制,它將數據表導成 SQL 腳本文件,在不同的 MySQL 版本之間升級時相對比較合適,建議加上--opt參數,快速的導入和導出
對於InnoDB,XtraBackup基於InnoDB的crash-recovery功能進行備份。
crash-recovery是這樣的:InnoDB維護了一個redo log,又稱爲 transaction log,也叫事務日誌,它包含了InnoDB數據的所有改動情況。InnoDB啓動的時候先去檢查datafile和transaction log,然後應用所有已提交的事務並回滾所有未提交的事務。
XtraBackup在備份的時候並不鎖定表,而是一頁一頁地複製InnoDB的數據,與此同時,XtraBackup還有另外一個線程監視着transactions log,一旦log發生變化,就把變化過的log pages複製走(因爲transactions log文件大小有限,寫滿之後,就會從頭再開始寫,新數據可能會覆蓋到舊的數據,所以一旦變化就要立刻複製走)。在全部數據文件複製完成之後,停止複製logfile。