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のインスタンス内に保存する方法について紹介します。
Linode インスタンスを構築する
Akamai Cloud Managerにログインし、Linodeインスタンスを起動します。
今回は以下の設定で起動します。
Image : Ubuntu 22.04 LTS
Region : Tokyo
Linode Plan : Dedicated 4 GB
起動したサーバーにSSHでアクセスをします。
追加ディスクを付与
以下の記事を参考に1TBのディスクを付与します。
root@localhost:~# df -h /mnt/uls/
Filesystem Size Used Avail Use% Mounted on
/dev/sdc 984G 28K 934G 1% /mnt/uls
クレデンシャルの設定
以下の記事を参考にAPIクレデンシャルを発行します。
発行した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内の番号をコピーします。
コピーした番号を.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のログ種類
ディレクトリの作成
3つのディレクトリを作成します。
mkdir -p /mnt/uls/sia/{aup,dns,threat}
ログ圧縮用のスクリプトを作成します。
Githubのドキュメントを参考に圧縮スクリプトを用意します。
スクリプトを配置するディレクトリを作成します。
mkdir /opt/sia
DNSのスクリプトを作成します。
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のスクリプトを作成します。
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のスクリプトを作成します。
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/*
サービススクリプトの作成
自動起動できるようにサービススクリプトを作成します。
コマンドのオプション説明のドキュメントは以下になります。
オプション | 説明 |
---|---|
--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のサービススクリプトを作成します。
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のサービススクリプトを作成します。
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のサービススクリプトを作成します。
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のインストールが必要です。
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関連など開発者向けの記事を掲載しております。