ApsaraDB RDS for MySQL インスタンスで常時機密データベース機能を使用する前に、データ保護ルールを設定する必要があります。ApsaraDB RDS for MySQL では、設定ファイルを使用してデータ保護ルールを管理できます。本トピックでは、SQL ステートメントを使用してデータ保護ルールを設定する方法と、関連する API オペレーションの使用方法について説明します。
常時機密データベース機能は、設定されたデータ保護ルールを RDS インスタンスのシステムテーブルに格納します。RDS インスタンスのシステムテーブルへの書き込みは、特権アカウントまたは許可されるユーザーのみが行えます。該当のシステムテーブルは、mysql.encdb_sensitive_rules テーブルおよび mysql.encdb_auth_users テーブルです。
前提条件
RDS for MySQL インスタンスは、MySQL 5.7(マイナーエンジンバージョン 20231031 以降)または MySQL 8.0(マイナーエンジンバージョン 20240430 以降)を実行している必要があります。詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
常時機密データベース機能が有効になっている必要があります。詳細については、「常時機密データベース機能の使用」をご参照ください。
データ保護ルールの設定には、特権アカウントを使用する必要があります。
注意事項
データ保護ルールを設定して有効化すると、そのルールは RDS インスタンス上のすべてのデータベースに適用され、再度設定する必要はありません。
データ保護ルールの管理とオンラインアプリケーションの運用には、それぞれ専用のデータベースアカウントを使用することを推奨します。必要がない限り、オンラインアプリケーションに対して管理権限を付与しないでください。
mysql.encdb_sensitive_rules テーブルおよび mysql.encdb_auth_users テーブルに対する読み取り・書き込み権限の付与には十分ご注意ください。これらのテーブルが改変されると、攻撃者が常時機密保護をバイパスできる可能性があります。
SQL UDF での操作
ADD:ルールの追加
SELECT encdb_rule_op('add',<rule object json string> or <rules list json string>);例 1:newrule という名前のルールを追加します。
SELECT encdb_rule_op('add','{"name":"newrule","enabled":true,"meta":{"databases":["test"],"tables":["test"],"columns":["a","b"]}}');例 2:newrule1 および newrule2 という名前のルールを追加します。
SELECT encdb_rule_op('add','[{"name":"newrule1","enabled":true,"meta":{"databases":["test"],"tables":["test"],"columns":["a","b"]}},{"name":"newrule2","enabled":true,"meta":{"databases":["test2"],"tables":["test2"],"columns":["a","b"]}}]');UPDATE:ルールの更新
SELECT encdb_rule_op('update',<rule object json string> or <rules list json string>);例 1:newrule という名前のルールを更新します。
SELECT encdb_rule_op('update','{"name":"newrule","enabled":true,"meta":{"databases":["test"],"tables":["test"],"columns":["a","b"]}}');例 2:newrule1 および newrule2 という名前のルールを更新します。
SELECT encdb_rule_op('update','[{"name":"newrule1","enabled":true,"meta":{"databases":["test"],"tables":["test"],"columns":["a","b"]}},{"name":"newrule2","enabled":true,"meta":{"databases":["test2"],"tables":["test2"],"columns":["a","b"]}}]');説明nameで指定されたルールがすでに存在する場合は更新されます。存在しない場合は、nameに対応する新しいルールが追加されます。この場合、update操作はadd操作と同一になります。DELETE:ルールの削除
SELECT encdb_rule_op('delete',<rule name json string> or <rule name list json string>);例 1:delrule という名前のルールを削除します。
SELECT encdb_rule_op('delete','"delrule"');例 2: delrule1 および delrule1 という名前のルールを削除します。
SELECT encdb_rule_op('delete','["delrule1","delrule2"]');説明paramsパラメーターの値は JSON フォーマットである必要があります。そのため、単一のルールを削除する際は、xxx形式ではなく、"xxx"形式でルール名を指定する必要があります。たとえば、'delrule'ではなく、'"delrule"'と指定します。GRANT:権限の付与または取り消し
説明ユーザーに必要な権限を付与する必要があります。
権限の付与または取り消し
SELECT encdb_rule_op('grant',<users object json string>);例 1:appuser および test_user ユーザーに制限付きリソースへのアクセス権限を付与します。
SELECT encdb_rule_op('grant','{"restrictedAccess": ["appuser","test_user"]}');例 2:illegal ユーザーの権限を取り消します。
SELECT encdb_rule_op('grant','{"noneAccess": ["illegal"]}');例 3:appuser および test_user ユーザーに制限付きリソースへのアクセス権限を付与し、illegal ユーザーの権限を取り消します。
SELECT encdb_rule_op('grant','{"restrictedAccess": ["appuser","test_user"], "noneAccess": ["illegal"]}');説明本セクションで言及されているユーザーは、RDS インスタンス内に存在している必要があります。
fullAccess 権限の一時的な付与
利便性およびプレーンテキストデータのメンテナンスを一時的に行うために、常時機密データベース機能ではユーザーに
fullAccess権限を付与できます。この権限を持つユーザーは、プレーンテキストでデータベースにアクセスできます。この場合、設定されたデータ保護ルールは該当ユーザーには適用されず、ユーザーは RDS インスタンス内のデータベースデータを直接プレーンテキストでクエリできます。
セキュリティ上、必要な場合にのみ短期間で権限を付与することを推奨します。fullAccess 権限を付与する前に、ビジネス要件を十分に理解し、関連するリスクについて責任を負う必要があります。
expiredパラメーターの値は、MySQL がサポートする範囲内である必要があります。サポート範囲は1970-01-02 00:00:01から2038-01-18 03:14:07までです。
例:dba ユーザーに full access 権限を一時的に付与します。
SELECT encdb_rule_op('grant','{"fullAccess": ["dba"], "expired": "2023-08-21 14:21:30"}');