はじめに
「うちのウェブサイト、そもそも攻撃されてるの?」
という単純な問いに答えるために、ウェブサイトやウェブアプリケーションのセキュリティ監視をしてみましょう。まずはアクセスログをLoggolに投げてみると、簡単にその答えが得られます。
今回は日々のウェブのセキュリティ監視を自動化するために便利な、LoggolのWebAPIの使い方を紹介します。(APIのドキュメントはこちら)
WebAPI使用時の流れ
Loggolにはウェブブラウザを使って管理コンソールにログインして使う、いわゆる一般的なウェブアプリケーションとしての機能があります。

管理コンソールでは次の順番で操作することで、アクセスログのセキュリティ分析がおこなわれます。
- ログをアップロードする
- そのログについての分析タスクを作成する
- 分析タスクが終了するまで待つ
- 分析結果を取得する
WebAPIを使う場合でも基本的な流れはこれと同じです。しかし、3の「分析タスクが終了するまで待つ」については、管理コンソールではただ待っていれば自動的に画面が更新されるためタスクの終了を知ることが出来ますが、WebAPIでは「タスクの状態を取得する」「もしまだ終了していないならば少し時間を空けて、またタスクの状態を取得する」のように、いわゆるポーリングと呼ばれるロジックを実装する必要があります。
Python3でのコード例
ポーリングのロジックを含む、Python3のコード例は次のようになります。なお、エンドポイントやHTTPリクエストへのAPIキーの埋め込み方などはこちらのドキュメントを参照してください。
import requests
import time
import sys
import os
# APIキーを指定
API_KEY = "your_api_key_here"
# 基本URL
BASE_URL = "https://api.loggol.jp"
# ヘッダ
HEADERS = {
"X-Api-Key": API_KEY
}
def upload_log(file_path):
"""ログファイルをアップロードし、log_idを取得"""
url = f"{BASE_URL}/api/log/add"
with open(file_path, "rb") as file:
files = {"log": file}
response = requests.post(url, headers=HEADERS, files=files)
response.raise_for_status()
return response.json()["log_id"]
def start_analysis(log_id):
"""分析タスクを開始し、task_idを取得"""
url = f"{BASE_URL}/api/task/add"
data = {"log_id": log_id}
response = requests.post(url, headers=HEADERS, data=data)
response.raise_for_status()
return response.json()["task_id"]
def wait_for_task_completion(task_id):
"""分析タスクが完了するまでポーリング"""
url = f"{BASE_URL}/api/task/show/{task_id}"
while True:
response = requests.get(url, headers=HEADERS)
response.raise_for_status()
task_info = response.json()
state = task_info["state"]
if state == 2: # 正常終了
print("分析が完了しました")
break
elif state == 3: # エラー終了
raise Exception(f"タスクがエラー終了しました: {task_info['state_str']}")
else:
print(f"タスクの状態: {task_info['state_str']} - 再試行します...")
time.sleep(5)
def get_analysis_result(task_id, output_path):
"""分析結果を取得し、保存"""
url = f"{BASE_URL}/api/task/detail/{task_id}"
response = requests.get(url, headers=HEADERS)
response.raise_for_status()
with open(output_path, "w") as file:
file.write(response.text)
print(f"分析結果を保存しました: {output_path}")
def main(file_path):
if not os.path.isfile(file_path):
print(f"ファイルが存在しません: {file_path}")
sys.exit(1)
print("ログファイルをアップロード中...")
log_id = upload_log(file_path)
print(f"ログがアップロードされました。log_id: {log_id}")
print("分析タスクを開始中...")
task_id = start_analysis(log_id)
print(f"分析タスクが開始されました。task_id: {task_id}")
print("分析タスクの完了を待機中...")
wait_for_task_completion(task_id)
print("分析結果を取得中...")
get_analysis_result(task_id, "/tmp/result.json")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("使用法: python client.py <ログファイルパス>")
sys.exit(1)
log_file_path = sys.argv[1]
main(log_file_path)
wait_for_task_completionという関数において、「分析タスクの状態を確認し、必要な場合は5秒スリープする、を繰り返す」ポーリングのロジックが実装されています。
この例では分析結果はJSONで取得し、/tmp/result.jsonというファイル名で保存しています。
OpenAPI対応なのでChatGPT等のAIの使用が便利
この記事ではとりあえずPython3のコード例をお見せしました。
他のプログラミング言語での例が欲しい場合、ChatGPT等の生成AIを用いると便利です。LoggolではOpenAPI規格に従った定義ファイルがダウンロードできます。これはいわばWebAPIの説明書のようなもので、どのエンドポイントでどんな機能が提供されているか、などが規格に沿った形で記述されており、AIはこれを解析して必要な情報を取得することができます。
このファイルを生成AIにアップロードし、希望するプログラミング言語でのコード例を生成させることができます。
OpenAPI定義ファイルはこちらのリンク先の画面上部にある「Download OpenAPI specification」のボタンを押すとダウンロードされます。
ChatGPT 4oで定義ファイルを添付し、次のプロンプトで指示することで上記のPython3のソースコードが生成されました。
これはwww.loggol.jpで提供されているサービスのAPI定義ファイルです。
このファイルに従って、次の動作を行うAPIクライアントのソースコードを出力してください。引数を1つとります。これにはローカルの1つのファイル名を指定します。このファイルはウェブサーバのアクセスログです。
このファイルをアップロードし、分析タスクを開始し、そのタスクの終了を待ち、終了したら結果を取得して/tmp/result.jsonとして保存します。
Python3では一発できちんと動くコードを生成してくれたので、他の言語でも同じようにコードを生成してくれることを期待してよいのではないかと思います。
まとめ
今回はWebAPIでLoggolの基本的な機能を利用するコード例をお見せしました。日々生成されるアクセスログを自動的にLoggolに放り込み、例えば攻撃が多い日には通知するなど、ウェブサイトやウェブアプリケーションのセキュリティ監視に使ってみてください。
Loggolでは二週間の無料トライアルを提供中です。ぜひお気軽にお試しください。また、質問などあればお気軽に金床にメンションしてポストしてください。