Wtyczki i oprogramowanie pośrednie w interfejsie API Gateway
1) Dlaczego potrzebujesz wtyczki i oprogramowanie pośrednie
Brama API - punkt egzekwowania polityki korporacyjnej. Prawidłowo zmontowany łańcuch wtyczek:- normalizuje bezpieczeństwo (authN/authZ, WAF, CORS),
- chroni stabilność (ograniczenie prędkości, wyłącznik, polityka ponownej próby),
- zarządza umową (walidacja systemów, przekształcenia),
- daje możliwość obserwacji (metryki, kłody, śledzenie),
- Zmniejsza koszty (buforowanie, deduplikacja, zasady kanaryjskie)
Klucz: minimalna opóźnienie i jasna spójność aplikacji.
2) Klasy wtyczek i co robią
1. Identyfikacja/uwierzytelnianie
Dostawcy JWT/JWKS, OAuth2/OIDC, klucze API, mTLS (klient cert).
Podpisy HMAC (webhaki/partnerzy), DPoP/PoP na krawędzi.
2. Autoryzacja
RBAC/ABAC/OPA/Cedar (PDP) z lokalnym buforem roztworu.
BOLA-guard: sprawdzanie „najemcy ”/„ właściciela” w nagłówkach/kontekście.
3. Ochrona sieci i protokołu
WAF (OWASP CRS), anty-boty (szybkość/zachowanie), filtry Geo/IP/ASN, profile TLS.
CORS, nagłówki CSP, filtry Fetch-Metadata, CORP/COOP/COEP.
4. Stabilność
Ograniczenie stawki (wiadro tokenowe/GCRA), kwoty i konkurencyjność.
Wyłącznik, timeouts, adaptive concurrency, load shedding.
Polityka retry z wypróbowaniem czasu i jitterem.
5. Przekształcenia i walidacja
Path/Header Census, body-rewrite, JSON/XML, gRPC
Walidacja schematu (OpenAPI/JSON Schema/Protobuf), normalizacja ID.
6. Buforowanie i wydajność
Pamięć podręczna odpowiedzi/fragmentu, ETag/If-None-Match, kompresja, brotli.
Żądanie zawalenia (koalescencji) dla tych samych kluczy.
7. Obserwacja i audyt
RED/USE metrics, decision logging (429/403/5xx), odwzorowanie (W3C Trace-Context/OpenTelemetry), sampling (ogon/adaptive).
Nagłówki bezpieczeństwa audytu i wersje polityki.
8. Cykl życia i działanie
Kanaryjski/niebiesko-zielony, flagi funkcji, rozwiązania cieni (dziennik, nie dotyczy), migracje wersji.
3) Procedura stosowania (zalecany łańcuch)
[Ingress TLS]
→ Early-Deny (ASN/Geo, IP allow/deny)
→ mTLS / Client Cert Auth
→ JWT/OAuth2 AuthN (JWKS cache)
→ OPA/ABAC AuthZ (solution cache)
→ Rate Limit / Concurrency
→ Circuit / Timeout / Retries (пер-try)
→ Schema Validation (request)
→ Transform (headers/path/body) / CORS
→ Caching (lookup)
→ Upstream Proxy (app)
← Caching (store) / Compression
← Response Transform / Schema Validation (response)
← Logging / Tracing / Metrics / Security Headers
Zasada: wcześniej - tańsze/bardziej śmiertelne (zaprzeczanie, auth, limity), później - „kosmetyki” (transformacja, pamięć podręczna).
4) Wydajność i kardynalność
Trzymaj się kroków O (1) bez zewnętrznych żądań na gorącej drodze.
Wszystkie „połączenia zewnętrzne” wtyczek (PDP/JWKS) są za pomocą krótkiego TTL i asynchronicznego odświeżania.
Etykiety/etykiety dla mierników - ograniczona kardynalność ("najemca", "plan", "trasa", ale nie "user _ id').
„Ciężkie” wtyczki (WAF, body-transform) - umożliwiają selektywnie na trasie.
5) Przykłady konfiguracji
5. 1 Wysłannik: JWT + Limit + OPA + Retries (pseudo)
yaml static_resources:
listeners:
- name: public_listener filter_chains:
- filters:
- name: envoy. filters. network. http_connection_manager typed_config:
route_config:
name: main virtual_hosts:
- name: api domains: ["api. example. com"]
routes:
- match: { prefix: "/v1/payments" }
route:
cluster: payments timeout: 350ms retry_policy:
retry_on: connect-failure,reset,5xx,gateways num_retries: 1 per_try_timeout: 200ms http_filters:
- name: envoy. filters. http. jwt_authn typed_config:
providers:
oidc:
issuer: https://auth. example. com/
remote_jwks:
http_uri: { uri: https://auth. example. com/.well-known/jwks. json, cluster: jwks, timeout: 2s }
cache_duration: 300s forward: true
- name: envoy. filters. http. ext_authz # OPA/Cedar PDP typed_config:
http_service:
server_uri: { uri: http://opa:8181, cluster: opa, timeout: 50ms }
authorization_request: { allowed_headers: { patterns: [{ exact: "authorization" }, { exact: "x-tenant" }] } }
- name: envoy. filters. http. ratelimit typed_config:
domain: public-api rate_limit_service:
grpc_service: { envoy_grpc: { cluster_name: rl } }
- name: envoy. filters. http. router
5. 2 NGINX/OpenResty: HMAC + Lua + Redis (pseudo)
nginx lua_shared_dict jwks 10m;
lua_shared_dict limits 10m;
server {
listen 443 ssl http2;
Early deny by ASN/Geo if ($bad_asn) { return 403; }
HMAC signature check (webhooks/partners)
set_by_lua_block $sig_ok {
return verify_hmac_signature(ngx. var. http_x_signature, ngx. var. request_time, ngx. var. request_body)
}
if ($sig_ok = 0) { return 401; }
Token bucket in Redis access_by_lua_block {
local key = ngx. var. binary_remote_addr.. ":".. ngx. var. request_uri local allowed, retry_after = ratelimit_allow(key, 50, 100)
if not allowed then ngx. header["Retry-After"] = retry_after return ngx. exit(429)
end
}
proxy_read_timeout 300ms;
proxy_connect_timeout 100ms;
proxy_pass http://app_backend;
}
5. 3 Kong: wtyczki na trasie
yaml services:
- name: payments url: http://payments:8080 routes:
- service: payments paths: ["/v1/payments"]
plugins:
- name: jwt config: { key_claim_name: kid, secret_is_base64: false, run_on_preflight: false }
- name: opa config: { server_url: "http://opa:8181/v1/data/authz/allow", timeout: 50 }
- name: rate-limiting config: { second: 50, policy: redis, redis_host: redis, fault_tolerant: true }
- name: correlation-id config: { header_name: "traceparent" }
- name: response-transformer config: { add: { headers: ["Strict-Transport-Security:max-age=31536000"] } }
5. 4 Apache APISIX: JWT + Limit + Proxy-lustro (cień)
yaml routes:
- uri: /v1/wallets/
plugins:
openid-connect:
client_id: wallet discovery: "https://auth. example. com/.well-known/openid-configuration"
scope: "openid"
limit-count:
count: 100 time_window: 60 key_type: "var"
key: "remote_addr"
proxy-mirror: # shadow traffic host: "http://shadow-backend:8080"
upstream_id: 1
5. 5 Traefik: łańcuch Middleware
yaml http:
middlewares:
hsts-headers:
headers:
stsSeconds: 31536000 stsIncludeSubdomains: true ratelimit:
rateLimit:
average: 50 burst: 100 routers:
api:
rule: "Host(`api. example. com`) && PathPrefix(`/v1`)"
service: app middlewares:
- hsts-headers
- ratelimit
6) Wersje wielopoziomowe i polityczne
Klucz routingu: '{najemca, plan, region, trasa, wersja}'.
Wtyczki odczytać 'najemca' z mTLS SAN/JWT stempel/nagłówek → stosować limity/kwoty/zasady do najemcy.
Zasady wersji ('policy _ version'), wprowadź changelog i rollout kanaryjski.
7) Testowanie i rolowanie
Przed zwolnieniem
Testy łańcucha kontraktowego (if-then table): auth → zaprzeczenie, auth → permit, rate → 429, schemat → 422.
Załadunek: bursts × 10, long plateaus, „brudne” wzory (slow-POST).
Chaos: degradacja PDP/JWKS/Redis - musi być uszkodzona/degradacja minimalnie bezpieczna.
Zwolnienie
„Tylko raport ”/tryb cienia (rozwiązania logarytmiczne bez aplikacji).
Kanaryjski 1-5% ruch + porównanie metryczne (p95/p99, 4xx/5xx/429).
Automatyczny zwrot na SLO/wpisy.
8) Obserwowalność i metryki
Metryka:- „http _ requests _ total {route, najemca, plan, status}”
- „quest _ duration _ seconds _ bucket {route}” (p95/p99)
- 'rate _ limited _ total {policy}', 'retry _ total {reason}', 'circuit _ state'
- 'authn _ fail _ total {reason}', 'authz _ denied _ total {action}'
- „schema _ validation _ fail _ total {route}”
- Traces: rozpiętość na filtr, atrybuty „policy _ version”, „lokator”, „limit _ key”.
- Logi (pobrane próbki): odmówić/429/5xx rozwiązań z przyczynami i 'trace _ id'.
- Deski rozdzielcze: Exec-summary, per-route, per-najemca, „gorący” politycy.
9) Bezpieczeństwo i eksploatacja
Wszystkie sekrety (HMAC, JWKS private, klucze API) - w KMS/Vault, nie w plikach konfiguracyjnych.
Odrzucenie zasady domyślnej dla tras wrażliwych.
Krótka pamięć podręczna TTL JWKS/PDP, asynchroniczne aktualizacje z backoff.
Migracja systemów transformacji - w wersji; „łamanie” - poprzez podwójne pisanie.
Ograniczyć wielkość ciała (DoS) i głębokość JSON.
10) Antypattery
Uniwersalny wszechstronny zestaw wtyczek na każdej trasie → dodatkowe milisekundy i rachunki.
Zewnętrzne zależności wtyczek bez cache/timeouts → kaskadowe timeouts.
Brak kolejności filtrów: najpierw transformacja/logika, a następnie limity - niepoprawne.
Wysoka kardynalność etykiet metrycznych (surowe 'user _ id'/' ip').
Mieszanie authN/authZ we wzorach transformacji (dorozumiane rozwiązania w Lua/Jinja).
Rejestrowanie tajemnic/żetonów.
Jeden globalny klaster Redis/dla wszystkich limitów bez ostrości/rezerwy.
11) Szczegóły dotyczące iGaming/Finance
Per najemca/per jurisdiction rules: KYC/AML, sankcje, limity płatności odpowiedzialnych.
Twarde zasady dotyczące tras płatności: krótkie czasy, jeden powtórzenie, idempotencja („Idempotency-Key”).
Obwód podziału dla PSP/KYC SDK (oddzielne domeny/łańcuchy wtyczek).
Audyt niezmiennych dzienników decyzji (wnioski, blokowanie, odmowa sankcji).
12) Lista kontrolna gotowości Prod
- Kolejność filtrów jest authN → authZ → limits → circuit/timeout → schemat → przekształcenie → cache.
- Zestaw wtyczek na trasę; ciężkie - tylko w razie potrzeby.
- JWKS/PDP z krótkim TTL i pamięci podręcznej; terminy i strategie awaryjne.
- Rate/Quota/Concurrency - klucze są zaprojektowane, shading przechowywania.
- Zestaw metryczny RED/USE, śledzenie OTel, próbkowanie ogonowe/adaptacyjne.
- Tryb Canary + shadow, auto-rollback przez SLO.
- Tajemnice w KMS/Vault; configs - w wersji, z migracjami.
- Granice nadwozia/nagłówków; zabezpieczenie oversize/slow-POST.
- Dokumentacja klienta: kody 401/403/409/422/429/5xx, „Retry-After”, przykładowe nagłówki.
13) TL; DR
Zbuduj „wczesną awarię → uwierzytelnianie/autoryzacja → ograniczenia/trwałość → → walidacja transformacji/pamięci podręcznej → telemetria” łańcuch. Włączyć tylko niezbędne wtyczki na trasie, zewnętrzne rozwiązania pamięci podręcznej (JWKS/PDP), ustawić harmonogram i zasady wznawiania, kontrolować kardynalność mierników. Uwolnić przez cień/kanarka, zachować sekrety w KMS/Skarbiec i zmierzyć wpływ każdej wtyczki na p95/p99.