MySQL_Help_Link
MySQL安全配置
1 安全策略
1.1 管理意義上的數(shù)據(jù)安全
訪問 MySQL 數(shù)據(jù)庫必須首先訪問數(shù)據(jù)庫的某個權(quán)限、即以某個權(quán)限模式用戶的身份登錄,大部分的安全管理主要通過模式用戶的權(quán)限來實現(xiàn)。
MySQL 的相關(guān)權(quán)限信息主要存放在 grant tables 的系統(tǒng)表中,即 mysql.User(全局級別權(quán)限) 、 mysql.db (數(shù)據(jù)庫級別權(quán)限)、 mysql.Host(數(shù)據(jù)庫級別權(quán)限) 、mysql.table_priv(表級別權(quán)限) 和、 mysql.column_pr(列級別權(quán)限)表中, MySQL 啟動時裝入內(nèi)存。應盡量使用 GRANT 、REVOKE 、CREATE USER 及 DROP USER 來進行用戶和權(quán)限的變更操作。如 :GRANT SELECT.UPDATE,DELETE,INSERT,EXECUTE ON test_shop.* TO ‘ test_guest ‘@’localhost’;
查看某用戶權(quán)限,如 SHOW GRANTS FOR ‘test_guest’@’ localhost ‘
1.2 防范故障角度的數(shù)據(jù)安全
數(shù)據(jù)文件是操作系統(tǒng)級的對象,因此一般來講具有相當?shù)拇嗳跣?、而且依賴于操作系統(tǒng)的性能特點。由于磁盤介質(zhì)的因素、一個大的數(shù)據(jù)文件上個別數(shù)據(jù)塊的損壞可能導致整個數(shù)據(jù)文件的不可用,這對一個系統(tǒng)來說是災難性的,而且大的表空間或數(shù)據(jù)文件的恢復是困難和耗時的。
巨大對象的分區(qū)在性能角度之外也有安全的因素,當磁盤錯誤使一個巨大表中一個單獨的數(shù)據(jù)塊不能讀寫時可能導致整個表不可用,必須恢復包含該表的整個表空間。
考慮到數(shù)據(jù)倉庫問題。可以進行以下操作:
對數(shù)據(jù)量大且不進行寫操作的表,使用 myisampack 工具,生成壓縮、只讀 MyISAM 表??梢詨嚎s 40% - 50% 的表文件空間。具體操作如下:
A 壓縮文件: >myisampack ../data/music_shop/ 表名 .MYI
B 重建索引: >myisamchk -rq --sort-index --analyze../data/test_shop/ 表名 .MYI
C 強制 mysqld 使用新表: > mysqladmin flush-tables
如果要進行寫操作,可以解壓縮一個壓縮的表,恢復原有狀態(tài),使用 myisamchk 。 如: myisamchk --unpack ../data/music_shop/ 表名 .MYI
最后,系統(tǒng)上線后,隨著數(shù)據(jù)量的增加,會發(fā)現(xiàn)數(shù)據(jù)目錄下的磁盤空間越來越下,造成安全隱患??梢圆扇煞N措施。一種針對 MyISAM 存儲引擎的表,在建表時分別指定數(shù)據(jù)目錄和索引目錄到不同的磁盤空間,而默認會同時放在數(shù)據(jù)目錄下。另外一種針對 InnoDB 存儲引擎的表,因為數(shù)據(jù)文件和索引文件在一起的,所以無法將它們分離。當磁盤空間不足時,可以增加一個新的數(shù)據(jù)文件,這個文件放在有充足空間的磁盤上。具體請查閱參數(shù)innodb_data_file_path 設置。
1.3 容災與備份機制
建立主從數(shù)據(jù)庫集群,采用 MySQL 復制
MySQL 復制的優(yōu)點:
1 如果主服務器出現(xiàn)問題,可以快速切換到從服務器;
2 可以在從服務器上執(zhí)行查詢操作,降低主服務器的訪問壓力;
3 可以在從服務器上執(zhí)行備份,以避免備份期間影響主服務器的;
應注意的問題:
由于實現(xiàn)的是異步的復制,所以主從服務器之間存在一定的差距。在從服務器上進行的查詢操作要考慮到這些數(shù)據(jù)的差異,一般只有對實時性要求不高的數(shù)據(jù)可以通過從服務器查詢。
定期備份文件與數(shù)據(jù),通過各種方式保存文件與數(shù)據(jù)。
以下是幾點防范的措施:
制定一份數(shù)據(jù)庫備份 / 恢復計劃,并對計劃進行仔細測試。
啟動數(shù)據(jù)庫服務器的二進制變更日志,該功能的系統(tǒng)開銷很小 ( 約為 1%) ,二進制日志包含備份后進行的所有更新,我們沒有理由不這樣做。(log-bin=file,file可以不指定)
定期檢查數(shù)據(jù)表,防范于未燃。
定期對備份文件進行備份,以防備份文件失效。
把 MySQL 的數(shù)據(jù)目錄和備份文件分別放到兩個不同的驅(qū)動器中,以平衡磁盤 I/O 和增加數(shù)據(jù)的安全。
2 安全隱患
2.1 正確設置目錄權(quán)限
設置目錄權(quán)限的原則是軟件和數(shù)據(jù)分開,具體如下:
1. 將 mysql 安裝在單獨的用戶下
2. 安裝時,以 root 用戶進行安裝,mysql 的軟件默認都為 root 權(quán)限
3. 安裝完畢后,將數(shù)據(jù)目錄權(quán)限設置為實際運行 mysql 的用戶權(quán)限,比如:
Chown –R mysql:mysql /home/mysql/data
2.2 盡量避免以 root 權(quán)限運行 mysql
將 4.1 的目錄權(quán)限設置完畢后,啟動、停止 mysql 以及日常的維護工作都可以在
mysql 用戶下進行,沒有必要 su 到 root 后再用—user=mysql 來啟動和關(guān)閉 mysql,
這樣就沒有必要授權(quán)維護人員 root 權(quán)限,而且最重要的一定是因為任何具有 FILE權(quán)限的用戶能夠用 root 創(chuàng)建文件。
2.3 刪除匿名賬號
有些版本的 MySQL 安裝完之后會安裝一個空賬號( User = ‘‘ ),此賬號對 test 數(shù)據(jù)庫有完全權(quán)限,為避免此賬號登陸后,建立大表,占用磁盤空間,影響系統(tǒng)安全,建議刪除
drop user ''@'localhost';
drop user ''@' localhost.localdomain’;
2.4 給 root 賬號設置口令
建議以一句話的拼音為口令。如 SET PASSWORD=PASSWORD(‘woshiyitiaoyu’)
并且限定只能通過 localhost 訪問。
2.5 只授予賬號必須的權(quán)限
如: Grant select,insert,update,delete on tablename to ‘username’@’hostname’
2.6 除 root 外,任何用戶不應有 mysql 庫 user 表的存取權(quán)限
如果擁有 mysql 庫中 user 表的存取權(quán)限(select、update、insert、delete), 就
可以輕易的增加、修改、刪除其他的用戶權(quán)限,造成系統(tǒng)的安全隱患。
如:use mysql;delete from db where user<>‘root’ and db=‘mysql’
2.7 不要把 file 、 process 、或 super 權(quán)限授予管理員以外的賬號
會產(chǎn)生保密信息外泄,查看管理員執(zhí)行的動作,普通用戶執(zhí)行 kill 命令等嚴重的安全隱患。
FILE 權(quán)限可以被濫用于將服務器主機上 MySQL 能讀取的任何文件讀入到數(shù)據(jù)庫表中。包括任何人可讀的文件和服務器數(shù)據(jù)目錄中的文件??梢允褂?SELECT 訪問數(shù)據(jù)庫表,然后將其內(nèi)容傳輸?shù)娇蛻舳松?。不要向非管理用戶授?FILE 權(quán)限。
有這權(quán)限的任何用戶能在擁有 mysqld 守護進程權(quán)限的文件系統(tǒng)那里寫一個文件!為了更加安全,由 SELECT ... INTO OUTFILE 生成的所有文件對每個人是可寫的,并且你不能覆蓋已經(jīng)存在的文件。
file 權(quán)限也可以被用來讀取任何作為運行服務器的 Unix 用戶可讀取或訪問的文件。使用該權(quán)限,你可以將任何文件讀入數(shù)據(jù)庫表。這可能被濫用,例如,通過使用 LOADDATA 裝載“/etc/passwd”進一個數(shù)據(jù)庫表,然后能用 SELECT 顯示它。PROCESS 權(quán)限能被用來察看當前執(zhí)行的查詢的明文文本,包括設定或改變密碼的查詢。
SUPER 權(quán)限能用來終止其它用戶或更改服務器的操作方式。比如 kill 進程不要將 PROCESS 或 SUPER 權(quán)限授給非管理用戶。mysqladmin processlist 的輸出顯示出當前執(zhí)行的查詢正文,如果另外的用戶發(fā)出一個 UPDATE user SETpassword=PASSWORD('not_secure')查詢,被允許執(zhí)行那個命令的任何用戶可能看得到
2.8 LOAD DATA LOCAL 帶來的安全問題
由 MySQL 服務器啟動文件從客戶端向服務器主機的傳輸。理論上,打過補丁的服務器可以告訴客戶端程序傳輸服務器選擇的文件,而不是客戶用LOAD DATA 語句
指定的文件。這樣服務器可以訪問客戶端上客戶有讀訪問權(quán)限的任何文件。
在 Web 環(huán)境中,客戶從 Web 服務器連接,用戶可以使用 LOAD DATA LOCAL 來讀取 Web 服務器進程有讀訪問權(quán)限的任何文件(假定用戶可以運行 SQL 服務器的任何命令)。在這種環(huán)境中,MySQL 服務器的客戶實際上是 Web 服務器,而不是連接 Web 服
務器的用戶運行的程序。
解決方法:
可以用--local-infile=0 選項啟動 mysqld 從服務器端禁用所有 LOAD DATA
LOCAL 命令。
對于 mysql 命令行客戶端,可以通過指定--local-infile[=1]選項啟用 LOAD
DATA LOCAL,或通過--local-infile=0 選項禁用。類似地,對于 mysqlimport,--local or -L 選項啟用本地數(shù)據(jù)文件裝載。在任何情況下,成功進行本地裝載需要服務器啟用相關(guān)選項。
2.9 使用 MERGE 存儲引擎潛藏的安全漏洞
Merge 表在某些版本中可能存在以下安全漏洞:
用戶 A 賦予表 T 的權(quán)限給用戶 B
用戶 B 創(chuàng)建一個包含 T 的 merge 表,做各種操作
用戶 A 收回對 T 的權(quán)限
安全隱患:用戶 B 通過 merge 表仍然可以訪問表 A 中的數(shù)據(jù)
2.10 盡量避免通過 symlinks 訪問表
不要允許使用表的符號鏈接。(可以用--skip-symbolic-links 選項禁用)。如果 你
用 root 運行 mysqld 則特別重要,因為任何對服務器的數(shù)據(jù)目錄有寫訪問權(quán)限的人
則能夠刪除系統(tǒng)中的任何文件!
2.11 防止 DNS 欺騙
如果你不信任你的 DNS,你應該在授權(quán)表中使用 IP 數(shù)字而不是主機名。在任何情況下,你應該非常小心地使用包含通配符的主機名來創(chuàng)建 授權(quán)表條目!
2.12 DROP TABLE 命令并不收回以前的相關(guān)訪問授權(quán)
drop 表的時候,其他用戶對此表的權(quán)限并沒有被收回,這樣導致重新創(chuàng)建同名的表時,以前其他用戶對此表的權(quán)限會自動賦予,導致權(quán)限外流。
因此,要在刪除表時,同時取消其他用戶在此表上的相應權(quán)限。
2.13 REVOKE 命令漏洞
grant all privileges on *.* to guest@localhost; 后
revoke all privileges on *.* from guest@localhost; 不起作用,必須針對每個數(shù)據(jù)單獨使用 revoke
2.14 如果可能,給所有用戶加上訪問 IP 限制
給所有用戶加上 ip 限制將拒絕所有未知的主機進行的連接,保證只有受信任的主
機才可以進行連接。例如:
Grant select on dbname.* to ‘username’@’ip’ identified by ’passwd’;
2.15 嚴格控制操作系統(tǒng)帳號和權(quán)限
在數(shù)據(jù)庫服務器上要嚴格控制操作系統(tǒng)的帳號和權(quán)限,比如:
鎖定 mysql 用戶
其他任何用戶都采取獨立的帳號登陸,管理員通過普通用戶管理 mysql;或者通過 root su到 mysql 用戶下進行管理。
禁止修改 mysql 用戶下的任何資源
2.16 增加防火墻
購買防火墻。這樣可以保護你防范各種軟件中至少 50%的各種類型的攻擊。把MySQL放到防火墻后或隔離區(qū)(DMZ)
2.17 嚴格模式
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
2.18 限制MYSQL的訪問目錄
--chroot
2.19 防止在連接MYSQL是使用TCP/IP套接字
--skip-networking
2.20 防止連接到MYSQL數(shù)據(jù)庫時使用主機名
--skip-name-resolve
2.21 防止沒有SHOW DATABASES權(quán)限的用戶使用此命令
--skip-show-database
2.22 如果對user表沒有INSERT權(quán)限,可以防止這些用戶通過GRANT命令創(chuàng)建用戶
--safe-user-create
3 其他安全配置
MySQL 本身帶有一些選項,適當?shù)氖褂眠@些選項將會使數(shù)據(jù)庫更加安全。
3.1 使用 skip-network
在網(wǎng)絡上不允許 TCP/IP 連接,所有到數(shù)據(jù)庫的連接必須由命名管道 (Named Pipes) 或共享內(nèi)存(Shared Memory) 或 UNIX 套接字 SOCKET 文件進行。這個選項適合應用和數(shù)據(jù)庫共用一臺服務器的情況,其他客戶端將無法通過網(wǎng)絡遠程訪問數(shù)據(jù)庫,大大增強了數(shù)據(jù)庫的安全性,但同時也帶來了管理維護上的不方便。 MySQL 僅能通過命名管道或共享內(nèi)存 ( 在 widows 中 ) 或 Unix 套接字文件 ( 在 Unix 系統(tǒng)中 ) 來和客戶端連接交互。以下為配置實例:
skip-networking
-S 是 --socket 的簡寫形式,如: -s /tmp/mysql.sock,而其值必須和服務端設置的相同
--protocol 是嚴格指定連接類型,如果一些設置使用默認值時,如windows下服務器端設置--socket=mysql(mysql是默認值),在連接時指定 --protocol=pipe 后 --socket=mysql 可省略指定。
1. 命名管道
只適合在 Windows 系統(tǒng)下用來連接本機的 MySQL ,性能可比一般的TCP/IP方式提升30%~50%。
服務端設置要求
enable-named-pipe #或 named_pipe=ON
socket=MySQL
客戶端連接
mysql --protocol=pipe --socket=mysql
2. 共享內(nèi)存
4.1版本后,mysql對windows系統(tǒng)還提供了共享內(nèi)存方式的連接
服務端設置要求
shared-memory=ON
shared_memory_base_name=MYSQL
客戶端連接
mysql --protocol=memory --shared-memory-base-name=mysql
3. UNIX套接字
linux和unix環(huán)境下,可以使用unix域套接字,來連接同在一臺機器上的mysql;
服務端設置要求
socket=/tmp/mysql.sock
客戶端連接
mysql --protocol=socket --socket=/tmp/mysql.sock
3.2 allow-suspicious-udfs
該選項控制是否可以載入主函數(shù)只有 xxx 符的用戶定義函數(shù)。默認情況下,該選項被關(guān)閉,并且只能載入至少有輔助符的 UDF。這樣可以防止從未包含合法 UDF 的共享對象文件載入函數(shù)。
3.3 old-passwords
強制服務器為新密碼生成短(pre-4.1)密碼哈希。當服務器必須支持舊版本客戶端程序時,為了保證兼容性這很有用。
3.4 safe-user-create
如果啟用, 用戶不能用 GRANT 語句創(chuàng)建新用戶,除非用戶有 mysql.user 表的 INSERT
權(quán)限。如果你想讓用戶具有授權(quán)權(quán)限來創(chuàng)建新用戶,你應給用戶授予下面的權(quán)限:
mysql> GRANT INSERT(user) ON mysql.user TO 'user_name '@'host_name';
這樣確保用戶不能直接更改權(quán)限列,必須使用 GRANT 語句給其它用戶授予該權(quán)限。
3.5 secure-auth
不允許鑒定有舊(pre-4.1)密碼的賬戶
3.6 skip-grant-tables
這個選項導致服務器根本不使用權(quán)限系統(tǒng)。這給每個人以完全訪問所有的數(shù)據(jù)庫的權(quán)力!(通過執(zhí)行 mysqladmin flush-privileges 或 mysqladmin reload 命令,或執(zhí)行 FLUSH PRIVILEGES 語句,你能告訴一個正在運行的服務器再次開始使用授權(quán)表 。 )
3.7 skip-show-database
使用該選項,只允許有 SHOW DATABASES 權(quán)限的用戶執(zhí)行 SHOW DATABASES 語句,該
語句顯示所有數(shù)據(jù)庫名。不使用該選項,允許所有用戶執(zhí)行 SHOW DATABASES,但
只顯示用戶有 SHOW DATABASES 權(quán)限或部分數(shù)據(jù)庫權(quán)限的數(shù)據(jù)庫名。請注意全局權(quán)
限指數(shù)據(jù)庫的權(quán)限。
3.8 使用 SSL
SSL ( Secure Socket Layer 安全套接字)是一種安全協(xié)議,最初由 Netscape 公司所開發(fā),用以保障在Internet 上數(shù)據(jù)傳輸?shù)陌踩?, 利用數(shù)據(jù)加密技術(shù),可確保數(shù)據(jù)在網(wǎng)絡上的傳輸過程中不會被截取。
應用場景,在主從數(shù)據(jù)庫復制中使用,提供以下服務保障。
a) 認證用戶和服務器,確保數(shù)據(jù)發(fā)送到正確的客戶和服務器。
b) 加密數(shù)據(jù)以防止數(shù)據(jù)中途被竊取。
c) 維護數(shù)據(jù)的完整性,確保數(shù)據(jù)在傳輸過程中不被破壞。
在 MySql 中使用 SSL 進行安全傳輸,需要在命令行或選項文件中設置 ‘SSL’ 選項。下面以命令行為例,進行安裝介紹。
A. 安裝證書管理工具
a) 所需部件Win32OpenSSL-0_9_8g.exe ,可從網(wǎng)上下載
b) 安裝 雙擊Win32OpenSSL-0_9_8g.exe 按提示進行安裝。安裝在C:\OpenSSL 目錄下
c) 在C:\OpenSSL\bin 目錄下創(chuàng)建root ,server ,client 三個子路徑
d) 在創(chuàng)建證書時輸入的用戶名,密碼請妥善保存
B. 創(chuàng)建根證書,并采用自簽名簽署它
a) 創(chuàng)建私鑰 進入DOS 窗口,進入C:\OpenSSL\bin 路徑,然后輸入openssl genrsa -out root/root-key.pem 1024 命令,按Enter 鍵。
b) 創(chuàng)建證書請求 繼續(xù)輸入openssl req -new -out root/root-req.csr -key root/root-key.pem ,然后按Enter 鍵,要求輸入一系列信息,可根據(jù)實際情況輸入,但是CommonName :一定要輸入root
c) 自簽署根證書 繼續(xù)輸入openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey root/root-key.pem -days 3650 ,然后按Enter 鍵
d) 查看根證書內(nèi)容 要先進入證書所在路徑 例:C:\OpenSSL\bin\root ,然后輸入keytool -printcert -file root-cert.pem,然后按Enter 鍵。
C. 創(chuàng)建服務器證書,并采用根證書簽署它
a) 創(chuàng)建私鑰 進入DOS 窗口,進入C:\OpenSSL\bin 路徑,然后輸入openssl genrsa -out server/server-key.pem 1024 命令,按Enter 鍵。
b) 創(chuàng)建證書請求 繼續(xù)輸入openssl req -new -out server/server-req.csr -key server/server-key.pem ,然后按Enter鍵,要求輸入一系列信息,可根據(jù)實際情況輸入,但是CommonName :一定要輸入localhost 或服務器的域名(存在域名情況下)。
c) 簽署服務器證書 繼續(xù)輸入openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650 ,然后按Enter 鍵。
d) 查看服務器證書內(nèi)容 要先進入證書所在路徑 例:C:\OpenSSL\bin\server ,然后輸入keytool -printcert -file server-cert.pem ,然后按Enter 鍵。
D. 創(chuàng)建客戶證書,并采用根證書簽署它
a) 創(chuàng)建私鑰 進入DOS 窗口,進入C:\OpenSSL\bin 路徑,然后輸入openssl genrsa -out client/client-key.pem 1024 命令,按Enter 鍵。
b) 創(chuàng)建證書請求 繼續(xù)輸入openssl req -new -out client/client-req.csr -key client/client-key.pem ,然后按Enter鍵,要求輸入一系列信息,可根據(jù)實際情況輸入,CommonName :輸入用戶ID 。
c) 簽署客戶證書 繼續(xù)輸入openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650 ,然后按Enter 鍵。
d) 查看客戶證書內(nèi)容 要先進入證書所在路徑 例:C:\OpenSSL\bin\client ,然后輸入keytool -printcert -file client-cert.pem ,然后按Enter 鍵。
完成以上步驟后,將所生成的證書root 、server 和client 文件夾,拷到C:\mysll 目錄下。 至此,已部署完在啟動服務器時所用的有關(guān)選項指明證書文件和密鑰文件。在建立加密連接前,要準備三個文件,一個 CA 證書,是由可信賴第三方出具的證書,用來驗證客戶端和服務器端提供的證書。 CA 證書可向商業(yè)機構(gòu)購買,也可自行生成。第二個文件是證書文件,用于在連接時向?qū)Ψ阶C明自已身份的文件。第三個文件是密鑰文件,用來對在加密連接上傳輸數(shù)據(jù)的加密和解密。 MySQL 服務器端的證書文件和密鑰文件必須首先安裝,在 myssl 目錄里的幾個文件:root-cert.pem(CA 證書 ) , server-cert.pem( 服務器證書 ) , server-key.pem( 服務器公共密鑰 ) 。
在主數(shù)據(jù)庫創(chuàng)建從數(shù)據(jù)庫操作所用的用戶,并指定必須用SLL 認證。
CREATE USER ‘test_guest’@’localhost’ IDENTIFIED BY ‘1234’;
GRANT ALL PRIVILEGES ON music_shop.* TO ‘ test_guest ‘@’10.12.1.42’ REQUIRE ssl;
關(guān)閉主數(shù)據(jù)庫
>mysqladmin -uroot shutdown
重啟服務器,使配置生效。
>mysqld--ssl-ca=C:\myssl\server\root-cert.pem --ssl-cert=C:\myssl\server\server-cert.pem --ssl-key=C:\myssl\server\server-key.pem
用從數(shù)據(jù)庫客戶程序建立加密連接。
>mysql -u test_guest --ssl-ca=C:\myssl\client\root-cert.pem --ssl-cert=C:\myssl\client\client-cert.pem --ssl-key=C:\myssl\client\client-key.pem
配置完成后,調(diào)用 mysql 程序運行 \s 或 SHOW STATUS LIKE ‘SSL%’ 命令,如果看到 SSL: 的信息行就說明是加密連接了。如果把 SSL 相關(guān)的配置寫進選項文件,則默認是加密連接的。也可用 mysql 程序的 --skip-ssl 選項取消加密連接。
更多信息請查看IT技術(shù)專欄