MySQL入門--MySQL安全
MySQL 安全
當多個使用者同時訪問 MySQL 伺服器,尤其當這些使用者透過 Internet 進行連線時, MySQL 伺服器將有安全風險。不僅 MySQL 伺服器處於危險中,整個伺服器主機也可能受到損害。有多種型別的安全攻擊:竊聽、更改、播放、拒絕服務;
對於儲存在 MySQL 資料庫中的資料,必須使其保持安全,以免 MySQL 使用者期望保密的資料被公開。 MySQL 使用基於訪問控制列表 (access control list, ACL) 的安全。對於所有連線、查詢和其他操作, MySQL 使用基於 ACL 的安全。 ACL 也支援 MySQL 客戶機和伺服器之間的 SSL 加密連線。
有關 MySQL 安全問題的更多資訊,請參閱《 MySQL 參考手冊》:
http://dev.mysql.com/doc/refman/5.6/en/security.html 。
最常見的安裝安全風險為:
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 任務。
有關與 MySQL 的安全連線相關的更多資訊,請參閱《 MySQL 參考手冊》:
http://dev.mysql.com/doc/refman/5.6/en/ssl-connections.html 。
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 ,請訪問 。使用 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 證照進行驗證。
有關為 MySQL 設定 SSL 證照的資訊,請參閱《 MySQL 參考手冊》:
http://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html 。
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 進行加密。
有關使用 SSH 從 Windows 客戶機遠端連線到 MySQL 的資訊,請參閱《 MySQL 參考手冊》:
http://dev.mysql.com/doc/refman/5.6/en/windows-and-ssh.html 。
1.7. MySQL 安全常見問題
要查詢對許多常見安全問題的解答,請參閱《 MySQL 參考手冊》的常見問題部分中有關安全的內容:
http://dev.mysql.com/doc/refman/5.6/en/faqs-security.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16976507/viewspace-2647255/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL入門--mysql命令MySql
- MySQL入門系列:MySQL概述MySql
- Mysql入門【Mysql約束】MySql
- MySQL入門MySql
- SQL快速入門 ( MySQL快速入門, MySQL參考, MySQL快速回顧 )MySql
- 入門入門入門 MySQL命名行MySql
- MySQL 入門指南MySql
- Mysql入門【JDBC】MySqlJDBC
- 如何入門 MySQLMySql
- MySQL 快速入門MySql
- mySql入門-(二)MySql
- MySQL入門——排序MySql排序
- Mysql - 使用入門MySql
- MYSQL 入門全套MySql
- MySQL安全登入策略MySql
- MySQL 基礎入門MySql
- MySQL入門--EVENT(事件)MySql事件
- Mysql 簡單入門MySql
- MySQL入門系列:MySQL資料型別MySql資料型別
- [MySQL光速入門]002 讓MySQL跑起來MySql
- [MySQL光速入門]030 使用者和資料安全MySql
- 《MySQL 入門教程》第 02 篇 MySQL 安裝MySql
- 《MySQL 入門教程》第 17 篇 MySQL 變數MySql變數
- 《MySQL 入門教程》第 01 篇 MySQL 簡介MySql
- MySQL入門系列:檢視MySql
- Mysql系列一:SQL入門MySql
- 入門MySQL——架構篇MySql架構
- MySQL 入門(5):複製MySql
- [MySQL光速入門]027 索引MySql索引
- MySQL入門--儲存引擎MySql儲存引擎
- MySQL入門--表維護MySql
- node+express+mysql入門ExpressMySql
- mysql新手入門隨筆MySql
- Django+MySQL 例項入門DjangoMySql
- 入門MySQL——DML語句篇MySql
- MySQL入門--效能調優概述MySql
- MySQL入門--後設資料MySql
- [MySQL光速入門]020 事務MySql