【IBM Cloud】IBM Cloud Flow Logs for VPCを使ってフロー・ログを確認してみた

## はじめに
今回はIBM Cloudの機能の中、Flow Logs for VPCを使ってネットワーク・ログを確認する流れについて整理します。
Flow Logs for VPCを使うことで、VPC内のネットワーク・インターフェースを出入りするIPトラフィック情報の収集、保管、表示が可能になり、運用にあたって以下の点で役に立ちます。
- 特定のトラフィックがインスタンスに到達しない理由のトラブルシューティング
- インスタンスに到達するメタデータ・ネットワーク・トラフィックの記録
- ネットワーク・インターフェースの送信元トラフィックと宛先トラフィックの判別
- コンプライアンス規制への準拠
- 根本原因分析の支援

## 前提条件
#### 1. 少なくとも1つのVPC、サブネット、Virtual Server Instance（VSI）が作成されている
今回実施する検証はVPC内のFlow Logs機能を試してみるものとなり、当然ですがVPCやサブネット、VSIが必要となります。まだ用意されていない場合には、[こちらの作成手順](https://qiita.com/Sungyun_Moon/items/82e4fbe5056c7918bc54)をご参考ください。
#### 2. Flow Logsを保管するためのObject Storage（ICOS）のインスタンス、またバケットが作成されている
また、上記の通り取得したFlow Logsを保管するためのICOS、バケットが必要となります。

（以下）IBM Cloud Object Storage（ICOS）のインスタンス作成

ICOS画面にて`インスタンスの作成`をクリックします。
![スクリーンショット 2024-07-11 17.19.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/f3e791d5-e4fa-6b8c-1f63-033a7e838412.png)
インフラの選択やインスタンス名、リソースグループなどの設定を行ってインスタンスを作成します。
![FireShot Capture 008 - Cloud Object Storage - IBM Cloud - cloud.ibm.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/ae4d4473-d2b4-1911-008c-c37102528c80.png)

ICOSのインスタンスが作成されたら、次は「バケット」を作成します。
「バケット」とは、インタンス内で実際ログデータが保管される論理的区域であり、名前通りデータを入れておく箱のようなものとなります。

まずは`バケットの作成`をクリックします。
![スクリーンショット 2024-07-11 17.20.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/8955139f-37aa-e773-3e8d-3c9acaea3840.png)

Quick Startテンプレートを含め、複数のテンプレートが用意されていますが、今回はカスタムテンプレートにて作成しました。
![スクリーンショット 2024-07-11 17.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/d89934ba-8432-f7b3-b307-fb1963f15dbe.png)

バケット名や可用性の設定、リージョン、Storage Tierなどを設定し、バケットを作成します。こちらの設定はバケット作成後には変更ができませんのでご注意ください。
ここではリージョンやストレージ・クラス（プラン）などを選択します。
![FireShot Capture 009 - Cloud Object Storage - IBM Cloud - cloud.ibm.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/3900cd59-cdd1-4615-1ef6-2a9ed6542f16.png)
今回の検証では、回復力は`Regional`、ロケーションは`東京`、ストレージ・クラスは`Smart Tier`を選択しています。

:::note warn
ICOSの作成には以下を注意してください。
- VPCのリージョンとICOS、Flow Logsのリージョンは全て同じリージョンである必要があります。
- Flow Logs保管のためのバケットを作成する際、対象リソースと同じリージョンにある単一リージョンのバケットでなければなりません。そのため、回復力は`Cross Region`を選択しないようにしてください。
:::
#### 3. VPCからICOSにアクセスするためのIAM許可がされている
最後に、VPC上でFlow Logsを取得しICOSに保管するためにはVPCからICOSへのS2Sアクセス権限が必要です。

（以下）VPCからICOSへのアクセス権限許可

まず、IBM Cloudコンソールにて、`管理`→`IAM`をクリックします。
![スクリーンショット 2025-01-20 17.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/9db68783-a465-76dc-7c2d-ac36560591a6.png)

IAMの画面が表示されたら、`許可`カテゴリーをクリックします。
![スクリーンショット 2025-01-20 17.14.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/491a54d4-2a0d-7044-3c38-7ee54557b19d.png)

許可画面が表示されたら、アクセス権限を付与するために`作成`ボタンをクリックします。
![スクリーンショット 2025-01-20 17.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/bf3c48a3-df9f-79fc-401d-300b140a0261.png)

ここでソース（VPC）とターゲット（ICOS）の各インスタンスを選択します。選択する際に、ソース・リソースを`resourceType ストリングが等しい`に選択しないとターゲットにICOSが表示されませんのでご注意ください。
なお、`Flow Logs`->`Object Storage`に対するWriter権限以上が必要となります。
![image (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/d971ac83-5d1a-407d-b093-bafb09cd867e.png)


## Flown Logs Collectorの作成
上記の前提条件をクリアしている場合、Flow LogsのCollectorを作成します。
コンソール画面にて、`ナビゲーション・メニュー`→`インフラストラクチャー`→`ネットワーク`→`フロー・ログ`にアクセスします。
![スクリーンショット 2025-03-10 17.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/bebb7eb8-c824-46b2-b591-2ee3fbae4c05.png)

フロー・ログの画面が表示されたら、`作成`ボタンをクリックします。
![スクリーンショット 2025-03-10 15.47.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/d79360c2-b50c-47df-80ed-517da950894b.png)

フロー・ログの作成画面に入ったら、各設定を行います。
ロケーションやFlow Logs名、Collectorの詳細（VPCなど）、保管用のICOSインスタンスやバケットなどを選択します。全ての選択が終わったら`フロー・ログ・コレクターの作成`をクリックします。
![FireShot Capture 070 - フロー・ログ・コレクター のプロビジョン - インフラストラクチャー - IBM Cloud - [cloud.ibm.com].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/f840826e-778b-408e-a66f-c966882b2efb.png)

::: note
なお、Flow Logs Collectorを構成する際、ログの収集範囲を選択することができます。今回はVPCを選択し、全てのネットワーク・インターフェースのデータを収集するように設定しています。
- VPC
  - 特定のVPC上のすべてのネットワーク・インターフェースのデータを収集
- サブネット
    - 特定のサブネット上のすべてのネットワーク・インターフェースのデータを収集
- インスタンス
    - 特定の仮想サーバー上の個別やすべてのネットワーク・インターフェースのデータを収集
- インターフェース
    - 特定の仮想サーバー上の特定のネットワーク・インターフェースのデータを収集
:::

Flow Logs Collectorが作成されたら、リストに表示されます。
![スクリーンショット 2025-03-10 18.20.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/da299c9e-40ce-46f2-b31c-ecd9adf4d506.png)

## Flow Logs Objectの表示
次はFlow Logsが入ってきているかターミナルにて確認します。Flow Logsはリアルタイムではなく数分～最大15分程度でObject Storageに記録されますので、Collectorの作成後少しお待ちください。

まずはターミナルにて、IBM Cloudにログインします。
IBM Cloud右上のプロフィールアイコンをクリックし、`CLIとAPIにログイン`をクリックしますと、以下のログインCLIが表示されます。IBM Cloud CLIをコピーしターミナルにコマンド入力することで簡単にログインできます。
また、必要に応じてリージョンを選択しますが、今回はインスタンス作成通り、東京（jp-tok）を選択します。
![スクリーンショット 2023-01-27 14.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/85389613-4b70-eda8-43d4-a0da1211064c.png)
![スクリーンショット 2023-01-27 14.52.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/04c3ad3e-31da-6abc-804c-506a5536429d.png)
```shell:結果
moonsy@moon ~ % ibmcloud login -a https://cloud.ibm.com -u passcode -p xxxxxxxxxx
API エンドポイント: https://cloud.ibm.com
認証中です...
OK

ターゲットのアカウント itz-cp-jpn (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) <-> xxxxxxx


リージョンを選択します (または Enter キーを押してスキップします):
1. au-syd
2. in-che
3. jp-osa
4. jp-tok
5. eu-de
6. eu-es
7. eu-gb
8. ca-tor
9. us-south
10. us-south-test
11. us-east
12. br-sao
数値を入力してください> 4
ターゲットのリージョン jp-tok


API エンドポイント:   https://cloud.ibm.com
Region:               jp-tok
ユーザー:             S.Moon@ibm.com
アカウント:           itz-cp-jpn (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) <-> xxxxxxx
リソース・グループ:   リソース・グループがターゲットになっていません。'ibmcloud target -g RESOURCE_GROUP' を使用してください
```

次はObject StorageのCLIコマンドを利用するために、以下のコマンドにてCLIプラグインをダウンロードします。
```
ibmcloud plugin install cloud-object-storage
```
```shell:結果
moonsy@moon ~ % ibmcloud plugin install cloud-object-storage

リポジトリー 'IBM Cloud' から 'cloud-object-storage' を検索しています...
プラグイン 'cloud-object-storage[cos] 1.10.0' がリポジトリー 'IBM Cloud' 内で見つかりました
バイナリー・ファイルをダウンロードしようとしています...
 19.92 MiB / 19.92 MiB [===========================================================================================================] 100.00% 0s
20887330 バイトがダウンロードされました
バイナリーをインストールしています...
OK
プラグイン 'cloud-object-storage 1.10.0' は /Users/moonsungyun/.bluemix/plugins/cloud-object-storage に正常にインストールされました。 'ibmcloud plugin show cloud-object-storage' を使用して詳細を表示してください。
```
ICOSのCLIが利用できるようになったら、以下コマンドにてログ保管のバケットにアクセスし、Flow Logs Obejctを確認します。
```
ibmcloud cos objects --bucket <your-bucket-name>
```
```shell:結果
moonsy@moon ~ % ibmcloud cos objects --bucket flow-log
OK
見つかりました 2 バケットにオブジェクトがあります 'flow-log':

名前                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       最終変更日時               オブジェクト・サイズ   
ibm_vpc_flowlogs_v1/account=xxxxxxxxxxxxxxxxxxxxxxxx/region=jp-tok/vpc-id=crn%3xxxxxxuemix%3Apublxxxxxxs%3Ajp-tok%3Aa%2F27dc483dc1f14d2f821e8b3a4xxxxxxxxxxxxxxxxxxc%3Ar022-2ef7aa5e-c952-4b95-8db1-36aca1db685c/subnet-id=crn%3Av1%3Axxxxxxxxxxxxxxxxxxxxxxxxlic%3Ais%3Ajp-tok-2%3Aa%2F27dc483dc1xxxxxxxxxxxxxxxxxx93ad13%3A%3Asubnet%3A02f7-bf70cee2-6efe-47b2-b724-8c328xxxxxx/endpoint-type=vnics/instance-id=crn%3Avxxxxxxuemix%3ApublixxxxxxAjp-tok-2%3Aa%2F27dc483dc1f14d2f821e8b3a4193ad13%3A%3Ainstance%3A02f7_36a668ae-1615-42ac-9244-6ff884bd0cea/vnic-id=xxxx-41eec51e-xxxx-4e32-xxxx-7ad15a76a028/record-type=egress/year=2025/month=03/day=10/hour=08/stream-id=20250310T081450Z/00000000.gz    Mar 10, 2025 at 08:14:50   568 B   
ibm_vpc_flowlogs_v1/account=xxxxxxxxxxxxxxxxxxxxxxxx/region=jp-tok/vpc-id=crn%3xxxxxxuemix%3Apublxxxxxxs%3Ajp-tok%3Aa%2F27dc483dc1f14d2f821e8b3a4xxxxxxxxxxxxxxxxxxc%3Ar022-2ef7aa5e-c952-4b95-8db1-36aca1db685c/subnet-id=crn%3Av1%3Axxxxxxxxxxxxxxxxxxxxxxxxlic%3Ais%3Ajp-tok-2%3Aa%2F27dc483dc1xxxxxxxxxxxxxxxxxx93ad13%3A%3Asubnet%3A02f7-bf70cee2-6efe-47b2-b724-8c328xxxxxx/endpoint-type=vnics/instance-id=crn%3Avxxxxxxuemix%3ApublixxxxxxAjp-tok-2%3Aa%2F27dc483dc1f14d2f821e8b3a4193ad13%3A%3Ainstance%3A02f7_36a668ae-1615-42ac-9244-6ff884bd0cea/vnic-id=xxxx-41eec51e-xxxx-4e32-xxxx-7ad15a76a028/record-type=egress/year=2025/month=03/day=10/hour=08/stream-id=20250310T081450Z/00000000.gz    Mar 10, 2025 at 08:14:50   568 B   

moonsy@moon ~ % 
```

コンソール上でICOSのバケット画面を確認してもしっかりFlow Logs Objectが次々と入ってきていることを確認できます。
![スクリーンショット 2025-03-10 18.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/96f7a8d8-913d-42ac-b7b2-e76dc2181443.png)

ここで、特定のFlow Logs Objectをクリックし、ダウンロードすることで、json形式でデータを確認することができます。
![スクリーンショット 2025-03-10 18.40.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/e8bb85df-1694-4d71-9652-b55b2df9d905.png)
```shell:データの例
    {
        "version": "0.0.1",
        "collector_crn": "crn",
        "attached_endpoint_type": "vnic",
        "network_interface_id": "crn",
        "instance_crn": "crn",
        "vpc_crn": "crn"
        "capture_end_time": "2008-09-15T15:53:00Z",
        "capture_start_time": "2008-09-15T15:00:00Z",
        "state": "ok",
        "number_of_flow_logs" : 1,
        "flow_logs": [
            {
                "start_time": "2008-09-15T15:53:00",
                "end_time": "2008-09-15T15:40:00",
                "direction": "O",
                "action": "accepted",
                "initiator_ip": "1.2.3.4",
                "initiator_port": 20033,
                "target_ip": "5.6.7.8",
                "target_port": 80,
                "transport_protocol": 6,
                "ether_type": "IPv4",
                "was_initiated": true,
                "was_terminated": false,
                "bytes_from_initiator": 12000,
                "packets_from_initiator": 2212,
                "bytes_from_target": 323232,
                "packets_from_target": 3232
                "cumulative_packets_from_initiator": 2212,
                "cumulative_packets_from_target": 3232,
                "cumulative_bytes_from_target": 323232,
                "cumulative_bytes_from_initiator": 12000,
            }
        ],
    }

```
なお、今回はターミナルやUIで確認していますが、実際の運用では[こちら](https://cloud.ibm.com/docs/vpc?topic=vpc-fl-analyze&interface=ui)に記載のとおりAnalytics Engineを利用して分析することができるのでご参考ください。

## うまくいかない時のTips
① Flow Log Collectorの設定確認
Flow Log Collectorを正しく設定しているか確認してください。
- VPC全体or特定のサブネットを監視対象にしているか
- 適切なObject Storageバケットを指定しているか
- Flow Logのステータスが「Active」になっているか（IBM Cloudコンソールで確認）

② Object Storageの設定
Flow Logデータは IBM Cloud Object Storage (COS) に保存されるため、以下を確認してください。
- ICOSバケットが 正しいリージョンに作成されているか（VPCのリージョンと一致しているか）
- ICOSのアクセス権限（IAMでのS2S権限）が正しく設定されているか（Flow Log Collectorが書き込めるか）

③ CLIプラグイン
CLIプラグインがダウンロードされているか、最新バージョンか確認してください。
- 以下のコマンドでIBM Cloud CLIのプラグインを確認し、ICOS CLIが存在するか確認
    - `ibmcloud plugin list`
- もしない場合やバージョンが古い場合、以下のICOSプラグインのインストールコマンドにてダウンロード及び最新化
    - `ibmcloud plugin install cloud-object-storage`

## 参考
- [IBM Cloud Flow Logs for VPC について](https://cloud.ibm.com/docs/vpc?topic=vpc-flow-logs&interface=ui)
- [S2Sを作成して IBM Cloud Logsにバケットへのアクセスを許可する
](https://cloud.ibm.com/docs/cloud-logs?topic=cloud-logs-iam-service-auth-cos&interface=ui)