監査ログメカニズム
監査ログとは?
監査ログ(監査トレイルとも呼ばれる)は、セキュリティに関連する時系列の記録、記録の集合、または記録の送信元・宛先であり、特定の操作、手順、またはイベントにいつ影響を与えたかの一連の活動の証拠を文書として提供します。

NuxSaaS では、監査ログはユーザーの活動、システムイベント、潜在的なセキュリティインシデントを追跡するために不可欠です。これにより、責任の明確化、デバッグの容易化、コンプライアンスの確保が可能となります。
監査ログスキーマ
監査ログのエントリは、以下の構造(server/database/schema/auditLog.ts で定義)を持つ audit_log テーブルに保存されます。
id: SERIAL - 監査ログエントリの一意な識別子(主キー)。userId: UUID - 操作を行ったユーザーのID。user.idを参照します。システムまたは未認証エンティティによる操作の場合はnullとなることがあります。category: TEXT - イベントのカテゴリ。例:auth、email、payment。action: TEXT - 実行された具体的なアクション。例:login、register、verification、reset_password、trial_start、subscription_created。targetType: TEXT - アクションが実行されたエンティティの種類。例:user、email、stripeCustomerId。targetId: TEXT - 対象エンティティの識別子。ipAddress: TEXT - アクションが発生したIPアドレス。userAgent: TEXT - アクションを開始したクライアントのユーザーエージェント文字列。status: TEXT - アクションのステータス。例:success、failure、pending。デフォルトはsuccess。details: TEXT - イベントに関連する追加情報やエラーメッセージ。createdAt: TIMESTAMP - イベントが発生した日時。デフォルトは現在時刻。
監査イベントの記録方法
監査イベントは、server/utils/auditLogger.ts にある logAuditEvent 関数を使用して記録されます。この集中管理された関数は、アプリケーションのさまざまな部分から呼び出され、重要なイベントを記録します。
export async function logAuditEvent(data: {
userId?: string;
category: 'auth' | 'email' | 'payment';
action: string;
targetType?: string;
targetId?: string;
ipAddress?: string;
userAgent?: string;
status?: 'success' | 'failure' | 'pending';
details?: string;
}) {
// ... implementation to insert into audit_log table ...
}この関数はイベントの詳細を含むオブジェクトを受け取り、データベースに保存します。
記録されるイベントの例
NuxSaaS では、さまざまなモジュールで多様なイベントが記録されます。
1. 認証イベント
認証関連の活動は、server/utils/auth.ts で設定された better-auth システムのフックを通じて記録されます。
- 記録されるイベント:
- ユーザーのサインイン試行(例:
/sign-in/email) - ユーザー登録(例:
/sign-up/email) - パスワード忘れリクエスト(例:
/forget-password) - パスワードリセット完了(例:
/reset-password)
- ユーザーのサインイン試行(例:
- 取得される情報:
userId(利用可能な場合、例:サインイン成功後や既存セッションの操作時)category:authaction:認証操作のAPIパス(例:/sign-in/email)targetType:email(メール/パスワード操作の場合)またはusertargetId:ユーザーのメールアドレスまたはユーザーIDipAddress:リクエストヘッダーから取得userAgent:リクエストヘッダーから取得status:successまたはfailuredetails:失敗時のエラーメッセージ(例:APIErrorから)
2. メール送信イベント
メール送信(例:認証、パスワードリセット)に関連するイベントは、メール送信試行直後に記録されます。
- 記録されるイベント(
server/utils/auth.tsより):- パスワードリセットメールの送信(
sendResetPassword関数) - メール認証メールの送信(
sendVerificationEmail関数)
- パスワードリセットメールの送信(
- 取得される情報:
userId:メール送信先ユーザーのIDcategory:emailaction:reset_passwordまたはverificationtargetType:emailtargetId:ユーザーのメールアドレスstatus:successまたはfailure(メール送信サービスの応答に基づく)details:メール送信失敗時のエラーメッセージ
3. 支払いイベント(Stripe連携)
支払いおよびサブスクリプションのライフサイクルイベントは、server/utils/stripe.ts で定義された Stripe 連携のコールバックを通じて記録されます。
- 記録されるイベント:
- トライアル開始(
trial_start) - トライアル終了(
trial_end) - トライアル未契約終了(
trial_expired) - サブスクリプション作成(
subscription_created) - サブスクリプション更新(
subscription_updated) - サブスクリプションキャンセル(
subscription_canceled) - サブスクリプション削除(
subscription_deleted)
- トライアル開始(
- 取得される情報(
addPaymentLogヘルパー関数による):userId:StripeカスタマーIDに紐づくユーザーIDcategory:paymentaction:trial_start:pro-monthlyのようなイベント+プランの複合文字列targetType:stripeCustomerIdtargetId:StripeカスタマーIDstatus:これらのWebhookイベントでは通常success
監査ログへのアクセスと活用
監査ログは、データベースの audit_log テーブルをクエリすることでアクセスできます。管理者はこのデータを以下の目的で利用できます。
- セキュリティ監視:不審な活動、不正アクセス試行、潜在的なセキュリティ侵害の検出
- トラブルシューティング:問題発生前後のイベントの流れを確認し、原因を特定
- コンプライアンス:規制や社内コンプライアンス要件に対するシステム活動の証拠提供
- ユーザーサポート:ユーザーの行動を把握し、より良いサポートを提供
通常、管理パネル内の専用インターフェースで監査ログを閲覧・フィルタ・検索でき、管理目的で容易にアクセスできます。