Bonjou Habr, non mwen se Ilya, mwen travay nan ekip platfòm nan Exness. Nou devlope ak aplike eleman enfrastrikti debaz ke ekip devlopman pwodwi nou yo itilize.
Nan atik sa a, mwen ta renmen pataje eksperyans mwen nan mete ann aplikasyon teknoloji SNI (ESNI) chiffres nan enfrastrikti sit entènèt piblik yo.

Itilizasyon teknoloji sa a pral ogmante nivo sekirite lè w ap travay ak yon sit entènèt piblik epi konfòme li ak estanda sekirite entèn yo adopte pa Konpayi an.
Premye a tout, mwen ta renmen fè remake ke teknoloji a pa ofisyèl epi li toujou nan bouyon an, men CloudFlare ak Mozilla deja sipòte li (nan ). Sa a te motive nou pou yon eksperyans konsa.
Yon ti jan nan teyori
ESNI se yon ekstansyon nan pwotokòl TLS 1.3 ki pèmèt SNI chifreman nan mesaj TLS "Kliyan Hello" nan men anmen. Men sa kliyan Hello sanble ak sipò ESNI (olye SNI nòmal nou wè ESNI):

Pou itilize ESNI, ou bezwen twa konpozan:
- dns;
- Sipò pou kliyan;
- Sipò bò sèvè.
dns
Ou bezwen ajoute de dosye DNS - A, Ak TXT (Dosye TXT a gen kle piblik la ak ki kliyan an ka ankripte SNI) - gade anba a. Anplis de sa, dwe gen sipò DoH (DNS sou HTTPS) paske kliyan ki disponib (gade anba a) pa pèmèt sipò ESNI san DoH. Sa a se lojik, piske ESNI implique chifreman nan non resous n ap jwenn aksè a, se sa ki, li pa fè okenn sans jwenn aksè nan DNS sou UDP. Anplis, itilizasyon an pèmèt ou pwoteje kont atak anpwazònman kachèt nan senaryo sa a.
Kounye a disponib , pami yo:
CloudFlare (Tcheke navigatè mwen an → SNI ankripte → Aprann plis) ke sèvè yo deja sipòte ESNI, se sa ki, pou sèvè CloudFlare nan DNS nou gen omwen de dosye - A ak TXT. Nan egzanp ki anba a nou mande Google DNS (sou HTTPS):
А antre:
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 dosye, demann pwodwi dapre yon modèl _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."
}
Se konsa, nan yon pèspektiv DNS, nou ta dwe itilize DoH (de preferans ak DNSSEC) epi ajoute de antre.
Sipò kliyan
Si nou ap pale de navigatè, Lè sa a, nan moman sa a . Men enstriksyon sou kijan pou aktive sipò ESNI ak DoH nan FireFox. Apre navigatè a configuré, nou ta dwe wè yon bagay tankou sa a:

pou tcheke navigatè a.
Natirèlman, TLS 1.3 dwe itilize pou sipòte ESNI, paske ESNI se yon ekstansyon pou TLS 1.3.
Nan bi pou yo teste backend la ak sipò ESNI, nou aplike kliyan an sou go, Men plis sou sa pita.
Sipò bò sèvè
Kounye a, ESNI pa sipòte pa sèvè entènèt tankou nginx/apache, elatriye, paske yo travay ak TLS atravè OpenSSL/BoringSSL, ki pa ofisyèlman sipòte ESNI.
Se poutèt sa, nou deside kreye pwòp eleman devan nou an (ESNI reverse proxy), ki ta sipòte TLS 1.3 revokasyon ak ESNI ak proxy HTTP(S) trafik nan en an, ki pa sipòte ESNI. Sa a pèmèt teknoloji a dwe itilize nan yon enfrastrikti ki deja egziste, san yo pa chanje eleman prensipal yo - sa vle di, lè l sèvi avèk sèvè entènèt aktyèl ki pa sipòte ESNI.
Pou klè, isit la se yon dyagram:

Mwen sonje ke prokurasyon an te fèt ak kapasite pou mete fen nan yon koneksyon TLS san ESNI, pou sipòte kliyan san ESNI. Epitou, pwotokòl kominikasyon an ak en kapab swa HTTP oswa HTTPS ak yon vèsyon TLS ki pi ba pase 1.3 (si en pa sipòte 1.3). Konplo sa a bay maksimòm fleksibilite.
Aplikasyon sipò ESNI sou go nou te prete nan men . Mwen ta renmen sonje touswit ke aplikasyon an li menm se byen ki pa trivial, paske li enplike chanjman nan bibliyotèk estanda a. crypto/tls e se poutèt sa mande pou "patching" GOROOT anvan asanble.
Pou jenere ESNI kle nou te itilize (tou lide CloudFlare). Kle sa yo itilize pou SNI chifreman / dechifre.
Мы протестировали сборку с использованием go 1.13 на Linux (Debian, Alpine) и MacOS.
Yon kèk mo sou karakteristik operasyonèl yo
ESNI reverse proxy bay mezi nan fòma Prometheus, tankou rps, latansi en ak kòd repons, echwe/siksè TLS lanmen ak dire TLS lanmen. Nan premye gade, sa a te sanble ase yo evalye ki jan prokurasyon an okipe trafik.
Nou menm tou nou te fè tès chaj anvan ou itilize. Rezilta anba a:
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
Nou te fè tès chaj piman kalitatif pou konpare konplo a lè l sèvi avèk prokurasyon ranvèse ESNI ak san yo pa. Nou "vide" trafik lokalman yo nan lòd yo elimine "entèferans" nan eleman entèmedyè.
Se konsa, ak sipò ESNI ak proxy nan en soti nan HTTP, nou te resevwa alantou ~ 550 rps soti nan yon egzanp, ak konsomasyon mwayèn CPU / RAM nan prokurasyon ranvèse ESNI:
- 80% CPU Usage (4 vCPU, 4 GB RAM хосты, Linux)
- 130 MB Mem RSS

Pou konparezon, RPS pou menm nginx en san revokasyon TLS (HTTP pwotokòl) se ~ 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
Наличие таймаутов говорит о том, что есть нехватка ресурсов (мы использовали 4 vCPU, 4 GB RAM хосты, Linux), и по факту потенциальный RPS выше (мы получали цифры до 2700 RPS на более мощных ресурсах).
An konklizyon, mwen remake ke teknoloji ESNI sanble byen pwomèt. Genyen toujou anpil kesyon ouvè, pou egzanp, pwoblèm yo nan estoke kle ESNI piblik la nan DNS la ak wotasyon kle ESNI - pwoblèm sa yo ap diskite aktivman, ak dènye vèsyon an nan bouyon an ESNI (nan moman an ekri) deja. .
Sous: www.habr.com
