Oracle Databaseのセキュリティ上の問題点を探すDBSATを試す

Oracle Databaseの各種設定がセキュリティの観点で望ましい状態にあるかをアセスメントするツールがOracle Database Security Assessment Tool (DBSAT)です。

# DBSATとは
DBSATは稼働中のデータベースに接続し、各種設定がセキュリティ上望ましい状態であるかをチェックし、レポーティングするツールです。データベース内の設定だけでなく、リスナー等の設定ファイルのチェックを行うこともできます。

DBSATは以下の３つのコンポーネントから構成されます。

<dl>
<dt> Collector </dt>
<dd> セキュリティ情報を収集します </dd>
<dt> Reporter </dt>
<dd> 収集されたセキュリティ情報からレポートを出力します </dd>
<dt> Discoverer </dt>
<dd> リモート・データベースに接続し、レポートを生成します </dd>
</dl>

## 必要要件
DBSATを実行するには以下の要件を満たす必要があります。

- 接続先データベース： Oracle Database 10g (10.2.0.5) 以上
- オペレーティング・システム: Linux x86-64, HP-UX IA (64bit), Windows x64, Solaris x64/SPARC, AIX (64bit), Linux on zSeries (64bit)
- zip, unzipコマンド
- Python 2.6以上（レポーター実行用）
- Java Runtime 1.8以上（ディスカバラ実行用）

## インストール

My Oracle Support (MOS) から以下のドキュメントを参照してdbsat.zipファイルをダウンロードします。

> Oracle Database Security Assessment Tool (DBSAT) (Doc ID 2138254.1)	

ダウンロードしたzipファイルをoracle管理ユーザー（OSユーザー）の権限で任意のディレクトリに展開します。

```
$ mkdir $HOME/dbsat
$ cd dbsat
$ unzip dbsat.zip
Archive:  dbsat.zip
  inflating: dbsat
  inflating: dbsat.bat
  inflating: sat_reporter.py
  inflating: sat_analysis.py
  inflating: sat_collector.sql
  inflating: xlsxwriter/app.py
  inflating: xlsxwriter/chart_area.py
  inflating: xlsxwriter/chart_bar.py
  inflating: xlsxwriter/chart_column.py
  inflating: xlsxwriter/chart_doughnut.py
  inflating: xlsxwriter/chart_line.py
  inflating: xlsxwriter/chart_pie.py
  inflating: xlsxwriter/chart.py
  inflating: xlsxwriter/chart_radar.py
  inflating: xlsxwriter/chart_scatter.py
  inflating: xlsxwriter/chartsheet.py
  inflating: xlsxwriter/chart_stock.py
  inflating: xlsxwriter/comments.py
  inflating: xlsxwriter/compat_collections.py
  inflating: xlsxwriter/compatibility.py
  inflating: xlsxwriter/contenttypes.py
  inflating: xlsxwriter/core.py
  inflating: xlsxwriter/custom.py
  inflating: xlsxwriter/drawing.py
  inflating: xlsxwriter/format.py
  inflating: xlsxwriter/__init__.py
  inflating: xlsxwriter/packager.py
  inflating: xlsxwriter/relationships.py
  inflating: xlsxwriter/shape.py
  inflating: xlsxwriter/sharedstrings.py
  inflating: xlsxwriter/styles.py
  inflating: xlsxwriter/table.py
  inflating: xlsxwriter/theme.py
  inflating: xlsxwriter/utility.py
  inflating: xlsxwriter/vml.py
  inflating: xlsxwriter/workbook.py
  inflating: xlsxwriter/worksheet.py
  inflating: xlsxwriter/xmlwriter.py
  inflating: xlsxwriter/LICENSE.txt
  inflating: Discover/bin/discoverer.jar
  inflating: Discover/lib/ojdbc8.jar
  inflating: Discover/lib/oraclepki.jar
  inflating: Discover/lib/osdt_cert.jar
  inflating: Discover/lib/osdt_core.jar
  inflating: Discover/conf/sample_dbsat.config
  inflating: Discover/conf/sensitive_en.ini
$ ls
Discover  dbsat.bat  sat_analysis.py    sat_reporter.py
dbsat     dbsat.zip  sat_collector.sql  xlsxwriter
```

## マニュアル
DBSATには[オンライン・マニュアル](https://docs.oracle.com/cd/E93129_01/SATUG/toc.htm)が用意されています。

# Collector
Collector はデータベースに接続し、各種設定を収集します。収集結果は単一のzipファイルにまとめられます。zipファイルにはパスワードを設定することができます。

## ユーザー要件
DBSATが接続するユーザーは以下権限を持っている必要があります。

- CREATE SESSION システム権限
- SELECT on SYS.REGISTRY$HISTORY オブジェクト権限
- SELECT_CATALOG_ROLE ロール
- SELECT on SYS.DBA_USERS_WITH_DEFPWD オブジェクト権限（Oracle Database 11g以降）
- AUDIT_VIEWER ロール（Oracle Database 12c以降）
- SELECT on AUDSYS.AUD$UNIFIED オブジェクト権限（Oracle Database 12c以降）
- DV_SECANALYST ロール（Database Vaultを使っている場合）

```
$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on 水 7月 4 15:03:46 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
SQL> CREATE USER dbsat IDENTIFIED BY dbsat;
ユーザーが作成されました。

SQL> GRANT CREATE SESSION TO dbsat;
権限付与が成功しました。

SQL> GRANT SELECT ON SYS.REGISTRY$HISTORY TO dbsat;
権限付与が成功しました。

SQL> GRANT SELECT_CATALOG_ROLE TO dbsat;
権限付与が成功しました。

SQL> GRANT AUDIT_VIEWER TO dbsat;
権限付与が成功しました。

SQL> GRANT SELECT ON SYS.DBA_USERS_WITH_DEFPWD TO dbsat;
権限付与が成功しました。

SQL> GRANT SELECT ON AUDSYS.AUD$UNIFIED TO dbsat;
権限付与が成功しました。
```

## 実行方法
展開したディレクトリ内のdbsatコマンドを実行します。コレクターを実行するにはパラメーターとしてcollectと、データベースに接続する情報、収集した情報を保存するファイルへのパスを指定します。
下記の例では、ローカル・データベースのdbsatユーザーで接続し、収集ファイルを$HOME/dbsat.result1.zipファイルに格納します。

```
$ cd dbsat
$ ./dbsat collect dbsat $HOME/dbsat.result1

Database Security Assessment Tool version 2.0.2 (May 2018)

This tool is intended to assist in you in securing your Oracle database
system. You are solely responsible for your system and the effect and
results of the execution of this tool (including, without limitation,
any damage or data loss). Further, the output generated by this tool may
include potentially sensitive system configuration data and information
that could be used by a skilled attacker to penetrate your system. You
are solely responsible for ensuring that the output of this tool,
including any generated reports, is handled in accordance with your
company's policies.

Connecting to the target Oracle database...


SQL*Plus: Release 12.2.0.1.0 Production on 水 7月 4 15:06:25 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

パスワードを入力してください: <<データベース接続パスワード>>


Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
Setup complete.
SQL queries complete.
/bin/cat: /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora: そのようなファイルやディレクトリはありません
Warning: Exit status 256 from OS rule: listener.ora
/bin/ls: /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora にアクセスできません: そのようなファイルやディレクトリはありません
Warning: Exit status 512 from OS rule: ls_listener.ora
OS commands complete.
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Productionとの接続が切断されました。
DBSAT Collector completed successfully.

Calling /u01/app/oracle/product/12.2.0/dbhome_1/bin/zip to encrypt dbsat.result1.json...

Enter password: <<zipパスワード>>
Verify password: <<zipパスワード>>
  adding: dbsat.result1.json (deflated 84%)
zip completed successfully.
$
$ ls -l ~/dbsat.result1.zip
-rw------- 1 oracle oinstall 34259  7月  4 15:09 /home/oracle/dbsat.result1.zip
```

上記例の環境は、リスナーがOracle Grid Infrastructureの管理下にあり、dbsat実行ユーザーがlistener.oraファイルを参照できないためエラーが出力されています。

# Reporter
Reporter は Collector が生成した情報を元にレポートを作成します。-nパラメーターはレポートを暗号化しない設定です。
パラメーターとしてreportと、zipファイルへのパスを指定します（拡張子を含めない）。

## 実行例

```
$ ./dbsat report -n ../dbsat.result1

Database Security Assessment Tool version 2.0.2 (May 2018)

This tool is intended to assist in you in securing your Oracle database
system. You are solely responsible for your system and the effect and
results of the execution of this tool (including, without limitation,
any damage or data loss). Further, the output generated by this tool may
include potentially sensitive system configuration data and information
that could be used by a skilled attacker to penetrate your system. You
are solely responsible for ensuring that the output of this tool,
including any generated reports, is handled in accordance with your
company's policies.

Archive:  dbsat.result1.zip
[dbsat.result1.zip] dbsat.result1.json password: <<zipパスワード>>
  inflating: dbsat.result1.json
DBSAT Reporter ran successfully.

$ ls ../dbsat.result1*
../dbsat.result1.zip          ../dbsat.result1_report.txt
../dbsat.result1_report.html  ../dbsat.result1_report.xlsx
../dbsat.result1_report.json
```

## レポート
作成されたレポートはテキスト、Microsoft Excel、JSON、HTMLの各フォーマットで出力されます。レポートには以下のタイトルを持つ複数のセクションが出力されます。

|タイトル|内容|
|:---|:---|
|Assessment Date & Time|実行時刻|
|Database Identity|データベース名,ロール,作成日|
|Summary|チェックするカテゴリーの一覧|
|Basic Information|バージョンとセキュリティ系オプションの情報|
|User Accounts|データベース・ユーザーの情報|
|Privileges and Roles|システム権限とロール|
|Authorization Control|Database Vaultの使用状況|
|Data Encryption|暗号化に関する情報|
|Fine-Grained Access Control|ファイングレイン制御に関する情報|
|Auditing|監査設定に関する情報|
|Database Configuration|データベース設定に関する情報|
|Network Configuration|通信暗号化に関する情報|
|Operating System|OS設定に関する情報|

各セクションには多数のチェック項目があり、それぞれに Status （合格 Pass, リスクあり High Risk / Medium Risk / Low Risk）、Summary（サマリー）、
Details（詳細）、Remark（追記事項）、Reference（参照情報）が記述されます。

下記はレポートとして出力されたチェック項目の一部です。

- 最新のパッチが適用されていない = High Risk
![high risk](https://qiita-image-store.s3.amazonaws.com/0/181284/bbb646e3-0c17-3a9a-bd2f-87910a16db41.png)

- SYSTEM表領域やSYSAUX表領域を使う一般ユーザーはいない = Pass
![medium risk](https://qiita-image-store.s3.amazonaws.com/0/181284/21fa0277-cdf6-e1c8-b8d0-b5a5c6e1d403.png)

- サンプル・スキーマが見つかった = Medium Risk
![pass](https://qiita-image-store.s3.amazonaws.com/0/181284/616c5ba8-a5b9-7d62-d96b-9715c07c0095.png)

# Discoverer
　Discovererはリモート・データベースに対して情報を取得できるツールです。できることはCollector / Reporterと同じです。検証は実施していません。