Oracle Database 23ai の新機能であるSQL FirewallをOCIのOracle Data Safeを利用してOCIのサービスダッシュボード経由で設定、運用が可能になったので試してみました。
準備
Oracle Data Safeを利用する為のIAMポリシーの設定
Oracle Data Safe の利用に必要なIAMポリシーの設定例はこちらになります。Administratorsグループに対しTenancy全体に有効なポリシーを設定するため、ルート・コンパートメントに下記ポリシーを設定しました。
allow group Administrators to manage data-safe-family in tenancy
allow group Administrators to manage data-safe-sql-firewall-family in tenancy
allow group Administrators to inspect groups in tenancy
allow group Administrators to manage autonomous-database in tenancy
allow group Administrators to manage database-family in tenancy
allow group Administrators to inspect db-nodes in tenancy
allow group Administrators to inspect vnics in tenancy
allow group Administrators to manage virtual-network-family in tenancy
Oracle Data Safeの利用機能毎に必要なポリシーや、監視対象となるターゲット登録リソース毎に必要なポリシーについてはドキュメントを参考に編集ください。
ナビゲーション・メニューより、アイデンティティとセキュリティ > アイデンティティ > ポリシー にアクセスします。「ポリシーの作成」を選択し、必要なポリシーを作成していきます。
Oracle Database 23aiが稼働するBaseDBインスタンスの作成
Oracle Data Safeの監視対象として登録するBaseDBインスタンスを作成します。ナビゲーション・メニューより、Oracle Database > Oracleベース・データベース・サービス にアクセスします。本検証ではSQL Firewallの監視にOracle Data Safeを利用する為、SQL Firewallを利用するの前提条件であるEnterprise Edition High Performanceを選択し、バージョンは23aiを選択しました。
画面下部のデータベース名「ORCL」を選択しデータベース詳細画面に遷移後、画面左下Resourcesメニューの「プラガブル・データベース」を選択し、表示される一覧からData Safeに登録し、SQL Firewallを有効化するPDB名「PDB01」を選択します。「PDB接続」ボタンからPDBに対する接続文字列(簡易接続)をメモしておきます。
db.jumpserverpubli.demovcn.oraclevcn.com:1521/PDB01.jumpserverpubli.demovcn.oraclevcn.com
HRスキーマのインストール
SQL Firewallの検証に利用するサンプルスキーマ(HRスキーマ)をインストールします。
wgetコマンドでインストール・スクリプトを入手し、解凍しておきます。
wget https://github.com/oracle-samples/db-sample-schemas/archive/refs/tags/v23.2.zip
unzip v23.2.zip
SQLPlusからsysユーザーでPDBにログインし、サンプルスキーマのインストールスクリプトを実行します。
[oracle@db ~]$ sqlplus / as sysdba
SQL*Plus: Release 23.0.0.0.0 - Production on Tue May 14 17:41:28 2024
Version 23.4.0.24.05
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Connected to:
Oracle Database 23ai EE High Perf Release 23.0.0.0.0 - Production
Version 23.4.0.24.05
SQL> alter session set container = PDB01;
Session altered.
SQL> show con_name;
CON_NAME
------------------------------
PDB01
SQL> @./db-sample-schemas-23.2/human_resources/hr_install.sql
Thank you for installing the Oracle Human Resources Sample Schema.
This installation script will automatically exit your database session
at the end of the installation or if any error is encountered.
The entire installation will be logged into the 'hr_install.log' log file.
Enter a password for the user HR: (任意のPASSWORDを入力)
Enter a tablespace for HR [USERS]: (変更しないので空白のままエンター)
Do you want to overwrite the schema, if it already exists? [YES|no]: Yes
****** Creating REGIONS table ....
Table created.
(略)
Thank you for using Oracle Database!
Disconnected from Oracle Database 23ai EE High Perf Release 23.0.0.0.0 - Production
Version 23.4.0.24.05
前の手順で確認したPDBの接続文字列を用いて、HRユーザーで設定したパスワードを用いてログインし、HRスキーマが作成できていることを確認します。
sqlplus hr/PASSWORD@db.jumpserverpubli.demovcn.oraclevcn.com:1521/PDB01.jumpserverpubli.demovcn.oraclevcn.com
SQL*Plus: Release 23.0.0.0.0 - Production on Tue May 14 17:43:14 2024
Version 23.4.0.24.05
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Connected to:
Oracle Database 23ai EE High Perf Release 23.0.0.0.0 - Production
Version 23.4.0.24.05
SQL> select TABLE_NAME from user_tables;
TABLE_NAME
--------------------------------------------------------------------------------
COUNTRIES
DEPARTMENTS
EMPLOYEES
JOBS
JOB_HISTORY
LOCATIONS
REGIONS
7 rows selected.
SQL> select count(*) from employees;
COUNT(*)
----------
107
SQL>
問題なくインストールできていることを確認できました。
Data Safeユーザーの作成
PDBにsystemユーザーでアクセスし、Data Safeが利用するデータベース・ユーザーを事前に作成し、CONNECT権限を付与しておきます。他の権限はData Safeに登録する際、ダウンロード可能なスクリプトを利用して設定できるので、後の手順で実施しています。
sqlplus system/PASSWORD@db.jumpserverpubli.demovcn.oraclevcn.com:1521/PDB01.jumpserverpubli.demovcn.oraclevcn.com
SQL*Plus: Release 23.0.0.0.0 - Production on Tue May 14 11:56:17 2024
Version 23.4.0.24.05
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Last Successful login time: Tue May 14 2024 11:55:38 +09:00
Connected to:
Oracle Database 23ai EE High Perf Release 23.0.0.0.0 - Production
Version 23.4.0.24.05
SQL> CREATE USER DATASAFE identified by PASSWORD;
User created.
SQL> GRANT CONNECT, RESOURCE TO DATASAFE;
Grant succeeded.
SQL>
Oracle Data Safeの有効化
ナビゲーション・メニューの「Oracle Database」カテゴリ内の「データ・セーフ - データベース・セキュリティ」にアクセスします。
「データ・セーフにデータベースを登録します」の一覧より、「Oracle Cloudデータベース」の「ウィザードの起動」ボタンを選択します。設定ウィザードの最初のページ「データベースの選択」に、「権限スクリプトのダウンロード」リンクがあるので、スクリプトをダウンロードし、BaseDBのOS領域(oracleユーザーのホームディレクトリ等)にアップロードしておきます。
PDBにsystemユーザーでアクセスし、Data Safeの権限スクリプトを実行します。
sqlplus / as sysdba
SQL*Plus: Release 23.0.0.0.0 - Production on Tue May 14 12:02:03 2024
Version 23.4.0.24.05
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Connected to:
Oracle Database 23ai EE High Perf Release 23.0.0.0.0 - Production
Version 23.4.0.24.05
SQL> alter session set container=PDB01;
Session altered.
SQL> show con_name;
CON_NAME
------------------------------
PDB01
SQL> @datasafe_privilleges.sql
Enter value for USERNAME (case sensitive matching the username from dba_users)
DATASAFE
Setting USERNAME to DATASAFE
Enter value for TYPE (grant/revoke)
grant
Setting TYPE to grant
Enter value for MODE (audit_collection/audit_setting/data_discovery/masking/assessment/sql_firewall/all)
all
Setting MODE to all
Granting AUDIT_COLLECTION privileges to "DATASAFE" ...
Granting AUDIT_SETTING privileges to "DATASAFE" ...
Granting SQL_FIREWALL privileges to "DATASAFE" ...
Granting DATA_DISCOVERY role to "DATASAFE" ...
Granting MASKING role to "DATASAFE" ...
Granting ASSESSMENT role to "DATASAFE" ...
Disconnected from Oracle Database 23ai EE High Perf Release 23.0.0.0.0 - Production
Version 23.4.0.24.05
権限スクリプトの実行が完了している状態でData Safeにデータベースを登録するウィザードに下記の設定値の入力を進めていきます。
- クラウド・データベース・タイプ: Oracleベース・データベース
- <コンパートメント>のデータベースを選択: 監視対象を選択: BaseDB23aiEEHP
- データ・セーフ・ターゲット表示名: BaseDB23aiEEHP
- コンパートメント: データセーフを配備するコンパートメントを選択
- プライベートIPを持つデータベースですか。:「はい」
- データベース・サービス名: PDB01.jumpserverpubli.demovcn.oraclevcn.com
- データベース・ポート番号: 1521
- TCP/TLS: TCP
- データベース・ユーザー名: DATASAFE
- データベース・パスワード: PASSWORD
無事にリソースの作成が完了した場合は、「ターゲット・データベース」から登録済のBaseDBインスタンスが登録されていることを確認できます。
「接続オプション」メニューの「プライベート・エンドポイント」では新規作成されたプライベート・エンドポイントの情報を確認できます。
Data Safe 管理コンソールから「データ・セーフ・ダッシュボード」を起動します。
管理対象のBaseDBの情報を確認することができました。Data Safeのダッシュボード左にあるセキュリティ・センター・メニューの「SQLファイアウォール」を選択すると、デフォルトではターゲット・データベースのSQL FirewallのステータスはDisabledになっていることがわかります。
SQL Firewallの構成
Data SafeからSQL Firewallの有効化
「ターゲットのサマリー」からSQL Firewallを有効化するターゲット・データベースを選択します。構成詳細画面にて、「SQLファイアウォール・ステータス」横の「有効化」を選択します。
ステータスの表示が緑になり「Enable」のステータスになれば有効化が成功です。
SQLの収集とSQLファイアウォール・ポリシーの設定
SQL Firewallで許可するSQLの収集を収集します。ターゲットデータベースの「構成詳細」画面より、「SQL収集の作成および開始」を選択します。データベースユーザーに事前作成しておいたHRユーザーを選択します。ターゲットユーザーが見つからない場合は、「データベース・ユーザー」横のリフレッシュアイコンを選択してリフレッシュ実施してください。
SQLPlusでターゲット・データベースに接続文字列を利用してHRユーザーでアクセスし、実行を許可する下記のSQL文を実行します。
select * from employees;
select * from employees where employee_id=100;
select employee_id,first_name,salary from employees;
実行を許可するSQLの収集が終わった後、Data Safeのダッシュボードにてターゲット・データベースを選択し、SQL収集の詳細より収集されたSQLの一覧を確認することができます。SQL収集のインサイトが表示されなければ、「インサイトのリフレッシュ」を実行してください。
「停止」を選択し、「ファイアウォール・ポリシーの生成」を選択します。ファイアウォール・ポリシーが生成されたら、「デプロイと実施」を選択、「セッション・コンテキスト・タイプ」や「一意の許可されたSQL文」を確認し、問題なければ「デプロイと実施」を選択してください。下記の設定値を選択し、「デプロイと実施」を実行してください。
- 実施スコープ: すべて(セッション・コンテキストとSQL文)
- 違反に対するアクション: 違反のブロックとログ記録
- 違反の監査: 対象
ACTIVEになればSQL Firewallの設定は完了です。
SQL Firewallの動作確認と違反レポートの確認
SQL Firewallの動作確認
ターゲット・データベースに対し、SQLPlusからHRユーザーでアクセスしてSQLを実行してみます。
- 許可されたSQL
sqlplus hr/PASSWORD@db.jumpserverpubli.demovcn.oraclevcn.com:1521/PDB01.jumpserverpubli.demovcn.oraclevcn.com
SQL*Plus: Release 23.0.0.0.0 - Production on Tue May 14 18:32:29 2024
Version 23.4.0.24.05
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Last Successful login time: Tue May 14 2024 18:18:54 +09:00
Connected to:
Oracle Database 23ai EE High Perf Release 23.0.0.0.0 - Production
Version 23.4.0.24.05
SQL> set linesize 200
SQL> select * from employees where employee_id=100;
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL PHONE_NUMBER HIRE_DATE JOB_ID SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- -------------------- ------------------------- ------------------------- -------------------- --------- ---------- ---------- -------------- ---------- -------------
100 Steven King SKING 1.515.555.0100 17-JUN-13 AD_PRES 24000 90
SQL> select * from employees where employee_id=110;
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL PHONE_NUMBER HIRE_DATE JOB_ID SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- -------------------- ------------------------- ------------------------- -------------------- --------- ---------- ---------- -------------- ---------- -------------
110 John Chen JCHEN 1.515.555.0110 28-SEP-15 FI_ACCOUNT 8200 108 100
SQL>
- 許可されていないSQL
qlplus hr/PASSWORD@db.jumpserverpubli.demovcn.oraclevcn.com:1521/PDB01.jumpserverpubli.demovcn.oraclevcn.com
SQL*Plus: Release 23.0.0.0.0 - Production on Tue May 14 18:32:29 2024
Version 23.4.0.24.05
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Last Successful login time: Tue May 14 2024 18:18:54 +09:00
Connected to:
Oracle Database 23ai EE High Perf Release 23.0.0.0.0 - Production
Version 23.4.0.24.05
SQL> select first_name,last_name from employees;
select first_name,last_name from employees
*
ERROR at line 1:
ORA-47605: SQL Firewall violation
Help: https://docs.oracle.com/error-help/db/ora-47605/
SQL>
違反レポートの確認
Data SafeのダッシュボードからSQL Firewallの稼働状況や、違反レポートにてブロックされたSQLの詳細情報を確認することができます。
参考情報
https://docs.oracle.com/en/cloud/paas/data-safe/admds/register-oracle-cloud-database.html#GUID-F7213ABF-A115-4363-B9F9-348A92466AD3
https://docs.oracle.com/en/cloud/paas/data-safe/admds/sql-firewall-resources.html#GUID-27D25B22-7F60-4246-8105-C864CF9CCFA6
https://qiita.com/western24/items/ca6515042d1a84ee07db
https://qiita.com/ritokuna/items/382ef519f5abf40bf733