在本節中,我們將討論 MySQL 權限系統如何與 NDB Cluster 配合運作,以及這對保持 NDB Cluster 安全的影響。
標準 MySQL 權限適用於 NDB Cluster 表格。這包括在資料庫、表格和欄位層級上授予的所有 MySQL 權限類型(SELECT
權限、UPDATE
權限、DELETE
權限等等)。與任何其他 MySQL 伺服器一樣,使用者和權限資訊儲存在 mysql
系統資料庫中。用於授予和撤銷 NDB
表格、包含此類表格的資料庫,以及此類表格中欄位的權限的 SQL 陳述式,在所有方面都與連線到涉及任何(其他)MySQL 儲存引擎的資料庫物件所使用的 GRANT
和 REVOKE
陳述式相同。對於 CREATE USER
和 DROP USER
陳述式也是如此。
請務必記住,根據預設,MySQL 授權表使用 InnoDB
儲存引擎。因此,這些表格通常不會在 NDB Cluster 中作為 SQL 節點的 MySQL 伺服器之間複製或共用。換句話說,根據預設,使用者及其權限的變更不會在 SQL 節點之間自動傳播。如果您願意,可以啟用 NDB Cluster SQL 節點之間 MySQL 使用者和權限的同步;如需詳細資訊,請參閱第 25.6.13 節,〈權限同步和 NDB_STORED_USER〉。
相反地,由於 MySQL 中沒有拒絕權限的方式(權限可以撤銷或一開始未授予,但不能以這種方式拒絕),因此,即使您未使用自動分發使用者權限,也無法特別保護某個 SQL 節點上的 NDB
表格免受另一個 SQL 節點上具有權限的使用者侵害;即使您未使用自動分發使用者權限,情況也是如此。此情況的明確範例是 MySQL root
帳戶,該帳戶可以對任何資料庫物件執行任何動作。在 config.ini
檔案的空白 [mysqld]
或 [api]
區段的情況下,此帳戶可能會特別危險。要了解原因,請考慮以下情境
config.ini
檔案至少包含一個空白的[mysqld]
或[api]
區段。這表示 NDB Cluster 管理伺服器不會檢查 MySQL 伺服器(或其他 API 節點)從哪個主機存取 NDB Cluster。沒有防火牆,或防火牆無法防止從網路外部的主機存取 NDB Cluster。
NDB Cluster 管理伺服器的主機名稱或 IP 位址是已知的,或可以從網路外部判斷。
如果這些條件為真,則任何人都可以從任何地方啟動 MySQL 伺服器,並使用 --ndbcluster
--ndb-connectstring=
存取此 NDB Cluster。使用 MySQL management_host
root
帳戶,此人接著可以執行下列動作
執行中繼資料陳述式,例如
SHOW DATABASES
陳述式(以取得伺服器上所有NDB
資料庫的清單)或SHOW TABLES FROM
陳述式,以取得給定資料庫中所有some_ndb_database
NDB
表格的清單-
SELECT * FROM
或some_table
TABLE
從任何表格讀取所有資料some_table
DELETE FROM
或 TRUNCATE TABLE 刪除表格中的所有資料some_table
DESCRIBE
或some_table
SHOW CREATE TABLE
判斷表格結構描述some_table
UPDATE
以「垃圾」資料填滿表格欄位;這實際上可能造成比單純刪除所有資料更大的損害some_table
SETcolumn1
=some_value
更陰險的變體可能包括以下陳述式
UPDATE some_table SET an_int_column = an_int_column + 1
或
UPDATE some_table SET a_varchar_column = REVERSE(a_varchar_column)
此類惡意陳述式僅受攻擊者想像力的限制。
唯一能免於此類破壞的表格,是使用
NDB
以外的儲存引擎所建立的表格,因此「惡意」SQL 節點看不到。可以使用
root
身分登入的使用者也可以存取INFORMATION_SCHEMA
資料庫及其表格,從而取得關於資料庫、表格、已儲存常式、排程事件,以及任何其他在INFORMATION_SCHEMA
中儲存中繼資料的資料庫物件的資訊。除非您使用共用權限,否則最好為不同 NDB Cluster SQL 節點上的
root
帳戶使用不同的密碼。
總之,如果 NDB Cluster 可以直接從您的本機網路外部存取,則無法確保其安全。
切勿將 MySQL root 帳戶密碼留空。當執行 MySQL 作為 NDB Cluster SQL 節點時,情況與將其作為獨立 (非叢集) MySQL 伺服器執行時一樣,且應在設定 MySQL 伺服器作為 NDB Cluster 中的 SQL 節點之前,作為 MySQL 安裝程序的一部分進行。
如果您需要在 SQL 節點之間同步 mysql
系統表格,可以使用標準 MySQL 複製來執行此作業,或使用指令碼在 MySQL 伺服器之間複製表格項目。使用者及其權限可以使用 NDB_STORED_USER
權限進行共用和保持同步。
摘要。 關於 NDB Cluster 的 MySQL 權限系統,以下列出最重要且應記住的重點
在一個 SQL 節點上建立的使用者和權限不會自動存在,也不會在叢集中的其他 SQL 節點上生效。相反地,在叢集中的一個 SQL 節點上移除使用者或權限,不會從任何其他 SQL 節點移除使用者或權限。
您可以使用
NDB_STORED_USER
在 SQL 節點之間共用 MySQL 使用者和權限。一旦從 NDB Cluster 中的某個 SQL 節點授予 MySQL 使用者在
NDB
表格上的權限,該使用者可以「看到」表格中的任何資料,無論資料來自哪個 SQL 節點,即使該使用者未共用也一樣。