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.
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
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):
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
Hozirda mavjud
CloudFlare
А 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
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:
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
ESNI kalitlarini yaratish uchun biz foydalandik
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
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.
Manba: www.habr.com