Flow LogsによるGlobal IPからのアクセスログの取得方法

# はじめに
VPCのようなCloud環境を利用するにあたり、セキュリティの観点からアクセスログを保管したいといった要件があるかと思います。

IBM CloudではVPC環境のネットワークインターフェースに対してFlow Logを使用することでアクセスログを取得することができます。

本稿ではVPC内に構築したWEBサーバーへネットワークロードバランサー経由でアクセスするケースにてFlow Logsを用いてアクセスログを取得する方法を記載します。

作成手順についてはIBM Cloud docsの[フロー・ログ・コレクターの作成](https://cloud.ibm.com/docs/vpc?topic=vpc-ordering-flow-log-collector&interface=ui)を参考に記載しています。


# Flow Logsとは
IBM Cloud Flow Logs for VPC を使用すると、VPC内のネットワーク・インターフェースを出入りするインターネット・プロトコル(IP)トラフィックについての情報の収集、保管、表示が可能になります。

VPCもしくはサブネット、インスタンス、インターフェースの中から指定した範囲でFlow Log Collectorによりログを取得し、ICOS上にディレクトリ形式でログの保存が実行されます。

![fl-granularity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/cc3c6ea7-09ac-4fdf-9820-e3be2ba50a79.png)


作成時に指定したVPCの取得範囲に対して、5分おきにアクセスログを取得し、ICOSへ保存します。ネットワークインターフェース毎に100KBを超えるログが発生した場合はさらに頻度をあげてログが取得されます。

Flow Logsで取得可能なログの種類については[フロー・ログ・オブジェクトの表示](https://cloud.ibm.com/docs/vpc?topic=vpc-fl-analyze)を参照ください。

# ログの取得手順
本稿ではVPC内に構築したWEBサーバーへネットワークロードバランサー経由でアクセスするケースにてFlow Logsを用いてアクセスログを取得する方法を記載します。

最終的にWEBサーバーにアクセスしたローカルPCのGlobal IPをICOSで確認することを目標とします。(下の図のx.x.x.xにあたるIP)

![スクリーンショット 2025-03-23 20.55.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/2f6c4328-1386-4017-91a2-0fbab31cf15c.png)

手順は以下のとおりです。
1. Flow Logインスタンスの作成
1. WEBサーバーへのアクセスログの確認


## 事前準備
以下の環境は事前に作成済みなものとします。
- VPC(jp-tok) : vpc-tok
- 仮想サーバー(OS : CentOS, 2corex4GB, tok04) : vsi-web-tok
- Object Storage : icos-instance, バケット(smart tier, jp-tok) : fl-bucket
- ネットワークロードバランサー(public) : nlb-tok

仮想サーバーはWEBサーバーとしてアクセスできるように、あらかじめhttpdをインストールし、サーバーのIPアドレスを表示する簡単な設定をします。

WEBサーバーは外部からアクセスできるようにNLBに登録しておき、NLB経由でアクセスできるように設定します。

![スクリーンショット_2025-03-23_20_36_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/155c7ced-8ce4-47b7-afff-eb0fe80a7f01.png)

また、Flow Logのインスタンス作成にはVPCとICOS間のS2S認証でライター以上の権限が必要ですのであらかじめ設定しておいてください。
設定方法は[フロー・ログ・コレクターの作成 : UI の前提条件](https://cloud.ibm.com/docs/vpc?topic=vpc-ordering-flow-log-collector&interface=ui#fl-before-you-begin-ui)を参考に設定してください。


# 1. Flow Logインスタンスの作成

まずはFLow Logのインスタンスを作成します。

ポータルのホーム画面左上のメニューボタンから`インフラストラクチャー`→`ネットワーク`→`フロー・ログ`を選択します。

![スクリーンショット_2025-03-23_21_56_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/5ff11feb-be45-4fc5-b32e-0ba4a2eaf25a.png)

作成済みFlow Logの一覧から右上の青い`作成`ボタンから新規Flow Logを作成します。

![スクリーンショット_2025-03-23_22_19_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/a37e2107-8e6e-41aa-ad60-288408d9ac8c.png)

Flow Log作成の際に設定する項目は以下の通りです。それぞれの項目で事前に作成したVPC, ICOSの名前を選択してください。

| 項目 |  |
|:-:|:-:|
| 名前 | fl-collector(任意の名前)  |
| ターゲット・サービス  |  VPC | 
| 仮想プライベートクラウド  |  vpc-tok | 
| Cloud Object Storageインスタンス | icos-instance |
| バケット | fl-bucket |

:::note warn
作成時に権限が足りていない場合はICOSインスタンスの選択ができなくなります。
必要なS2S権限を追加後、再度試してみてください。
:::

Flow Logのログの取得範囲として「VPC・サブネット・インスタンス・インターフェース」
から選択できます。

VPCを選ぶと指定したVPC内のネットワークインターフェースのログを取得でき、サブネット→インスタンス→インターフェースの順に取得する範囲が狭くなります。

今回はVPCを選択していますが、取得ログを１つのインスタンスに限定したい場合やインスタンスが１つのサブネットに限定したい場合はターゲットサービスにサブネットやインスタンスを選択してください。

インスタンス作成後からすぐにログの取得が開始され、ICOSにログが保管されます。
Flow Log作成時に設定したバケットを開くと以下のようにログデータが保存され始めます。

初期設定ではICOSはディレクトリ表示になっていないため、右上のファイルマークを選択し、ディレクトリ表示に変更することで取得したいログを見つけやすくなります。

![スクリーンショット_2025-03-24_0_22_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/8818d325-c76a-43db-a565-482ee7b193e9.png)

ディレクトリ表示すると一番上のディレクトリの`ibm_vpc_flowlogs_v1`が表示されます。

![スクリーンショット_2025-03-24_0_29_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/9a01407b-d649-44bd-9573-6b47ae0b3ee0.png)

ここからリージョン、インスタンス、日時等をディレクトリを指定することで対象のログを確認することが可能です。

![スクリーンショット_2025-03-24_0_57_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/494b8ea9-b844-4178-af4d-fad570992b93.png)


# 2. WEBサーバーへのアクセスログの確認

事前準備で作成していたWEBサーバーにアクセスして、その時間帯にログが発生していることを確認します。

ローカルPCからNLBのパブリックIPを使ってWEBサーバーにアクセスします。
flow logのログは通常だと５分おきに生成されるため、5分ほど置いてからicosのバケットを確認します。

今回はWEBサーバーにアクセスしてから1.WEBサーバーのログ、2.NLBのログの２つを確認してみます。

## 2-1. WEBサーバーのログ
ICOSのバケットから対象となるWEBサーバーのログを探します。
一番上の`ibm_vpc_flowlogs_v1`から`account`→`region`→`vpc-id`→`subnet-id`→`endpoint-type`→`instance-id`→`vnic-id`→`record-type`→`year`→`month`→`day`→`hour`→`stream-id`の順番に指定します。
`vpc-id`や`subnet-id`等のidはポータルから対象のインスタンスに当てはまるidが確認可能なため、適切なものを選択してください。

WEBサーバーにアクセスした時間帯のファイルを取得し、中身を確認してみるとflow logの5分間分のアクセスデータが保存されていることが確認できます。

量が多い場合はIPアドレス(今回はLocal PCのGlobal IP)で検索をかけることで目的のログを見つけることが可能です。

![スクリーンショット_2025-03-24_1_16_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/9c7ce16a-e02e-4514-88b8-c544c19dc979.png)

アクセスログを確認するとWEBサーバーにアクセスした時間帯で正しくGlobal IPが保存されていることが確認できます。

また、WEBサーバーはパブリックIPをつけていないため、`action`の項目が全て`accepted`となっていることが確認できます。

## 2-2. NLBのログ
ICOSのバケットから同様にNLBのログを探します。
ディレクトリから探すことはVSIと同じですが、NLBはポータルから`instance-id`を確認する方法が見つかっていません。（見つけたら追記します)

ですが、ICOSの中にはNLBに当てはまる`instance-id`のディレクトリは存在するのでログファイルを確認する等の方法で特定してください。

![スクリーンショット_2025-03-24_1_27_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625926/268927dd-b8b4-4aaa-b23f-98d69cf1b075.png)

NLBもVSIと同様にLocal PCのGlobal IPからのアクセスが確認できました。

また、NLBはパブリックIPをつけていますがセキュリティグループの機能によってアクセスを制限しているため、VSIと違い`action`のほとんどが`rejected`となっていることが確認できます。

そのため、アクセス成功したIP一覧を調べるには`accepted`の文字検索することで絞り込めます。

:::note
ALBのログでは外部IPからALBのPrivate IPにNATされていることが確認できます。
また、ALBはVPC内部からもアクセスがあるため`accepted`で外部IPの検索をかけることはできません。
:::


# まとめ

本稿ではVPC内のWEBサーバーに対して外部からアクセスをした際のアクセスログをFlow Logで取得する方法を記載しました。

今回はNLB経由のVSIのログを取得しましたが、Floating IP経由のVSIやIKS、ROKS、そのALBのログも同様に取得できます。
ICOSの保管ポリシーと組み合わせることで任意の期間アクセスログを保管し、問題があった際に指定の日時のログを取得する、といった使用方法も可能です。

Flow Logの導入は非常に容易なので皆さんもぜひ利用してみてください。

# 参考記事

https://qiita.com/Sungyun_Moon/items/71966194cc0f2af8622e

https://qiita.com/testnin2/items/ca116be55aecb742e76c