【Oracle Cloud Infrastructure, OCI】VCN Flow Logsでトラフィックのログを収集する

# 要旨
ロギングの手法として、VCN Flow Logsを用いてVCN (Virtual Cloud Network, AWSのVPCに対応) を流れるパケットを捕捉し、記録することができる [[1]]。2023年10月10日のアップデートでは、ロギングの対象をサブネット内のVNICだけでなく、特定のVNICに絞ったり、VCN内の全てのVNICに拡張したりできるようになった [[2]]。今回、特定のコンピュート・インスタンスのVNICを対象にICMPの通信を捕捉する設定を行い、実際にログを確認した。

# 手順
コンピュート・インスタンスが既に作成してある前提で、ローカルPCからIPアドレスに向けてpingコマンドを実行する。

### 手順1. ログ・グループを作成する（手順3の時点でも作成可能）
フロー・ログの格納先であるログ・グループを作成する。メニューの「監視および管理」> 「ログ・グループ」を選択し（図）、遷移先のページで「ログ・グループの作成」ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/14f2f60b-594f-87a2-2cbf-d2bc5f6712d6.png)
コンパートメントを選択し、名前と説明を入力して作成ボタンをクリックする（図）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/bb585476-1e9e-fddd-72ee-462801207aeb.png)
ログ・グループの作成が完了するとログ・グループの詳細画面に遷移する（まだログが格納されていないので「No log sources found to be read」のメッセージが表示されている）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/5f628385-0023-5274-8706-6731d3ee20ce.png)

### 手順2. 取得フィルタを作成する
取得フィルタはパケット・キャプチャの際に、プロトコルや宛先ポートなどを絞り込むルールを定義するコンポートネントである。この手順で作成する取得フィルタを、ログを有効化するときに引き当てることができる。
メニューから「ネットワーキング」 > 「ネットワーク・コマンド・センター」 > 「取得フィルタ」を選択し、遷移先の「取得フィルタの作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/9e47d2c5-eaf6-7410-45f8-3eaccc198e2f.png)
名前とンパートメントに加え、以下を選択/入力する。
<ul>
    <li>フィルタタイプ:「フロー・ログ取得フィルタ」（VTAPはパケットを複製できるサービスで、このサービスでも取得フィルタでルールを設定する。実は元々VTAPのための取得フィルタが今回のアップデートでVCN Flow Logsに応用された格好。使い方の例については<a href=https://oracle-japan.github.io/ocitutorials/intermediates/vtap/>OCIチュートリアル</a>を参照のこと）</li>
    <li>サンプリング・レート:「100%」</li>
    <li>ルール（順序番号1）</li>
        <ul>
        <li>トラフィック配置: 「すべて」</li>
        <li>包含/除外: 「含める」</li>
        <li>ソースのIPv4アドレス: 自分のPCのグローバルIPアドレス（インターネットで提供されているIPアドレス確認サービスを用いると簡単）</li>
        <li>宛先のIPv4 CIDRまたは接頭辞: 指定しない（後ほどログを有効化する際に監視対象のVNICを指定するため不必要）</li>
        <li>IPプロトコル：ICMP</li>
    <ul>
        <li>ICMPタイプ: 「8―エコー」</li>
        <li>ICMPコード: 「0―エコー・リクエスト」</li>
    </ul>
    </ul>
</ul>
    
作成ボタンをクリックすると、取得フィルタの詳細画面に遷移する（図）。入力したルールが取得フィルタに反映され、ステータスが有効になっていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/8fbbe119-db05-8013-4420-7df3ee679847.png)


### 手順3. フロー・ログを有効化する
メニューの「監視および管理」> 「ログ」を選択し、遷移先のページで「サービス・ログの有効化」ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/4504644a-b011-a92f-b72f-d3ef4491738a.png)
表示されるウィザードで、リソース・コンパ―トメントやログ名を設定し、その他の項目については次のように入力/設定し、「ログの有効化」ボタンをクリックする（図も参照のこと）。
<ul>
    <li>サービス: 「Virtual Cloud Network - Flowlogs」</li>
    <li>Resource Level: 「Virtual Network Interface Card (VNIC)」</li>
    <li>リソース: pingを送るインスタンスのプライマリVNICを選択</li>
    <li>ログカテゴリ: Flow Logs - vnic records</li>
    <li>Capture filter: 手順3で作成したフィルタを選択</li>
</ul>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/15f9bcb7-4f6f-9e76-525f-89f5481ae0c0.png)

### 手順4. 標的のインスタンスにpingを打つ
NSG (Network Security Group) か、ネットワーク・セキュリティ・リストでICMP Type8のイングレス通信をステートフルで許可するルールを追加した後、PCからpingコマンドを叩く（NSGによる通信の許可の方法は補遺を参照）。
```bash: bash
ping -c 5 <標的のインスタンスのパブリックIPアドレス>
```

### 手順5. ログを確認する
作成したログの詳細画面を表示すると、pingを叩いた時間にtypeが「vcn.flowlogs.DataEvent」のログが記録されている（図）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/6a96546b-d499-0913-f3c3-ac561a1aea75.png)

ログをドリルダウンして詳細を観察すると、合計パケット数やByteサイズ、ソースIPアドレスなどがJSON形式で記録されていることを確認できる（図）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/52369b8c-278e-a332-fcd5-65edeb69b131.png)

# 最後に
VCN Flow Logsで集めたログはオブジェクト・ストレージに保管したり、ログ・アナリティクス（Logging Analytics）サービスを用いて分析を行うことができる。今度使ってみたい。

[1]:https://docs.oracle.com/ja-jp/iaas/Content/Network/Concepts/vcn-flow-logs.htm
[2]:https://docs.oracle.com/en-us/iaas/releasenotes/changes/2be233e2-8717-495a-ba1e-cc96aa1663c3/


# 補遺
### NSGの設定方法
OCIではデフォルトでVCN内の全ての通信トラフィックが禁止されているため、許可したい通信についてルールの設定を行う。方法は二つあり、一つはセキュリティ・リストを用いる方法で、もう一つはNSGを用いる方法である。前者はサブネット内の全てのVNICが従うルールを定義し、後者はクラスを作成しそのクラスに属するVNICが従うルールを定義する。前者を用いる方法は多少簡単ではあるが、ルールを設定したことを忘れてしまうと、ルールを適用したかったVNIC以外に対しても望まない通信を許可してしまいかねないため、ここでは後者による設定方法を紹介する。

### 手順1. NSGを作成する
ICMPのエコー要求の受信を許可するルールを紐づけたNSGを作成する。メニューから「ネットワーキング」 > 「仮想クラウド・ネットワーク」 > 標的のインスタンスが配置されたVCNを選択する。遷移先の画面で「Resources」の項目から「ネットワーク・セキュリティ・グループ」を選択し（図）、「ネットワーク・セキュリティ・グループの作成」ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/94d1f83a-0de9-52a5-b55f-4ba1e6b309f6.png)

NSGの名前を入力し、「次」の画面で以下のように入力/設定を行い「作成」ボタンをクリックする。
<ul>
    <li>ステートレス: チェック<b>しない</b></li>
    <li>方向: 「イングレス」</li>
    <li>リソース・タイプ: 「CIDR」</li>
    <li>ソースCIDR: PCのグローバルIPアドレス（/32で指定）</li>
    <li>IPプロトコル: 「ICMP」</li>
        <ul>
            <li>タイプ: 8</li>
            <li>コード: 記入しない</li>
        </ul>
</ul>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/9adcdb48-5707-338e-c585-2593e6b09729.png)

### 手順2. 作成したNSGを標的インスタンスのVNICに紐づける
標的インスタンスの詳細画面を表示する。画面左下のリソース・メニューから「アタッチされたVNIC」を選択する（図）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/89ac4822-1073-b348-c5f6-9fc6d1efd418.png)

プライマリVNICを選択する（図）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/a667a19d-e4c0-6442-f23e-0a008e5a71b8.png)

ネットワーク・セキュリティ・グループの項目から編集をクリックする（図）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/9ef10816-80d4-11bb-cf9f-fd839cf87bdd.png)

表示されるウィザードで、先ほど作成したNSGを選択して、「変更の保存」ボタンをクリックする（図）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/78766819-51b6-e28d-8f39-a97428335bf0.png)

NSGの項目が変更されていること確認する（図）。ローカルPCからのpingが通るようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844955/b68c0cbe-e7fd-6d6f-66c4-5fd557f124b4.png)

# 参考文献
[[1]] 『VCNフロー・ログ』Oracle Cloud Infrastructureドキュメント  (https://docs.oracle.com/ja-jp/iaas/Content/Network/Concepts/vcn-flow-logs.htm)
[[2]] 『New Release of VCN Flow Logs』Oracle Cloud Infrastructure Documentation / Release Notes (https://docs.oracle.com/en-us/iaas/releasenotes/changes/2be233e2-8717-495a-ba1e-cc96aa1663c3/)