您好,登錄后才能下訂單哦!
2 數據庫安全加固... 28
2.1 修改root用戶默認口令,刪除空口令... 30
2.2 刪除默認數據庫和非必要數據庫用戶... 31
2.3 使用獨立用戶運行msyql32
2.4 關于非root數據庫用戶的管理... 33
2.5 關于默認管理員用戶名的管理... 34
2.6 用戶目錄權限限制... 35
2.7 命令歷史記錄保護... 36
2.8 禁止用戶遠程連接數據庫... 37
2.9 禁止MySQL對本地文件存取... 38
2.10 MySQL服務器權限控制... 39
2.11 開啟MySQL錯誤日志... 40
2.12 數據庫備份策略... 41
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(符號鏈接)屬性。
實施風險
低
重要等級
★★★
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。