Akamai Unified Log Streamer (ULS)とは
Akamai Unified Log Streamer (ULS) は、Akamai製品(EAA/SIA/MFA/AGS)から取得したログを、SplunkなどのSIEMに連携するためのオープンソースログ収集ツールです。
各製品は個別のAPIを通じてログを提供していますが、ULSはそれらに対応し、ログ取得からSIEM転送までを一元化することが可能です。
🔗 https://github.com/akamai/uls
Akamai 製品の概要
製品 | 説明 |
---|---|
EAA | ゼロトラストアーキテクチャに基づき、IaaS・SaaS・オンプレ環境へセキュアにアクセスできるアイデンティティ認識型プロキシ |
SIA | DNSフィルタリングとセキュアWebゲートウェイにより、マルウェア・フィッシングからの防御を実現 |
Akamai MFA | FIDO準拠の多要素認証で、フィッシング耐性と高セキュリティな認証を提供 |
AGS (Akamai Guardicore Segmentation) | マイクロセグメンテーションにより、東西トラフィックを制御し、ランサムウェアや内部攻撃を防御 |
Akamai ULSで取得できるログの種類と送信方法
以下はAkamai EAA/SIA(ETP)/MFAで取得できるログの種類の一覧になります。
表のLogの列を選択するとサンプルのLogFormatが確認できます。
また、ログ取得に必要なAPIの種別を記載しています。
Product | Log | API |
---|---|---|
EAA | ACCESS | EAA Legacy API |
EAA | ADMIN | EAA Legacy API |
EAA | CONHEALTH | EAA {OPEN} API |
EAA | DEVINV | EAA {OPEN} API |
EAA | DIRHEALTH | EAA {OPEN} API |
SIA | THREAT | ETP {OPEN} API Reporting |
SIA | AUP | ETP {OPEN} API Reporting |
SIA | DNS | ETP {OPEN} API Reporting |
SIA | PROXY | ETP {OPEN} API Reporting |
SIA | NETCON | ETP {OPEN} API Reporting |
MFA | EVENT | MFA Integration for logging |
AGS | NETLOG | Guardicore API |
AGS | INCIDENT | Guardicore API |
AGS | GC Audit | Guardicore API |
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 |
Linode Kubernetes Engine (LKE) で Akamai ULSを構築してSplunkのログを送る
Akamai ULSはログをSplunk(SIEM)に送るためのサーバーが必要となります。
構築するには以下の4つの方法のうちいずれかで対応する必要があります。
今回は、Linode Kubernetes Engineを利用して、Akamai ULSを構築する方法を紹介します。
SplunkのData Inputを設定する
Splunkにログを送信するためにData Inputsの設定をします。

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

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

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

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

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

Linode Kubernetes Engine (LKE) を構築する
Akamai ULSを実行するためのKubernetes環境をLinodeで用意します。
コンソールからKubernetesを選択し、Create Clusterを選択します。

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

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

ダウンロードしたConfigファイルをkubectlが利用できるようにexportします
export KUBECONFIG=test-kubeconfig.yaml
アクセス情報を用意する。
各APIにアクセスするためにアクセスキーの発行を行います。
すべてのAPIキーを発行する必要はありません、取得したい製品EAA/SIA(ETP)/MFAに合わせて設定してください。
EAAの場合
EAA Legacy APIのアクセスキー発行
EAA {OPEN} APIのアクセスキー発行
SIAの場合
ETP {OPEN} API Reportingのアクセスキー発行
MFAの場合
MFA Integration for loggingのアクセスキー発行
AGSの場合
発行したアクセスキーの情報を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ログを取得する設定になります。
複数設定する必要がある場合には、設定ファイルも複数用意します。
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の場合の例はこちらになります。
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"
設定するパラメーターについてはこちらに説明があります。
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側にログが転送されていることを確認してインストールは完了です。
さいごに
Akamai ULSを利用することで、SIEMへのログ連携が行うことができました
今回のようにKubernetes上で構築することで、単一のサーバーに異常があった際でも、別のサーバーでPodが自動的に復旧することができ、高い可用性を維持して運用していくことができます。
Linodeはインスタンス費用も安く、Control Planeが無料なLinode Kubernetes Engineを利用することで、低コストでサーバーを用意できます。
ぜひEAA/SIA(ETP)/MFAのログを活用し、セキュリティ向上に役立ててください。
関連記事
アカマイ・テクノロジーズ合同会社の Qiita では、 Akamai Cloud 関連などの開発者向けの記事を掲載しております。