Ommaviy veb-saytingizni ESNI bilan qanday himoya qilish kerak

Salom Xabr, mening ismim Ilya, men Exnessda platforma jamoasida ishlayman. Biz mahsulot ishlab chiqish guruhlarimiz foydalanadigan asosiy infratuzilma komponentlarini ishlab chiqamiz va amalga oshiramiz.

Ushbu maqolada men ommaviy veb-saytlar infratuzilmasida shifrlangan SNI (ESNI) texnologiyasini joriy etish bo'yicha tajribam bilan o'rtoqlashmoqchiman.

Ommaviy veb-saytingizni ESNI bilan qanday himoya qilish kerak

Ushbu texnologiyadan foydalanish ommaviy veb-sayt bilan ishlashda xavfsizlik darajasini oshiradi va Kompaniya tomonidan qabul qilingan ichki xavfsizlik standartlariga mos keladi.

Avvalo shuni ta'kidlashni istardimki, texnologiya standartlashtirilmagan va hali loyihada, lekin CloudFlare va Mozilla allaqachon uni qo'llab-quvvatlaydi qoralama 01). Bu bizni bunday tajribaga undadi.

Bir oz nazariya

ESNI TLS 1.3 protokolining kengaytmasi boʻlib, u TLS qoʻl siqish “Mijoz Salom” xabarida SNI shifrlash imkonini beradi. Client Hello ESNI ko'magida qanday ko'rinishga ega (odatdagi SNI o'rniga biz ESNIni ko'ramiz):

Ommaviy veb-saytingizni ESNI bilan qanday himoya qilish kerak

 ESNI-dan foydalanish uchun sizga uchta komponent kerak bo'ladi:

  • DNS; 
  • Mijozlarni qo'llab-quvvatlash;
  • Server tomonini qo'llab-quvvatlash.

DNS

Ikkita DNS yozuvini qo'shishingiz kerak - Ava txt (TXT yozuvida mijoz SNI shifrlashi mumkin bo'lgan ochiq kalit mavjud) - pastga qarang. Bundan tashqari, qo'llab-quvvatlash bo'lishi kerak DoH (HTTPS orqali DNS), chunki mavjud mijozlar (pastga qarang) DoH holda ESNI qo'llab-quvvatlashini yoqmaydi. Bu mantiqan to'g'ri, chunki ESNI biz foydalanayotgan resurs nomini shifrlashni nazarda tutadi, ya'ni UDP orqali DNS-ga kirishning ma'nosi yo'q. Bundan tashqari, foydalanish DNSSEC ushbu stsenariyda keshni zaharlash hujumlaridan himoya qilish imkonini beradi.

Hozirda mavjud bir nechta DoH provayderlari, ular orasida:

CloudFlare deb e'lon qiladi (Mening brauzerim → Shifrlangan SNI → Batafsil ma'lumotni tekshiring) ularning serverlari allaqachon ESNI-ni qo'llab-quvvatlaydi, ya'ni DNS-dagi CloudFlare serverlari uchun bizda kamida ikkita yozuv mavjud - A va TXT. Quyidagi misolda biz Google DNS (HTTPS orqali) so'raymiz: 

А kirish:

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 yozuv, so'rov shablonga muvofiq yaratiladi _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."
}

Shunday qilib, DNS nuqtai nazaridan, biz DoH dan (afzalroq DNSSEC bilan) foydalanishimiz va ikkita yozuvni qo'shishimiz kerak. 

Mijozlarni qo'llab-quvvatlash

Agar biz brauzerlar haqida gapiradigan bo'lsak, hozirda qo'llab-quvvatlash faqat FireFox-da amalga oshiriladi. u Bu yerda FireFox-da ESNI va DoH yordamini faollashtirish bo'yicha ko'rsatmalar mavjud. Brauzer sozlangandan so'ng, biz shunga o'xshash narsani ko'rishimiz kerak:

Ommaviy veb-saytingizni ESNI bilan qanday himoya qilish kerak

aloqa brauzerni tekshirish uchun.

Albatta, ESNI ni qo'llab-quvvatlash uchun TLS 1.3 dan foydalanish kerak, chunki ESNI TLS 1.3 ning kengaytmasi hisoblanadi.

ESNI qo'llab-quvvatlashi bilan backendni sinab ko'rish uchun biz mijozni ishga tushirdik go, Lekin bu haqda keyinroq.

Server tomonini qo'llab-quvvatlash

Hozirda ESNI nginx/apache va boshqalar kabi veb-serverlar tomonidan qo'llab-quvvatlanmaydi, chunki ular ESNI-ni rasman qo'llab-quvvatlamaydigan OpenSSL/BoringSSL orqali TLS bilan ishlaydi.

Shuning uchun biz o'z old tomon komponentimizni (ESNI teskari proksi-server) yaratishga qaror qildik, u TLS 1.3 ni ESNI bilan tugatishni va ESNI-ni qo'llab-quvvatlamaydigan yuqori oqimga proksi HTTP(S) trafigini qo'llab-quvvatlaydi. Bu texnologiyani allaqachon mavjud infratuzilmada, asosiy komponentlarni o'zgartirmasdan, ya'ni ESNI-ni qo'llab-quvvatlamaydigan joriy veb-serverlardan foydalanishga imkon beradi. 

Aniqlik uchun bu erda diagramma:

Ommaviy veb-saytingizni ESNI bilan qanday himoya qilish kerak

Shuni ta'kidlaymanki, proksi-server TLS ulanishini ESNIsiz to'xtatish, ESNIsiz mijozlarni qo'llab-quvvatlash uchun mo'ljallangan. Bundan tashqari, yuqori oqim bilan aloqa protokoli HTTP yoki 1.3 dan past bo'lgan TLS versiyasiga ega HTTPS bo'lishi mumkin (agar yuqori oqim 1.3 ni qo'llab-quvvatlamasa). Ushbu sxema maksimal moslashuvchanlikni beradi.

ESNI qo'llab-quvvatlashni amalga oshirish go dan qarz oldik CloudFlare. Darhol shuni ta'kidlashni istardimki, dasturning o'zi juda ahamiyatsiz, chunki u standart kutubxonadagi o'zgarishlarni o'z ichiga oladi. kripto/TL va shuning uchun "yamoq" talab qiladi GOROOT yig'ilishdan oldin.

ESNI kalitlarini yaratish uchun biz foydalandik esnitool (shuningdek, CloudFlare kompaniyasining tashabbusi). Ushbu kalitlar SNI shifrlash/parchalash uchun ishlatiladi.
Linux (Debian, Alpine) va MacOS’da go 1.13 yordamida tuzilmani sinovdan o‘tkazdik. 

Operatsion xususiyatlar haqida bir necha so'z

ESNI teskari proksi-server Prometey formatidagi ko'rsatkichlarni taqdim etadi, masalan, rps, yuqoridagi kechikish va javob kodlari, muvaffaqiyatsiz/muvaffaqiyatli TLS qo'l siqishlari va TLS qo'l siqish davomiyligi. Bir qarashda, bu proksi-serverning trafikni qanday boshqarishini baholash uchun etarli bo'lib tuyuldi. 

Ishlatishdan oldin biz yuk sinovini ham o'tkazdik. Quyidagi natijalar:

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 

Biz ESNI teskari proksi-serverdan foydalangan holda va bo'lmasdan sxemani solishtirish uchun faqat sifatli yuk sinovini o'tkazdik. Biz oraliq qismlarga "aralashuvni" bartaraf etish uchun mahalliy trafikni "to'kdik".

Shunday qilib, ESNI qo'llab-quvvatlashi va HTTP bilan yuqori oqim uchun proksi-server bilan biz bir misoldan taxminan 550 rps oldik, ESNI teskari proksi-serverining o'rtacha CPU/RAM iste'moli:

  • 80% protsessordan foydalanish (4 vCPU, 4 GB RAM xostlari, Linux)
  • 130 MB RSS xotirasi

Ommaviy veb-saytingizni ESNI bilan qanday himoya qilish kerak

Taqqoslash uchun, TLS (HTTP protokoli) tugatilmagan bir xil nginx yuqori oqimi uchun RPS ~ 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 

Vaqt tugashining mavjudligi resurslarning etishmasligidan dalolat beradi (biz 4 vCPU, 4 GB RAM xostlari, Linuxdan foydalandik) va aslida potentsial RPS yuqoriroq (biz kuchliroq manbalarda 2700 RPSgacha ko'rsatkichlarni oldik).

Xulosa qilib shuni ta'kidlayman ESNI texnologiyasi juda istiqbolli ko'rinadi. Hali ham ochiq savollar mavjud, masalan, ochiq ESNI kalitini DNS-da saqlash va ESNI kalitlarini aylantirish masalalari - bu masalalar faol muhokama qilinmoqda va ESNI loyihasining so'nggi versiyasi (yozish vaqtida) allaqachon mavjud. 7.

Manba: www.habr.com

a Izoh qo'shish