MySQL簡單安全設置與優化(總結)
MySQL簡單安全設置與優化
注本文並不是原則,只是簡單的總結,你們有問題多關注一下如下兩個站點:
http://imysql.cn/
http://dev.mysql.com/doc/refman/5.1/zh/index.html
也能夠在本站與我討論交流.
1.修改root用戶的的口令
缺省狀況下MySQL沒有設置密碼,咱們能夠用三種方法設置密碼頭:
* 用mysqladmin命令來改root用戶口令
# mysqladmin -uroot password 54netseek //設置MySQL管理操做用戶root的密碼爲52netseek
* 用set password修改口令:
mysql> set password for root@localhost=password('54netseek);
* 直接修改user表的root用戶口令
mysql> use mysql;
mysql> update user set password=password('54netseek') where user='root';
mysql> flush privileges;
2.刪除默認的數據庫和用戶
咱們的數據庫是在本地,而且也只須要本地的php腳本對mysql進行讀取,因此不少用戶不須要。m
ysql初始化後會自動生成空用戶和test庫,這會對數據庫構成威脅,咱們所有刪除。
咱們使用mysql客戶端程序鏈接到本地的mysql服務器後出現以下提示:
mysql> drop database test;
mysql> use mysql;
mysql> delete from db;
mysql> delete from user where not(host="localhost" and user="root");
mysql> flush privileges;
3. 改變默認mysql管理員的名稱 //僅爲建議
根據我的習慣,由於默認的mysql的管理員名稱是root,因此若是可以修改的話,
可以防止一些腳本小子對系統的窮舉。咱們能夠直接修改數據庫,把root用戶改成"admin"
mysql> use mysql;
mysql> update user set user="admin" where user="root";
mysql> flush privileges;
4. 提升本地安全性
提升本地安全性,主要是防止mysql對本地文件的存取,好比***經過mysql把/etc/passwd獲取了,會對系統構成威脅。
mysql對本地文件的存取是經過SQL語句來實現,主要是經過Load DATA LOCAL INFILE來實現,咱們可以經過禁用該功能來
防止***經過SQL注射等獲取系統核心文件。 禁用該功能必須在 my.cnf 的[mysqld]部分加上一個參數:
set-variable=local-infile=0
5. 禁止遠程鏈接mysql
由於咱們的mysql只須要本地的php腳本進行鏈接,因此咱們無需開socket進行監聽,那麼咱們徹底能夠關閉監聽的功能。
有兩個方法實現:
* 配置my.cnf文件,在[mysqld]部分添加 skip-networking 參數
* mysqld服務器中參數中添加 --skip-networking 啓動參數來使mysql不監放任何TCP/IP鏈接,增長安全性。若是要進行mysql的管理的話,能夠在服務器本地安裝一個phpMyadmin來進行管理。
6.控制數據庫訪問權限
對於使用php腳原本進行交互,最好創建一個用戶只針對某個庫有 update、select、delete、insert、drop table、create table等權限,這樣就很好避免了數據庫用戶名和密碼被***查看後最小損失。
好比下面咱們建立一個數據庫爲db1,同時創建一個用戶test1可以訪問該數據庫。
mysql> create database db1;
mysql> grant select,insert,update,delete,create,drop privileges on db1.* to test1@localhost identified by 'admindb';
以上SQL是建立一個數據庫db1,同時增長了一個test1用戶,口令是admindb,可是它只能從本地鏈接mysql,對db1庫有select,insert,update,delete,create,drop操做權限。
7. 限制通常用戶瀏覽其餘用戶數據庫
若是有多個數據庫,每一個數據庫有一個用戶,那麼必須限制用戶瀏覽其餘數據庫內容,能夠在啓動MySQL服務器時加--skip-show-database 啓動參數就可以達到目的。
忘記mysql密碼的解決辦法
若是不慎忘記了MySQL的root密碼,咱們能夠在啓動MySQL服務器時加上參數--skip-grant-tables來跳過受權表的驗證 (./safe_mysqld --skip-grant-tables &),這樣咱們就能夠直接登錄MySQL服務器,而後再修改root用戶的口令,重啓MySQL就能夠用新口令登錄了。
8. 數據庫文件的安全
咱們默認的mysql是安裝在/usr/local/mysql目錄下的,那麼對應的數據庫文件就是在/usr/local/mysql/var目錄下,那麼咱們要保證該目錄不能讓未經受權的用戶訪問後把數據庫打包拷貝走了,因此要限制對該目錄的訪問。
咱們修改該目錄的所屬用戶和組是mysql,同時改變訪問權限:
# chown -R mysql.mysql /usr/local/mysql/var
# chmod -R go-rwx /usr/local/mysql/var
9.刪除歷史記錄
執行以上的命令會被shell記錄在歷史文件裏,好比bash會寫入用戶目錄的.bash_history文件,若是這些文件不慎被讀,
那麼數據庫的密碼就會泄漏。用戶登錄數據庫後執行的SQL命令也會被MySQL記錄在用戶目錄的.mysql_history文件裏。
若是數據庫用戶用SQL語句修改了數據庫密碼,也會因.mysql_history文件而泄漏。因此咱們在shell登錄及備份的時候
不要在-p後直接加密碼,而是在提示後再輸入數據庫密碼。 另外這兩個文件咱們也應該不讓它記錄咱們的操做,以防萬一。
# rm .bash_history .mysql_history
# ln -s /dev/null .bash_history
# ln -s /dev/null .mysql_history
10. 其餘
另外還能夠考慮使用chroot等方式來控制mysql的運行目錄,更好的控制權限,具體能夠參考相關文章。
my.cnf的調試參數
11.快速修復MySQL數據庫
修復數據庫
# mysqlcheck -A -o -r -p
修復指定的數據庫
# mysqlcheck -o -r Database_NAME -p
--------------------------------------
12.跟據內存的大小選擇MySQL的負載,選擇相應的文件名複製到/etc/my.cnf
若是是RPM包安裝:/usr/share/doc/mysql-XXX/目錄下有
若是是源代碼編譯安裝:support-files/目錄下有.
cp /usr/local/share/mysql-***/my-large.cnf /etc/my.cnf
my-small.cnf # > my-medium.cnf # 32M - 64M
my-large.cnf # memory = 512M
my-huge.cnf # 1G-2G
my-innodb-heavy-4G.cnf # 4GBphp