保持期間・書き込み上限・不正アクセス対策
保持期間・書き込み上限・不正アクセス対策
不正なアクセスによって監査ログが大量に書き込まれ、データベースが肥大化するのを防ぐための機能です。保持期間を過ぎたログの自動削除、同じログの書き込み頻度の制限、記録から除外する接続元の指定、失敗を繰り返す接続元の自動ブロックがあります。
対応バージョン: Ver. 3.2.39 以降で利用できます。
設定のうち、保持期間・書き込み上限・自動ブロックは、a-blog cms 設置ディレクトリにある「.env ファイル」で行います。記録から除外する接続元は管理画面で設定します。
保持期間
保持期間を過ぎた監査ログは、通常のアクセスの終わりに自動で削除されます。
AUDIT_LOG_RETENTION_DAYS=365 # ログを残す日数。0 は無期限
AUDIT_LOG_PURGE_ON_REQUEST=on # off にすると、通常のアクセスでは削除しない設定項目 | 説明 | デフォルト値 |
|---|---|---|
AUDIT_LOG_RETENTION_DAYS | 監査ログを残す日数。0 は無期限。数字以外を書いたときも、誤って消さないよう無期限として扱います | 365 |
AUDIT_LOG_PURGE_ON_REQUEST | off にすると、通常のアクセスの終わりの自動削除を行いません | on |
書き込み上限
同じ内容の監査ログを、一定の時間枠のあいだに書き込める件数に上限を設けます。同じ接続元から同じログが大量に発生しても、データベースが膨らみません。
AUDIT_LOG_RATE_LIMIT_PER_IP=10 # 同じ接続元・同じログの、時間枠あたりの上限
AUDIT_LOG_RATE_LIMIT_GLOBAL=100 # 接続元を問わない同じログの、時間枠あたりの上限
AUDIT_LOG_RATE_LIMIT_WINDOW=60 # 時間枠(秒)設定項目 | 説明 | デフォルト値 |
|---|---|---|
AUDIT_LOG_RATE_LIMIT_PER_IP | 同じ接続元・同じログの、時間枠あたりの上限。0 で無効 | 10 |
AUDIT_LOG_RATE_LIMIT_GLOBAL | 接続元を問わない同じログの、時間枠あたりの上限。0 で無効 | 100 |
AUDIT_LOG_RATE_LIMIT_WINDOW | 時間枠(秒)。0 にすると書き込み上限はすべて無効になります | 60 |
上限を超えた最初の 1 件は、省略が始まったことが分かる印を付けて書き込まれ、以降は時間枠が切り替わるまで書き込まれません。ログイン中のユーザーの操作の記録(INFO)は、上限の対象外です。
記録から除外する接続元
監視ツールなど、記録が不要な接続元を指定できます。管理画面の「コンフィグ」の「監査ログ」で、1 行に 1 件ずつ IP アドレスまたは CIDR を指定します。指定できるのは 100 件までです。IPv4 は /16、IPv6 は /48 より広い範囲は指定できません。
指定した接続元からの、ログインしていない状態の NOTICE 以下の記録は保存されません。ログインしている状態の記録や、WARNING 以上の記録は、これまでどおり保存されます。
除外する接続元は、後述の自動ブロックの対象外にはなりません。
セキュリティイベント
CSRF トークンの不一致やログインの失敗など、セキュリティに関わる出来事は「セキュリティイベント」として、種類を付けて NOTICE で記録されます。監査ログの一覧では、種類で絞り込めます。
次のイベントは、同じ接続元から繰り返し発生した回数が数えられ、自動ブロックの判定に使われます。
イベント | 内容 |
|---|---|
post.invalid_route | 不正なルートからの POST |
post.broken_takeover | POST データの takeover が復元できなかった |
csrf.token_mismatch | CSRF トークンの不一致 |
csrf.referer_mismatch | 管理ドメイン・サイトのドメイン以外のリファラー |
login.failed | ログインの失敗 |
login.locked | ログインのロック |
login.unknown_email | 存在しないメールアドレスでのログイン |
login.invalid_code | 認証コードの誤り |
tfa.failed | 二段階認証の失敗 |
tfa.locked | 二段階認証のロック |
tfa.recovery_failed | 二段階認証のリカバリーの失敗 |
password_reset.unknown_email | 存在しないメールアドレスでのパスワード再設定 |
password_reset.invalid_link | 不正なパスワード再設定リンク |
attachment.rejected | 不正な添付ファイルの拒否(アップロード由来でないなど) |
同じ接続元から、数えるイベントが短時間に繰り返し発生すると(ブロックの閾値の 3 分の 1 に達したとき)、security.burst というイベントが 1 回記録されます。ログインの打ち間違いのように、1 件ずつでは正規の利用者にも起きるイベントを、繰り返したときだけまとめて知らせるためです。
自動ブロック
同じ接続元から、数えるイベントが閾値に達すると、その接続元からの「ログインしていない状態の POST」を、一定の時間、429 で受け付けなくなります。GET リクエストと、ログイン中のリクエストは止めません。
SECURITY_IP_BLOCK_THRESHOLD=30 # ブロックする回数。0 はブロックしない
SECURITY_IP_BLOCK_TRIAL_TIME=10 # 回数を数える時間(分)
SECURITY_IP_BLOCK_TIME=30 # ブロックする時間(分)設定項目 | 説明 | デフォルト値 |
|---|---|---|
SECURITY_IP_BLOCK_THRESHOLD | 回数を数える時間のあいだに、この回数に達した接続元をブロックします。0 はブロックしません | 30 |
SECURITY_IP_BLOCK_TRIAL_TIME | 回数を数える時間(分) | 10 |
SECURITY_IP_BLOCK_TIME | ブロックする時間(分) | 30 |
数字以外の値を書いたときは、ブロックしない設定(0)として扱います。