Bot Protection和antifrod API
1)為什麼需要它
機器人和攻擊者攻擊增長和金錢的輸入點:註冊,登錄(ATO),存款/結論,促銷機制,遊戲/系數目錄。手動規則和凈利率限制已經不足:需要分層信號,實時得分和決策控制(allow/deny/challenge/throttle),並得到業務事件(chargebacks,chargeback-ratio,KYC feils)的反饋。
2)威脅分類
註冊/登錄:大眾賬戶,一次性電子郵件/SIM銀行,魔術場。
ATO (Account Takeover): credential stuffing, password spraying, session hijack.
Bonus Abuse:多次出庭,地理/司法套利,自我釋放旁路。
卡丁車/支付額: 卡測試,偷錢包,退款.
Scraping/庫存:積極拉動內容、價格、比率。
低強度API-DoS:烏龜攻擊,慢開機,移動SDK仿真。
Webhooks/集成:在沒有HMAC/mTLS, replay的情況下偽造通知。
3)保護體系結構
3.1層
1.邊緣(CDN/WAF/網關):早期故障(ASN/Geo/IP聲譽),輕挑戰賽,限制,PoW。
2.風險API (PDP): 集中的規則/ML引擎;ответ — `decision`, `score`, `reason`, `ttl`.
3.應用級別:域不變量,業務邏輯(限制,KYC,AML),異步評論。
4.事件流:Kafka/Kinesis →功能商店/模型→付款/發行反饋。
3.2解決方案概述
[Request] → Edge Plugins → (enrich) → Risk API (rules+ML) → Decision:
allow deny throttle challenge(type=captcha sms PoW biometry)
解決方案通過鍵(例如,設備×帳戶×路線)緩存「ttl」秒。
4)信號與富集
網絡/通道:IP/ASN,代理/VPN/Tor,rdns,rtt/jitter,SYN-rate,TLS fingerprint(JA3/JA4),HTTP/2/3行為。
Devays/Browser: canvas/audio/WebGL FP(精益),平臺/SDK, timezone/locale,分辨率,字體,WebDriver/headless指示器,移動適應(SafetyNet/DeviceCheck,如果可能)。
行為:輸入速度,鼠標/觸摸軌跡,屏幕序列,dwell-time,嘗試頻率,瀏覽器標識符之間的轉換。
內容/查詢:電子郵箱表格/域名,可拆卸提供商,電話HLR/或號碼類型, BIN卡,帳戶/IBAN在冰箱註冊表,類似於FIO/地址。
帳戶/歷史記錄:帳戶年齡,KYC狀態,重組,ARPPU,按存款/結論/獎金排序。
外部來源:損害清單(類似HIBP),支付風險信號(PSP),ASN聲譽。
5)解決方案: 規則+ML
5.1規則(確定性)
Velocity:「N 註冊從/24到10分鐘」,「M登錄到X帳戶」,「K 3 DS連續」。
地理/管轄權:IP地理vs地址/文檔沖突,突然的位置跳躍。
業務不變性: 負責任的支付限額,自我釋放,制裁名單.
5.2個ML得分(real time)
在線特征上的輕型模型(GBM/logreg):「ip_risk」,「device_age」,「account_age」,「pwd_fail_rate」,「bin_risk」,「velocity_」,「behavioral_」。
ATO的單獨模型,以及付款或結算的單獨模型。
按管轄權/tenant進行細分(閾值校準的per市場)。
5.3作出決定
if ip_blacklisted or bad_asn then deny else if rule_severe then challenge(hard)
else if score >= 0. 9 then deny else if 0. 7 <= score < 0. 9 then challenge(soft)
else allow
在「挑戰」中保留通過/失敗的事實;動態升級/減少摩擦。
6)Velocity和配額(密鑰和窗口)
Ключи: `ip`, `ip/24`, `device_id`, `account_id`, `payment_instrument`, `email_domain`, `bin`.
窗口:滑動(1m/5m/1h/24 h)+單獨的「burst「/「sustained」。
政客:熱路線上的「強硬」deny(登錄/存款),內容上柔軟的throttle。
pseudo allow, retry_after = gcra_allow(key="login:ip:"+ip, rate=60/min, burst=30)
if not allow:
return 429, {"Retry-After": retry_after}
7)挑戰與「人性」檢查"
CAPTCHA/turnstile: как soft-challenge;在對「幹凈」會議充滿信心之後進行清理。
工作證明(PoW):對於API/腳本-計算具有給定復雜性的哈希;負載增加時的動態復雜性。
OTP/SMS/電子郵件/推送:用於ATO/關鍵操作;不要濫用(成本/UX)。
WebAuthn/生物識別技術:對現金流出/付款細節變更的高度信心。
設備信托:對經過驗證的設備進行分類帳戶;新的魔鬼→挑戰。
8)集成到網關/代理中
8.1 Envoy: ext_authz → Risk API(偽)
yaml http_filters:
- name: envoy. filters. http. ext_authz typed_config:
http_service:
server_uri: { uri: http://risk-api:8080, cluster: risk, timeout: 80ms }
authorization_request:
allowed_headers:
patterns:
- exact: "x-tenant"
- exact: "x-device-id"
- exact: "user-agent"
authorization_response:
allowed_upstream_headers:
patterns: [{ exact: "x-risk-score" }, { exact: "x-risk-decision" }]
- name: envoy. filters. http. router
8.2 NGINX/Lua:輕量級PoW和velocity
nginx lua_shared_dict vel 20m;
access_by_lua_block {
local ip = ngx. var. remote_addr if not gcra_allow("reg:ip:"..ip, 20, 40) then ngx. header["Retry-After"] = 30; return ngx. exit(429)
end
local pow = ngx. req. get_headers()["X-POW"]
if not verify_pow(pow, ngx. var. request_id, 18) then ngx. status = 401; ngx. say('need-pow'); return ngx. exit(401)
end
}
9) Risk API合同
請求(豐富):json
{
"tenant":"eu-1",
"route":"POST /v1/login",
"subject":{"account_id":"a123","email":"u@d. com"},
"device":{"id":"d-xyz","fp":"...","ja3":"...","headless":false},
"network":{"ip":"203. 0. 113. 10","asn":12345,"country":"DE","rtt_ms":42},
"context":{"fail_5m":3,"pwd_reset_24h":1}
}
答案是:
json
{ "decision":"challenge", "score":0. 83, "reason":"high_velocity+new_device", "ttl_sec":900, "challenge":"captcha" }
10)數據,fici和模型
功能商店(在線):Redis/Scylla/KeyDB-計數器/velocity/時間戳。
Batch/離線: DWH(BigQuery/S3+Athena)用於培訓/反射;儲存流出標記,chargeback,手動咆哮.
模型:易於實時(logreg/GBM);重型(XGBoost/NN)-離線,帶有PGMs/量表和隨後的蒸餾。
漂移控制:PSI,AUC/PR,通過區域/渠道對閾值進行排序。
11)可觀察性和操作回路
度量標準:- `risk_requests_total{route,decision}`
- `risk_score_bucket` (distribution)
- `waf_block_total`, `velocity_block_total`, `challenge_pass_rate`
- `ato_incidents`, `carding_detected`, `cashout_denied`
- 業務指標:「chargeback_rate」、「bonus_abuse_rate」、「false_positive_rate」
- Logi(已編輯):「決策」,「得分」,關鍵信號「trace_id」,沒有PII/秘密。
- A/B和Shadow:陰影模式下的新政策(我們計算解決方案),然後是金絲雀(1-5%),SLO/FP自動後衛。
- Playbooks:升級、臨時收緊、回滾、「虛擬補丁」。
12)隱私和合規性
盡量減少PII;散列可持續標識符(例如電子郵件SHA-256鹽)。
尊重區域管轄權(數據本地化、同意)。
對手動咆哮解決方案的透明解釋;僅存儲必需的TTL。
13) iGaming/財務細節
註冊:可泄露的電子郵件/VoIP過濾器,velocity/24,魔法場→挑戰/惡作劇。
Login/ATO: 新功能/地理飛躍→ OTP/WebAuthn;password spraying → throttle/deny.
獎金:「洗錢之路」(depozit→bonus→minimalnyy oborot→vyvod)的限制,隸屬關系的圖形分析(地址/devays/Card)。
付款/結論:BIN風險,country-mismatch,PSP信號;新工具→高閾值和KYC跳躍。
PSP/KYC webhooks:HMAC+mTLS,狹窄的IP allow列表,反復制(「X-Timestamp」,窗口± 5分鐘)。
14)反模式
一個通用的captcha「無處不在」→高FP/轉換下降。
僅限利率,沒有行為/失態信號。
「原始」印刷品和PII的存儲是無限期的。
新策略缺乏陰影運行和金絲雀。
完全信任外部「聲譽」標簽,沒有自己的驗證。
客戶端決策(JS/mobile SDK)無需服務器驗證。
15)規則示例和偽代碼
15.1復合規則(real time)
pseudo score = 0 if ip_asn in bad_asn_list then score += 0. 5 if device_age < 1d and route in {login, withdraw} then score += 0. 3 if velocity("login:account", 5m) > 10 then score += 0. 3 if geovelocity(last_login_loc, current_loc) > 800km/h then score += 0. 2 decision = score>=0. 9? "deny": score>=0. 7? "challenge": "allow"
15.2鏈接圖(多站點)
edge(accountA, deviceX)
edge(accountB, deviceX)
edge(accountB, cardY)
edge(accountC, cardY)
Threshold by common nodes → investigation/deny bonus
16)準備就緒支票清單
- 分層體系結構:Edge → Risk API → App,事件流。
- 信號:網絡、設備、行為、內容、付款;PII的最小化。
- Velocity/GCRA在ip/device/account/payment密鑰上,滑動窗口。
- 決定:allow/deny/challenge/throttle;TTL解決方案緩存;挑戰事實資料庫。
- 挑戰:captcha/PoW/OTP/WebAuthn;動態復雜性。
- 風險API:SLA <100 ms,緩存,降級為「最小安全」模式。
- 觀察力:風險、FP/FN、dashbords、Alerta的指標;業務指標(chargeback/bonus-abuse)。
[] Shadow → canary → enforce;升級和回滾的花花公子。
- PSP/KYC Webhooks:HMAC+mTLS+anti-replay+allow-list。
- 敏感數據的區域要求和TTL。
17) TL;DR
構建分層保護:早期的邊緣過濾器和挑戰,集中的帶有+ML規則的Risk API和用於反饋的事件流。使用velocity 極限、網絡/devys/行為信號、動態挑戰 (captcha/PoW/OTP/WebAuthn)。決定allow/deny/challenge/throttle,測量FP/FN和業務效果,通過影子/金絲雀推出。對於支付/獎勵路徑-與KYC/AML的單獨收緊配置文件和捆綁。