前言 MySQL是完全網絡化的跨平台關系型數據庫系統
同時是具有客戶機/服務器體系結構的分布式數據庫管理系統
它具有功能強
使用簡便
管理方便
運行速度快
安全可靠性強等優點
用戶可利用許多語言編寫訪問MySQL數據庫的程序
特別是與PHP更是黃金組合
運用十分廣泛
由於MySQL是多平台的數據庫
它的默認配置要考慮各種情況下都能適用
所以在我們自己的使用環境下應該進行進一步的安全加固
作為一個MySQL的系統管理員
我們有責任維護MySQL數據庫系統的數據安全性和完整性
MySQL數據庫的安全配置必須從兩個方面入手
系統內部安全和外部網絡安全
另外我們還將簡單介紹編程時要注意的一些問題以及一些小竅門
系統內部安全 首先簡單介紹一下MySQL數據庫目錄結構
MySQL安裝好
運行了mysql_db_install腳本以後就會建立數據目錄和初始化數據庫
如果我們用MySQL源碼包安裝
而且安裝目錄是/usr/local/mysql
那麼數據目錄一般會是/usr/local/mysql/var
數據庫系統由一系列數據庫組成
每個數據庫包含一系列數據庫表
MySQL是用數據庫名在數據目錄建立建立一個數據庫目錄
各數據庫表分別以數據庫表名作為文件名
擴展名分別為MYD
MYI
frm的三個文件放到數據庫目錄中
MySQL的授權表給數據庫的訪問提供了靈活的權限控制
但是如果本地用戶擁有對庫文件的讀權限的話
攻擊者只需把數據庫目錄打包拷走
然後拷到自己本機的數據目錄下就能訪問竊取的數據庫
所以MySQL所在的主機的安全性是最首要的問題
如果主機不安全
被攻擊者控制
那麼MySQL的安全性也無從談起
其次就是數據目錄和數據文件的安全性
也就是權限設置問題
從MySQL主站一些老的binary發行版來看
xx版本中數據目錄的屬性是
這樣非常危險
任何本地用戶都可以讀數據目錄
所以數據庫文件很不安全
xx版本中數據目錄的屬性是
這種屬性也有些危險
本地的同組用戶既能讀也能寫
所以數據文件也不安全
xx版本數據目錄的屬性是
這樣就比較好
只有啟動數據庫的用戶可以讀寫數據庫文件
保證了本地數據文件的安全
如果啟動MySQL數據庫的用戶是mysql
那麼象如下的目錄和文件的是安全的
請注意數據目錄及下面的屬性
shell>ls
l /usr/local/mysql
total
drwxrwxr
x
root root
Feb
:
bin
drwxrwxr
x
root root
Feb
:
include
drwxrwxr
x
root root
Feb
:
info
drwxrwxr
x
root root
Feb
:
lib
drwxrwxr
x
root root
Feb
:
libexec
drwxrwxr
x
root root
Feb
:
man
drwxrwxr
x
root root
Feb
:
mysql
test
drwxrwxr
x
root root
Feb
:
share
drwxrwxr
x
root root
Feb
:
sql
bench
drwx
mysql mysql
Feb
:
var
shell>ls
l /usr/local/mysql/var
total
drwx
mysql mysql
Feb
:
mysql
drwx
mysql mysql
Feb
:
test
shell>ls
l /usr/local/mysql/var/mysql
total
rw
mysql mysql
Feb
:
columns_priv
MYD
rw
mysql mysql
Feb
:
columns_priv
MYI
rw
mysql mysql
Feb
:
columns_priv
frm
rw
mysql mysql
Feb
:
db
MYD
rw
mysql mysql
Feb
:
db
MYI
rw
mysql mysql
Feb
:
db
frm
rw
mysql mysql
Feb
:
func
MYD
rw
mysql mysql
Feb
:
func
MYI
rw
mysql mysql
Feb
:
func
frm
rw
mysql mysql
Feb
:
host
MYD
rw
mysql mysql
Feb
:
host
MYI
rw
mysql mysql
Feb
:
host
frm
rw
mysql mysql
Feb
:
tables_priv
MYD
rw
mysql mysql
Feb
:
tables_priv
MYI
rw
mysql mysql
Feb
:
tables_priv
frm
rw
mysql mysql
Feb
:
user
MYD
rw
mysql mysql
Feb
:
user
MYI
rw
mysql mysql
Feb
:
user
frm
如果這些文件的屬主及屬性不是這樣
請用以下兩個命令修正之
shell>chown
R mysql
mysql /usr/local/mysql/var
shell>chmod
R go
rwx /usr/local/mysql/var
用root用戶啟動遠程服務一直是安全大忌
因為如果服務程序出現問題
遠程攻擊者極有可能獲得主機的完全控制權
MySQL從
版本開始時作了小小的改動
默認安裝後服務要用mysql用戶來啟動
不允許root用戶啟動
如果非要用root用戶來啟動
必須加上
user=root的參數(
/safe_mysqld
user=root &)
因為MySQL中有LOAD DATA INFILE和SELECT
INTO OUTFILE的SQL語句
如果是root用戶啟動了MySQL服務器
那麼
數據庫用戶就擁有了root用戶的寫權限
不過MySQL還是做了一些限制的
比如LOAD DATA INFILE只能讀全局可讀的文件
SELECT
INTO OUTFILE不能覆蓋已經存在的文件
本地的日志文件也不能忽視
包括shell的日志和MySQL自己的日志
有些用戶在本地登陸或備份數據庫的時候為了圖方便
有時會在命令行參數裡直接帶了數據庫的密碼
如
shell>/usr/local/mysql/bin/mysqldump
uroot
ptest test>test
sql
shell>/usr/local/mysql/bin/mysql
uroot
ptest
這些命令會被shell記錄在歷史文件裡
比如bash會寫入用戶目錄的
bash_history文件
如果這些文件不慎被讀
那麼數據庫的密碼就會洩漏
用戶登陸數據庫後執行的SQL命令也會被MySQL記錄在用戶目錄的
mysql_history文件裡
如果數據庫用戶用SQL語句修改了數據庫密碼
也會因
mysql_history文件而洩漏
所以我們在shell登陸及備份的時候不要在
p後直接加密碼
而是在提示後再輸入數據庫密碼
另外這兩個文件我們也應該不讓它記錄我們的操作
以防萬一
shell>rm
bash_history
mysql_history
shell>ln
s /dev/null
bash_history
shell>ln
s /dev/null
mysql_history
上門這兩條命令把這兩個文件鏈接到/dev/null
那麼我們的操作就不會被記錄到這兩個文件裡了
外部網絡安全 MySQL數據庫安裝好以後
Unix平台的user表是這樣的
mysql> use mysql;
Database changed
mysql> select Host
User
Password
Select_priv
Grant_priv from user;
educity
cn/img_
/
/
/
jpg>
圖
rows in set (
sec)
Windows平台的user表是這樣的
mysql> use mysql;
Database changed
mysql> select Host
User
Password
Select_priv
Grant_priv from user;
educity
cn/img_
/
/
/
jpg>
圖
rows in set (
sec)
我們先來看Unix平台的user表
其中redhat只是我試驗機的機器名
所以實際上Unix平台的MySQL默認只允許本機才能連接數據庫
但是缺省root用戶口令是空
所以當務之急是給root用戶加上口令
給數據庫用戶加口令有三種方法
)在shell提示符下用mysqladmin命令來改root用戶口令:
shell>mysqladmin
uroot password test
這樣
MySQL數據庫root用戶的口令就被改成test了
(test只是舉例
我們實際使用的口令一定不能使用這種易猜的弱口令)
)用set password修改口令
mysql> set password for root@localhost=password(
test
);
這時root用戶的口令就被改成test了
)直接修改user表的root用戶口令
mysql> use mysql;
mysql> update user set password=password(
test
) where user=
root
;
mysql> flush privileges;
這樣
MySQL數據庫root用戶的口令也被改成test了
其中最後一句命令flush privileges的意思是強制刷新內存授權表
否則用的還是緩沖中的口令
這時非法用戶還可以用root用戶及空口令登陸
直到重啟MySQL服務器
我們還看到user為空的匿名用戶
雖然它在Unix平台下沒什麼權限
但為了安全起見我們應該刪除它
mysql> delete from user where user=
;
Windows版本MySQL的user表有很大不同
我們看到Host字段除了localhost還有是%
這裡%的意思是允許任意的主機連接MySQL服務器
這是非常不安全的
給攻擊者造成可乘之機
我們必須刪除Host字段為%的記錄
mysql>de
From:http://tw.wingwit.com/Article/program/MySQL/201311/29418.html