OceanBaseデータベースはOracleのLabel Security機能と互換性があり、行レベルでアクセスを制御し、読み書きデータの安全性を確保できます。Label Securityに基づいて、行レベルデータに対する細かい粒度のアクセス制御を実現するためのセキュリティポリシーを構築できます。ポリシーを作成した後、保護が必要なテーブルにそのポリシーを適用し、ユーザーにラベルを付与します。
Label Securityは強制的なアクセス制御の一種であり、テーブルにラベル列を追加して各行のラベル値を記録し、アクセス時にユーザーのラベルとデータのラベルを比較することで、主体(ユーザー)による客体(テーブル内のデータ)へのアクセスを制約する目的を達成します。
OceanBaseデータベースは、この機能を管理・利用するための組み込みのセキュリティ管理者LBACSYSを提供しています。セキュリティ管理者は、セキュリティポリシーの作成、ポリシー内のラベルの定義、ユーザーのラベルの設定を通じて、独自のセキュリティポリシーをカスタマイズできます。1つのセキュリティポリシーを複数のテーブルに適用でき、また1つのテーブルに複数のセキュリティポリシーを適用することも可能です。セキュリティポリシーが適用されるたびに、そのテーブルには自動的に、当該ポリシーのアクセス制御用の列が追加されます。
制限事項
現在、ラベルセキュリティはOracleモードのみでサポートされています。
ラインレベルアクセス制御の設定
SYSユーザーでOracleテナントにログインし、LBACSYSユーザーのロックを解除します。OceanBaseデータベースはデフォルトで
LBACSYSユーザーを作成しますが、このユーザーはロックされた状態です。Label Security機能を使用するには、まずこのユーザーを有効にする必要があります。obclient> ALTER USER LBACSYS ACCOUNT UNLOCK;LBACSYSユーザーのログインパスワードを変更します。セキュリティを確保するため、
LBACSYSユーザーのパスワードはSYSユーザーが指定します。後でパスワードを変更する必要がある場合は、新しいパスワードを再指定するだけです。obclient> ALTER USER LBACSYS IDENTIFIED BY ***R***;LBACSYSユーザーの権限を設定します。LBACSYSユーザーにはデフォルトで権限が付与されていません。ラインレベルアクセス権限に関連する操作を実行するには、GRANTステートメントを使用してLBACSYSユーザーにCREATE SESSION権限を付与する必要があります。obclient> GRANT CREATE SESSION TO LBACSYS;セキュリティ管理者として
LBACSYSユーザーでOracleテナントにログインします。セキュリティポリシーを作成します。
この例では、
MY_POLICYという名前のセキュリティポリシーを作成します。ラベルセキュリティポリシーの作成の詳細については、SA_SYSDBA.CREATE_POLICYを参照してください。
例:
obclient> CALL SA_SYSDBA.CREATE_POLICY('MY_POLICY','MY_LABEL','');レベルLevelを作成し、そのショートネームとロングネームを指定します。
レベルの作成の詳細については、SA_COMPONENTS.CREATE_LEVELを参照してください。
例:
obclient> CALL SA_COMPONENTS.CREATE_LEVEL('MY_POLICY', 100, 'PUBLIC','Public Level'); obclient> CALL SA_COMPONENTS.CREATE_LEVEL('MY_POLICY', 200, 'INTERNAL','Internal Level'); obclient> CALL SA_COMPONENTS.CREATE_LEVEL('MY_POLICY', 300, 'HIGH', 'High Level'); obclient> SELECT * FROM sys.ALL_VIRTUAL_TENANT_OLS_COMPONENT_REAL_AGENT; +-----------+-----------------------+--------------------+-----------+----------+------------+----------------+-------------+------------------------------+------------------------------+ | TENANT_ID | LABEL_SE_COMPONENT_ID | LABEL_SE_POLICY_ID | COMP_TYPE | COMP_NUM | SHORT_NAME | LONG_NAME | PARENT_NAME | GMT_CREATE | GMT_MODIFIED | +-----------+-----------------------+--------------------+-----------+----------+------------+----------------+-------------+------------------------------+------------------------------+ | 1004 | 500019 | 500018 | 0 | 100 | PUBLIC | PUBLIC LEVEL | NULL | 09-DEC-22 02.38.37.835729 PM | 09-DEC-22 02.38.37.835729 PM | | 1004 | 500020 | 500018 | 0 | 200 | INTERNAL | INTERNAL LEVEL | NULL | 09-DEC-22 02.38.49.336692 PM | 09-DEC-22 02.38.49.336692 PM | | 1004 | 500021 | 500018 | 0 | 300 | HIGH | HIGH LEVEL | NULL | 09-DEC-22 02.39.02.742233 PM | 09-DEC-22 02.39.02.742233 PM | +-----------+-----------------------+--------------------+-----------+----------+------------+----------------+-------------+------------------------------+------------------------------+ 3 rows in set (0.001 sec)データラベルLabelを作成し、結果を確認します。
データラベルの作成の詳細については、SA_LABEL_ADMIN.CREATE_LABELを参照してください。
例:
obclient> DELIMITER / obclient> BEGIN SA_LABEL_ADMIN.CREATE_LABEL('MY_POLICY',10000,'PUBLIC',TRUE); SA_LABEL_ADMIN.CREATE_LABEL('MY_POLICY',20000,'INTERNAL',TRUE); SA_LABEL_ADMIN.CREATE_LABEL('MY_POLICY',30000, 'HIGH',TRUE); END; / Query OK, 0 rows affected obclient> DELIMITER ; obclient> SELECT * FROM sys.ALL_VIRTUAL_TENANT_OLS_LABEL_REAL_AGENT; +-----------+-------------------+--------------------+-----------+----------+------+------------------------------+------------------------------+ | TENANT_ID | LABEL_SE_LABEL_ID | LABEL_SE_POLICY_ID | LABEL_TAG | LABEL | FLAG | GMT_CREATE | GMT_MODIFIED | +-----------+-------------------+--------------------+-----------+----------+------+------------------------------+------------------------------+ | 1004 | 500022 | 500018 | 10000 | PUBLIC | 1 | 09-DEC-22 04.25.59.611117 PM | 09-DEC-22 04.25.59.611117 PM | | 1004 | 500023 | 500018 | 20000 | INTERNAL | 1 | 09-DEC-22 04.25.59.636390 PM | 09-DEC-22 04.25.59.636390 PM | | 1004 | 500024 | 500018 | 30000 | HIGH | 1 | 09-DEC-22 04.25.59.651032 PM | 09-DEC-22 04.25.59.651032 PM | +-----------+-------------------+--------------------+-----------+----------+------+------------------------------+------------------------------+ 3 rows in set (0.001 sec)ユーザーのラベルを指定します。
SYSユーザーでOracleテナントにログインし、ユーザーuser1を作成して、user1にGRANT OPTION以外の現在のユーザーが持つすべての権限を付与します。obclient> CREATE USER user1 IDENTIFIED BY *******; Query OK, 0 rows affected obclient> GRANT ALL PRIVILEGES TO user1; Query OK, 0 rows affectedセキュリティ管理者として
LBACSYSにログインし、ユーザーuser1にラベルを指定します。ユーザーにラベルを指定する詳細については、SA_USER_ADMIN.SET_LEVELSを参照してください。
obclient> CALL SA_USER_ADMIN.SET_LEVELS('MY_POLICY', 'user1', 'HIGH','PUBLIC', 'PUBLIC', 'PUBLIC'); Query OK, 0 rows affected obclient [LBACSYS]> SELECT * FROM sys.ALL_VIRTUAL_TENANT_OLS_USER_LEVEL_REAL_AGENT; +-----------+------------------------+---------+--------------------+---------------+---------------+---------------+-----------+------------------------------+------------------------------+ | TENANT_ID | LABEL_SE_USER_LEVEL_ID | USER_ID | LABEL_SE_POLICY_ID | MAXIMUM_LEVEL | MINIMUM_LEVEL | DEFAULT_LEVEL | ROW_LEVEL | GMT_CREATE | GMT_MODIFIED | +-----------+------------------------+---------+--------------------+---------------+---------------+---------------+-----------+------------------------------+------------------------------+ | 1004 | 500027 | 500025 | 500018 | 300 | 100 | 100 | 100 | 09-DEC-22 04.31.23.965076 PM | 09-DEC-22 04.31.23.965076 PM | +-----------+------------------------+---------+--------------------+---------------+---------------+---------------+-----------+------------------------------+------------------------------+ 1 row in set (0.002 sec)
ポリシーをテーブルに適用します。
user1ユーザーでOracleテナントにログインし、テーブルtbl1を作成します。obclient> CREATE TABLE tbl1(col1 INT,col2 INT); Query OK, 0 rows affectedセキュリティ管理者として
LBACSYSにログインし、ポリシーMY_POLICYをテーブルtbl1に適用します。指定したポリシーをテーブルに追加する詳細については、SA_POLICY_ADMIN.APPLY_TABLE_POLICYを参照してください。
obclient> CALL SA_POLICY_ADMIN.APPLY_TABLE_POLICY('MY_POLICY','user1', 'tbl1', '', '', ''); Query OK, 0 rows affected
データを挿入し、クエリ結果を検証します。
user1ユーザーでログインし、tbl1テーブルにcol1とMY_LABELの2つの列のデータを挿入します。obclient> INSERT INTO tbl1 VALUES(1,1,10000); Query OK, 1 row affected obclient> INSERT INTO tbl1(MY_LABEL) VALUES(20000); Query OK, 1 row affected obclient> INSERT INTO tbl1(col1) VALUES (2); Query OK, 1 row affected obclient> COMMIT; Query OK, 0 rows affecteduser1ユーザーでSESSION LABELとROW LABELを設定します。現在のデータベースセッションラベルを設定する詳細については、SA_SESSION.SET_LABELを参照してください。
現在のデータベースセッションのデフォルトの行ラベル値を設定する詳細については、SA_SESSION.SET_ROW_LABELを参照してください。
obclient> CALL SA_SESSION.SET_LABEL('MY_POLICY', 'INTERNAL'); Query OK, 0 rows affected obclient> CALL SA_SESSION.SET_ROW_LABEL('MY_POLICY', 'INTERNAL'); Query OK, 0 rows affected obclient> SELECT SA_SESSION.LABEL('MY_POLICY') FROM DUAL; +-------------------------------+ | SA_SESSION.LABEL('MY_POLICY') | +-------------------------------+ | INTERNAL | +-------------------------------+ 1 row in set obclient> SELECT SA_SESSION.ROW_LABEL('MY_POLICY') FROM DUAL; +-----------------------------------+ | SA_SESSION.ROW_LABEL('MY_POLICY') | +-----------------------------------+ | INTERNAL | +-----------------------------------+ 1 row in setクエリを実行すると、ユーザー
user1がINTERNALレベル以下のデータにアクセスできることがわかります。obclient> SELECT * FROM tbl1; +------+------+----------+ | COL1 | COL2 | MY_LABEL | +------+------+----------+ | 1 | 1 | 10000 | | NULL | NULL | 20000 | | 2 | NULL | 10000 | +------+------+----------+ 3 rows in setラベルを変更して再度クエリを実行すると、ユーザー
user1がPUBLICレベルのデータにのみアクセスできることがわかります。obclient> CALL SA_SESSION.SET_LABEL('MY_POLICY', 'PUBLIC'); Query OK, 0 rows affected obclient> CALL SA_SESSION.SET_ROW_LABEL('MY_POLICY', 'PUBLIC'); Query OK, 0 rows affected obclient> SELECT * FROM tbl1; +------+------+----------+ | COL1 | COL2 | MY_LABEL | +------+------+----------+ | 1 | 1 | 10000 | | 2 | NULL | 10000 | +------+------+----------+ 2 rows in set