在本節中,我們將討論 MySQL 權限系統如何與 NDB 叢集搭配運作,以及這對於保持 NDB 叢集安全性的影響。
標準 MySQL 權限適用於 NDB 叢集表格。這包括在資料庫、表格和資料行層級授予的所有 MySQL 權限類型(SELECT
權限、UPDATE
權限、DELETE
權限等)。如同任何其他 MySQL 伺服器,使用者和權限資訊會儲存在 mysql
系統資料庫中。用於在 NDB
表格、包含此類表格的資料庫和此類表格中的資料行上授予和撤銷權限的 SQL 陳述式,在各方面都與使用於涉及任何(其他)MySQL 儲存引擎的資料庫物件的 GRANT
和 REVOKE
陳述式相同。對於 CREATE USER
和 DROP USER
陳述式來說也是如此。
請務必記住,預設情況下,MySQL 授權表格會使用 InnoDB
儲存引擎。因此,這些表格通常不會在充當 NDB 叢集中 SQL 節點的 MySQL 伺服器之間複製或共用。換句話說,使用者及其權限的變更預設不會在 SQL 節點之間自動傳播。如果需要,您可以啟用 NDB 叢集 SQL 節點之間的 MySQL 使用者和權限同步;請參閱第 25.6.13 節「權限同步和 NDB_STORED_USER」,以取得詳細資訊。
相反地,由於 MySQL 中沒有拒絕權限的方法(權限可以撤銷或根本不授予,但不能以這種方式拒絕),因此,即使您未使用自動分發使用者權限,一個 SQL 節點上的 NDB
表格也不會受到在另一個 SQL 節點上擁有權限的使用者特別保護;即使您未使用自動分發使用者權限,情況也是如此。明確的範例是 MySQL root
帳戶,它可以對任何資料庫物件執行任何動作。結合 config.ini
檔案的空白 [mysqld]
或 [api]
區段,此帳戶可能特別危險。若要了解原因,請考慮以下情境
config.ini
檔案至少包含一個空白的[mysqld]
或[api]
區段。這表示 NDB 叢集管理伺服器不會檢查 MySQL 伺服器(或其他 API 節點)從哪個主機存取 NDB 叢集。沒有防火牆,或是防火牆無法防止從網路外部的主機存取 NDB 叢集。
NDB 叢集管理伺服器的主機名稱或 IP 位址已知,或是可以從網路外部判斷。
如果這些條件成立,則任何地方的任何人都可以使用 --ndbcluster
--ndb-connectstring=
啟動 MySQL 伺服器,並存取此 NDB 叢集。使用 MySQL management_host
root
帳戶,此人可以執行下列動作
執行中繼資料陳述式,例如
SHOW DATABASES
陳述式(取得伺服器上所有NDB
資料庫的清單)或SHOW TABLES FROM
陳述式,以取得指定資料庫中所有some_ndb_database
NDB
表格的清單在任何已探索的表格上執行任何合法的 MySQL 陳述式,例如
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 叢集 SQL 節點上的
root
帳戶使用不同的密碼。
總而言之,如果可以從本機網路外部直接存取 NDB 叢集,則無法建立安全的 NDB 叢集。
永遠不要讓 MySQL root 帳戶密碼為空白。當執行 MySQL 做為 NDB 叢集 SQL 節點時,與將其當做獨立(非叢集)MySQL 伺服器執行時一樣,都是如此,而且應在將 MySQL 伺服器設定為 NDB 叢集中的 SQL 節點之前,執行作為 MySQL 安裝程序的一部分。
如果您需要在 SQL 節點之間同步 mysql
系統資料表,您可以使用標準的 MySQL 複製來執行,或是使用腳本在 MySQL 伺服器之間複製資料表條目。使用者及其權限可以使用 NDB_STORED_USER
權限來共用和保持同步。
摘要。 以下列出關於 NDB Cluster 的 MySQL 權限系統最重要需要記住的重點:
在一個 SQL 節點上建立的使用者和權限不會自動存在於叢集中的其他 SQL 節點上或生效。相反地,在叢集中的一個 SQL 節點上移除使用者或權限,不會從任何其他 SQL 節點中移除該使用者或權限。
您可以使用
NDB_STORED_USER
在 SQL 節點之間共用 MySQL 使用者和權限。一旦 MySQL 使用者從 NDB Cluster 的一個 SQL 節點被授予對
NDB
資料表的權限,該使用者就可以“查看”該資料表中的任何資料,無論資料來自哪個 SQL 節點,即使該使用者未被共用。