Data Management (DMS) の SQL コンソールは、実行前に各 SQL ステートメントを一連のセキュリティチェックポイントに照らして評価します。これらのチェックポイントは、どの SQL ステートメントを、誰が、どのような条件下で実行できるかを制御し、データベースのアクセスと操作を詳細に制御できます。このトピックでは、ApsaraDB RDS for MySQL を例として使用します。
仕組み
SQL コンソールで SQL ステートメントを送信すると、DMS は各ステートメントを事前定義されたチェックポイントに対して順次評価します。各チェックポイントで、DMS はファクター (プレフィックス @fac.) を読み取って、SQL タイプ、影響を受ける行数、現在のユーザーのロールなどのランタイムコンテキストを評価し、設定されたルール条件に基づいてアクション (プレフィックス @act.) を適用します。
チェックポイント
DMS は、次のチェックポイントに対して SQL ステートメントを順番に評価します。各チェックポイントには、独自の設定可能なルールがあります。
| チェックポイント | 制御内容 |
|---|---|
| 基本設定項目 | クエリごとに返される最大行数、結果セットを変更できるかどうか、機密データを計算に含めることができるかどうか |
| SQL 実行数量基準 | 一度に送信できる SQL ステートメントの最大数 |
| DQL SQL 基準 | データクエリ言語 (DQL) ステートメントの実行制約 |
| その他の SQL 基準 | 複数の SQL タイプに対する実行制約 (例:認識されない SQL の許可、全テーブル削除のブロック) |
| SQL 権限基準 | データベース、テーブル、機密列、および行に対する権限に基づく実行制約 |
| SQL 実行パフォーマンス基準 | 影響を受ける表領域がサイズ制限を超えた場合に DDL ステートメントをブロックするか、影響を受ける行数が制限を超えた場合に DML ステートメントをブロックします |
| データベースおよびテーブル列権限の例外認識基準 | 解析例外が発生した場合に、DQL、DML、DDL、またはデータ制御言語 (DCL) ステートメントを続行するか拒否するかを決定します |
| 論理データベースにおける SQL 実行基準 | 論理データベースに対して実行される SQL ステートメントの実行制約 |
DMS は、各チェックポイントに対して事前定義された設定とルールを提供します。これらをカスタマイズする方法については、「セキュリティルールの管理」トピックのセキュリティルールの設定セクションをご参照ください。
ファクターとアクション
ファクター
ファクターは、DMS がセキュリティルール条件で使用するために公開する事前定義された変数です。ファクターは、ステートメントが全テーブルに影響を与えるかどうか、現在のユーザーが DBA であるかどうかなどのランタイムコンテキストをキャプチャします。
ファクター名は @fac.<display-name> のフォーマットを使用します。
セキュリティルールセットの詳細ページの各モジュールは、そのチェックポイントに固有のファクターセットを提供します。
SQL コンソールが提供するファクター
| ファクター | 説明 |
|---|---|
@fac.sql_count | 一度に送信される SQL ステートメントの数 |
@fac.select_sql_count | 送信された SQL ステートメントの中の DQL ステートメントの数 |
@fac.dml_sql_count | 送信された SQL ステートメントの中のデータ操作言語 (DML) ステートメントの数 |
@fac.sql_type | SQL ステートメントのカテゴリ。有効な値については、「SQL ステートメントのタイプ」をご参照ください。 |
@fac.sql_sub_type | SQL ステートメントのサブカテゴリ。有効な値については、「SQL ステートメントのタイプ」をご参照ください。 |
@fac.env_type | インスタンスの環境タイプ。環境名 (DEV や PRODUCT など) として表示されます。詳細については、「インスタンスの環境タイプを変更する」をご参照ください。 |
@fac.fulltable_delete | ステートメントが全テーブルを削除するかどうか。有効な値: true、false |
@fac.fulltable_update | ステートメントが全テーブルを更新するかどうか。有効な値: true、false |
@fac.current_sql | 現在の SQL ステートメント |
@fac.user_is_admin | 現在のユーザーが DMS 管理者であるかどうか。有効な値: true、false |
@fac.user_is_dba | 現在のユーザーがデータベース管理者 (DBA) であるかどうか。有効な値: true、false |
@fac.user_is_inst_dba | 現在のユーザーが現在のデータベースインスタンスの DBA であるかどうか。有効な値: true、false |
@fac.user_is_sec_admin | 現在のユーザーがセキュリティ管理者であるかどうか。有効な値: true、false |
@fac.sql_affected_rows | 現在のステートメントが影響を与える行数。 説明 このファクターは |
@fac.sql_relate_table_store_size | 現在のステートメントがアクセスするテーブルの推定合計サイズ (MB)。この値は DMS メタデータに基づいて推定されたものであり、実際の値ではありません。 |
アクション
アクションは、ルールの IF 条件が満たされたときに DMS が実行する内容を定義します。たとえば、ステートメントの許可または拒否、ユーザーが機密列に対する権限を持っているかどうかの確認などです。
アクション名は @act.<display-name> のフォーマットを使用します。
セキュリティルールセットの詳細ページの各モジュールは、そのチェックポイントに固有のアクションセットを提供します。
SQL コンソールが提供するアクション
| アクション | 説明 |
|---|---|
@act.reject_execute | 現在の SQL ステートメントを拒否します |
@act.allow_execute | 現在の SQL ステートメントを許可します |
@act.reject_sql_type_execute | 特定のサブカテゴリの SQL ステートメントを拒否します。サブカテゴリを引数として指定します。例: @act.reject_sql_type_execute 'UPDATE' |
@act.allow_sql_type_execute | 特定のサブカテゴリの SQL ステートメントを許可します。サブカテゴリを引数として指定します。例: @act.allow_sql_type_execute 'UPDATE' |
@act.check_dml_sec_column_permission | ユーザーが機密列に対する権限を持っているかどうかを確認します。持っていない場合、DML ステートメントは実行されません。 |
@act.uncheck_dml_sec_column_permission | DML ステートメントの機密列権限の確認をスキップします |
@act.check_sql_access_permission | ユーザーがステートメントに関与するデータベース、テーブル、または列に対して必要な権限 (読み取り権限や書き込み権限など) を持っているかどうかを確認します |
@act.uncheck_sql_access_permission | アクセス権限の確認をスキップします |
@act.enable_sec_column_mask | これらの列に対する権限を持たないユーザーのクエリ結果セット内の機密列をマスクします |
@act.disable_sec_column_mask | これらの列に対する権限を持たないユーザーのクエリ結果セット内の機密列をマスクしません |
SQL ステートメントのタイプ
DMS は SQL ステートメントを 4 つのカテゴリに分類します。@fac.sql_type ファクターはカテゴリを返し、@fac.sql_sub_type は以下にリストされている特定のステートメントタイプを返します。
DML
INSERT, INSERT_SELECT, SELECT_INTO, MULTI_INSERT, REPLACE, REPLACE_INTO, UPDATE, DELETE, MERGE, REMOVE, MSCK_REPAIR, REFRESH_MATERIALIZED_VIEW, BEGIN, START_TRANSACTION, COMMIT, ROLLBACK, SAVEPOINT, RELEASE_SAVEPOINT, SET, ADD_EDGE, ADD_VERTEX, SET_PROPERTY, GDB_DROP, INSERT_MANY, INSERT_ONE, DELETE_MANY, DELETE_ONE, UPDATE_MANY, UPDATE_ONE, WLM_ADD_RULE
DDL
CREATE, CREATE_SCHEMA, CREATE_INDEX, CREATE_VIEW, CREATE_SEQUENCE, CREATE_TABLE, CREATE_TABLEGROUP, CREATE_PACKAGE, CREATE_SELECT, TRUNCATE, DROP, DROP_SCHEMA, DROP_INDEX, DROP_VIEW, DROP_TABLE, DROP_TABLEGROUP, DROP_SEQUENCE, RENAME, ALTER_TABLE_DROP_COLUMN, ALTER_TABLE_CHARACTER_COLLATE, ALTER_TABLE_AUTOINCREMENT, ALTER, ALTER_SCHEMA, ALTER_INDEX, ALTER_VIEW, ALTER_TABLE, ALTER_TABLEGROUP, ALTER_SEQUENCE, CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION, CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE, MONGO_CREATE_INDEX, MONGO_DROP_INDEX, CREATE_DATABASE, ALTER_DATABASE, DROP_DATABASE, CREATE_USER, ALTER_USER, DROP_USER, CREATE_ROLE, DROP_ROLE, EXEC, CALL_PROCEDURE, CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER, CREATE_EVENT, ALTER_EVENT, DROP_EVENT, ROLLBACK_DDL, CANCEL_DDL, VACUUM, SUBMIT_JOB, CANCEL_JOB, BUILD_TABLE, IF
DQL
データクエリ言語 (DQL) ステートメントは、データを変更せずに取得します。
SELECT, DESC, EXPLAIN, SHOW_INDEX, SHOW, CHECK_TABLE, SHOW_DDL, LIST, GDB_QUERY, CHECKSUM, SELECT_PG_TERMINATION_BACKEND, WLM_LIST_RULE
DCL
データ制御言語 (DCL) ステートメントは、データベースアクセスとセッション状態を管理します。
GRANT, DECLARE, SET, ANALYZE, FLUSH, OPTIMIZE, KILL, RECOVER_DDL, REMOVE_DDL, SELECT_PG_TERMINATION_BACKEND
よくある質問
Q: 'select *' SQL ステートメントの実行を制限できますか?
A: これは、セキュリティコラボレーションパターンが有効になっているインスタンスにのみ適用されます。
DMS の上部のメニューバーで、セキュリティとディザスタリカバリ (DBS) > セキュリティルールを選択します。
仕様管理タブで、ご利用のデータエンジンタイプに対応するルールセットを選択します。
宛先ルールを見つけ、操作列で 編集ボタンをクリックして 詳細ページを開きます。
左側のナビゲーションウィンドウで、SQL コンソールを選択します。チェックポイントセクションで、SQL 実行数量仕様を選択します。
ルールの追加をクリックし、設定用の DSL スクリプトを入力します。
if @fac.sql_sub_type in ['SELECT'] AND @fun.is_contain_str(@fac.current_sql,'*') then @act.reject_execute 'SQL ステートメントに * が含まれています。別の方法を使用してください。' end
Q: DMS SQL コンソールで大規模なクエリに制限を設定するにはどうすればよいですか?
A: この操作には、セキュリティコラボレーションモードが有効になっているインスタンスが必要です。
DMS の上部のメニューバーで、セキュリティとディザスタリカバリ (DBS) > セキュリティルールを選択します。
仕様管理タブで、ご利用のデータエンジンタイプに対応するルールセットを選択します。
宛先ルールを見つけ、操作列の 編集をクリックして 詳細ページに移動します。
左側のナビゲーションウィンドウで、SQL コンソールを選択します。検索バーに「full table scan」と入力し、検索ボタンをクリックします。
表示されたリストで宛先ルールを選択し、編集ボタンをクリックして設定します。