Akamai's cloud computing servicesでULSを構築し、SIA(ETP)のログファイルをサーバーに保存する

# Akamai Unified Log Streamer (ULS)とは
Akamai Unified Log Streamer (ULS)は Akamai EAA/SIA(ETP)/MFA/Guardicore/Akamai's cloud computing servicesのログを、SplunkなどのSIEMと連携するためのオープンソースのプロダクトです。
EAA/SIA(ETP)/MFA/Guardicore/Akamai's cloud computing servicesはそれぞれで管理用のAPIを持ち、ログも取得できます。
そのため、SIEM連携するためにはそれぞれのAPIに対応したログ取得方法が必要になります。
Akamai ULSは、それぞれのAPIを利用してログを収集し、SIEMへ一括で転送することができます。
今回の構築ではSecure Internet Access(SIA)、旧製品名Enterprise Threat Protector(ETP)のDNSログをLinodeのインスタンス内に保存する方法について紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/7e0a4a27-e9cb-4939-cc5b-b46df1e1c2a4.png)

https://github.com/akamai/uls

## Linode インスタンスを構築する

Akamai Cloud Managerにログインし、Linodeインスタンスを起動します。

https://cloud.linode.com/linodes

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/c456d79e-5155-a365-fb59-23e127b36360.png)

今回は以下の設定で起動します。

Image : Ubuntu 22.04 LTS
Region : Tokyo
Linode Plan : Dedicated 4 GB

起動したサーバーにSSHでアクセスをします。

## 追加ディスクを付与

以下の記事を参考に1TBのディスクを付与します。

https://qiita.com/isss802/items/a2b8cce84f4266b9bf86

```
root@localhost:~# df -h /mnt/uls/
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc        984G   28K  934G   1% /mnt/uls
```

## クレデンシャルの設定

以下の記事を参考にAPIクレデンシャルを発行します。

https://qiita.com/kabe-akam/items/499507d19220b44b4901

発行したAPIクレデンシャルをサーバー内のファイルに記載します。

```
root@localhost:~# vim /root/.edgerc

[default]
; Akamai {OPEN} API credentials
client_secret = XXXXXXXXXXXXX
host = XXXXXXXXXXXXXXXXXXXXX.luna.akamaiapis.net
access_token = akab-XXXXXXXXXXXXXXXXX
client_token = akab-XXXXXXXXXXXXXXXXX
```

Akamai Control CenterのハンバーガーメニューからEnterprise Centerにアクセスします。

以下のメニューを選択して、URL内の番号をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/594130da-c6bf-f182-7af5-d2d1c851794e.png)

コピーした番号を.edgercに追記します。

```
root@localhost:~# vim /root/.edgerc

; ETP Config ID (required for ETP usage, can be obtained from the Akamai Web Interface)
etp_config_id = XXXXXXXX
```

## ULSをインストール

インストールに必要なパッケージをインストールします。

```
apt update
apt install python3-pip
```

ULSをインストールします。

```
curl -O https://raw.githubusercontent.com/akamai/uls/main/scripts/get-uls.sh
bash get-uls.sh
```

正しくインストールされているか動作確認します。

```
python3 uls/bin/uls.py --help
```

## SIAで取得するログ

今回はSIAのDNS保護を利用した際のログを保存したいため、THREAT/AUP/DNSのログを保存します。

**SIAのログ種類**
- [THREAT](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#threat-log-threat)
- [AUP](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#accceptable-use-policy-logs-aup)
- [DNS](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#dns)
- [PROXY](https://github.com/akamai/uls/blob/main/docs/LOG_OVERVIEW.md#proxy)

## ディレクトリの作成

３つのディレクトリを作成します。

```
mkdir -p /mnt/uls/sia/{aup,dns,threat}
```

## ログ圧縮用のスクリプトを作成します。

Githubのドキュメントを参考に圧縮スクリプトを用意します。

https://github.com/akamai/uls/blob/main/docs/ADDITIONAL_FEATURES.md#post-processing-of-files-fileoutput-only

スクリプトを配置するディレクトリを作成します。

```
mkdir /opt/sia
```

DNSのスクリプトを作成します。

```bash
vim /opt/sia/dns.sh

#!/bin/bash

target_dir="/mnt/uls/sia/dns"
file_name="log_dns_$(date +%Y%M%d-%H%m%S).gz"

if [[ -z $1 ]] ; then
        echo "No file given - please specify absolute path"
        exit 1
fi
gzip -cvf $1 > ${target_dir=}/${file_name=}
echo "->  ${target_dir=}/${file_name=}"
rm $1

# 90日経過したログは削除
find $target_dir -type f -mtime +90 -exec rm -f {} \;

```

AUPのスクリプトを作成します。

```bash
vim /opt/sia/aup.sh

#!/bin/bash

target_dir="/mnt/uls/sia/aup"
file_name="log_aup_$(date +%Y%M%d-%H%m%S).gz"

if [[ -z $1 ]] ; then
        echo "No file given - please specify absolute path"
        exit 1
fi
gzip -cvf $1 > ${target_dir=}/${file_name=}
echo "->  ${target_dir=}/${file_name=}"
rm $1

# 90日経過したログは削除
find $target_dir -type f -mtime +90 -exec rm -f {} \;
```

THREATのスクリプトを作成します。

```bash
vim /opt/sia/threat.sh

#!/bin/bash

target_dir="/mnt/uls/sia/threat"
file_name="log_threat_$(date +%Y%M%d-%H%m%S).gz"

if [[ -z $1 ]] ; then
        echo "No file given - please specify absolute path"
        exit 1
fi
gzip -cvf $1 > ${target_dir=}/${file_name=}
echo "->  ${target_dir=}/${file_name=}"
rm $1

# 90日経過したログは削除
find $target_dir -type f -mtime +90 -exec rm -f {} \;
```

実行権限を付与します。

```
chmod +x /opt/sia/*
```

## サービススクリプトの作成

自動起動できるようにサービススクリプトを作成します。

コマンドのオプション説明のドキュメントは以下になります。

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

|オプション|説明|
|---|---|
|--input etp |SIA(ETP)のAPIを利用します|
|--feed dns/aup/threat|取得するログを選択します|
|--output file|ファイルに保存します|
|--filename /mnt/uls/sia/dns/dns.log|出力先のファイル名を設定します|
|--filehandler SIZE|ファイルサイズでローテートします|
|--filemaxbytes 10240000|10MBでローテートします|
|--filebackupcount 1|保存するバックアップファイルを設定します|
|--fileaction "/opt/sia/dns.sh '%%s'"|ローテート時に指定したスクリプトを実行します|

DNSのサービススクリプトを作成します。

```unit-file
vim /etc/systemd/system/uls-sia-dns.service

# ULS as systemd service example
# uls-sia-dns.service

[Unit]
Description=Akamai ULS feed SIA/DNS
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=root
WorkingDirectory=/root/uls
ExecStart=/usr/bin/python3 /root/uls/bin/uls.py --input etp --feed dns --output file --filename /mnt/uls/sia/dns/dns.log --filehandler SIZE --filemaxbytes 10240000 --filebackupcount 1 --fileaction "/opt/sia/dns.sh '%%s'"

[Install]
WantedBy=multi-user.target
```

AUPのサービススクリプトを作成します。

```unit-file
vim /etc/systemd/system/uls-sia-aup.service

# ULS as systemd service example
# uls-sia-aup.service

[Unit]
Description=Akamai ULS feed SIA/AUP
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=root
WorkingDirectory=/root/uls
ExecStart=/usr/bin/python3 /root/uls/bin/uls.py --input etp --feed aup --output file --filename /mnt/uls/sia/aup/aup.log --filehandler SIZE --filemaxbytes 10240000 --filebackupcount 1 --fileaction "/opt/sia/aup.sh '%%s'"

[Install]
WantedBy=multi-user.target
```

THREATのサービススクリプトを作成します。

```unit-file
vim /etc/systemd/system/uls-sia-threat.service

# ULS as systemd service example
# uls-sia-threat.service

[Unit]
Description=Akamai ULS feed SIA/THREAT
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=root
WorkingDirectory=/root/uls
ExecStart=/usr/bin/python3 /root/uls/bin/uls.py --input etp --feed threat --output file --filename /mnt/uls/sia/threat/threat.log --filehandler SIZE --filemaxbytes 10240000 --filebackupcount 1 --fileaction "/opt/sia/threat.sh '%%s'"

[Install]
WantedBy=multi-user.target
```

サービスを起動します。

```
systemctl daemon-reload
systemctl start uls-sia-dns.service
systemctl start uls-sia-aup.service
systemctl start uls-sia-threat.service
systemctl enable uls-sia-dns.service
systemctl enable uls-sia-aup.service
systemctl enable uls-sia-threat.service
```

## 確認

ログが蓄積されていることを確認します。

```
root@localhost:~# ls -lh /mnt/uls/sia/dns/ | head -10
total 219M
-rw-r--r-- 1 root root 2.0M Jun 14 05:30 dns.log
-rw-r--r-- 1 root root 404K Jun 13 00:00 log_dns_20230013-000606.gz
-rw-r--r-- 1 root root 401K Jun 13 11:00 log_dns_20230013-110619.gz
-rw-r--r-- 1 root root 403K Jun 13 21:00 log_dns_20230013-210608.gz
-rw-r--r-- 1 root root 421K Jun 13 23:00 log_dns_20230013-230608.gz
-rw-r--r-- 1 root root 396K Jun 14 05:00 log_dns_20230014-050615.gz
-rw-r--r-- 1 root root 406K Jun 13 01:01 log_dns_20230113-010606.gz
-rw-r--r-- 1 root root 411K Jun 13 03:01 log_dns_20230113-030606.gz
-rw-r--r-- 1 root root 383K Jun 13 04:01 log_dns_20230113-040608.gz
```

## tips

今回のBashスクリプトでは90日経過したログを削除しましたが、ログを長期的に保存する場合にはLinode Object Storageに格納することも可能です。
以下のようにスクリプトを修正することで、転送することができます。
ファイルの転送にはs5cmdのインストールが必要です。

```bash
s3_bucket="s3://mybucket/path"  # ここに適切なバケット名を指定してください
s3_endpoint="https://us-southeast-1.linodeobjects.com"  # ここに適切なエンドポイント URL を指定してください

# Check if there are any files older than 3 months
old_files=$(find $target_dir -type f -mtime +90)

# If old files exist, copy them to the S3 bucket and then delete them
if [[ -n $old_files ]] ; then
        for file in $old_files; do
                s5cmd --endpoint-url $s3_endpoint cp "$file" "$s3_bucket"
                rm -f "$file"
        done
fi
```

## まとめ

Akamai Unified Log Streamerを利用することで、ログを転送するのみではなくログを蓄積することも可能です。
また、Linode Object Storageを活用することで、長期的なログの保存も低価格で実現することができます。

# 関連記事

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

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