API密鑰、令牌和訪問任務:安全身份驗證
文章全文
1)為什麼要這樣做: iGaming的威脅模型
金錢和PII:鑰匙的損害→盜竊,泄漏,罰款。
網絡集成:數十個外部提供商,不同區域/許可證。
高SLA利率:簡單或雙倍支付-聲譽和法律風險。
結論:身份驗證和授權必須「默認安全」,具有最小的權限和可觀察性。
2)工具: 我們在軍火庫中擁有什麼
API密鑰:靜態客戶端ID。集成簡單,泄漏風險高。
OAuth2 (Client Credentials):帶有scope/audience的短壽命啤酒代幣。
mTLS:相互的TLS驗證,強大的客戶端鏈接到通道。
HMAC/EdDSA簽名:請求主體的加密完整性和響應保護(timestamp+nonce)。
Proof-of-Possession: MTLS綁定令牌或DPoP(客戶端密鑰簽名HTTP請求)。
JWT/PASETO:自簽名令牌(最好是短TTL)。
RBAC/ABAC:角色/屬性重讀授權(ORA/策略解決方案)。
臨時訪問授權(delegation/STS):為特定情景發放的時間和目標限制票。
3)基本原則(「停止標誌」)
1.Least Privilege:每個鑰匙/令牌都是最小的權利。
2.短暫的默認生活:TTL幾分鐘,不是幾天。輪換是自動的。
3.Bind to channel:將令牌綁定到mTLS/DPoP →泄漏時無用。
4.Per-brand/region:鑰匙/證書和許可證-品牌/許可證/地區。
5.代碼中沒有共享的秘密:僅通過Vault/HSM/KMS或Git/Logs中的秘密。
6.WORM審核:所有操作/簽發/輪換的不變日誌。
7.寫入路徑上的等效性:使用相同密鑰的任何重播都不會第二次改變金錢。
4)何時使用(iGaming上下文)
5)訪問任務設計(scopes, audience,條件)
Scope-y(示例):- `bets:write`, `settlements:write`, `wallet:credit`, `wallet:debit`, `rg:read`, `rg:enforce`, `jackpot:trigger`.
聽眾: 令牌的對象是誰(例如'aud:wallet。api`).
Constraints (fine-grained):
`brand_id`, `region`, `ip/cidr`, `time_of_day`, `rate_limit`, `max_amount`.
存儲在令牌(JWT claims)或Vault/STS中已簽出的「任務」中。
6)參考浮動
6.1 RGS ⇄平臺: RPC資金
1.mTLS手動(按品牌/地區認證)。
2.OAuth2 CC: RGS收到'access_token' (TTL 2-5 min, 'aud=wallet.api`, `scope=bets:write settlements:write`).
3.查詢「POST/v1/bets/authorize」標題:- `Authorization: Bearer `, `X-Idempotency-Key`, `X-Trace-Id`. 
- 4.響應+在WORM審核中寫入(誰/什麼/何時/何地)。
- 5.令牌的旋轉是無縫的,過期後是CC重復。
6.2 Webhuki平臺→提供商
標題"X-Signature: eddsa=
提供者檢查:有效性窗口(± 5分鐘),一次性「nonce」,身體簽名。
如果不可用,則通過「event_id」進行後退。
6.3委托(頭獎服務→錢包)
JP調用STS:「在'wallet:credit'上給臨時令牌,」player_id=p_……「,總和≤ X,TTL 2分鐘」。
STS檢查政策/限制→發布授權(窄令牌)。
JP用這個令牌借錢包。妥協這樣的令牌毫無意義:短的TTL,狹窄的權限,綁定到mTLS。
7)查詢設計
7.1相似性(必修)
POST /v1/bets/settle
Authorization: Bearer <MTLS-bound>
X-Idempotency-Key: settle_r_8c12_1
X-Trace-Id: tr_a1b2
{
"bet_id":"b_001",  "round_id":"r_8c12",  "win":{"amount":1460,"currency":"EUR"}
}
→ 200 { "status":"credited", "settlement_id":"st_77" }
(重復使用相同的鍵→相同的響應)7.2 webhook標題(HMAC)
X-Signature: sha256=BASE64(HMAC(secret, timestamp + "." + nonce + "." + body))
X-Timestamp: 1730000000
X-Nonce: 1f7a...8)秘密和密鑰管理
Vault/HSM/KMS:生成、存儲、輪換、召回。
常規環境:sandbox/prod是不同的信任根源。
Per品牌/地區:單個密鑰和證書。
自動輪換:cron/警報;用於無縫替換的覆蓋期。
禁令:密碼不寫在stdout中,不屬於崩潰報告。
設備/工作負載身份:SPIFFE/SPIRE, K8s ServiceAccount → mTLS沒有手動秘密。
9)授權政策(RBAC/ABAC)和OPA
RBAC: роли «rgs», «wallet», «jackpot», «reporting».
ABAC:規則「如果'region=EU'和'brand=A' →允許'wallet: credit' ≤ 10k」。
OPA/REGO或類似物:集中決策,策略驗證,幹燥測試。
10)可觀察性和審計
每個查詢/事件中的端到端「trace_id」和「client_id」。
度量標準:p50/p95/p99 latency by enpointes, error-rate by codes ('AUTH_FAILED'、'SCOPE_DENIED'、'IDEMPOTENCY_MISMATCH'),輪換頻率,逾期百分比代幣。
WORM日誌:令牌簽發/評論,更改密鑰,更改策略。
Alerts: 「AUTH_FAILED」激增,地理/ASN異常,生長「逾期/召回」>閾值。
11)區域居住和細分
代幣/證書與區域相關(EU/UK/BR/……)。
在「區域」中,平臺網關禁止跨區域調用。
每個區域分別使用KMS和Vault群集;鑰匙不是在區域之間「開車」。
12)事件和召回
Compromise劇本:即時恢復key/令牌, network/ASN,關閉scope。
網關級別的殺手開關:「no new sessions/funds」。
Postmortham:「如何進入博客/存儲庫」,「為什麼秘密DLP/掃描儀不起作用」。
13)支票單
A.為平臺
- 所有寫路徑:mTLS+OAuth2 CC(TTL ≤ 5分鐘),「X-Idempotency-Key」,「X-Trace-Id」。
- Webhooks:HMAC/EdDSA+timestamp+nonce,「event_id」的去世。
- Keystor: Vault/HSM/KMS,輪換和召回,按品牌/地區劃分。
- ORA/策略: RBAC/ABAC,變更日誌,測試。
- WORM審核和SLO-dashbords (latency, error, revoke/rotate)。
- DR/xaoc演習:代幣到期,簽名變換,沒有mTLS的MITM。
B.供應商(RGS/live/JP)
- 不要在代碼中存儲秘密;通過環境變量使用Vault/子菜單。
- 代幣自動旋轉;帶更新的handle 401/403。
- 簽名webhooks/檢查有效性和一次性窗口。
- 對關鍵行動進行審核並回應Deprecation/Sunset頭條新聞。
- 在所有寫作挑戰中都具有相等性,在「Idempotency-Key」上表現出色。
14)反模式(紅旗)
沒有保質期的靜態API密鑰。
不帶通道的Bearer令牌(沒有MTLS/DPoP)。
在Git/CI Log/configa frontenda中存儲秘密。
多個品牌/地區的通用密鑰/證書。
沒有簽名的Webhooks和→中繼的時間窗口。
沒有集中召回和WORM日誌。
缺乏相同的能力→借記/貸記。
15)迷你政治模式(示例,人性化)
授權「rgs→wallet」(歐盟,品牌A):- `aud=wallet.api`, `scope=["bets:write","settlements:write"]`
- `constraints: region=EU, brand=A, ip in {asn:…}, max_amount=5000 EUR, ttl=300s`
- `binding: mTLS(cert_hash=sha256:…)`
Webhook'wallet。credit.ok`:
'alg=Ed25519',窗口'± 300s','nonce'是獨一無二的,dedup'event_id' 24小時。
iGaming中的安全身份驗證是實踐的組合:簡短的任務授權,鏈路綁定(mTLS/DPoP),狹窄的scope/audience,嚴格的等效性,Vault/HSM和WORM審計,區域細分和可觀察性。這樣的堆棧不會幹擾集成的速度,而是從根本上降低了泄漏和金融事件的風險-金錢和數據仍然受到控制,升級可以預見,並且合規性是「開箱即用的」。
