Akamai EAA/SIA/MFA/AGSのログをSIEMに連携するAkamai ULSをLinode Kubernetes Engineで構築する

# Akamai Unified Log Streamer (ULS)とは
**Akamai Unified Log Streamer (ULS)** は、Akamai製品（EAA/SIA/MFA/AGS）から取得したログを、SplunkなどのSIEMに連携するための**オープンソースログ収集ツール**です。

各製品は個別のAPIを通じてログを提供していますが、ULSはそれらに対応し、**ログ取得からSIEM転送までを一元化**することが可能です。

![ULS概要図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/1481a88e-0dca-417b-baed-50571e1bddcf.png)

🔗 [https://github.com/akamai/uls](https://github.com/akamai/uls)


## Akamai 製品の概要

| 製品 | 説明 |
|---|---|
| [**EAA**](https://www.akamai.com/ja/products/enterprise-application-access) | ゼロトラストアーキテクチャに基づき、IaaS・SaaS・オンプレ環境へセキュアにアクセスできるアイデンティティ認識型プロキシ |
| [**SIA**](https://www.akamai.com/ja/products/secure-internet-access) | DNSフィルタリングとセキュアWebゲートウェイにより、マルウェア・フィッシングからの防御を実現 |
| [**Akamai MFA**](https://www.akamai.com/ja/products/akamai-mfa) | FIDO準拠の多要素認証で、フィッシング耐性と高セキュリティな認証を提供 |
| [**AGS (Akamai Guardicore Segmentation)**](https://www.akamai.com/products/akamai-guardicore-segmentation) | マイクロセグメンテーションにより、東西トラフィックを制御し、ランサムウェアや内部攻撃を防御 |

## Akamai ULSで取得できるログの種類と送信方法

以下はAkamai EAA/SIA(ETP)/MFAで取得できるログの種類の一覧になります。
表のLogの列を選択するとサンプルのLogFormatが確認できます。
また、ログ取得に必要なAPIの種別を記載しています。


| Product | Log | API |
|:----|:---|:---|
| EAA | [ACCESS](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#access-logs-access) | [EAA Legacy API](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#eaa-legacy-api-for-access-and-admin-audit-feeds) |
| EAA | [ADMIN](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#admin-logs-admin) | [EAA Legacy API](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#eaa-legacy-api-for-access-and-admin-audit-feeds) |
| EAA | [CONHEALTH](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#connector-health-conhealth) | [EAA {OPEN} API](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#eaa-open-api-for-connector-health-feed) |
| EAA | [DEVINV](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#device-inventory-devinv) | [EAA {OPEN} API](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#eaa-open-api-for-connector-health-feed) |
| EAA | [DIRHEALTH](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#directory-health-dirhealth) | [EAA {OPEN} API](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#eaa-open-api-for-connector-health-feed) |
| SIA | [THREAT](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#threat-log-threat) | [ETP {OPEN} API Reporting](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#etp-open-api-reporting) |
| SIA | [AUP](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#accceptable-use-policy-logs-aup) | [ETP {OPEN} API Reporting](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#etp-open-api-reporting) |
| SIA | [DNS](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#dns) | [ETP {OPEN} API Reporting](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#etp-open-api-reporting) |
| SIA | [PROXY](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#proxy) | [ETP {OPEN} API Reporting](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#etp-open-api-reporting) |
| SIA | [NETCON](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#netcon) | [ETP {OPEN} API Reporting](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#etp-open-api-reporting) |
| MFA | [EVENT](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#authentication-logs-auth) | [MFA Integration for logging](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#mfa-integration-for-logging) |
| AGS | [NETLOG](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#netlog) | [Guardicore API](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#guardicore) |
| AGS | [INCIDENT](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#incident) | [Guardicore API](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#guardicore) |
| AGS | [GC Audit](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#gc-audit) | [Guardicore API](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#guardicore) |

## ULSがサポートする出力方法

|送信方法|コマンドオプション|
|---|---|
|TCP Socket (tcp://host:port)| --output tcp|
|UDP Socket (udp://host:port) | --output udp
|HTTP and HTTPS URL (http(s)://host:port/path) (Authentication対応) | --output http |
|RAW (>STDOUT) | --output raw|
|FILE (ローカルのファイルに書き込み) | --output file|

📄 [出力形式の詳細はこちら](https://github.com/akamai/uls/blob/main/docs/OUTPUTS.md)


# Linode Kubernetes Engine (LKE) で Akamai ULSを構築してSplunkのログを送る

Akamai ULSはログをSplunk(SIEM)に送るためのサーバーが必要となります。
構築するには以下の4つの方法のうちいずれかで対応する必要があります。

- [python (command line)](https://github.com/akamai/uls/blob/main/docs/COMMAND_LINE_USAGE.md)
- [docker](https://github.com/akamai/uls/blob/main/docs/DOCKER_USAGE.md)
- [docker-compose](https://github.com/akamai/uls/blob/main/docs/DOCKER-COMPOSE_USAGE.md)
- [kubernetes / k8s](https://github.com/akamai/uls/blob/main/docs/KUBERNETES_USAGE.md)

今回は、Linode Kubernetes Engineを利用して、Akamai ULSを構築する方法を紹介します。

https://qiita.com/isss802/items/5313c7a6da1d9ed50a38

## SplunkのData Inputを設定する

Splunkにログを送信するためにData Inputsの設定をします。

<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/e5297cce-a1dd-4743-fa86-283b9db34b92.png">

Akamai ULSではHTTPでのログ送信に対応しているため、HTTP Event Collectorを作成します。
また、Akamai ULSはTCP,UDPの送信にも対応しています。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/e95f6c76-753f-e21d-88e4-cbf636c50646.png">

わかりやすいように転送したいログの種類を名前にしてNextを選択します。
今回はEAAのAccessログを取得する設定になります。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/72ee3714-3515-6792-0ab7-80cc3ad4a0a2.png">

Source typeをjsonとして設定します。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/28c8cacb-dc39-0b51-cb9d-b8e1b42b9497.png">


問題なければSubmitを選択します。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/104037df-9fe9-8486-83bf-a5a6b4d1a9d3.png">

発行されたTokenを控えておきます。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/299b0619-21d0-64cf-6665-c776388eaac5.png">



## Linode Kubernetes Engine (LKE) を構築する

Akamai ULSを実行するためのKubernetes環境をLinodeで用意します。

コンソールからKubernetesを選択し、Create Clusterを選択します。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/ecd0a626-f145-c24b-eb8e-b14a7d466928.png">

今回は最小のインスタンスを選択し、Node数は3台にします。
Linodeでは、KubernetesのControl Planeの料金はシングル構成であれば無料で利用できます。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/5fe221b4-f691-99c0-d242-f711a8aa2f09.png">

kubectlを利用するため、Kubeconfigをダウンロードします。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/46d731ef-df94-cdf9-3eb5-adafd2d8c3aa.png">

ダウンロードしたConfigファイルをkubectlが利用できるようにexportします

```
export KUBECONFIG=test-kubeconfig.yaml
```


## アクセス情報を用意する。

各APIにアクセスするためにアクセスキーの発行を行います。
すべてのAPIキーを発行する必要はありません、取得したい製品EAA/SIA(ETP)/MFAに合わせて設定してください。

**EAAの場合**
[EAA Legacy APIのアクセスキー発行](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#eaa-legacy-api-for-access-and-admin-audit-feeds)
[EAA {OPEN} APIのアクセスキー発行](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#eaa-open-api-for-connector-health-feed)

**SIAの場合**
[ETP {OPEN} API Reportingのアクセスキー発行](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#etp-open-api-reporting)

**MFAの場合**
[MFA Integration for loggingのアクセスキー発行](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#mfa-integration-for-logging)

**AGSの場合**

[AGS の ユーザー発行](https://github.com/akamai/uls/blob/main/docs/AKAMAI_API_CREDENTIALS.md#guardicore)

発行したアクセスキーの情報をedgercのファイルに記載します。

```
vim .edgerc

[default]
; EAA Legacy APIで発行した情報
eaa_api_host = manage.akamai-access.com
eaa_api_key = xxxxxxxxxxxxxxxxx
eaa_api_secret = xxxxxxxxxxxxxxxxxxxxxxxxxx

; EAAのContract_IDを記載
contract_id = xxxx

; Akamai {OPEN} API で発行した情報
client_secret = XXXXXXXXXXXXXXXXXXXXXXXXXXX
host = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.luna.akamaiapis.net
access_token = XXXXXXXXXXXXXXXXXXXXXXXXXXXX
client_token = XXXXXXXXXXXXXXXXXXXXXXXXXXXX

;ETP {OPEN} API Reportingで取得した ETP Config IDの番号 
etp_config_id = 111111

; MFA Integration for loggingで発行した情報
mfa_integration_id = app_XXXXXXXXXXXXXXXXXX
mfa_signing_key = XXXXXXXXXXXXXXXXXXXXXXXxxxx

; Guardicore integration credentials
gc_hostname = your_hostname.guardicore.com          # Do not prepend https://
gc_username = XXXXXXXXXXXX
gc_password = XXXXXXXXXXXXX
```

## Akamai ULSをインストールする

Helm ChartをGithubから取得します。

```
git clone git@github.com:akamai/uls.git
cp -r uls/docs/examples/kubernetes/helm/akamai-uls ./
```

akamai ulsを利用するためのnamespaceを作成します。

```
kubectl create namespace akamai-uls
```

先ほど作成したアクセス情報をシークレットに格納します。

```
kubectl create secret generic akamai-edgerc -n akamai-uls --from-file=edgerc=./.edgerc
```


Helmで利用するSplunkにログを転送するための設定ファイルを記載します。
今回はEAAのAccessログを取得する設定になります。
複数設定する必要がある場合には、設定ファイルも複数用意します。

```yaml
vim eaa_access.yaml

akamai_uls:
    environment:
      ULS_INPUT: "EAA"
      ULS_FEED: "ACCESS"
      ULS_OUTPUT: "HTTP"
      ULS_HTTP_URL: "https://[host].splunkcloud.com:8088/services/collector/event"
      ULS_HTTP_AUTH_HEADER: '{"Authorization": "Splunk [Data Inputで発行したアクセスキー]"}'
      ULS_HTTP_INSECURE: "TRUE"
```

AGSの場合の例はこちらになります。

```yaml
vim ags_netlog.yaml

akamai_uls:
  environment:
    ULS_INPUT: "GC"
    ULS_FEED: "NETLOG"
    ULS_OUTPUT: "HTTP"
    ULS_HTTP_URL: "https://xxxxxxxx.splunkcloud.com:8088/services/collector"
    ULS_HTTP_AUTH_HEADER: '{"Authorization": "Splunk XXXXXXXXXXXX"}'
    ULS_HTTP_INSECURE: "True"
    ULS_HTTP_LIVNESS_CHECK: "False"
    GC_SKIP_TLS_VALIDATION: "True"
```

設定するパラメーターについてはこちらに説明があります。

https://github.com/akamai/uls/blob/main/docs/ARGUMENTS_ENV_VARS.md

HelmでKubernetes上にAkamai ULSをインストールします。

```
helm install --namespace akamai-uls -f eaa_access.yaml uls-eaa-access akamai-uls
```

helm listでインストールされていることを確認します。

```
helm list -n akamai-uls

NAME          	NAMESPACE 	REVISION	UPDATED                             	STATUS  	CHART           	APP VERSION
uls-eaa-access	akamai-uls	1       	2022-09-13 14:19:27.321941 +0900 JST	deployed	akamai-uls-1.5.1	1.5.1
```

podのログを確認してログ転送が行われているか確認します。

```
kubectl -n akamai-uls logs uls-eaa-access-xxxxxxxxx

2022-09-13 05:19:31,727 ULS W UlsOutput TLS CA Certificate verification has been disabled - this is insecure !!
{"dt": "2022-09-13T05:24:30.726002", "uls_product": "EAA", "uls_feed": "ACCESS", "uls_output": "HTTP", "uls_version": "1.5.1", "uls_runtime": 300, "event_count": 2, "event_count_interval": 2, "event_ingested_interval": 2, "event_bytes_interval": 1810, "event_rate": 0.01, "mon_interval": 300}
{"dt": "2022-09-13T05:29:30.728046", "uls_product": "EAA", "uls_feed": "ACCESS", "uls_output": "HTTP", "uls_version": "1.5.1", "uls_runtime": 600, "event_count": 7, "event_count_interval": 5, "event_ingested_interval": 5, "event_bytes_interval": 4487, "event_rate": 0.02, "mon_interval": 300}
```

Splunk側にログが転送されていることを確認してインストールは完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/9298bad1-062e-7603-7914-f0e8896cc076.png)

## TrafficPeakとの連携

[Akamai Unified Log Streamer（ULS）](https://github.com/akamai/uls)は、**TrafficPeak**との連携にも対応しています。具体的なインテグレーション手順については、以下のリファレンスをご参照ください

[Hydrolix 連携手順（GitHub）](https://github.com/akamai/uls/tree/1745fe31aa40438c41dabb48e63d6b4e43e330de/docs/SIEM/HYDROLIX)

ULSは柔軟な出力オプションを備えており、TrafficPeakのような高性能ログ分析基盤と統合することで、より高度な可視化・相関分析が可能になります。

**TrafficPeak**の概要や特徴については、以下の解説記事をご覧ください

https://qiita.com/isss802/items/8d4f1b48c4d1000617a0



# さいごに

Akamai ULSを利用することで、SIEMへのログ連携が行うことができました
今回のようにKubernetes上で構築することで、単一のサーバーに異常があった際でも、別のサーバーでPodが自動的に復旧することができ、高い可用性を維持して運用していくことができます。
Linodeはインスタンス費用も安く、Control Planeが無料なLinode Kubernetes Engineを利用することで、低コストでサーバーを用意できます。
ぜひEAA/SIA(ETP)/MFAのログを活用し、セキュリティ向上に役立ててください。


# 関連記事

アカマイ・テクノロジーズ合同会社の Qiita では、 Akamai Cloud 関連などの開発者向けの記事を掲載しております。

https://qiita.com/xenbase/items/52e2956a64cedc772bd9