注本文並非原則,只是簡單的總結,大家有問題多關注一下以下兩個網站:
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 # 4GB