OpenAMのAuditログ

## 今日やること

今日はOpenAMで取得可能なログについての話です。

この[Advent Calendarの1日目](http://qiita.com/nanazero/items/cd4b61f0f56ed7c83b21)の
**OpenAMでできること**というところで、以下のように書きました。

> Audit Logging（監査ログ）
> AuthenticationとかAuthorizationとかFederationのログがしっかり残せる

OpenAMはIAMとして、**アプリの認証とか認可を代わりにやってあげる**ようなことをしているので、自ずとこういったログの集積も可能なわけってことです。

## Audit Log（監査ログ）

ここでのAudit Logの定義は、システムのセキュリティやトラブルシューティング、いろんな約束事（笑）の遵守などに役立つに情報のことを指します。例えば、然るべき役職の人が、然るべき認証を経て、然るべき認可を受けて、然るべきシステムにアクセスしているか？といった情報です。

こういったログはどういった場面で必要とされるかは、あまり経験がないのでわからないです。しかし、先述のセキュリティと絡めたケースを考えると、「セキュリティ侵害が発生した時に役立ちそう！」ってのはわかりやすいです。

「システム監査時に有効そう！」ってのは**監査というものを受けたことがない**ので、よくわからないです。きっと、ログの解析までして、**業務の有効性**とか**財務報告の信頼性を確保**したりとかするんですかね。内部統制的なお話ですかね～。

## OpenAMの監査ログ

OpenAMは以下の4つトピックに基づいて、ログを統合します。

| トピック | 実際のファイル名 | 説明 |
|:---|:---|:---|
|アクセス| `access.csv` | アクセスごとに、誰が、何を、いつ、どうしたか？みたいなのを出力 |
|アクティビティ|`activity.csv`| ユーザーが作成、更新、削除したセッションの情報を出力 |
|認証| `authentication.csv` | ユーザーが認証された時間と認証の方法を出力 |
|設定| `configuration.csv` | 誰が、いつOpenAMの設定を変更したかを出力|

アクティビティはOAuth2.0やOpenID Connect関連のトークン（ID TokenやAccess Token）のイベントは記録されない的な注意書きが[Administration Guide](https://backstage.forgerock.com/docs/openam/13.5/admin-guid)に書いてありましたが、のちのリリースで対応されるみたいです。

## デフォルトの監査ログの置き場所

OpenAMのデフォルトの設定では**OpenAMの設定情報が格納されているディレクトリ以下に保存されているみたいです。（本記事では`/home/openam/openam/openam/log`となります）

```bash
[vagrant@iam ~]$ sudo -u openam ls -l /home/openam/openam/openam/log
total 3880
-rw-r--r-- 1 openam openam 3667621 Dec 13 23:44 access.csv
-rw-r--r-- 1 openam openam   69570 Dec 15 19:42 activity.csv
-rw-r--r-- 1 openam openam  177533 Dec 13 23:44 authentication.csv
-rw-r--r-- 1 openam openam   33669 Dec 13 23:32 config.csv
```

このログの出力場所の設定は、OpenAMの設定から変更できます。
**CONFIGURE => GLOBAL SERVICES**をクリックし、

<img width="879" alt="001.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/65b503e7-d6fc-ef50-a910-96df48a34b05.jpeg">

**Audit Logging**をクリックします。

<img width="877" alt="002.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/a6f03b9c-5b41-662e-3757-03c8203e1eb3.jpeg">

**Secondary Configuration => Global CSV Handler**をクリックします。

<img width="897" alt="003.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/6288a17a-da27-0606-10ff-cc2c830b6cc3.jpeg">

（深いですね...）**CSV Configuration**というタブの中に、**Log Directory**という設定項目がありますので、ここで変更可能です。

<img width="890" alt="004.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/208976be-209c-1d98-e9fc-2e063a9a56af.jpeg">

## ログローテーションとかもできる

先ほどの**Global CSV Handler**では、CSV形式のファイル出力に関する設定ができるようになっています。

* Global Handler Configuration
    * 出力するトピックを指定します
    * デフォルトでは`access`、`activity`、`authentication`、`config`と設定されています
* Audit Event Handler Factory
    * ここはいじらいない
    * Audit Event Handlerのクラスパスが設定されています
* CSV Configuration
    * CSVファイルの出力先ディレクトリを指定します
* File Rotation
    * ファイルローテーションのポリシーを指定します
    * デフォルトでは100000000Byteに達したらローテーションされます
* File Retention
    * ローテーションしたファイルをどのぐらい（何世代）保持するかを指定します
    * デフォルトでは、無制限に保持となっています
* Buffering
    * ロギングをバッファリングしてから行うかを指定します
* Tamper Evident Configuration
    * イベントごとにHMAC Digestを生成し、エントリに挿入するかどうかを指定します
    * 改ざん防止的な設定かな？

## Audit Logの中身

ちょっと、整形するのは心が折れた...

* Authentication

```
"_id","timestamp","eventName","transactionId","userId","trackingIds","result","principal","context","entries","component","realm"
"7bf6332a-cab7-4e8b-8661-bbed75571246-79","2016-12-01T12:04:35.494Z","AM-LOGIN-MODULE-COMPLETED","7bf6332a-cab7-4e8b-8661-bbed75571246-77","id=amadmin,ou=user,dc=openam,dc=forgerock,dc=org","[""502e295c57ad44dd01""]","SUCCESSFUL","[""amadmin""]",,"[{""moduleId"":""DataStore"",""info"":{""authControlFlag"":""REQUIRED"",""moduleClass"":""DataStore"",""ipAddress"":""192.168.33.1"",""authLevel"":""0""}}]","Authentication","/"
```

* Activity

```
"_id","timestamp","eventName","transactionId","userId","trackingIds","runAs","objectId","operation","before","after","changedFields","revision","component","realm"
"7bf6332a-cab7-4e8b-8661-bbed75571246-81","2016-12-01T12:04:35.611Z","AM-SESSION-CREATED","7bf6332a-cab7-4e8b-8661-bbed75571246-77","id=amadmin,ou=user,dc=openam,dc=forgerock,dc=org","[""502e295c57ad44dd01""]","id=dsameuser,ou=user,dc=openam,dc=forgerock,dc=org","502e295c57ad44dd01","CREATE",,,,,"Session","/"
```

* Access

```
"_id","timestamp","eventName","transactionId","userId","trackingIds","server.ip","server.port","client.ip","client.port","request.protocol","request.operation","request.detail","http.request.secure","http.request.method","http.request.path","http.request.queryParameters","http.request.headers","http.request.cookies","http.response.headers","response.status","response.statusCode","response.detail","response.elapsedTime","response.elapsedTimeUnits","component","realm"
"7bf6332a-cab7-4e8b-8661-bbed75571246-67","2016-12-01T12:03:29.914Z","AM-ACCESS-OUTCOME","7bf6332a-cab7-4e8b-8661-bbed75571246-60",,,"iam.example.com","443","192.168.33.1","61462","CREST","READ",,"true","GET","https://iam.example.com:443/openam/json/serverinfo/*","{}","{""accept"":[""application/json, text/javascript, */*; q=0.01""],""Accept-API-Version"":[""protocol=1.0,resource=1.1""],""host"":[""iam.example.com""],""referer"":[""https://iam.example.com/openam/XUI/""],""user-agent"":[""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36""],""X-Requested-With"":[""XMLHttpRequest""]}","{""JSESSIONID"":""6D3835342673B06D0DE661B71C28833C""}",,"SUCCESSFUL","",,"397","MILLISECONDS","Server Info","/
```

* Config

```
"_id","timestamp","eventName","transactionId","userId","trackingIds","runAs","objectId","operation","before","after","changedFields","revision","component","realm"
"7bf6332a-cab7-4e8b-8661-bbed75571246-50","2016-12-01T12:02:13.942Z","AM-CONFIG-CHANGE","7bf6332a-cab7-4e8b-8661-bbed75571246-0",,,"id=dsameuser,ou=user,dc=openam,dc=forgerock,dc=org","ou=https://iam.example.com:443/openam,ou=com-sun-identity-servers,ou=default,ou=GlobalConfig,ou=1.0,ou=iPlanetAMPlatformService,ou=services,dc=openam,dc=forgerock,dc=org","UPDATE",,,"[""sunKeyValue""]",,,
```

この**`trackingIds`**というのは凄く気になりますね。複数のログファイル、また、違うトピックのログファイルにわたって検索できるキーになるんでしょうか？どれどれ...

```bash
$ sudo -u openam grep 502e295c57ad44dd01 ./* | awk -F":" '{print $1}' 
./access.csv
./access.csv
./access.csv
./access.csv
./access.csv
./access.csv
./access.csv
./access.csv
./access.csv
./access.csv
./access.csv
./access.csv
./activity.csv
./activity.csv
./activity.csv
./authentication.csv
./authentication.csv
```

おお～、ログの串刺しが捗りそうですね～！ログ分析とかやったことないけど(´ρ`)

## 〆

他にもマニュアルを読んでると、**Legacy Log**なんてのもあるみたいですが、Legacyっていうぐらいですから、消えゆく機能なんでしょうかね～？

本日のまとめとしては

* OpenAMの監査ログを取得できる
* 監査ログはアクセス、認証、アクティビティ、設定というトピックからなる
* CSV形式で出力されて、ローテーションやリテンションのポリシーを設定できる
* なんだか有能そうな串刺し属性（trackingIds）が出力されている

明日はなにしよう～？

ばい！