Oracle Cloud (OCI) Audit を利用したアクティビティの監視

# はじめに
システムを安全に運用していくためには、オンプレミスと同様、パブリック・クラウドにおいても **リソースの操作の監視、管理**は重要です。AWSでは `CloudTrail`、Azureでは `Activity Log` が提供されているように、Oracle Cloud Infrastructure (OCI) でも アクティビティ監視のためのサービスとして、`Audit (監査)` があります。

Audit (監査) は 昔からあるサービスではありますが、アップデートされている部分もあるので、改めて本記事では「OCI でのアクティビティ監視ってどうやるの？」と思われている方に向けて 解説していきたいと思います。

- **index：**
    - [Audit (監査) とは](#audit-監査-とは)
    - [ログで確認できる内容](#ログで確認できる内容)
    - [GUIで監査ログを確認する](#guiで監査ログを確認する)
    - [CUIで監査ログを確認する](#cuiで監査ログを確認する)
    - [監査ログを出力する](#監査ログを出力する)
    - [監査ログをOracle Management Cloudで分析する](#監査ログをoracle-management-cloudで分析する)

# Audit (監査) とは
まずはじめに、概要のお話です。Audit (監査) は、元々は独立したサービスでしたが、2020年秋頃に Logging というサービスが提供された際に、Logging のなかの１機能のような立ち位置になりました。この際、ログの保持期間のデフォルト値が変わるなど、細かな変更はありましたが、基本的な機能は変わっていません。

- **概要**
    - OCI上の <font color="salmon">**全てのAPIコールを自動的に記録するサービス**</font>
    - デフォルト有効化されており、<font color="salmon">**無償**</font> で利用が可能  
    - 記録された情報 (監査ログ) は <font color="salmon">**365日分**</font> 保持される(*1)
    - 全てのサービスでサポートされているが、オブジェクト・ストレージ・サービスのうち、<font color="salmon">**"オブジェクト" に関連したイベントは対象外**</font>(*2)

(*1) 期間は変更不可。保存要件に満たない場合、ユーザ側でオブジェクト・ストレージに保存するなどの対応が必要です
(*2) オブジェクト関連のログが必要な場合、Logging でサービス・ログを有効化することを検討してください

# ログで確認できる内容
監査ログは <font color="salmon">**JSON 形式**のドキュメント</font>で保存されます。各項目の詳細については、OCI ドキュメント："[監査ログ・イベントの内容](https://docs.oracle.com/en-us/iaas/Content/Audit/Reference/logeventreference.htm)" に記載の通りです。
様々な項目がありますが、ここでは 一部だけピックアップして紹介します。

- `source` : イベントを生成した**リソース名**  
<font color="silver">例．"instancePool-01", "testBucket" など</font>
- `time` : イベントの発生した**時刻**  
<font color="silver">例．"2021-06-11T10:20:29.641Z" など</font>
- `data`.`eventName` : このイベントを生成した **API 操作名**  
<font color="silver">例．"GetInstance", "GetBucket" など</font>
- `data`.`message` : 操作によって起きた**内容の説明**  
<font color="silver">例．"GetInstancePool succeeded", "Bucket details retrieved." など</font>
- `data`.`identity`.`ipAddress` : リクエストの**送信元 IPアドレス**  
<font color="silver">例．"10.0.30.xx", "129.2xx.xx.xx" など</font>
- `data`.`identity`.`principalId` : リクエストを行った**プリンシパルのOCID**  
<font color="silver">例．"ocid1.user.oc1..aaaaag~" など</font>
- `data`.`identity`.`principalName` : プリンシパルIDに紐づく**ユーザ名**または**サービス名**  
<font color="silver">例．"autoscaling", "dev-user1" など</font>
- `data`.`request`.`action` : リクエストの**HTTPメソッド**  
<font color="silver">例．"GET", "DELETE", "POST" など</font>
- `data`.`request`.`headers` : **HTTPヘッダー**のフィールドとその値

ここで挙げたように、ログからは **誰が**（**何のサービスが**）どの**リソース**に対して、どのような**操作**を、**いつ行い**、**何が発生したのか**、など、基本的な内容が確認できることが分かります。<font color="silver">（当たり前ですね…!）</font>

# GUIで監査ログを確認する
監査サービスは、`OCI コンソール・メニュー` → `監視および管理` → `監査` からアクセスできます。
![image-20210611130044563.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/8ec4a245-842a-2aae-f1fc-47e03e0f2cce.png)
このページでは、監査ログの検索、その結果の閲覧、エクスポートが行えます。また、下記項目を用いてフィルタリングが可能です。
なお、監査ログは、<font color="salmon">操作が行われた**コンパートメント**に紐づく</font>ため、対象の操作がどのコンパートメントで行われたのかを理解し、適切なコンパートメントを選択する必要があります。

- **ユーザー**：操作を行ったプリンシパル名  
<font color="silver">例．"autoscaling", "dev-user1" など</font>
- **リソース**：イベントを生成したリソース名  
<font color="silver">例．"instancePool-01", "testBucket" など</font>
- **リクエスト・アクション・タイプ**：リクエストのHTTPメソッド  
<font color="silver">例．"GET", "DELETE", "POST" など</font>
- **イベント・タイプ**：発生したイベントの種類 
<font color="silver">例．"com.oraclecloud.objectstorage.getbucket" など</font>
- **カスタム・フィルタ**：監査ログに含まれる様々な項目を用いたフィルタ  
項目名の入力を開始すると、項目の候補や演算子が自動的に表示され、入力を補助してくれます。
- **時間によるフィルタ**：検索対象期間の指定  
「過去5分間」「過去15分間」「今日」などの選択肢があります。「カスタム」を選択することで自由な期間を指定できますが、<font color="red">**最大14日**というレンジの中で指定する必要があります</font>。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/a4b736d5-0441-2ddd-352b-7194de00883c.png)

検索した結果は、以下のように表示されます。また、検索結果を `ログ・データのエクスポート(JSON)` ボタンから エクスポートすることも可能です。
ただし、検索結果は <font color="red">**500件が上限** となっていますので、それ以上のデータを取得したい場合は、CUIの利用をオススメ</font>します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/d461123e-a9b9-a485-772d-63c1095866a6.png)

# CUIで監査ログを確認する
前述の通り、<font color="red">GUIでの検索は 表示上限が500件といった制約</font>があります。CUIを利用することで、それ以上のログを取得することが可能です。
なお、<font color="red">CUIにおいても検索期間のレンジが最大14日間であるという制約は変わらない</font>ため、より長期間でログを取得したい場合は、後述の「[監査ログを出力する](#監査ログを出力する)」を確認してください。

CUIには、`Auditのコマンドを利用する方法` と、`Logging のコマンドを利用する方法` の **２種類** があります。これは、Audit (監査) サービスが 2020年秋頃に Logging のなかの１機能のような立ち位置になったことに起因します。特に制約がなければ、<font color="salmon">今後は Logging コマンドの利用する</font>のが良いと思います。

```text:例："audit"コマンド（全件取得）
oci audit event list --compartment-id <compartment-id> --end-time yyyy-MM-ddT00:00:00Z --start-time yyyy-MM-ddT00:00:00Z --all
```

```text:例："logging"コマンド（1000件取得）
oci logging-search search-logs --search-query "search \"<compartment-id>/_Audit\" | sort by datetime desc" --time-end 2021-03-16 --time-start 2021-02-15 --limit 1000
```

上記のとおり、Logging のコマンドでは `search-logs` というパラメータで、"**[問合せ構文](https://docs.oracle.com/ja-jp/iaas/Content/Logging/Reference/query_language_specification.htm)**" というステートメントを指定して ログの問合せを行います。
「問合せ構文なんて知らんがな」という方は、GUIの検索機能でフィルタ項目などを設定した後、`検索に変換` というボタンをクリックしましょう。<font color="salmon">**フィルタで設定した内容を構文に変換** してくれます</font>。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/26f4f262-8116-cf5a-5852-1ef42613d8d5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/7dc5ce3d-5348-e157-267c-407bbb0842f3.png)

# 監査ログを出力する
GUIやCUIを通じた監査ログの取得は、14日間という制約があるため、長期間のログを取得するには不便です。
まとまった期間のデータを扱いたい場合は、[**SR(Service Request)** で一括取得する方法](https://docs.oracle.com/ja-jp/iaas/Content/Audit/Concepts/bulkexport.htm#Requesting_an_Export_of_Audit_Logs)（要 5〜10営業日）の他に、[**サービス・コネクタ・ハブ**で取得/蓄積していく方法](https://docs.oracle.com/en-us/iaas/Content/service-connector-hub/overview.htm#Service_Connector_Hub_Overview) が挙げられます。

サービス・コネクタ・ハブは ざっくり言うと <font color="salmon">サービス間のデータ連携ができるサービス</font>です。利用する際の 大まかな流れは、下記記事にて詳細に記載してくださっていますので、まずはこちらをご参照ください。

- [OCI Logging のログを Service Connector Hub で Object Storage に出力してみた](https://qiita.com/k_kane/items/e0ca9c711560dfe63313)

基本的には上記記事の通りですが、監査ログのログ・グループ名は、決め打ちで「`_Audt`」となっています。ソースを指定する際は、取得したいコンパートメントと そこに紐づく「_Audit」グループを選択しましょう。
また、下記の画面イメージでは連携先にオブジェクト・ストレージを選択していますが、他にファンクション、ログ・アナリティクスなども選択可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/c3df3fb7-820d-f6da-67d4-dc02806e5522.png)

その他、ターゲットに連携する際は、ログ・フィルタ・タスクを指定してフィルタリングをかけたり、ファンクションを実行する、といったことも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/41e3ad63-e3b3-1463-85fa-dd8c32485bea.png)

# 監査ログをOracle Management Cloudで分析する
アドホックな検索であれば、これまでに述べた方法でも問題ないかと思います。しかし、定常的な監査業務や、より俯瞰的、視覚的な分析をしたいと言う場合には、Oracle Management Cloud など、別サービスと連携させることもオススメです。

少し前の記事になりますが、[Oracle Cloud Infrastructureの監査ログをOracle Management Cloudで分析する](https://qiita.com/western24/items/ab2d84c2882a0baac5b4)  という記事にて、詳しく記載してくださっているので、是非ご参照ください。

# おわりに
システムの運用・監視という観点では他にも ネットワーク監視、OS監視、アプリケーション監視といった観点が挙げられますが、本記事では、"操作履歴の監視(監査)" にフォーカスして機能を紹介しました。

もちろん、その他の監視項目に対しても、様々な有用なサービスが提供されていますので、興味があれば是非調べて活用していただけると幸いです。