2 數據庫安全加固html
2.1 修改root用戶默認口令,刪除空口令mysql
2.2 刪除默認數據庫和非必要數據庫用戶linux
2.3 使用獨立用戶運行msyqlsql
2.4 關於非root數據庫用戶的管理shell
2.5 關於默認管理員用戶名的管理數據庫
2.6 用戶目錄權限限制安全
2.7 命令歷史記錄保護bash
2.8 禁止用戶遠程鏈接數據庫服務器
2.9 禁止MySQL對本地文件存取網絡
2.10 MySQL服務器權限控制
2.11 開啓MySQL錯誤日誌
2.12 數據庫備份策略
2.13 Mysqld安全相關啓動選項
MySQL版本爲5.5;按照操做系統、安裝介質以及安裝時設置的不一樣,安裝目錄會和本文示例有所區別。下表是MySQL手冊中的默認安裝目錄及結構。
Linux操做系統下采用RPM方式安裝,默認安裝路徑見下表。
表2-1 Linux安裝後文件路徑
Directory |
Contents of Directory |
/usr/bin |
Client programs and scripts |
/usr/sbin |
The mysqld server |
/var/lib/mysql |
Log files, databases |
/usr/share/info |
Manual in Info format |
/usr/share/man |
Unix manual pages |
/usr/include/mysql |
Include (header) files |
/usr/lib/mysql |
Libraries |
/usr/share/mysql |
Miscellaneous support files, including error messages, character set files, sample configuration files, SQL for database installation |
/usr/share/sql-bench |
Benchmarks |
本文中使用的MySQL全局配置文件也會根據操做系統以及安裝方式不一樣,位於不一樣的目錄下;下表分別是Linux下可能的位置。
表2-2 Linux下全局配置文件可能位置
File Name |
Purpose |
/etc/my.cnf |
Global options |
/etc/mysql/my.cnf |
Global options |
SYSCONFDIR/my.cnf |
Global options |
$MYSQL_HOME/my.cnf |
Global options |
defaults-extra-file |
The file specified with --defaults-extra-file=path, if any |
~/.my.cnf |
User-specific options |
本文示例Linux環境採用rpm方式安裝;安裝路徑爲默認值,全局配置文件爲/etc/my.cnf。
本文示例已將運行所需的命令文件所需的加入到系統變量中。
實施目的
缺省安裝的MySQL的root用戶是空密碼的,爲了安全起見,必須修改成強密碼,所謂的強密碼,至少8位,由字母、數字和符號組成的不規律密碼。
問題影響
爲了保證用戶的安全登陸。
系統當前狀態
查看系統當前的密碼,查看mysql的user表。
實施步驟
使用MySQL自帶的命令mysqladmin修改root密碼,同時也能夠登錄數據庫,修改數據庫mysql下的user表的字段內容,修改方法以下所示:
方法1:使用mysqladmin命令或者進入usr/bin目錄使用mysqladmin工具修改密碼。
# /usr/bin/mysqladmin -u root -p password
回車後在系統提示下輸入舊密碼以及新密碼。
方法2:登錄數據庫修改密碼。
#mysql -u root -p
#mysql> use mysql;
#mysql> update user set password= password('newpassword') where user='root';
#mysql> flush privileges;
「flush privileges」命令的做用是強制刷新內存受權表,使得修改當即生效。
回退方案
恢復原始密碼到加固前的設置。
判斷依據
使用原始密碼鏈接數據庫,若是登錄失敗且提示鑑權問題,則修改爲功。
實施風險
低
重要等級
★★★
實施目的
通常狀況下,MySQL數據庫安裝後,只容許本地訪問且不少用戶不須要,尤爲是默認安裝的用戶。
問題影響
MySQL初始化後會自動生成空用戶和test庫,進行安裝的測試,這會對數據庫的安全構成威脅,有必要所有刪除,最後的狀態只保留root和ultravr便可,固然之後根據須要增長用戶和數據庫。
系統當前狀態
存在test數據庫以及mysql數據庫中的user表中存在非必要的其餘用戶信息。
實施步驟
# mysql -u root -p
# mysql> show databases;
# mysql> drop database test; //刪除數據庫test
# mysql>use mysql;
# mysql>delete from db; //刪除存放數據庫的表信息,由於尚未數據庫信息。
# mysql> delete from user where user <> 'root' and user <> 'ultravr'; // 刪除初始非root和ultravr的用戶
# mysql> delete from user where user='root' and password=''; //刪除空密碼的root
# mysql> delete from user where user='ultravr' and password=''; //刪除空密碼的ultravr
# mysql> flush privileges; //強制刷新內存受權表。
回退方案
恢復原始用戶到加固前的設置。
判斷依據
查詢是否存在對應的數據庫和用戶數據信息。
實施風險
低
重要等級
★★★
實施目的
通常狀況下,MySQL數據庫安裝後,只容許本地訪問且不少用戶不須要,尤爲是默認安裝的用戶。
問題影響
MySQL初始化後會自動生成空用戶和test庫,進行安裝的測試,這會對數據庫的安全構成威脅,有必要所有刪除,最後的狀態只保留root和ultravr便可,固然之後根據須要增長用戶和數據庫。
系統當前狀態
存在test數據庫以及mysql數據庫中的user表中存在非必要的其餘用戶信息。
實施步驟
# mysql -u root -p
# mysql> show databases;
# mysql> drop database test; //刪除數據庫test
# mysql>use mysql;
# mysql>delete from db; //刪除存放數據庫的表信息,由於尚未數據庫信息。
# mysql> delete from user where user <> 'root' and user <> 'ultravr'; // 刪除初始非root和ultravr的用戶
# mysql> delete from user where user='root' and password=''; //刪除空密碼的root
# mysql> delete from user where user='ultravr' and password=''; //刪除空密碼的ultravr
# mysql> flush privileges; //強制刷新內存受權表。
回退方案
恢復原始用戶到加固前的設置。
判斷依據
查詢是否存在對應的數據庫和用戶數據信息。
實施風險
低
重要等級
★★★
實施目的
mysqld拒絕使用root運行,除非使用-user=root選項明顯指定。應該用普通非特權用戶運行mysqld。正如前面的安裝過程同樣,爲數據庫創建獨立的linux中的mysql帳戶,該帳戶用來只用於管理和運行MySQL。
問題影響
絕對不要做爲使用root用戶運行MySQL服務器。這樣作很是危險,由於任何具備FILE權限的用戶可以用root建立文件(例如,~root/.bashrc)。
系統當前狀態
當前運行mysql用戶爲root。
實施步驟
要想用其它Linux用戶啓動mysqld,增長user選項指定/etc/my.cnf選項文件或服務器數據目錄的my.cnf選項文件中的[mysqld]組的用戶名。
方法1:修改/etc/my.cnf文檔,配置mysqld的啓動用戶
#cp /etc/my.cnf /etc/my.cnf.bak //請在修改前備份/etc/my.cnf
#vi /etc/my.cnf
[mysqld]
user=mysql
該命令使服務器用指定的用戶來啓動,不管你手動啓動或經過mysqld_safe或mysql.server啓動,都能確保使用mysql的身份,
方法2:在啓動數據庫時,加上user參數。
# mysqld_safe –user=mysql &
mysqld運行時,只使用對數據庫目錄具備讀或寫權限的linux用戶來運行。
回退方案
恢復/etc/my.cnf到加固前的狀態。
判斷依據
使用ps命令查詢MySQL進程的執行用戶。
實施風險
低
重要等級
★★★★★
實施目的
使用一個低權限的用戶訪問受權的數據庫,防止管理員密碼外泄或者業務系統使用的帳戶具備高權限。
問題影響
由於root用戶具備最高數據庫權限,所以平常使用中對於業務系統直接使用root用戶會形成安全上的不少威脅。
系統當前狀態
系統中除了root用戶外不存在其餘用戶。
實施步驟
咱們須要建立一個單獨的用戶僅在本地訪問FusionCloud UltraVR的業務數據庫。
# mysql -u root -p
# mysql> CREATE USER ultravr@'localhost' IDENTIFIED BY 'mypassword';
# mysql> GRANT ALL ON lego.* TO 'ultravr'@'localhost';//受權對lego數據庫有所有權限。
# mysql> flush privileges; //強制刷新內存受權表。
對於ISO和VHD方式安裝的系統ultravr已經建立,須要執行下面的命令來加固:
# mysql -u root -p
# mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'ultravr'@'localhost';// 收回對全部數據庫的所有權限。
# mysql> GRANT ALL ON lego.* TO 'ultravr'@'localhost';//受權對lego數據庫有所有權限。
# mysql> flush privileges; //強制刷新內存受權表。
請不要將mysql數據庫的權限賦給普通用戶,特別是mysql.user表保存了不少用戶敏感信息,建議只有管理員纔有這張表的訪問等權限。
若是還須要設置其餘權限,請參考Mysql手冊關於GRANT的描述。須要注意的是FusionCloud UltraVR的正常運行至少須要帳戶對lego數據庫添加表、刪除表、修改表、對錶記錄的插入、刪除、修改以及執行存儲過程權限。
回退方案
刪除新建用戶。
判斷依據
# mysql> show GRANTS FOR 'ultravr'@'localhost';
+----------------------------------------------------------------------------------------------------------------+
| Grants for ultravr@localhost |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'ultravr'@'localhost' IDENTIFIED BY PASSWORD '*63DAA25989C7E01EB96570FA4DBE154711BEB361' |
| GRANT ALL PRIVILEGES ON `lego`.* TO 'ultravr'@'localhost' |
+----------------------------------------------------------------------------------------------------------------+
實施風險
低
重要等級
★★★★
實施目的
修改mysql的管理員默認的管理員名稱,減小窮舉系統用戶的惡意行爲成功性。
問題影響
mysql的管理員名稱是root,這必定程度上對系統用戶窮舉的惡意行爲提供了便利,此時修改成複雜的用戶名,請不要在設定爲admin或者administraror的形式,由於它們也在易猜的用戶字典中。
系統當前狀態
當前管理員用戶爲root。
實施步驟
# mysql -u root -p
# mysql> use mysql;
# mysql> update user set user="newroot" where user="root"; //改爲不易被猜想的用戶名
# mysql> flush privileges;
回退方案
實施上述步驟,將管理員名稱更新成root。
判斷依據
使用root從新登陸Mysql,提示失敗;使用修改後的用戶民登陸提示成功。
實施風險
低
重要等級
★★
實施目的
默認的mysql的數據庫文件在/var/lib/mysql目錄下,所以,必須保證該目錄不能讓未經受權的用戶訪問後把數據庫打包拷貝走了,確保mysqld運行時,只使用對數據庫目錄具備讀或寫權限的linux用戶來運行。
問題影響
限制/var/lib/mysql目錄的訪問,保證數據安全性。
系統當前狀態
記錄/var/lib/mysql當前的權限。
實施步驟
Linux操做系統:
# chown -R mysql.mysql /var/lib/mysql //確保數據庫目錄權限所屬mysql用戶
# chmod -R 700 /var/lib/mysql //mysql主目錄給mysql用戶已讀、寫和執行權限
回退方案
還原上述目錄權限到加固前。
判斷依據
Linux 下利用ls -l /var/lib | grep mysql查看權限。
實施風險
高
重要等級
★★★★
實施目的
數據庫相關的shell操做命令都會分別記錄在.bash_history,若是這些文件不慎被讀取,會致使數據庫密碼和數據庫結構等信息泄露,而登錄數據庫後的操做將記錄在.mysql_history文件中,若是使用update表信息來修改數據庫用戶密碼的話,也會被讀取密碼,所以須要刪除這兩個文件,同時在進行登錄或備份數據庫等與密碼相關操做時,應該使用-p參數加入提示輸入密碼後,隱式輸入密碼,建議將以上文件置空。
問題影響
.bash_history和.mysql_history文件的不慎使用致使信息泄露。
系統當前狀態
兩個文件記錄shell裏面操做的命令信息。
實施步驟
找到.mysql_history和.bash_history文件所在位置。
#find / -name .bash_history
/root/.bash_history
#find / -name .mysql_history
/root/.mysql_history
若是有須要能夠備份這兩個文件。
#cp /root/.bash_history /root/.bash_history.bak
#cp /root/.mysql_history /root/.mysql_history.bak
清空.bash_history和.mysql_history
# rm .bash_history .mysql_history //刪除歷史記錄
# ln -s /dev/null .bash_history //將shell記錄文件置空
# ln -s /dev/null .mysql_history //將mysql記錄文件置空
回退方案
還原.bash_history和.mysql_history文件。
判斷依據
查看對應的文件內容。
實施風險
低
重要等級
★★★
實施目的
不容許高權限的用戶從遠程訪問數據庫,若是必要,能夠將全部用戶置爲僅本地訪問。
問題影響
容許高權限的用戶(如root)遠程訪問數據庫會致使數據庫遭到網絡***的可能,而只容許本地訪問則能夠經過操做系統的安全措施創建第一道攔截,減小數據庫被網絡***的風險。
系統當前狀態
默認root能夠遠程鏈接數據庫。
實施步驟
禁止root帳戶遠程訪問數據庫。
# mysql -u root -p
# mysql> use mysql;
# mysql> delete from user where user='root' and host<>'localhost';
# mysql> delete from user where user='ultravr' and host<>'localhost';
# mysql> flush privileges;
回退方案
將user表還原到加固前的狀態。
判斷依據
遠程使用root鏈接時,沒法訪問,提示訪問被拒絕。
實施風險
低
重要等級
★★★
實施目的
在mysql中,提供對本地文件的讀取,使用的是load data local infile命令,默認在5.0版本中,該選項是默認打開的,網絡上流傳的一些***方法中就有用它LOAD DATA LOCAL INFILE的,同時它也是不少新發現的SQL Injection***利用的手段。
問題影響
本地文件的讀取默認打開,使用load data local infile命令會把本地文件讀到數據庫中,而後用戶就能夠非法獲取敏感信息。不須要讀取本地文件,請務必關閉。應該禁止MySQL中用「LOAD DATA LOCAL INFILE」命令。
系統當前狀態
默認開啓對本地文件的讀取。
實施步驟
方法1:在my.cnf中爲[mysqld]添加local-infile=0。
方法2:在啓動MySQL時加入參數local-infile=0。
#mysqld_safe -user=mysql -local-infile=0 &
-local-infile=0選項啓動mysqld從服務器端禁用全部LOAD DATA LOCAL命令,假如須要獲取本地文件,須要打開,可是建議關閉。
回退方案
還原my.cnf到加固前的狀態。
判斷依據
#mysql> use mysql;
#mysql> load data local infile 'sqlfile.txt' into table users fields terminated by ',';
#ERROR 1148 (42000): The used command is not allowed with this MySQL version
實施風險
低
重要等級
★★★
實施目的
MySQL權限系統的主要功能是證明鏈接到一臺給定主機的用戶,而且賦予該用戶在數據庫上的SELECT、INSERT、UPDATE和DELETE等權限(詳見user超級用戶表)。還可對MySQL特定的功能例如LOAD DATA INFILE進行受權及管理操做的能力。
問題影響
管理員能夠對user,db,host等表進行配置,來控制用戶的訪問權限,而user表權限是超級用戶權限。只把user表的權限授予超級用戶如服務器或數據庫主管是明智的。對其餘用戶,你應該把在user表中的權限設成’N'而且僅在特定數據庫的基礎上受權。你能夠爲特定的數據庫、表或列受權,FILE權限給予你用LOAD DATA INFILE和SELECT … INTO OUTFILE語句讀和寫服務器上的文件,任何被授予FILE權限的用戶都能讀或寫MySQL服務器能讀或寫的任何文件。(說明用戶能夠讀任何數據庫目錄下的文件,由於服務器能夠訪問這些文件)。
系統當前狀態
記錄sqlfile.txt、user信息。
實施步驟
FILE權限容許用戶在MySQL服務器具備寫權限的目錄下建立新文件,但不能覆蓋已有文件在user表的File_priv設置Y或N。因此當你不須要對服務器文件讀取時,請關閉該權限。
# mysql -u root -p
# mysql> use mysql;
# mysql> update user set File_priv='N' where user='root'; //禁止讀取權限
# mysql> update user set File_priv='N' where user='ultravr'; //禁止讀取權限
# mysql> flush privileges;
回退方案
還原到加固前的狀態。
判斷依據
# mysql -u root -p
# mysql> use mysql;
#mysql> load data infile 'sqlfile.txt' into table user fields terminated by ','; //重登錄讀取文件
#ERROR 1045 (28000): Access denied for user 'notroot'@'localhost' (using password: YES) //失敗
# mysql> select * from user into outfile 'test.txt' fields terminated by ',';
ERROR 1045 (28000): Access denied for user ‘notroot’@'localhost’ (using password: YES)
實施風險
低
重要等級
★★★
實施目的
開啓Mysql錯誤日誌能夠提升檢測出惡意訪問的能力。
實施步驟
登錄Mysql後
# mysql>show variables like 'log_%';
+---------------------------------+---------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------+
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_error | /var/lib/mysql/linux-vrserver-02.err |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_queries | OFF |
| log_warnings | 1 |
查看log_error是否有記錄,Value即爲日誌位置。
若是Value爲OFF,則請在my.cnf的[mysqld]下增長一行:
log-error=log_path/error.log
而後重啓數據庫。
回退方案
還原my.cnf到加固前的狀態。
實施風險
低
重要等級
★★★
實施目的
建議使用FusionCloud UltraVR提供的備份配置數據功能對數據庫進行備份。
實施步驟
登陸FusionCloud UltraVR系統,進入管理 -> 備份配置數據 頁面進行配置。詳細操做參考幫助系統。
實施風險
低
重要等級
★★★
實施目的
在MySQL啓動時能夠指定一些安全相關的參數,這些參數會對系統的安全產生重要的影響。本章節就這些安全相關的參數進行說明。用戶啓動MySQL時能夠根據自身須要進行選擇。
實施步驟
在my.cnf中添加相應的啓動選項:
--local-infile[={0|1}]
若是用local-infile=0啓動服務器,則客戶端不能使用LOCAL IN LOAD DATA語句。
LOCAL IN LOAD DATA的安全隱患請參考本文2.9節。建議使用local-infile=0啓動服務器。
--old-passwords
強制服務器爲新密碼生成短(pre-4.1)密碼哈希。當服務器必須支持舊版本客戶端程序時,爲了保證兼容性這頗有用。可是若是不考慮持舊版本客戶端程序時請不要啓用該選項。
--safe-user-create
若是啓用,用戶不能用GRANT語句建立新用戶,除非用戶有mysql.user表的INSERT權限。若是你想讓用戶具備受權權限來建立新用戶,你應給用戶授予下面的權限:
mysql> GRANT INSERT(user) ON mysql.user TO 'user_name'@'host_name';
這樣確保用戶不能直接更改權限列,必須使用GRANT語句給其它用戶授予該權限。
--secure-auth
不容許鑑定有舊(pre-4.1)密碼的帳戶。
--skip-symbolic-links
建議開啓此選項禁用have_symlink(符號連接)屬性。
實施風險
低
重要等級
★★★