本文主要以 MySQL 和 OceanBase 對比的方式,來介紹 OceanBase(MySQL 模式)安全體系中關于使用者管理和通路控制的相關内容,包括使用者管理、使用者操作權限控制、網絡安全通路控制、行級權限控制、角色管理。
作者:金長龍
愛可生測試工程師,負責 DMP 産品的測試工作。
本文來源:原創投稿
* 愛可生開源社群出品,原創内容未經授權不得随意使用,轉載請聯系小編并注明來源。
本文主要以 MySQL 和 OceanBase 對比的方式,來介紹 OceanBase(MySQL 模式)安全體系中關于使用者管理和通路控制的相關内容,包括使用者管理、使用者操作權限控制、網絡安全通路控制、行級權限控制、角色管理。
使用者管理
1.1 基本概念
租戶
OceanBase 資料庫租戶是一個邏輯概念,是資源配置設定的機關。OceanBase 資料庫租戶間的資料是完全隔離的,每個租戶都相當于傳統資料庫的一個資料庫執行個體。
OceanBase 資料庫租戶分為:系統租戶和普通租戶。
- OceanBase 資料庫預定義了用于管理的系統租戶(sys 租戶),其相容模式為 MySQL
- 普通租戶又分為 Oracle 模式租戶和 MySQL 模式租戶
使用者
OceanBase 資料庫使用者分為:系統租戶使用者和普通租戶使用者。
- 系統租戶的内置系統管理者為使用者 root
- MySQL 租戶的内置租戶管理者為使用者 root
- Oracle 租戶的内置租戶管理者為使用者 sys
- 建立使用者時,如果目前會話的租戶為系統租戶,則建立的使用者為系統租戶使用者,反之為普通租戶使用者
1.2 使用者名稱文法
使用者名稱出現在 SQL 語句中(如:CREATE USER, GRANT, SET PASSWORD)需要遵循一些規則,測試這些規則在 OceanBase 和 MySQL 中的表現是否一緻。
OceanBase
# 使用者名稱文法為 'user_name'@'host_name'
obclient [oceanbase]> create user 'test01'@'%' identified by '123456';
Query OK, 0 rows affected (0.017 sec)
# @'host_name' 部分是可選的
obclient [oceanbase]> create user test02;
Query OK, 0 rows affected (0.017 sec)
# 如果使用者名和主機名作為不帶引号的辨別符是合法的,則無需将其引号括起來。如果 user_name 字元串包含特殊字元(如空格或 -),或者 host_name 字元串包含特殊字元或通配符(如 . 或 %),則必須使用引号
obclient [oceanbase]> create user test02@%;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near '%' at line 1
obclient [oceanbase]> create user test02@sun;
Query OK, 0 rows affected (0.027 sec)
# 主機值可以是主機名或 IP 位址(IPv4 或 IPv6)
obclient [oceanbase]> create user 'test02'@'127.0.0.1';
Query OK, 0 rows affected (0.021 sec)
# 主機名或 IP 位址值中允許使用 % 和 _ 通配符
obclient [oceanbase]> create user 'test02'@'%.mysql.com';
Query OK, 0 rows affected (0.016 sec)
# 對于指定為 IPv4 位址的主機值,可以提供一個網絡掩碼來訓示要用于網絡号的位址位數
obclient [oceanbase]> CREATE USER 'test02'@'198.51.100.0/255.255.255.0';
Query OK, 0 rows affected (0.017 sec)
# 指定為 IPv4 位址的主機值可以使用 CIDR 表示法寫入
obclient [oceanbase]> CREATE USER 'test02'@'198.51.100.0/24';
Query OK, 0 rows affected (0.028 sec)
MySQL
# 使用者名稱文法為'user_name'@'host_name'
mysql [localhost:8031] {msandbox} ((none)) > create user 'test01'@'%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.03 sec)
# @'host_name' 部分是可選的
mysql [localhost:8031] {root} ((none)) > create user test02;
Query OK, 0 rows affected (0.03 sec)
# 如果使用者名和主機名作為不帶引号的辨別符是合法的,則無需将其引号括起來。如果 user_name 字元串包含特殊字元(如空格或 -),或者 host_name 字元串包含特殊字元或通配符(如 . 或 %),則必須使用引号
mysql [localhost:8031] {root} ((none)) > create user test02@%;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%' at line 1
mysql [localhost:8031] {root} ((none)) > create user test02@sun;
Query OK, 0 rows affected (0.03 sec)
# 主機值可以是主機名或 IP 位址(IPv4 或 IPv6)
mysql [localhost:8031] {root} ((none)) > create user 'test02'@'127.0.0.1';
Query OK, 0 rows affected (0.01 sec)
# 主機名或 IP 位址值中允許使用 % 和 _ 通配符
mysql [localhost:8031] {root} ((none)) > create user 'test02'@'%.mysql.com';
Query OK, 0 rows affected (0.03 sec)
# 對于指定為 IPv4 位址的主機值,可以提供一個網絡掩碼來訓示要用于網絡号的位址位數
mysql [localhost:8031] {root} ((none)) > CREATE USER 'test02'@'198.51.100.0/255.255.255.0';
Query OK, 0 rows affected (0.02 sec)
# 從 MySQL 8.0.23 開始,指定為 IPv4 位址的主機值可以使用 CIDR 表示法寫入
mysql [localhost:8031] {root} ((none)) > CREATE USER 'test02'@'198.51.100.0/24';
Query OK, 0 rows affected (0.04 sec)
測試結果:表現一緻。
1.3 使用者密碼設定
常見的密碼配置設定語句有:CREATE USER, ALTER USER, SET PASSWORD,測試在 OceanBase 和 MySQL 中文法的支援情況。
OceanBase
obclient [oceanbase]> CREATE USER 'jeffrey'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.018 sec)
obclient [oceanbase]> ALTER USER 'jeffrey'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.017 sec)
obclient [oceanbase]> SET PASSWORD FOR 'jeffrey'@'%' = 'password';
ERROR 1827 (42000): The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.
obclient [oceanbase]> SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('password');
Query OK, 0 rows affected (0.015 sec)
obclient [(none)]> ALTER USER USER() IDENTIFIED BY 'password';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near '() IDENTIFIED BY 'password'' at line 1
MySQL
mysql [localhost:8031] {msandbox} ((none)) > CREATE USER 'jeffrey'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.53 sec)
mysql [localhost:8031] {msandbox} ((none)) > ALTER USER 'jeffrey'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
mysql [localhost:8031] {msandbox} ((none)) > SET PASSWORD FOR 'jeffrey'@'%' = 'password';
Query OK, 0 rows affected (0.02 sec)
mysql [localhost:8031] {msandbox} ((none)) > SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('password');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PASSWORD('password')' at line 1
mysql [localhost:8031] {jeffrey} ((none)) > ALTER USER USER() IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.03 sec)
測試結果:
- 兩種資料庫的 set password 文法略有不同。
- MySQL 的 alter user 語句支援帶 user() 函數,而在 OceanBase 中暫不支援該寫法。
通過指令行工具修改密碼:
- OceanBase:暫無。
- MySQL:可以通過 mysqladmin 工具修改。
密碼特有問題:
- OceanBase:暫無。
- MySQL:如果使用的是 MySQL 複制,目前副本用作 CHANGE REPLICATION SOURCE TO 語句(來自 MySQL 8.0.23)或 CHANGE MASTER TO 到語句(MySQL 8.0.23 之前)的密碼實際上限制為 32 個字元的長度;如果密碼較長,則任何多餘的字元都将被截斷。這不是由于 MySQL 伺服器通常施加的任何限制,而是 MySQL 複制特有的問題。
1.4 使用者鎖定
測試 OceanBase 和 MySQL 的 ALTER USER, CREATE USER 語句,是否支援使用者鎖定。
OceanBase
obclient [oceanbase]> alter user 'jeffrey'@'%' account unlock;
Query OK, 0 rows affected (0.004 sec)
obclient [oceanbase]> alter user 'jeffrey'@'%' account lock;
Query OK, 0 rows affected (0.019 sec)
obclient [oceanbase]> create user 'jin'@'%' account lock;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'account lock' at line 1
OceanBase 可以通過 __all_user 表中 is_locked 字段來确認使用者的鎖定狀态。
MySQL
mysql [localhost:8031] {msandbox} ((none)) > alter user 'jeffrey'@'%' account unlock;
Query OK, 0 rows affected (0.03 sec)
mysql [localhost:8031] {msandbox} ((none)) > alter user 'jeffrey'@'%' account lock;
Query OK, 0 rows affected (0.03 sec)
mysql [localhost:8031] {msandbox} ((none)) > create user 'jin'@'%' account lock;
Query OK, 0 rows affected (0.01 sec)
MySQL 可以通過 mysql.user 表中的 account_locked 字段來确認使用者的鎖定狀态。
測試結果:
- OceanBase:ALTER USER 支援使用者鎖定,CREATE USER 不支援使用者鎖定。
- MySQL:ALTER USER 和 CREATE USER 都支援使用者鎖定。
使用者操作權限控制
2.1 權限管理
OceanBase
OceanBase(MySQL 模式)的權限分為 3 個級别:
- 管理權限:可以影響整個租戶的權限,例如:修改系統設定、通路所有的表等權限。
- 資料庫權限:可以影響某個特定資料庫下所有對象的權限,例如:在對應資料庫下建立删除表,通路表等權限。
- 對象權限:可以影響某個特定對象的權限,例如:通路一個特定的表、視圖或索引的權限。
目前 OceanBase(MySQL 模式)的所有權限清單,可查詢 OB 官方文檔 MySQL 模式下的權限分類。
MySQL
MySQL 權限同樣分為 3 個級别:
- 管理權限:管理權限使使用者能夠管理 MySQL 伺服器的操作。這些特權是全局的,因為它們不特定于特定資料庫。
- 資料庫權限:資料庫權限适用于資料庫及其中的所有對象。可以為特定資料庫授予這些權限,也可以全局授予這些權限,以便将它們應用于所有資料庫。
- 對象權限:可以為資料庫中的特定對象、資料庫中給定類型的所有對象(例如,資料庫中的所有表)或對所有資料庫中給定類型的所有對象全局授予資料庫對象(如表、索引、視圖和存儲例程)的權限。
MySQL 還區分靜态權限和動态權限,具體的權限清單可查詢 MySQL 官方文檔Privileges Provided by MySQL。
權限管理對比
- 使用者權限級别都分為 3 個級别,且表達的含義一緻。
- 細分的權限上大同小異,OceanBase 目前還有些尚未支援。 從 OB 的官方文檔看,目前授權表裡預留了一些字段但尚未支援。
- OceanBase 特有的幾個權限:ALTER TENANT, ALTER SYSTEM, CREATE RESOURCE POOL, CREATE RESOURCE UNIT。
- 關于 MySQL 的動态權限,OceanBase 暫不支援。
2.2 授權語句
- 授權 GRANT
- 撤銷授權 REVOKE
- 權限轉授 WITH GRANT OPTION
- 檢視使用者權限 SHOW GRANTS
測試結果:OceanBase(MySQL 模式)和 MySQL 在授權語句、文法上都一緻。
2.3 授權表
OceanBase
相關庫 | 相關表 |
mysql | mysql.user mysql.db |
information_schema | information_schema.COLUMN_PRIVILEGES information_schema.SCHEMA_PRIVILEGES information_schema.TABLE_PRIVILEGES information_schema.USER_PRIVILEGES |
oceanbase | oceanbase.DBA_OB_DATABASE_PRIVILEGE oceanbase.CDB_OB_DATABASE_PRIVILEGE |
MySQL
相關庫 | 相關表 |
mysql | user global_grants db <br/> tables_priv columns_priv procs_priv proxies_priv default_roles role_edges password_history |
information_schema | information_schema.COLUMN_PRIVILEGES information_schema.SCHEMA_PRIVILEGES information_schema.TABLE_PRIVILEGES information_schema.USER_PRIVILEGES |
測試結果:OceanBase(MySQL 模式)和 MySQL 在授權表的實作上差别比較大。
2.4 部分撤銷權限限制
OceanBase
不支援部分撤銷全局權限。
MySQL
開啟變量 partial_revokes 後,可以部分撤銷全局權限。
測試結果:OceanBase 暫不支援部分撤銷全局權限。
網絡安全通路控制
OceanBase
OceanBase 資料庫提供租戶白名單政策,實作網絡安全通路控制。租戶白名單指的是該租戶允許登入的用戶端清單,系統支援以下多種租戶白名單格式:
- IP 位址的形式,例如:10.10.10.10, 10.10.10.11
- 子網/掩碼的形式,例如:10.10.10.0/24
- 模糊比對的形式,例如:10.10.10.% 或者 10.10.10._
- 多種格式混合的形式,例如:10.10.10.10, 10.10.10.11, 10.10.10.%, 10.10.10._, 10.10.10.0/24
可以通過修改變量 ob_tcp_invited_nodes 設定租戶的白名單。
MySQL
MySQL 自身沒有找到類似功能。
測試結果:OceanBase 在網絡安全通路控制上支援白名單,但 MySQL 自身不支援。
行級權限控制
OceanBase
MySQL 租戶模式不支援,在 Oracle 租戶模式下通過 Label Security 實作。
MySQL
沒有相關功能,可以通過視圖/觸發器間接實作。
測試結果:OceanBase(MySQL 模式)和 MySQL 均不支援行級别的權限控制。
角色管理
OceanBase
MySQL 租戶模式不支援,在 Oracle 租戶模式下支援。
MySQL
支援角色管理。
測試結果:OceanBase 不支援角色管理。
這裡我們思考一個問題:因為 MySQL 是支援角色管理的,如果從 MySQL 遷移至 OceanBase 應該怎麼處理?
從我個人的了解,角色就是一組權限的集合,它的好處是替代單個授權的便捷方式和概念化所有配置設定的權限。 是以如果從 MySQL 遷移至 OceanBase,理論上對角色的權限展開就可以了。
小結
在使用者管理方面,OceanBase 和 MySQL 對使用者名稱出現在 SQL 語句中遵循的規則是一緻的,配置設定密碼的 SQL 文法方面略有差異,使用者鎖定的 SQL 語句支援略有差異。
在權限管理方面,OceanBase 和 MySQL 的授權語句和文法是一緻的,兩種資料庫都有各自特有的授權表,OceanBase 暫時不支援動态權限和部分撤銷全局權限。
在角色管理和行級權限功能方面,OceanBase 在 MySQL 租戶模式不支援,但在 Oracle 租戶模式下可以支援。
值得一提的是,OceanBase 還提供租戶白名單功能,用來控制允許登入的用戶端。