ユーザーがスプールファイルを作成した（操作した）履歴を調べたい（監査ジャーナル）

前回投稿 [IBM i のユーザーやプリンター（OUTQ）毎に印刷出力したページ数を把握したい](https://qiita.com/gomAnomalocaris/items/d2417a770fddf4626b55)の検証です。

## 監査ジャーナルの全体像

このような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/98b1011d-4972-d1e1-bc6f-17992bb09d9d.png)


## 監査したいユーザーIDのスプール操作を監査ジャーナル対象として設定する　CHGUSRAUDコマンド

CHGUSRAUDコマンドで、対象ユーザーIDと対象操作を指定します。この例では、ユーザー処置の監査AUDLVLパラメーターに *SPLFDTA を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/789ed472-286c-c681-a1e0-e4f2cd3f587f.png)

ちなみに、上記の画面で
　**オブジェクト監査値**　・・・　*PF, *LF, *PGMその他オブジェクトの設定に*CHANGE や *ALL などの監査値が指定されている場合、このユーザーがそのオブジェクトを操作した履歴が監査レコードとして生成されます。（大事なファイルやプログラムなどを対象に、どのユーザーがどの操作をしたかを記録したい場合など）
 　**ユーザー処置の監査** ・・・　このユーザーがどのような操作をしたか、をログしたい場合に指定します。今回のようにスプールを生成（操作）した、バックアップや復元を実行した、などユーザーの操作を監査したい場合に使用します。

ユーザーIDに対する設定は以上で完了です。

ですがこのままでは監査ジャーナルは取得されません。IBM i OSレベルでの監査の対象や監査をアクティブにするための設定が別途必要です。


## システム値 QAUDLVL に監査対象としたい操作を指定する

最初にシステム全体設定としてスプールファイル操作を監査対象とする設定を行います。下図のように今回の場合ですと、 *SPLFDTA を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/222dfceb-02f0-6f76-b3aa-1795030f1a4e.png)

これでスプールファイルを監査可能となりました。ですがこれだけではまだ監査ログ（監査ジャーナル）は生成されません。さらにここで指定した監査対象を開始するための設定が必要です（次の章）

## 監査を開始する対象を指定する システム値QAUDCTL

**システム値QAUDCTL** はユーザーIDの監査対象指定のところと関連しています。ユーザーIDで監査対象は大きく、ユーザー操作に基づいた監査＝*AUDLVL　と　オブジェクトの監査設定に基づいた監査＝*OBJAUD の二種類がありました。このどちら（両方）を監査対象とするかを、ここで指定します。
今回はユーザーの操作＝*AUDLVL（のうち、スプール操作）だけを監査したいので 下図のように*AUDVLVを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/4bc0ea8e-e85d-473e-b216-8f5d61227a5b.png)

更に上記の図では、*NOQTEMP と指定されていますが、これはQTEMPライブラリーに対しては監査をしないことを指定しています。
QTEMPは通常ユーザージョブのワーク領域として利用されジョブ終了後は消されるので、監査が必要な重要なオブジェクトが無い場合が多いため、監査対象としない方がシステムパフォーマンス面で影響を軽微にできるためです。
**監査ジャーナルを無尽蔵に取得してしまうとシステムパフォーマンスやストレージ使用率を圧迫してしまうため、必要最小限にとどめることが推奨されています。**

## システム値 QAUDFRCLVL 強制監査データ 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/cbaa32a9-cad9-a794-9d66-3f3ff43c3370.png)

日本語訳がヘンで分かりにくいです。システム値の略字から推測すると分かりやすいと思いますが、FRCLVLとあるとおり、監査レコードを書き出す単位レコード数を指定するものです。デフォルトは下図のように *SYS で通常はこれで問題ないと思います。監査ジャーナルのストレージへの書き出しは通常1レコード単位ではなくバッファリングして行いますので、システム障害が発生した際、監査レコードが消失する可能性がゼロではありません。このためクリティカルなシステムではこの書き出しレコード数を極力小さくしたい、という要件が起きるかもしれません。

## システム値 QAUDENDACN

このシステム値を変更することはあまりないかもしれません。監査ジャーナルをログしようとした際に正常に監査ジャーナルに出力できなかった場合のシステムの挙動を指定しています。そもそもこのような事態が起こるケースは例えば、ASP1（システムのストレージ領域）が99%近くなって書き出しが出来ない、などしか思い浮かばないのですが、デフォルトではこのような場合、QSYSOPRなどに監査ジャーナルがログ出来なかったことを通知します。もう一つの設定可能値は *PWRDWNSYS です。この値を指定すると監査レコードが監査ジャーナルに正常にログされない場合、システムがシャットダウンされてしまう、というものです。一般的な企業のシステムではこのような必要性があるシステムは多くは無いと思います。が、そのような要件の必要なクリティカルなシステムではこの設定値だけで制御が可能となります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b6f83bbb-5f6c-75f4-ece7-4e16a48b4bdc.png)


ここまででシステム全般の監査設定は完了しました。監査ジャーナルを開始するためには最後に監査レコードを取得するための監査ジャーナルレシーバーの設定を行います。これは通常であれば、初めて監査ジャーナルを開始するときにだけ必要な操作になると思います。

## CHGSECAUDコマンド : 機密保護監査の変更

**CHGSECAUDコマンド** は監査ジャーナルをログする初期ジャーナルレシーバーの名前を指定します。指定したジャーナルレシーバーが無い場合は別途コマンドでここで指定したジャーナルレシーバーを作成が必要です。
下記では初期ジャーナルレシーバーのライブラリーをAUDLIBというユーザー作成ライブラリーを指定しています。（デフォルト値では QGPL/AUDRCV0001 が指定されています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/60813202-f451-63cd-64d5-f78da0678404.png)

また、CHGSECAUDコマンドではこれまで説明してきた、システム値（QAUDCTLシステム値、QAUDLVLシステム値）を変更することもできます。上図ではここまで説明してきた設定値が反映されて表示されています。

## 監査用ジャーナル・レシーバーの作成

始めて監査ジャーナルを開始するときなど、監査ジャーナル用のジャーナルレシーバーが無い場合、以下のコマンドで監査用のジャーナル・レシーバーを作成します。

``` CRTJRNRCV JRNRCV(AUDLIB/AUDJRN0001)  TEXT('System audit journal receiver')  AUT(*EXCLUDE) ```

※上記の例ではライブラリーAUDLIBに作成しています。
※AUT(*EXCLUDE)を指定して、一般ユーザーはアクセス不可にしています。

**ジャーナルレシーバーとは** 、これまで設定してきた結果、監査ジャーナルが生成された場合のジャーナルレコードの保管先となるオブジェクトです。ジャーナルレシーバーはジャーナルに接続されて（ジャーナルを経由して）ジャーナルレコードを記録します。
ジャーナルレコードは通常大量になるので、ある程度のレコード数になるとジャーナルを（自動で）切り替えて（複数個用意して）運用するのが一般的です。

## 監査用ジャーナルの作成

以下のコマンドで監査用のジャーナルを作成し、上で作成した監査用ジャーナルレシーバーを指定（接続）します。

```CRTJRN JRN(QSYS/QAUDJRN) JRNRCV(AUDLIB/AUDJRN0001)  TEXT('System audit journal') AUT(*USE)``` 

※監査用のジャーナル名は必ず QSYS/QAUDJRN です。
※監査用ジャーナルレシーバーと同様でAUT(*USE)として一般ユーザーの権限を最小化します

## 監査ジャーナルのレコードの確認　方法1

かつてはCLコマンドで割と手間な操作が必要でしたが、最近ではIBM i サービスの以下のコマンド1発で、監査ジャーナルレコードが検索できます。


`SELECT * FROM TABLE (
                 QSYS2.DISPLAY_JOURNAL( 'QSYS', 'QAUDJRN')) AS JT
                 WHERE journal_entry_type in ('SF') ;`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/162dabb7-d860-57ea-4c0c-7c8c8a72101c.png)

※上記の例では、**ジャーナル操作のレコードタイプ SP = スプールファイル操作 を指定**
※日付、ユーザーID, etc.でセレクトも可能

## 監査ジャーナルのレコードの確認　方法2

IBM i 7.5(と7.4TR）で監査ジャーナルの検索機能が拡張されています。
2002ポートから接続する新しいNavigator for i にログインして、 **セキュリティ→監査ジャーナル項目** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b5af3ef4-0e0c-b426-ea79-39eebd407476.png)

どのような操作の監査ジャーナルを検索したいかを指定します。時刻範囲も指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3ffeb597-3d19-2b68-f0a7-656977708c4a.png)

※注意 ** ただし、**執筆時点ではスプールファイルの監査情報は表示できないようです**(ジャーナル項目の選択に SF が出てこない）。将来的に拡張されると個人的には予想しますが。。更新情報が見つかり次第UPDATE致します。

暫定で、以下では何らかのオブジェクトを作成した際に記録される CO (Create Object) 監査ログを時刻指定で選択しています。
結果はこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/33d2b228-3a28-5984-39bd-892050ce013d.png)

結構分かりやすいと思います。
また、新Navigator for i 全般の機能に従って、**右上の SQL アイコンをクリックするとこの画面を生成しているSQLを取得でき、ユーザーのアプリケーションに組み込みできます。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/6e647886-1fe3-2d8c-050c-13034d9a7dcc.png)