Hello Habr, ang akong ngalan mao si Ilya, nagtrabaho ko sa platform team sa Exness. Among gipalambo ug gipatuman ang kinauyokan nga mga sangkap sa imprastraktura nga gigamit sa among mga team sa pagpalambo sa produkto.
Niini nga artikulo, gusto nakong ipaambit ang akong kasinatian sa pagpatuman sa teknolohiya nga naka-encrypt nga SNI (ESNI) sa imprastraktura sa mga publikong website.
Ang paggamit niini nga teknolohiya makadugang sa lebel sa seguridad kung nagtrabaho sa usa ka publiko nga website ug nagsunod sa mga sumbanan sa internal nga seguridad nga gisagop sa Kompanya.
Una sa tanan, gusto nakong ipunting nga ang teknolohiya dili standardized ug anaa pa sa draft, apan gisuportahan na kini sa CloudFlare ug Mozilla (sa
Usa ka teoriya
ESNI usa ka extension sa TLS 1.3 protocol nga nagtugot sa SNI encryption sa TLS handshake nga "Client Hello" nga mensahe. Ania kung unsa ang hitsura sa Client Hello sa suporta sa ESNI (imbes sa naandan nga SNI nga atong makita ang ESNI):
Aron magamit ang ESNI, kinahanglan nimo ang tulo nga sangkap:
- DNS;
- Suporta sa kliyente;
- Suporta sa kilid sa server.
DNS
Kinahanglan nimong idugang ang duha ka mga rekord sa DNS - Aug TXT (Ang rekord sa TXT naglangkob sa publikong yawe diin ang kliyente maka-encrypt sa SNI) - tan-awa sa ubos. Dugang pa, kinahanglan adunay suporta Ang DoH (DNS sa HTTPS) tungod kay ang anaa nga mga kliyente (tan-awa sa ubos) dili makahimo sa suporta sa ESNI nga walay DoH. Makataronganon kini, tungod kay ang ESNI nagpasabot sa pag-encrypt sa ngalan sa kapanguhaan nga atong gi-access, sa ato pa, wala'y kahulogan ang pag-access sa DNS sa UDP. Dugang pa, ang paggamit
Anaa karon
CloudFlare
Π entry:
curl 'https://dns.google.com/resolve?name=www.cloudflare.com&type=A'
-s -H 'accept: application/dns+json'
{
"Status": 0,
"TC": false,
"RD": true,
"RA": true,
"AD": true,
"CD": false,
"Question": [
{
"name": "www.cloudflare.com.",
"type": 1
}
],
"Answer": [
{
"name": "www.cloudflare.com.",
"type": 1,
"TTL": 257,
"data": "104.17.210.9"
},
{
"name": "www.cloudflare.com.",
"type": 1,
"TTL": 257,
"data": "104.17.209.9"
}
]
}
TXT rekord, ang hangyo gihimo sumala sa usa ka template _esni.FQDN:
curl 'https://dns.google.com/resolve?name=_esni.www.cloudflare.com&type=TXT'
-s -H 'accept: application/dns+json'
{
"Status": 0,
"TC": false,
"RD": true,
"RA": true,
"AD": true,
"CD": false,
"Question": [
{
"name": "_esni.www.cloudflare.com.",
"type": 16
}
],
"Answer": [
{
"name": "_esni.www.cloudflare.com.",
"type": 16,
"TTL": 1799,
"data": ""/wEUgUKlACQAHQAg9SiAYQ9aUseUZr47HYHvF5jkt3aZ5802eAMJPhRz1QgAAhMBAQQAAAAAXtUmAAAAAABe3Q8AAAA=""
}
],
"Comment": "Response from 2400:cb00:2049:1::a29f:209."
}
Busa, gikan sa panglantaw sa DNS, kinahanglan natong gamiton ang DoH (mas maayo nga adunay DNSSEC) ug magdugang og duha ka entries.
Suporta sa kustomer
Kung naghisgot kami bahin sa mga browser, nan sa pagkakaron
Siyempre, ang TLS 1.3 kinahanglan gamiton sa pagsuporta sa ESNI, tungod kay ang ESNI usa ka extension sa TLS 1.3.
Alang sa katuyoan sa pagsulay sa backend nga adunay suporta sa ESNI, gipatuman namon ang kliyente sa go, Apan labaw pa niana sa ulahi.
Suporta sa kilid sa server
Sa pagkakaron, ang ESNI wala gisuportahan sa mga web server sama sa nginx/apache, ug uban pa, tungod kay nagtrabaho sila sa TLS pinaagi sa OpenSSL/BoringSSL, nga dili opisyal nga nagsuporta sa ESNI.
Busa, nakahukom kami sa paghimo sa among kaugalingong front-end component (ESNI reverse proxy), nga mosuporta sa TLS 1.3 nga pagtapos sa ESNI ug proxy HTTP(S) nga trapiko ngadto sa upstream, nga dili mosuporta sa ESNI. Gitugotan niini ang teknolohiya nga magamit sa naa na nga imprastraktura, nga wala magbag-o sa mga nag-unang sangkap - nga mao, gamit ang karon nga mga web server nga wala nagsuporta sa ESNI.
Alang sa katin-awan, ania ang usa ka diagram:
Namatikdan nako nga ang proxy gidisenyo nga adunay katakus sa pagtapos sa koneksyon sa TLS nga wala ang ESNI, aron suportahan ang mga kliyente nga wala ang ESNI. Usab, ang protocol sa komunikasyon uban sa upstream mahimo nga HTTP o HTTPS nga adunay TLS nga bersyon nga ubos sa 1.3 (kung ang upstream dili mosuporta sa 1.3). Kini nga laraw naghatag labing taas nga pagka-flexible.
Pagpatuman sa suporta sa ESNI sa go nanghulam mi
Aron makamugna ang mga yawe sa ESNI nga among gigamit
Gisulayan namo ang pagtukod gamit ang go 1.13 sa Linux (Debian, Alpine) ug MacOS.
Pipila ka mga pulong mahitungod sa operational features
Ang ESNI reverse proxy naghatag ug metrics sa Prometheus format, sama sa rps, upstream latency & response codes, failed/successful TLS handshakes & TLS handshake duration. Sa una nga pagtan-aw, ingon og igo na kini aron mahibal-an kung giunsa pagdumala sa proxy ang trapiko.
Naghimo usab kami og pagsulay sa pagkarga sa wala pa gamiton. Mga resulta sa ubos:
wrk -t50 -c1000 -d360s 'https://esni-rev-proxy.npw:443' --timeout 15s
Running 6m test @ https://esni-rev-proxy.npw:443
50 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.77s 1.21s 7.20s 65.43%
Req/Sec 13.78 8.84 140.00 83.70%
206357 requests in 6.00m, 6.08GB read
Requests/sec: 573.07
Transfer/sec: 17.28MB
Naghimo kami og puro qualitative load testing aron itandi ang scheme gamit ang ESNI reverse proxy ug wala. "Gibubo" namon ang trapiko sa lokal aron mawagtang ang "pagpanghilabot" sa mga intermediate nga sangkap.
Mao nga, uban ang suporta sa ESNI ug upstream proxying gikan sa HTTP, nakakuha kami mga ~ 550 rps gikan sa usa ka higayon, nga adunay kasagaran nga pagkonsumo sa CPU / RAM sa ESNI reverse proxy:
- 80% Paggamit sa CPU (4 vCPU, 4 GB RAM host, Linux)
- 130 MB Mem RSS
Alang sa pagtandi, ang RPS alang sa parehas nga nginx upstream nga walaβy pagtapos sa TLS (HTTP protocol) mao ang ~ 1100:
wrk -t50 -c1000 -d360s 'http://lb.npw:80' β-timeout 15s
Running 6m test @ http://lb.npw:80
50 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.11s 2.30s 15.00s 90.94%
Req/Sec 23.25 13.55 282.00 79.25%
393093 requests in 6.00m, 11.35GB read
Socket errors: connect 0, read 0, write 0, timeout 9555
Non-2xx or 3xx responses: 8111
Requests/sec: 1091.62
Transfer/sec: 32.27MB
Ang presensya sa mga timeout nagpakita nga adunay kakulang sa mga kapanguhaan (among gigamit ang 4 vCPUs, 4 GB RAM host, Linux), ug sa pagkatinuod ang potensyal nga RPS mas taas (nakadawat kami og mga numero nga hangtod sa 2700 RPS sa mas gamhanan nga mga kapanguhaan).
Sa konklusyon, akong namatikdan nga ang teknolohiya sa ESNI daw maayo kaayo. Adunay daghan pa nga bukas nga mga pangutana, pananglitan, ang mga isyu sa pagtipig sa publiko nga yawe sa ESNI sa DNS ug pag-rotate sa mga yawe sa ESNI - kini nga mga isyu aktibo nga gihisgutan, ug ang pinakabag-o nga bersyon sa draft sa ESNI (sa panahon sa pagsulat) anaa na.
Source: www.habr.com