Akamai Unified Log Streamer (ULS)とは
Akamai Unified Log Streamer (ULS)は Akamai EAA/SIA(ETP)/MFAのログを、SplunkなどのSIEMを連携するためのオープンソースのプロダクトです。
Akamai EAA/SIA(ETP)/MFAはそれぞれで管理用のAPIを持ち、ログも取得できます。
そのため、SIEM連携するためにはそれぞれのAPIに対応したログ取得方法が必要になります。
Akamai ULSは、それぞれのAPIを利用してログを収集し、SIEMへ一括で転送することができます。
EAA(Enterprise Application Access)
アイデンティティ認識型プロキシにより、IaaS、SaaSおよび、社内DCなどのオンプレミス環境に対して、セキュアなアクセスを提供します。
https://www.akamai.com/ja/products/enterprise-application-access
SIA (Secure Internet Access) : 旧製品名ETP
「DNSセキュリティ」と「セキュアWebゲートウェイ(SWG)」により、デバイスをマルウェアサイト、フィッシングサイトから保護し、安全なインターネットアクセスを提供します。
https://www.akamai.com/ja/products/secure-internet-access
Akamai MFA
FIDOに準拠したMFAにより、従業員アカウントの乗っ取りやデータ漏えいを徹底的に防ぐフィッシング対抗の多要素認証機能を提供します。
https://www.akamai.com/ja/products/akamai-mfa
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 |
SIA(ETP) | THREAT | ETP {OPEN} API Reporting |
SIA(ETP) | AUP | ETP {OPEN} API Reporting |
SIA(ETP) | DNS | ETP {OPEN} API Reporting |
SIA(ETP) | PROXY | ETP {OPEN} API Reporting |
MFA | EVENT | MFA Integration for logging |
サポートするログの送信方法はこちらになります。
送信方法 | コマンドオプション |
---|---|
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
akamai ulsを利用するためのnamespaceを作成します。
kubectl create namespace akamai-uls
edgercを用意する
各APIにアクセスするためにアクセスキーの発行を行います。
すべてのAPIキーを発行する必要はありません、取得したい製品EAA/SIA(ETP)/MFAに合わせて設定してください。
EAAの場合
EAA Legacy APIのアクセスキー発行
EAA {OPEN} APIのアクセスキー発行
SIA(ETP)の場合
ETP {OPEN} API Reportingのアクセスキー発行
MFAの場合
MFA Integration for loggingのアクセスキー発行
発行したアクセスキーの情報を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
Podからアクセスキーの情報を取得できるようにするため、Secretを作成します。
kubectl create secret generic akamai-edgerc -n akamai-uls --from-file=edgerc=./.edgerc
Akamai ULSをインストールする
インストールにはHelmを利用します。
HelmのファイルをGitから取得します。
git clone git@github.com:akamai/uls.git
cp -r uls/docs/examples/kubernetes/helm/akamai-uls ./
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"
設定するパラメーターについてはこちらに説明があります。
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ではLinode関連など開発者向けの記事を記載しております。