您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么理解MySQL安全”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
當多個用戶同時訪問MySQL 服務器,尤其當這些用戶通過Internet 進行連接時,MySQL 服務器將有安全風險。不僅MySQL 服務器處于危險中,整個服務器主機也可能受到損害。有多種類型的安全攻擊:竊聽、更改、播放、拒絕服務;
對于存儲在MySQL 數據庫中的數據,必須使其保持安全,以免MySQL 用戶期望保密的數據被公開。MySQL 使用基于訪問控制列表(access control list, ACL) 的安全。對于所有連接、查詢和其他操作,MySQL 使用基于ACL 的安全。ACL 也支持MySQL 客戶機和服務器之間的SSL 加密連接。
最常見的安裝安全風險為:
u 網絡安全:有關客戶機帳戶的信息存儲在mysql 數據庫中。為每個帳戶設置的權限應該僅提供對該帳戶需要查看或修改的數據的訪問權限。指定帳戶口令可使用戶難以使用別人的帳戶連接到服務器。例如,MySQL root 帳戶具有可執行任何數據庫操作的完全權限,因此有必要為其指定一個不易猜到的口令。
u 操作系統安全:通常使用專用的登錄帳戶管理MySQL。但是,該帳戶所在的主機上可能還有其他登錄帳戶。將與MySQL 不相關的帳戶數量減至最少可以盡可能地降低此風險。
u 文件系統安全:目錄和文件是文件系統的一部分,因此您需要保護它們免受在服務器主機上具有登錄帳戶的其他用戶的直接訪問。MySQL 安裝還包括用于管理和訪問數據庫的程序和腳本。用戶需要能夠運行其中的一部分(例如客戶機程序),但應該無法對其進行修改或替換。
可以認為網絡安全是最高防御級別。其中包含了操作系統安全。后者又包含了文件系統安全以及更深層的用戶安全。盡管每個安全級別都有缺陷(或漏洞),但是當它們結合使用時,各個級別形成了一個幾乎堅不可摧的堡壘。
1.1. 網絡安全
網絡安全風險預防任務:
— 投資設置防火墻。
— 確保僅供授權的客戶機進行訪問。
— 限制服務器所使用的網絡接口。
— 使用安全安裝腳本:mysql_secure_installation
— 遵守常規權限安全事項。
— 不通過Internet 傳輸明文(未加密)數據。
MySQL 服務器在客戶機/服務器環境中運行,并提供內在面向網絡的服務。確保只有授權的客戶機可以連接到服務器以訪問其數據庫是非常重要的。確保使用口令保護MySQL 帳戶并且不為其設置不必要的權限也非常重要。此外,請考慮限制服務器所使用的網絡接口。
有許多不錯的免費開源防火墻。MySQL 不是為了面向Internet。如果MySQL 未放置在DMZ 中,應格外小心。事實上,如果MySQL 與面向Internet 的應用程序在同一計算機上運行,則可能應該僅使用文件套接字。
未加密的數據可被任何有時間和能力攔截該數據并使用它來達到自己目的的用戶訪問。因此,您應該使用SSL 或SSH 等加密協議。
1.2. 口令安全
口令安全風險預防任務:
— 使用強口令保護初始MySQL 帳戶。
— 不在數據庫中存儲任何純文本口令。mysql 數據庫將口令存儲在user 表中。最好使用單向散列存儲這些口令。
— 不從字典中選擇口令。
如果您使用純文本口令,則在您的計算機被入侵后,入侵者可以獲取完整的口令列表并使用這些口令。請改用MD5()、SHA1()、SHA2() 或其他單向散列函數來存儲散列值。
這種謹慎的方法用于在服務器中存儲其他口令。有一些特殊程序可破譯口令。應對這些程序的方法之一是使用由句子中每個單詞的第一個字符組成的口令(例如,“Mary had a little lamb”可以生成口令“Mhall”)。這種口令易于記憶和輸入,但不知道句子的人很難猜到。
1.3. 操作系統安全
操作系統安全與配置的復雜程度有關;
將不直接與運行MySQL 相關的服務器主機任務數減至最少。當為主機配置的任務較少時,與運行復雜配置以支持多個服務的主機相比,前一個主機更易于確保安全。所分配的MySQL 服務器最好是主要用于MySQL 或專供其用,而不是用于Web 托管或郵件處理之類的其他目的,或者是為通用交互使用而托管登錄帳戶的計算機。
如果其他用戶可以登錄,則可能會存在MySQL 安裝及其管理帳戶的私密數據庫信息被公開的風險。例如,不正確的文件系統權限可能會導致數據文件被公開。用戶可以運行ps 命令來查看有關進程及其執行環境的信息。
當計算機僅用于MySQL 時,除了系統管理帳戶和管理MySQL 自身可能需要的其他任何帳戶(例如mysql 用戶的帳戶),無需再設置登錄帳戶。
此外,如果在服務器主機上運行的網絡服務較少,則需要保持打開狀態的網絡端口也較少。關閉端口可將主機可能遭遇的攻擊途徑減至最少。盡量減少非MySQL 服務的數量意味著更多的系統資源可以專用于MySQL,從而可以在性能方面獲益。
1.4. 文件系統安全
MySQL 安裝(目錄和文件)風險預防任務:
l 更改所有權和訪問權限后,再啟動服務器。
將多用戶系統的所有權設置為具有管理權限的帳戶。將與MySQL 相關的目錄和文件以及user 和group 表所有權設置為mysql,其中包括:MySQL 程序、數據庫目錄和文件、日志、狀態和配置文件;
l 不要在保護文件之前設置口令。否則,將允許未經授權的用戶替換文件。
l 設置一個專用于MySQL 管理的帳戶。
請勿向任何人(MySQL root 帳戶除外)授予對mysql 數據庫中的user 表的訪問權限。將MySQL 置于防火墻后或隔離區(demilitarized zone, DMZ) 中。
僅當服務器正在運行時,才可以設置MySQL root 帳戶的口令。因此,啟動服務器并設置口令之前,請采取任何必要的措施來保護文件系統中與MySQL 相關的部分。如果在保護相應文件之前設置了口令,則有權直接訪問 服務器主機上文件系統的用戶可能會替換這些文件。這會危害MySQL 安裝并撤消口令設置的效果。
對于Linux 之類的多用戶系統,請將MySQL 安裝的所有組件的所有權設置為具有正確管理權限的專用登錄帳戶。這將保護安裝免受不負責數據庫管理的用戶的訪問。設置此帳戶的另外一個好處是,可以使用該帳戶運行MySQL 服務器,而不是從Linux root 帳戶運行服務器。具有root 登錄帳戶權限的服務器擁有不必要的文件系統訪問權限,從而成為一個安全風險。
注:本部分假定存在用戶名和組名均為mysql 的管理帳戶。不過,創建登錄帳戶的詳細信息因Linux 版本而不同,并且不在討論范圍之內。請參閱適用于您操作系統的文檔。
1.5. 數據安全
用戶可通過多種方法來損壞數據。您必須采取措施以保護數據免受如SQL 注入等攻擊。
首先,請勿信任應用程序用戶輸入的任何數據。用戶可以使用具有特殊意義的字符(如引號或轉義字符)獲取應用程序代碼。如果用戶輸入類似于DROP DATABASE mysql; 的內容,請確保應用程序保持安全。
其次,保護數值和字符串數據的值。否則,用戶可以獲取對安全數據的訪問權限,然后提交可以銷毀數據或導致服務器負載過高的查詢。
最后,甚至需要保護公開可用的數據,如Web 表單、URL 名稱、特殊字符等,因為攻擊會浪費服務器資源。
如果用戶輸入值234 時,應用程序生成一個類似于SELECT * FROM table WHERE ID=234 的查詢,則用戶可以輸入值234 OR 1=1 使應用程序生成查詢SELECT * FROM table WHERE ID=234 OR 1=1。因此,服務器將檢索表中的每一行。這將公開每一行并導致服務器負載過高。為了防止這種類型的攻擊,請使用不會將值解釋為SQL表達式的存儲過程或預處理語句。
您可能認為:如果數據庫僅包含公開可用的數據,則該數據庫不需要保護。這是錯誤的,即使允許顯示數據庫中的任何行,仍應該防止通過注入INSERT、UPDATE、REPLACE 或DELETE 語句來進行DdoS攻擊或修改數據的嘗試。否則,數據將對合法用戶不可用。
以下是一些用于檢測此問題的技巧:
— 在所有Web 表單中輸入單引號或雙引號(“'”和“"”)。
— 修改動態URL,向其添加%22(“"”)、%23(“#”)和%27(“'”)。
— 在數值字段中輸入字符、空格和特殊符號而不是數字。應用程序應刪除這些內容再將其傳遞給MySQL;否則,將生成錯誤。
1.6. 安全連接
默認情況下,MySQL 使用未加密的客戶機/服務器連接。但是未加密連接可能無法滿足在網絡上安全傳輸數據的要求,因為未加密連接網絡通信容易受到監控和攻擊,客戶機和服務器之間傳輸的數據可能會被更改。
通過使用加密算法可抵御大多數威脅,加密算法會使所有類型的數據無法讀取,這可抵御多種類型的攻擊。如果應用程序需要加密連接所提供的安全性,對于這些連接,必須考慮額外的計算資源。大家知道,數據加密是CPU 密集型操作,需要計算機執行額外工作,因此可能推遲其他MySQL 任務。
1.6.1. SSL 協議
MySQL 支持MySQL 客戶機和服務器之間的SSL(secure sockets layer,安全套接字層) 連接。SSL 連接協議具有以下特點:
? 使用不同的加密算法確保公共網絡上數據的安全
? 檢測任何數據更改、丟失或重放
? 結合了使用X509 標準提供身份驗證的算法
MySQL 可以針對單個連接啟用加密。根據各個應用程序的需要,您可以選擇常規的未加密連接或安全的加密SSL 連接。
安全連接基于OpenSSL API,可通過MySQL C API 獲取。復制時使用C API,因此可以在master和slave之間使用安全連接。
X509 使得在Internet 上進行身份識別成為可能。這主要用于電子商務應用程序中。基本上,應該有一個受信任的證書頒發機構(Certificate Authority, CA),該機構將電子證書分配給任何需要它們的人。證書依賴于包含兩個加密密鑰(公鑰和私鑰)的非對稱加密算法。
證書所有者可以向另一方提供證書作為身份證明。證書包含其所有者的公鑰和其他詳細信息,由可信任的CA 簽名。使用此公鑰加密的任何數據都只能使用相應的私鑰進行解密,私鑰由證書所有者持有。
例如,訪問安全的(HTTPS) 電子商務站點時,該站點將向您的瀏覽器提供其證書。瀏覽器將根據其受信任CA 列表驗證該證書,并使用其中包含的公鑰創建加密的會話信息,該信息只能由發起服務器解密。然后,瀏覽器和服務器可以進行安全通信。
1.6.2. 對MySQL 服務器使用SSL
對MySQL 服務器使用 SSL的要求:
? 系統必須支持yaSSL(已隨MySQL 提供)或OpenSSL。為便于使用安全連接,MySQL 已附帶了yaSSL。(MySQL 和yaSSL 采用相同的許可模型,但是OpenSSL 使用Apache 樣式的許可證。)
? 使用的MySQL 版本必須包含SSL 支持。
要獲取安全連接以便使用MySQL 和SSL,必須首先執行以下操作:
? 裝入OpenSSL(如果使用的不是預編譯的MySQL)。
? 為MySQL 配置SSL 支持。要獲得OpenSSL,請訪問http://www.openssl.org。使用OpenSSL 構建MySQL 需要一個共享的OpenSSL 庫;否則,將出現鏈接程序錯誤。要將MySQL 源代碼分發配置為使用SSL,請調用CMake:
shell> cmake . -DWITH_SSL=bundled
? 該操作會將分發配置為使用附帶的yaSSL 庫。要改用系統SSL 庫,請將相應選項指定為-DWITH_SSL=system。
? 確保mysql 數據庫中的user 表包含與SSL 相關的列(ssl_* 和x509_*)。如果user 表中沒有與SSL 相關的列(以ssl_* 和x509_* 開頭),則必須使用mysql_upgrade 程序對其進行升級。
? 使用--ssl 選項檢查服務器二進制文件是否使用SSL 支持進行編譯。如果服務器不支持SSL,則會出現錯誤:
shell> mysqld --ssl --help
060525 14:18:52 [ERROR] mysqld: unknown option '--ssl'
最后,使用SSL 的選項啟動服務器。
1.6.3. 使用SSL 啟動MySQL 服務器
通過以下選項,使mysqld 服務器可以使用SSL進行連接:
? --ssl-ca:確定要使用的證書頒發機構(Certificate Authority, CA) 證書(加密必需)
? --ssl-key:確定服務器公鑰
? --ssl-cert:確定服務器私鑰
shell> mysqld --ssl-ca=ca-cert.pem --ssl-cert=server-cert.pem --ssl-key=server-key.pem
可以向客戶機發送--ssl-cert 并針對其正在使用的CA 證書進行驗證。
1.6.4. SSL 加密連接
要使用SSL 支持建立與MySQL 服務器的安全連接,必須指定的客戶機選項取決于客戶機所使用的用戶帳戶的SSL 要求。除基于用戶名和口令的常見驗證之外,MySQL 還可以檢查X509 證書屬性。要為MySQL 帳戶指定與SSL 相關的選項,請使用GRANT 語句的REQUIRE 子句。使用GRANT 語句的REQUIRE SSL 選項可僅允許某個帳戶使用SSL 加密連接:
mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE SSL;
通過使用--ssl-ca 選項啟動mysql 客戶機可獲得加密連接。也可以為X509 連接指定--ssl-key 和 --ssl-cert 選項:
shell> mysql --ssl-ca=ca-cert.pem --ssl-cert=server-cert.pem --ssl-key=server-key.pem
有很多方法可限制給定帳戶的連接類型。本次只介紹三種選項:
? REQUIRE NONE:指示帳戶沒有SSL 或X509 要求。如果未指定與SSL 相關的REQUIRE 選項,則這是默認選項。如果用戶名和口令有效,則允許未加密的連接。但是,如果客戶機具有相應的證書和密鑰文件,則客戶機也可以通過指定一個選項來要求加密連接。即,客戶機無需指定任何SSL 命令選項,在這種情況下,連接是未加密的。
? REQUIRE SSL:指示服務器僅允許帳戶使用SSL 加密連接。
? REQUIRE X509:客戶機必須具有有效的證書,但具體的證書、頒發者和主題無關緊要。唯一的要求是,應該可以使用其中一個CA 證書驗證其簽名。
1.6.5. 檢查SSL 狀態
使用have_ssl 系統變量的值檢查正在運行的mysqld 服務器是否支持SSL:
mysql> SHOW VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl | YES |
+---------------+-------+
使用ssl_cipher 狀態變量的值檢查當前服務器連接是否使用了SSL:
mysql> SHOW STATUS LIKE 'ssl_cipher';
+---------------+--------------------+
| Variable_name | Value |
+---------------+--------------------+
| ssl_cipher | DHE-RSA-AES256-SHA |
+---------------+--------------------+
如果have_ssl 的值為YES,則服務器支持SSL 連接。如果值為DISABLED,則服務器支持SSL 連接,但在啟動時未提供相應的--ssl-* 選項。
對于mysql 客戶機,可以使用STATUS 或\s 命令并檢查SSL 行:
mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
1.6.6. 使用SSL 的優點和缺點
優點:
? 提高了有需求的應用程序的安全性
? 可以針對單個連接啟用
? 可用于復制操作
缺點:
? 占用大量CPU 資源
? 降低了客戶機/服務器協議的速度
? 可能會推遲其他SQL 任務
1.6.7. MySQL 安全遠程連接
MySQL 支持與遠程MySQL 服務器的SSH(secure shell,安全shell) 連接。這一功能要求:
? 客戶機上存在SSH 客戶機
? 通過SSH 隧道進行從客戶機到服務器的端口轉發
? 具有SSH 客戶機的計算機上存在客戶機應用程序
設置完成后,將有一個本地端口托管到MySQL 的SSH 連接并使用SSH 進行加密。
“怎么理解MySQL安全”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。