本文目錄一覽:
如何保證數據安全性 MySQL資料庫設計優化技巧
1、優化設計的技巧
(1) 如果一個欄位需要經常更改,則採用以空間換時間的設計方法
最常見的例子是用戶積分登錄次數的累加,按照範式設計,在users表中建立一個欄位us_scores,以後需要在用戶積分改變時採用update的語句進行修改。但是知道 update語句的執行速度是很慢的,為了避免大量重複使用它,優化的設計方案是建立us_scores表,存儲每次增加的積分,在查詢是採用SQL語句的sum方法來計算之。
(2) 關聯欄位類型儘可能定義為數字類型
(3) 表的序列欄位必須是數字類型
(4) 若資料庫有移植的可能性,不使用存儲過程及觸發器
(5) 建立恰當的索引
索引的建立是加快資料庫查詢的基本技巧之一,通常的建議是,只有百萬級的記錄的表格才應該建立索引。
,命名都應該作為非常重要的事情來看待,表、序列、欄位、索引的命名技巧可以歸結如下:
(1) 關聯欄位名稱必須相同,名稱以基礎表的欄位名稱為準
(2) 序列名字跟表欄位名字相同
(3) 關聯表的名稱應該是被關聯的表用「_」連接起來組成的
(4) 欄位定義的前兩位是表名的縮寫,第三位是下劃線
一,保證規範,序列名稱必須是唯一的,而且,一般的序列就是這個表的id欄位。如果不加前綴,那麼欄位都叫做id就會違背惟一性原則。
第二,為了將來關聯查詢語句的書寫方便。
(5) 索引的名字和表的名字相同
(6) 常用欄位採用固定定義
為了提高大數據量的表格的查詢速度,可以採用建立適當的索引方式。如果一個表只有一個索引,建議索引的名字跟表相同,如果有多個索引,則為表名稱加下劃線加索引列名稱。
最安全的設計方案是,Web資料庫和測試資料庫分離。Web資料庫許可權只被管理員一個人掌握。
關於MySQL資料庫設計
的優化措施還需要經過資料庫設計人員的不斷發掘,從資料庫設計中不斷的發現問題,提出解決問題的方法,才能將資料庫的性能優化的更好更全面。
mysql資料庫可靠性分析
mysql資料庫有undo空間
5種mysql做可靠性分析的方案:
1.MySQL Clustering(ndb-cluster stogare)
簡介:
MySQL公司以存儲引擎方式提供的高可靠性方案,是事務安全的,實時複製數據,可用於需要高可靠性及負載均衡的場合。該方案至少需要三個節點伺服器才能達到較好的效果。
成本:
節點伺服器對RAM的需求很大,與資料庫大小呈線性比例;
最好使用千兆乙太網絡;
還需要使用Dolphin公司提供的昂貴的SCI卡。
優點:
可用於負載均衡場合;
可用於高可靠性場合;
高伸縮性;
真正的資料庫冗餘;
容易維護。
缺點:
隨著資料庫的變大,對RAM的需求變得更大,因此成本很高;
速度:
幾乎 比典型的單獨伺服器(無千兆乙太網,無SCI卡,存儲引擎相關的限制少)慢10倍。
應用場合:
冗餘,高可靠性,負載均衡
2. MySQL / GFS-GNBD/ HA (Active/Passive)
簡介:
如果多個MySQL伺服器使用共享硬碟作為數據存儲,此方案如何?
GFS/GNBD可以提供所需的共享硬碟。
GFS是事務安全的文件系統。同一時刻你可以讓一個MySQL使用共享數據。
成本:
最多n台高性能伺服器的成本,其中一個激活的,其他作為備份伺服器。
優點:
高可靠性
某種程度的冗餘
按照高可靠性進行伸縮
缺點:
沒有負載均衡
沒有保證的冗餘
無法對寫操作進行伸縮
速度:
單獨伺服器的2倍。對讀操作支持得較好。
應用場合:
需要高可靠性的、讀操作密集型的應用
3. MySQL / DRBD / HA (Active/Passive)
簡介:
如果多個MySQL伺服器使用共享硬碟作為數據存儲,此方案如何?
DRBD可以提供這樣的共享硬碟。DRBD可以被設置成事務安全的。
同一時刻你可以讓一個MySQL使用共享數據。
成本:
最多n台高性能伺服器的成本,其中一個激活的,而其他則作為備份伺服器。
優點:
高可靠性;
一定程度的冗餘;
以高可靠性名義來看是可伸縮的。
缺點:
沒有負載均衡
沒有保證的冗餘
在寫負載方面沒有伸縮性
速度:
在讀寫方面相當於單獨伺服器
應用場合
需要高可靠性、讀操作密集型的應用
4. MySQL Write Master / Multiple MySQL Read Slaves (Active/Active)
簡介:
考慮不同的讀、寫DB資料庫連接的情況。可以使用一台主伺服器用於寫操作,而採用n台從伺服器用於讀操作。
成本:
最多1台高性能寫伺服器,n台讀伺服器的成本
優點:
讀操作的高可靠性;
讀操作的負載均衡;
在讀操作負載均衡方面是可伸縮的。
缺點:
無寫操作的高可靠性;
無寫操作的負載均衡;
在寫操作方面無伸縮性;
速度:
同單獨伺服器;在讀操作方面支持得較好
應用場合
讀操作密集型的、需要高可靠性和負載均衡的應用。
5. Standalone MySQL Servers(Functionally separated) (Active)
多台功能分離的單獨伺服器,沒有高可靠性、負載均衡能力,明顯缺點太多,不予考慮。
mysql的特點是什麼?
一、MySQL資料庫的特點和優勢:
(1)功能強大
MySQL 中提供了多種資料庫存儲引擎,各引擎各有所長,適用於不同的應用場合,用戶可以選擇最合適的引擎以得到最高性能,可以處理每天訪問量超過數億的高強度的搜索 Web 站點。MySQL5 支持事務、視圖、存儲過程、觸發器等。
(2)支持跨平台
MySQL 支持至少 20 種以上的開發平台,包括 Linux、Windows、FreeBSD 、IBMAIX、AIX、FreeBSD 等。這使得在任何平台下編寫的程序都可以進行移植,而不需要對程序做任何的修改。
(3)運行速度快
高速是 MySQL 的顯著特性。在 MySQL 中,使用了極快的 B 樹磁碟表(MyISAM)和索引壓縮;通過使用優化的單掃描多連接,能夠極快地實現連接;SQL 函數使用高度優化的類庫實現,運行速度極快。
(4)支持面向對象
PHP 支持混合編程方式。編程方式可分為純粹面向對象、純粹面向過程、面句對象與面向過程混合 3 種方式。
(5)安全性高
靈活和安全的許可權與密碼系統,允許基本主機的驗證。連接到伺服器時,所有的密碼傳輸均採用加密形式,從而保證了密碼的安全。
(6)成本低
MySQL 資料庫開放源代碼且無版權制約,是一種完全免費的產品,用戶可以直接通過網路下載,自主性及使用成本低。體積小,安裝方便。歷史悠久,用戶使用活躍,遇到問題可以尋求幫助,易於維護。
(7)支持各種開發語言
MySQL 為各種流行的程序設計語言提供支持,為它們提供了很多的 API 函數,包括 PHP、ASP.NET、Java、Eiffel、Python、Ruby、Tcl、C、C++、Perl 語言等。
(8)資料庫存儲容量大
MySQL 資料庫的最大有效表尺寸通常是由操作系統對文件大小的限制決定的,而不是由 MySQL 內部限制決定的。InnoDB 存儲引擎將 InnoDB 表保存在一個表空間內,該表空間可由數個文件創建,表空間的最大容量為 64TB,可以輕鬆處理擁有上千萬條記錄的大型資料庫。
(9)支持強大的內置函數
PHP 中提供了大量內置函數,幾乎涵蓋了 Web 應用開發中的所有功能。它內置了資料庫連接、文件上傳等功能,MySQL 支持大量的擴展庫,如 MySQLi 等,可以為快速開發 Web 應用提供便利。
二、相比其他資料庫的特點和優勢:
(1) 對事務的提交
MySQL默認是自動提交,不需要在寫commit指令或者點擊commit按鈕。
(2) 分頁查詢
MySQL是直接在SQL語句中寫”select… from …where…limit m, n”,有limit就可以實現分頁。PHP里還可以用SEEK定位到結果集的位置。
(3) 事務隔離級別
MySQL是read commited的隔離級別。
一個session讀取數據時,其他session不能更改數據,但可以在表最後插入數據。session更新數據時,要加上排它鎖,其他session無法訪問數據。
(4) 複製簡單
MySQL複製伺服器配置簡單。
(5) 自動增長的數據類型處理
MYSQL有自動增長的數據類型,插入記錄時不用操作此欄位,會自動獲得數據值。
(6) 單引號的處理
MYSQL里可以用雙引號包起字元串。
(7) 日期欄位的處理
MYSQL日期欄位分DATE和TIME兩種。
(8) 空字元的處理
MYSQL的非空欄位也有空的內容,NULL或空字元。
如何提高mysql的安全性
一 作為最流行的開源資料庫引擎,MySQL本身是非常安全的。即便如此,你仍然需要添加額外的安全層來保護你的MySQL資料庫不受攻擊,畢竟任何經營網上
在線業務的人都不想冒資料庫受到損壞的風險。接下來,我們將介紹一些實用的辦法,你可以利用這些辦法來保護MySQL資料庫,以便加強網站的安全性。
二 保護操作系統
確保操作系統的安全是保護資料庫安全的前提,因為如果整個運行環境不安全,那麼網站上所有的東西都脆弱,很容易暴露於攻擊者。為了維護操作系統和MySQL伺服器,你可以使用以下方法:
2.1 主機資料庫伺服器和web伺服器分別在不同的物理機器上,如果可能,在一個單獨的伺服器上運行資料庫伺服器,以預防由其他應用程序或服務的漏洞造成的伺服器問題。
安裝殺毒軟體,防火牆以及所有推薦的補丁和更新,防火牆能有效地把流量過濾到MySQL伺服器。為了更好的提高安全性,你還可以實行入口封鎖。
禁用所有不必要的服務,而且這樣的服務越少越好。
2.2 保護所有帳戶和密碼
攻擊者侵入MySQL資料庫最常見的一種方法是竊取有安全隱患的賬戶信息。為了降低出現這種風險的可能性,你不妨試一試下面的方法:
2.2.1. 給所有MySQL賬戶設置密碼
客戶程序並不是每次都能識別用戶,因此,如果用戶知道資料庫名但是沒有這個用戶名的密碼,那他可以指定任何其他用戶名連接到MySQL資料庫。讓每個MySQL用戶名都設置密碼,這樣一來,要想利用匿名賬戶建立連接將會變得很困難。
2.2.2. 不要使用根用戶運行MySQL伺服器
在安裝MySQL的時候,默認情況下創建了一個命名為「root」的管理用戶。每個人都知道這一點,所以攻擊者通常試圖侵入這個「root」用戶來獲取訪問許可權。為了保障這個重要帳戶的安全,你需要給它重新命名,然後更改一個長並且複雜的密碼。
2.2.3你可以在MySQL控制台使用mysql RENAME USER root TO new_username;
指令給根用戶重命名,使用mysql SET PASSWORD FOR ‘username’@’%hostname’ =
PASSWORD(‘newpassword’);//這是很重要的一條命令
指令來修改密碼。
三. 減少管理員賬戶
管理員賬戶越多,風險越大,所以你應該保持儘可能最少的帳戶數量,只有為那些真正需要它的人創建賬戶。此外,記得要刪除未使用的和匿名的賬戶。如果你有很多管理員賬戶,那你需要定期檢查並清理那些不必要的賬戶。
四. 加強所有的密碼
除了管理員帳戶,你還需要加強所有其他用戶的密碼。你可以檢查所有的用戶名和密碼,必要的時候你還可以重置安全強度低的賬戶密碼。雖說這樣做會有點費時,但卻是有必要的。
五 限制資料庫許可權
每個用戶都應該被授予適當的許可權以便資料庫能夠正常運行,但這樣一來也加大了資料庫的安全隱患。就資料庫許可權而言,我們有以下幾點建議:
5.1. 不要授予非管理員用戶文件/高級/程序許可權
文件,高級和程序許可權都不應該被濫用。文件許可權讓用戶可以在文件系統中的任何一個地方編寫文件,而程序許可權讓用戶在任何時候都能夠查看伺服器活動,終止客戶端連接甚至更改伺服器操作。為了你的資料庫安全,這些許可權只能授予給管理員賬戶。
5.2. 限制或禁用顯示資料庫許可權
顯示資料庫特權可以用於收集資料庫信息,所以攻擊者通常利用它來竊取數據並準備進一步攻擊。你應該把這個許可權授予那些真正需要的人,或者直接禁用這個權
限,你只需要把skip-show-database添加到MySQL資料庫中的/etc/my.cnf配置文件中。對於Windows操作系統來說,則
需要添加到my.ini文件中。
5.3. 限制管理員和所有其他用戶的許可權
即使是管理員,也不要在同一賬戶中授予所有許可權。因此我們建議你最好降低管理員賬戶訪問數據的許可權。至於其他的用戶,你最好檢查所有他們擁有的許可權,以確保一切都是合適的。
六 刪除風險組件
MySQL資料庫的默認配置有一些不必要的組件,你可以考慮以下建議:
6.1. 禁用LOAD DATA LOCAL INFILE指令
這個命令允許用戶讀取本地文件甚至訪問其他操作系統上的文件,這可能幫助攻擊者收集重要的信息並利用應用程序的漏洞侵入你的資料庫。你需要做的是把set-variable=local-infile=0插入到MySQL資料庫的my.cnf文件中,來禁用這個指令。
6.2. 刪除測試資料庫
有一個默認的「測試」資料庫用於測試目的。由於這個資料庫有安全風險,匿名用戶也可以訪問,你應該使用mysql DROP database test;指令儘快把它清除掉。
6.3. 刪除歷史文件
MySQL伺服器有一個歷史文件,它可以幫助你在安裝出錯的時候找到問題所在。歷史文件包含敏感信息,比如說密碼,如果這些信息被攻擊者獲得,那麼將會給
你的資料庫帶來巨大的安全隱患。在安裝成功後,歷史文件並沒有什麼用,因此你可以使用cat /dev/null
~/.mysql_history指令來刪除文件當中的內容。
七 限制遠程訪問MySQL伺服器
對於大多數用戶來說,不需要通過不安全的開放網路來訪問MySQL伺服器。你可以通過配置防火牆或硬體,或者迫使MySQL只聽從localhost來限制主機。此外,需要SSH隧道才能進行遠程訪問。
八 如果你想僅僅從本地主機來限制用戶建立連接,你需要在在配置文件中添加bind-address=127.0.0.1。
8.1利用日誌記錄
啟用日誌記錄讓你可以檢測伺服器上的活動,這樣你就可以分析失敗的登錄嘗試和敏感文件的訪問記錄,以便了解是否存在向你的伺服器和資料庫發起的惡意活動。
你只需要把log =/var/log/mylogfile指令添加到MySQL配置文件中,就可以手動啟用日誌記錄功能。
8.2至於日誌記錄,需要注意以下兩點:
8.2.1日誌記錄僅適用於查詢數量有限的資料庫伺服器。對於信息量大的伺服器,這可能會導致高過載。
8.2.2由於「hostname.err」文件包含敏感數據表名和密碼,只有「root」和「mysql」才有訪問和記錄這個文件的許可權。
如何做好MySQL安全策略
摘至網頁鏈接
常見Mysql配置文件:linux系統下是my.conf,windows環境下是my.ini;
資料庫整體安全需求:機密性、完整性、可用性;
下面以mysql 5.7版本為例,介紹mysql常見的安全策略、配置、加固方式等等,有些策略可能只針對Linux操作系統,更多策略可以參考CIS Mysql Benchmark相關文檔:
1、操作系統級別安全配置
1.1不要將資料庫放在系統分區
Windows系統:直接檢查是否將資料庫放置在C盤。
Linux系統:
在終端連接上mysql資料庫,執行如下命令:
show variables where variable_name = ‘datadir’;
然後返回shell命令行:
df -h datadir
其中datadir是上一條命令的返回值。
上述命令的返回值不應是/、/var、/usr
1.2使用專用的最小許可權賬號運行mysql資料庫進程
Windows系統:直接打開任務管理器,查看運行mysql進程的操作系統賬號,不能為administrator賬號。
Linux系統:
Shell命令行運行如下命令:
ps -ef | grep mysql
查看mysql服務的運行賬號是否為root或其他高許可權賬號,如果是的,則需要創建一個非管理員專用賬號來運行mysql服務。
1.3禁止使用mysql命令行歷史記錄
Linux系統:
執行如下命令:
find / -name “.mysql_history”
查看是否存在mysql的歷史命令記錄文件,如果存在,則需要進行如下加固:
(1)刪除.mysql_history文件;
(2)設置環境變數MYSQL_HISTFILE為/dev/null,並添加到shell的初始化腳本中,創建mysql_history到/dev/null的鏈接:
ln -s /dev/null $HOME/.mysql_history
1.4 確保MYSQL_PWD環境變數未設置敏感信息
Windows系統下進入cmd命令行,使用如下命令:
Set
查看是否設置了環境變數MYSQL_PWD。
Linux系統下使用如下命令:
grep MYSQL_PWD /proc/*/environ
查看MYSQL_PWD環境變數是否設置了敏感信息。
確認那個配置文件或腳本設置了MYSQL_PWD環境變數。
2、安裝
2.1使用資料庫專用伺服器
使用專用的伺服器安裝mysql服務可以減少mysql服務的攻擊面,盡量卸載或刪除操作系統上的不必要的應用或服務,減少其他應用的安裝可能給mysql的運行帶來的安全風險。
2.2 不要復用資料庫賬號
運行mysql服務的操作系統賬號不要用來運行其他應用或服務,這樣可以避免其他應用或伺服器被攻擊給mysql服務帶來影響。
2.3 歷史命令行密碼設置為不可見
使用如下命令:
mysql -u admin -p password
連接mysql資料庫服務,退出後查看歷史命令,確認password是否為明文。
建議使用如下命令方式登錄:
(1)先輸入mysql -u admin -p
(2)根據命令行提示輸入密碼;
而不要在一整條命令中輸入密碼。
另外要控制mysql配置文件訪問許可權。
3、文件許可權控制
3.1 控制數據目錄的訪問許可權
數據目錄是mysql資料庫存放的位置,在mysql命令行界面下執行如下命令:
show variables where variable_name = ‘datadir’;
在終端命令行下執行如下命令:
ls -l datadir/.. | egrep “^d[r|w|x]{3}——\s*.\s*mysql\s*mysql\s*\d*.*mysql”
其中datadir是第一條命令的執行結果
如果存在問題,linux環境下在終端執行如下命令進行加固:
chmod 700 datadir
chown mysql:mysql datadir
3.2 控制二進位日誌文件的許可權
mysql的運行會產生很多日誌,例如二進位日誌、錯誤日誌、慢查詢日誌等等,Mysql命令行下執行如下命令:
show variables like ‘log_bin_basename’;
在終端命令行執行如下命令:
ls log_bin_basename.*
對於發現的每一個文件,執行如下命令:
ls -l log_bin_basename.nnnnn | egrep “^-[r|w]{2}-[r|w]{2}—-\s*.*$”
根據輸出確認日誌文件的許可權設置是否存在問題。
對於每個日誌文件,修改其許可權和屬組如下:
chmod 660 log file
chown mysql:mysql log file
3.3 控制錯誤日誌文件的許可權
Mysql命令行下執行如下命令:
show variables like ‘log_error’;
在終端命令行執行如下命令:
ls log_error.*
對於發現的每一個文件,執行如下命令:
ls -l log_error | egrep “^-[r|w]{2}-[r|w]{2}—-\s*.*$”
根據輸出確認日誌文件的許可權設置是否存在問題。
對於每個日誌文件,修改其許可權和屬組如下:
chmod 660 log file
chown mysql:mysql log file
3.4控制慢查詢日誌文件的許可權
Mysql命令行下執行如下命令:
show variables like ‘slow_query_log_file’;
在終端命令行執行如下命令:
ls slow_query_log_file.*
對於發現的每一個文件,執行如下命令:
ls -l slow_query_log_file | egrep “^-[r|w]{2}-[r|w]{2}—-\s*.*$”
根據輸出確認日誌文件的許可權設置是否存在問題。
對於每個日誌文件,修改其許可權和屬組如下:
chmod 660 log file
chown mysql:mysql log file
3.5控制通用日誌文件的許可權
Mysql命令行下執行如下命令:
show variables like ‘general_log_file’;
在終端命令行執行如下命令:
ls general_log_file.*
對於發現的每一個文件,執行如下命令:
ls -l general_log_file | egrep “^-[r|w]{2}-[r|w]{2}—-\s*.*$”
根據輸出確認日誌文件的許可權設置是否存在問題。
對於每個日誌文件,修改其許可權和屬組如下:
chmod 660 log file
chown mysql:mysql log file
3.6控制審計日誌文件的許可權
Mysql命令行下執行如下命令:
show global variables where variable_name = ‘audit_log_file’;
在終端執行如下命令:
ls -l audit_log_file | egrep “^-rw[-x]rw[-x][-r][-w][-x][ \t]*[0-9][ \t]*mysql[
\t]*mysql.*$”
根據輸出確認日誌文件的許可權設置是否存在問題。
對於每個日誌文件,修改其許可權和屬組如下:
chmod 660 audit_log_file
chown mysql:mysql audit_log_file
4、通用安全
4.1安裝最新的補丁
在mysql命令行下查詢MySQL的版本:
SHOW VARIABLES WHERE Variable_name LIKE “version”;
確認是否由需要安裝的補丁包,如果有請安裝。
4.2 刪除test資料庫
Mysql資料庫默認安裝好後,存在一個名為test的資料庫,如果存在,請執行如下命令刪除:
Drop database 「test」
4.3 確保讀取本地文件的參數設置為失效
Mysql命令行下,使用如下命令:
SHOW VARIABLES WHERE Variable_name = ‘local_infile’;
查看結果是否為OFF。
如果該命令為ON,則資料庫用戶可以通過LOAD DATA INFILE 或者 SELECT local_file 讀取到資料庫所在操作系統本地的文件,在這種情況下,需要在mysql配置文件中新增一行:
Local-infile=0;
然後重啟資料庫服務。
5、許可權配置
5.1控制可以訪問所有資料庫的賬號
Mysql資料庫下的user表和db表中存放著可以授予資料庫用戶的許可權,確保只有管理員賬號才能訪問所有資料庫。可以訪問mysql資料庫的用戶或許可以查看密碼哈希值、修改用戶許可權等等。
使用如下sql語句:
SELECT user, host FROM mysql.user
WHERE (Select_priv = ‘Y’) OR (Insert_priv = ‘Y’) OR (Update_priv = ‘Y’)
OR (Delete_priv = ‘Y’) OR (Create_priv = ‘Y’) OR (Drop_priv = ‘Y’);
SELECT user, host FROM mysql.db WHERE db = ‘mysql’
AND ((Select_priv = ‘Y’) OR (Insert_priv = ‘Y’) OR (Update_priv = ‘Y’)
OR (Delete_priv = ‘Y’) OR (Create_priv = ‘Y’) OR (Drop_priv = ‘Y’));
確保返回結果只能是資料庫管理員賬號。
5.2限制非管理員用戶的許可權
Mysql.user表中的許可權列有:
file_priv:表示是否允許用戶讀取資料庫所在主機的本地文件;
Process:表示是否允許用戶查詢所有用戶的命令執行信息;
Super_priv:表示用戶是否有設置全局變數、管理員調試等高級別許可權;
Shutdown_priv:表示用戶是否可以關閉資料庫;
Create_user_priv:表示用戶是否可以創建或刪除其他用戶;
Grant_priv:表示用戶是否可以修改其他用戶的許可權;
應確保只有資料庫管理員才有上述許可權,使用如下sql語句查看擁有各個許可權的資料庫賬號:
select user, host from mysql.user where File_priv = ‘Y’;
select user, host from mysql.user where Process_priv = ‘Y’;
select user, host from mysql.user where Process_priv = ‘Y’;
SELECT user, host FROM mysql.user WHERE Shutdown_priv = ‘Y’;
SELECT user, host FROM mysql.user WHERE Create_user_priv = ‘Y’;
SELECT user, host FROM mysql.user WHERE Grant_priv = ‘Y’;
SELECT user, host FROM mysql.db WHERE Grant_priv = ‘Y’;
確保查詢結果中不存在非管理員用戶。
如果存在非管理員用戶,使用如下命令進行許可權回收:
REVOKE FILE ON *.* FROM ‘user’;
REVOKE PROCESS ON *.* FROM ‘user’;
REVOKE SUPER ON *.* FROM ‘user’;
REVOKE SHUTDOWN ON *.* FROM ‘user’;
REVOKE CREATE USER ON *.* FROM ‘user’;
REVOKE GRANT OPTION ON *.* FROM user;
其中user為上述查詢到的非管理員用戶。
5.3合理控制DML/DDL操作授權
DML/DDL語句包括創建或修改資料庫結構的許可權,例如insert、update、delete、create、drop和alter語句,在任何資料庫中都要控制用戶的此類許可權,確保只授權給有業務需求的非管理員用戶。Mysql命令行下執行如下命令:
SELECT User,Host,Db FROM mysql.db WHERE Select_priv=’Y’
OR Insert_priv=’Y’ OR Update_priv=’Y’ OR Delete_priv=’Y’ OR Create_priv=’Y’
OR Drop_priv=’Y’ OR Alter_priv=’Y’;
上述查詢到的用戶只能對特地的資料庫才有相關的許可權,使用如下命令進行相關許可權的回收:
REVOKE SELECT ON host.database FROM user;
REVOKE INSERT ON host.database FROM user;
REVOKE UPDATE ON host.database FROM user;
REVOKE DELETE ON host.database FROM user;
REVOKE CREATE ON host.database FROM user;
REVOKE DROP ON host.database FROM user;
REVOKE ALTER ON host.database FROM user;
其中user為查詢到的未授權的用戶,host為相關主機,database為相關資料庫。
6、審計和日誌
6.1開啟錯誤日誌審計功能
錯誤日誌包括資料庫運行和停止過程中的一系列活動信息,有助於分析資料庫運行過程中的一些異常活動,一般情況下需要開啟錯誤日誌記錄功能,使用如下命令查詢:
SHOW variables LIKE ‘log_error’;
確保返回結果為非空,如果為空,需要在mysql資料庫配置文件中增加相關配置。
6.2確保日誌存放在非系統區域
日誌文件隨著資料庫的運行會不斷增加,如果存放在系統區域,則會影響系統的正常運行,使用如下命令進行查詢:
SELECT @@global.log_bin_basename;
確保返回結果不是如下路徑:/、/var、/usr
6.3關閉原始日誌功能
原始日誌選項會決定一些敏感信息是否會被明文寫進日誌中,例如查詢日誌、慢查詢日誌、二進位日誌,確保資料庫配置文件中存在如下配置項:
Log-raw = OFF
7、認證
7.1 Old_passwords環境變數設置
Old_passwords決定了使用PASSWORD()函數和IDENTIFIED BY 、CREATE USER 、GRANT 等語句是時的hash演算法:
0 – authenticate with the mysql_native_password plugin
1 – authenticate with the mysql_old_password plugin
2 – authenticate with the sha256_password plugin
設置為mysql_old_password代表弱hash演算法,可以快速通過密碼字典進行暴力破解。使用如下命令查詢相關值:
SHOW VARIABLES WHERE Variable_name = ‘old_passwords’;
確保返回值不為1。
7.2 secure_auth 選項設置
如果客戶端採用Old_passwords發起連接請求,如果伺服器端設置了secure_auth,則客戶端會拒絕連接請求,可以根據安全需求在配置文件中做相應配置。
7.3 密碼保存
確保密碼沒有明文保存在全局配置文件中。
7.4 確保所有用戶都要求使用非空密碼登錄
執行如下語句查詢是否有用戶不需要密碼即可登錄:
SELECT User,host
FROM mysql.user
WHERE (plugin IN(‘mysql_native_password’, ‘mysql_old_password’)
AND (LENGTH(Password) = 0
OR Password IS NULL))
OR (plugin=’sha256_password’ AND LENGTH(authentication_string) = 0);
7.5不存在空賬號
使用如下命令查詢是否存在空賬號:
SELECT user,host FROM mysql.user WHERE user = ”;
8、網路設置
如果mysql資料庫伺服器與應用是跨信任域部署的,則需要考慮在資料庫伺服器與應用伺服器之間建立ssl通道進行數據傳輸,不過這種場景一般很少見,在此不詳細描述。
9、資料庫備份
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/270085.html