Oracle Database 23ai の SQL Firewall を Oracle Data Safeから設定してみた

Oracle Database 23ai の新機能であるSQL FirewallをOCIの[Oracle Data Safe](https://speakerdeck.com/oracle4engineer/oracle-data-safefalseji-neng-gai-yao-tote-zheng)を利用して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の利用機能毎に必要なポリシーや、監視対象となるターゲット登録リソース毎に必要なポリシーについては[ドキュメント](https://docs.oracle.com/cd/E83857_01/paas/data-safe/admds/tasks-that-require-permissions.html#GUID-D6EE7D8E-BD90-4482-B258-251A98D03E02)を参考に編集ください。

ナビゲーション・メニューより、アイデンティティとセキュリティ > アイデンティティ > ポリシー にアクセスします。「ポリシーの作成」を選択し、必要なポリシーを作成していきます。

![Pasted Graphic 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/9b1247d6-35be-6664-e87b-73faf71cdebf.png)
![Pasted Graphic 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/5fda26ce-511b-dec9-9524-2619cee48c5a.png)
![Pasted Graphic 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/35009e33-ee01-3ea3-7a73-41fc0c028018.png)


### Oracle Database 23aiが稼働するBaseDBインスタンスの作成
Oracle Data Safeの監視対象として登録するBaseDBインスタンスを作成します。ナビゲーション・メニューより、Oracle Database > Oracleベース・データベース・サービス にアクセスします。本検証ではSQL Firewallの監視にOracle Data Safeを利用する為、SQL Firewallを利用するの前提条件であるEnterprise Edition High Performanceを選択し、バージョンは23aiを選択しました。
![Pasted Graphic 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/bebc79f6-bf67-4868-61b0-7915b19adb52.png)
![Pasted Graphic 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/d5a96d99-b28d-845f-4651-522596f40f14.png)
![Pasted Graphic 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/33a9db7c-989e-f321-8032-dc27eb6a1423.png)
![Pasted Graphic 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a11be032-07e6-cc6d-1f71-d0ae650c7ac8.png)
![Pasted Graphic 8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/1931357b-2ae4-1652-6e16-ae44256d6162.png)

画面下部のデータベース名「ORCL」を選択しデータベース詳細画面に遷移後、画面左下Resourcesメニューの「プラガブル・データベース」を選択し、表示される一覧からData Safeに登録し、SQL Firewallを有効化するPDB名「PDB01」を選択します。「PDB接続」ボタンからPDBに対する接続文字列（簡易接続）をメモしておきます。

![Pasted Graphic 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/9ba22a9d-3af6-6584-19fb-e0a6465d3917.png)
![Pasted Graphic 12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a126520f-7782-5ecb-0618-b41333804688.png)


```
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」カテゴリ内の「データ・セーフ - データベース・セキュリティ」にアクセスします。
![Pasted Graphic 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/cdc3cf33-6bf2-9114-c927-a37f74bf186a.png)

「データ・セーフにデータベースを登録します」の一覧より、「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

![Pasted Graphic 14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/2df3aaf3-c028-ed1e-07d9-18e87f17d483.png)
![Pasted Graphic 15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/515a3143-acf0-aa04-f672-f94d896cf79c.png)
![Pasted Graphic 16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/2c4c78d6-e9b1-0ba5-8591-640762d85baa.png)
無事にリソースの作成が完了した場合は、「ターゲット・データベース」から登録済のBaseDBインスタンスが登録されていることを確認できます。

![Pasted Graphic 17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/f7bf2f8d-daac-5e5c-192a-cd4813ba820b.png)

「接続オプション」メニューの「プライベート・エンドポイント」では新規作成されたプライベート・エンドポイントの情報を確認できます。

![Pasted Graphic 18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/6a4da0d4-b981-78e3-e794-e91702fc9df7.png)

Data Safe  管理コンソールから「データ・セーフ・ダッシュボード」を起動します。
![Pasted Graphic 19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/60ff5c9f-e3a7-1914-26e3-b9d5661fa096.png)
![Pasted Graphic 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a60dc20a-df6c-9f37-2f4a-93740d4c60d6.png)

管理対象のBaseDBの情報を確認することができました。Data Safeのダッシュボード左にあるセキュリティ・センター・メニューの「SQLファイアウォール」を選択すると、デフォルトではターゲット・データベースのSQL FirewallのステータスはDisabledになっていることがわかります。
![Pasted Graphic 21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/c314d24c-f2c6-f5ba-9860-97804279293d.png)

# SQL Firewallの構成
### Data SafeからSQL Firewallの有効化
「ターゲットのサマリー」からSQL Firewallを有効化するターゲット・データベースを選択します。構成詳細画面にて、「SQLファイアウォール・ステータス」横の「有効化」を選択します。
![Pasted Graphic 22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/e4726fe1-fc44-77cc-37ef-366fa8f72ea9.png)

ステータスの表示が緑になり「Enable」のステータスになれば有効化が成功です。

![Pasted Graphic 23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/1bd2a6a4-fff6-0774-450d-4f0c95b6b858.png)

### SQLの収集とSQLファイアウォール・ポリシーの設定
SQL Firewallで許可するSQLの収集を収集します。ターゲットデータベースの「構成詳細」画面より、「SQL収集の作成および開始」を選択します。データベースユーザーに事前作成しておいたHRユーザーを選択します。ターゲットユーザーが見つからない場合は、「データベース・ユーザー」横のリフレッシュアイコンを選択してリフレッシュ実施してください。
![Pasted Graphic 24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/fbd52fc3-c8ca-6456-d97c-488a7f31fb81.png)
![Pasted Graphic 25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/97f1360f-3cc2-057f-0dd9-232732070220.png)
![Pasted Graphic 26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/ebce17ed-0f82-d2c1-81d6-12c88d542f90.png)
![Pasted Graphic 27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/4c9ab04e-a3ec-2eda-1aa8-016a29b42e98.png)

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収集のインサイトが表示されなければ、「インサイトのリフレッシュ」を実行してください。

![Pasted Graphic 28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/be059b50-4fab-51c3-529e-cc041bc07155.png)


「停止」を選択し、「ファイアウォール・ポリシーの生成」を選択します。ファイアウォール・ポリシーが生成されたら、「デプロイと実施」を選択、「セッション・コンテキスト・タイプ」や「一意の許可されたSQL文」を確認し、問題なければ「デプロイと実施」を選択してください。下記の設定値を選択し、「デプロイと実施」を実行してください。

* 実施スコープ: すべて(セッション・コンテキストとSQL文)
* 違反に対するアクション: 違反のブロックとログ記録
* 違反の監査: 対象

![Pasted Graphic 29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/f4228b23-5550-ac55-aa6f-430f25d37141.png)
![Pasted Graphic 30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/acf3ecf7-73e9-83c3-1db2-183117fbcc3b.png)

ACTIVEになればSQL Firewallの設定は完了です。

![Pasted Graphic 31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/615f3ca4-45be-da19-8161-b2f6724cd135.png)

# 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の詳細情報を確認することができます。
![Pasted Graphic 32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/b3e25e7f-89d8-5965-edd1-c272388ad17f.png)
![Pasted Graphic 33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/f4a40663-20d0-1cb9-b4d2-c47b73d053f9.png)
![Pasted Graphic 34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/67b2880f-ebe3-fd4f-48df-85cef66ce168.png)


# 参考情報
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