Skip to content

監査ログメカニズム

監査ログとは?

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

Audit Log

NuxSaaS では、監査ログはユーザーの活動、システムイベント、潜在的なセキュリティインシデントを追跡するために不可欠です。これにより、責任の明確化、デバッグの容易化、コンプライアンスの確保が可能となります。

監査ログスキーマ

監査ログのエントリは、以下の構造(server/database/schema/auditLog.ts で定義)を持つ audit_log テーブルに保存されます。

  • id: SERIAL - 監査ログエントリの一意な識別子(主キー)。
  • userId: UUID - 操作を行ったユーザーのID。user.id を参照します。システムまたは未認証エンティティによる操作の場合は null となることがあります。
  • category: TEXT - イベントのカテゴリ。例:authemailpayment
  • action: TEXT - 実行された具体的なアクション。例:loginregisterverificationreset_passwordtrial_startsubscription_created
  • targetType: TEXT - アクションが実行されたエンティティの種類。例:useremailstripeCustomerId
  • targetId: TEXT - 対象エンティティの識別子。
  • ipAddress: TEXT - アクションが発生したIPアドレス。
  • userAgent: TEXT - アクションを開始したクライアントのユーザーエージェント文字列。
  • status: TEXT - アクションのステータス。例:successfailurepending。デフォルトは success
  • details: TEXT - イベントに関連する追加情報やエラーメッセージ。
  • createdAt: TIMESTAMP - イベントが発生した日時。デフォルトは現在時刻。

監査イベントの記録方法

監査イベントは、server/utils/auditLogger.ts にある logAuditEvent 関数を使用して記録されます。この集中管理された関数は、アプリケーションのさまざまな部分から呼び出され、重要なイベントを記録します。

typescript
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(利用可能な場合、例:サインイン成功後や既存セッションの操作時)
    • categoryauth
    • action:認証操作のAPIパス(例:/sign-in/email)
    • targetTypeemail(メール/パスワード操作の場合)または user
    • targetId:ユーザーのメールアドレスまたはユーザーID
    • ipAddress:リクエストヘッダーから取得
    • userAgent:リクエストヘッダーから取得
    • statussuccess または failure
    • details:失敗時のエラーメッセージ(例:APIError から)

2. メール送信イベント

メール送信(例:認証、パスワードリセット)に関連するイベントは、メール送信試行直後に記録されます。

  • 記録されるイベントserver/utils/auth.ts より):
    • パスワードリセットメールの送信(sendResetPassword 関数)
    • メール認証メールの送信(sendVerificationEmail 関数)
  • 取得される情報
    • userId:メール送信先ユーザーのID
    • categoryemail
    • actionreset_password または verification
    • targetTypeemail
    • targetId:ユーザーのメールアドレス
    • statussuccess または 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に紐づくユーザーID
    • categorypayment
    • actiontrial_start:pro-monthly のようなイベント+プランの複合文字列
    • targetTypestripeCustomerId
    • targetId:StripeカスタマーID
    • status:これらのWebhookイベントでは通常 success

監査ログへのアクセスと活用

監査ログは、データベースの audit_log テーブルをクエリすることでアクセスできます。管理者はこのデータを以下の目的で利用できます。

  • セキュリティ監視:不審な活動、不正アクセス試行、潜在的なセキュリティ侵害の検出
  • トラブルシューティング:問題発生前後のイベントの流れを確認し、原因を特定
  • コンプライアンス:規制や社内コンプライアンス要件に対するシステム活動の証拠提供
  • ユーザーサポート:ユーザーの行動を把握し、より良いサポートを提供

通常、管理パネル内の専用インターフェースで監査ログを閲覧・フィルタ・検索でき、管理目的で容易にアクセスできます。