dhalドキュメント
9ページ中4ページDhal は決定論的な制御とルート固有のポリシーを組み合わせます。まず監視し、アプリケーションの動作を把握したルートからブロックを有効にします。
主な制御
- IP 許可・拒否リスト
- SQLi、XSS、パストラバーサル、SSRF、RCE、SSTI、GraphQL、一般的な探索シグネチャ
- リクエストサイズ
- ヘッダーおよび Content-Type の異常
- JSON API のポジティブセキュリティ
- ボットと自動化
- ハニーポット
- credential stuffing
- レート制限と IP レピュテーション
ルールパック
generic-web、api、auth、wordpress、strict-api を利用できます。
json
{
"rules": {
"packs": ["generic-web", "api"],
"sqli": true,
"xss": true,
"pathTraversal": true
}
}npx dhal rules でカタログを確認できます。
ルートプロファイル
json
{
"mode": "monitor",
"routes": {
"/api/login": {
"mode": "block",
"tags": ["authentication"],
"rateLimit": {
"enabled": true,
"windowSeconds": 60,
"max": 20,
"keyBy": ["ip", "route"]
},
"rules": {
"credentialStuffing": {
"enabled": true,
"windowSeconds": 300,
"maxFailures": 4,
"keyBy": ["ip", "route", "userAgent"]
}
}
}
}
}パターンは完全一致と * ワイルドカードをサポートします。複数一致する場合は、ワイルドカードを除いた長さが最も長いパターンが選ばれます。
json
{
"routes": {
"/api/admin/*": { "mode": "strict" },
"/api/public/*": { "mode": "monitor" }
}
}誤検知対策
ボット制御を全体で無効にする前に、scoreThreshold、minSignals、allowUserAgents、skipStaticAssets、ignorePaths を調整してください。
rules.api は JSON 専用サービスでのみグローバルに有効化し、混在アプリケーションではルートプロファイルに限定します。
抑制
json
{
"policy": {
"suppressions": [
{
"id": "approved-internal-scanner",
"enabled": true,
"ruleId": "honeypot.triggered",
"path": "/.well-known/security-canary",
"reason": "承認済みの内部スキャナー",
"expiresAt": "2027-01-01T00:00:00.000Z"
}
]
}
}抑制は監査メタデータに残ります。対象を狭くし、理由と有効期限を設定してください。