2 數據庫安全加固

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

本文示例已將運行所需的命令文件所需的加入到系統變量中。


 2.1 修改root用戶默認口令,刪除空口令

實施目的

缺省安裝的MySQLroot用戶是空密碼的,爲了安全起見,必須修改爲強密碼,所謂的強密碼,至少8位,由字母、數字和符號組成的不規律密碼。

問題影響

爲了保證用戶的安全登錄。

系統當前狀態

查看系統當前的密碼,查看mysqluser表。

實施步驟

使用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”命令的作用是強制刷新內存授權表,使得修改立即生效。

回退方案

恢復原始密碼到加固前的設置。

判斷依據

使用原始密碼連接數據庫,如果登陸失敗且提示鑑權問題,則修改成功。

實施風險

重要等級

★★★


 2.2 刪除默認數據庫和非必要數據庫用戶

實施目的

一般情況下,MySQL數據庫安裝後,只允許本地訪問且很多用戶不需要,尤其是默認安裝的用戶。

問題影響

MySQL初始化後會自動生成空用戶和test庫,進行安裝的測試,這會對數據庫的安全構成威脅,有必要全部刪除,最後的狀態只保留rootultravr即可,當然以後根據需要增加用戶和數據庫。

系統當前狀態

存在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'; // 刪除初始非rootultravr的用戶
# mysql> delete from user where user='root' and password=''; //刪除空密碼的root

# mysql> delete from user where user='ultravr' and password=''; //刪除空密碼的ultravr
# mysql> flush privileges; //強制刷新內存授權表。

 

回退方案

恢復原始用戶到加固前的設置。

判斷依據

查詢是否存在對應的數據庫和用戶數據信息。

實施風險

重要等級

★★★


 2.2 刪除默認數據庫和非必要數據庫用戶

實施目的

一般情況下,MySQL數據庫安裝後,只允許本地訪問且很多用戶不需要,尤其是默認安裝的用戶。

問題影響

MySQL初始化後會自動生成空用戶和test庫,進行安裝的測試,這會對數據庫的安全構成威脅,有必要全部刪除,最後的狀態只保留rootultravr即可,當然以後根據需要增加用戶和數據庫。

系統當前狀態

存在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'; // 刪除初始非rootultravr的用戶
# mysql> delete from user where user='root' and password=''; //刪除空密碼的root

# mysql> delete from user where user='ultravr' and password=''; //刪除空密碼的ultravr
# mysql> flush privileges; //強制刷新內存授權表。

 

回退方案

恢復原始用戶到加固前的設置。

判斷依據

查詢是否存在對應的數據庫和用戶數據信息。

實施風險

重要等級

★★★

 2.3 使用獨立用戶運行msyql

實施目的

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_safemysql.server啓動,都能確保使用mysql的身份,

方法2:在啓動數據庫時,加上user參數。

 # mysqld_safe –user=mysql &

mysqld運行時,只使用對數據庫目錄具有讀或寫權限的linux用戶來運行。

回退方案

恢復/etc/my.cnf到加固前的狀態。

判斷依據

使用ps命令查詢MySQL進程的執行用戶。

實施風險

重要等級

★★★★★

 2.4 關於非root數據庫用戶的管理

實施目的

使用一個低權限的用戶訪問授權的數據庫,防止管理員密碼外泄或者業務系統使用的賬戶具有高權限。

問題影響

因爲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; //強制刷新內存授權表。

對於ISOVHD方式安裝的系統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'                                                      |
+----------------------------------------------------------------------------------------------------------------+

實施風險

重要等級

★★★★

 2.5 關於默認管理員用戶名的管理

實施目的

修改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,提示失敗;使用修改後的用戶民登錄提示成功。

實施風險

重要等級

★★

 2.6 用戶目錄權限限制

實施目的

默認的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查看權限。

實施風險

重要等級

★★★★

 2.7 命令歷史記錄保護

實施目的

數據庫相關的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文件。

判斷依據

查看對應的文件內容。

實施風險

重要等級

★★★

 2.8 禁止用戶遠程連接數據庫

實施目的

不允許高權限的用戶從遠程訪問數據庫,如果必要,可以將所有用戶置爲僅本地訪問。

問題影響

允許高權限的用戶(如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連接時,無法訪問,提示訪問被拒絕。

實施風險

重要等級

★★★

 2.9 禁止MySQL對本地文件存取

實施目的

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

實施風險

重要等級

★★★

 2.10 MySQL服務器權限控制

實施目的

MySQL權限系統的主要功能是證實連接到一臺給定主機的用戶,並且賦予該用戶在數據庫上的SELECTINSERTUPDATEDELETE等權限(詳見user超級用戶表)。還可對MySQL特定的功能例如LOAD DATA INFILE進行授權及管理操作的能力。

問題影響

管理員可以對userdbhost等表進行配置,來控制用戶的訪問權限,而user表權限是超級用戶權限。只把user表的權限授予超級用戶如服務器或數據庫主管是明智的。對其他用戶,你應該把在user表中的權限設成’N'並且僅在特定數據庫的基礎上授權。你可以爲特定的數據庫、表或列授權,FILE權限給予你用LOAD DATA INFILESELECT … INTO OUTFILE語句讀和寫服務器上的文件,任何被授予FILE權限的用戶都能讀或寫MySQL服務器能讀或寫的任何文件。(說明用戶可以讀任何數據庫目錄下的文件,因爲服務器可以訪問這些文件)。

系統當前狀態

記錄sqlfile.txtuser信息。

實施步驟

FILE權限允許用戶在MySQL服務器具有寫權限的目錄下創建新文件,但不能覆蓋已有文件在user表的File_priv設置YN。所以當你不需要對服務器文件讀取時,請關閉該權限。

# 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)

實施風險

重要等級

★★★

 2.11 開啓MySQL錯誤日誌

實施目的

開啓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即爲日誌位置。

如果ValueOFF,則請在my.cnf[mysqld]下增加一行:

log-error=log_path/error.log

然後重啓數據庫。

回退方案

還原my.cnf到加固前的狀態。

實施風險

重要等級

★★★

 2.12 數據庫備份策略

實施目的

建議使用FusionCloud UltraVR提供的備份配置數據功能對數據庫進行備份。

實施步驟

登錄FusionCloud UltraVR系統,進入管理 -> 備份配置數據 頁面進行配置。詳細操作參考幫助系統。

實施風險

重要等級

★★★

 2.13 Mysqld安全相關啓動選項

實施目的

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(符號鏈接)屬性。

 

實施風險

重要等級

★★★





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章