天天看點

一文弄懂 OceanBase 使用者管理和通路控制

作者:愛可生

本文主要以 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 個級别:

  1. 管理權限:可以影響整個租戶的權限,例如:修改系統設定、通路所有的表等權限。
  2. 資料庫權限:可以影響某個特定資料庫下所有對象的權限,例如:在對應資料庫下建立删除表,通路表等權限。
  3. 對象權限:可以影響某個特定對象的權限,例如:通路一個特定的表、視圖或索引的權限。

目前 OceanBase(MySQL 模式)的所有權限清單,可查詢 OB 官方文檔 MySQL 模式下的權限分類。

MySQL

MySQL 權限同樣分為 3 個級别:

  1. 管理權限:管理權限使使用者能夠管理 MySQL 伺服器的操作。這些特權是全局的,因為它們不特定于特定資料庫。
  2. 資料庫權限:資料庫權限适用于資料庫及其中的所有對象。可以為特定資料庫授予這些權限,也可以全局授予這些權限,以便将它們應用于所有資料庫。
  3. 對象權限:可以為資料庫中的特定對象、資料庫中給定類型的所有對象(例如,資料庫中的所有表)或對所有資料庫中給定類型的所有對象全局授予資料庫對象(如表、索引、視圖和存儲例程)的權限。

MySQL 還區分靜态權限和動态權限,具體的權限清單可查詢 MySQL 官方文檔Privileges Provided by MySQL。

權限管理對比

  1. 使用者權限級别都分為 3 個級别,且表達的含義一緻。
  2. 細分的權限上大同小異,OceanBase 目前還有些尚未支援。 從 OB 的官方文檔看,目前授權表裡預留了一些字段但尚未支援。
  3. OceanBase 特有的幾個權限:ALTER TENANT, ALTER SYSTEM, CREATE RESOURCE POOL, CREATE RESOURCE UNIT。
  4. 關于 MySQL 的動态權限,OceanBase 暫不支援。

2.2 授權語句

  1. 授權 GRANT
  2. 撤銷授權 REVOKE
  3. 權限轉授 WITH GRANT OPTION
  4. 檢視使用者權限 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 還提供租戶白名單功能,用來控制允許登入的用戶端。

繼續閱讀