Firefox стал первым браузером, который реализовал шифрование TLS Server Name Indication (SNI). Поддержку ESNI внедрили в последнюю версию Firefox Nightly, на которой обкатывают все нововведения перед их добавлением в основную ветку.

О важности этого стандарта месяц назад рассказывал CDN-провайдер Cloudflare. Если вкратце, то благодаря ESNI шифруется информация о том, к какому домену вы отправляете запрос. В стандартном HTTPS заголовки с именами доменов не шифруются и доступны для просмотра провайдеру или другому «человеку посередине». Теперь он видит только IP-адрес. Поскольку в современном интернете на одном IP-адресе могут располагаться сотни доменов, то ESNI эффективно скрывает информацию, на какой домен заходит пользователь.

Таким образом, блокировки по именам перестают работать, а цензура в интернете сильно усложнится. Цензорам придётся блокировать IP-адреса, а это сомнительная практика. Такая блокировка может затронуть непричастные сайты, а блокируемый сервис легко (автоматически) переключается на другой IP-адрес.

Почему в обычном TLS SNI «светятся» имена хостов? Дело в том, что перед началом шифрования серверу необходимо знать, к какому домену обращается клиент, чтобы предъявить нужный сертификат. По этой причине имя хоста передаётся открытым текстом (ниже иллюстрации из блога Cloudflare).



В зашифрованном SNI (ESNI) эта проблема решена так: клиент берет публичный ключ сервера из DNS и шифрует им все данные до установления TLS сессии.


Поддержка браузером Firefox Nightly означает, что ESNI будет работать с каждым сайтом/провайдером, который его поддерживает.

Разработчики из Mozilla объясняют, что существует четыре основных способа утечки истории посещённых страниц:

  1. сообщение сертификата TLS,
  2. разрешение имен DNS,
  3. IP-адрес сервера,
  4. TLS Server Name Indication.

К настоящему времени они добились хорошего прогресса в закрытии первых двух каналов утечки: новый стандарт TLS 1.3 шифрует сертификат сервера по умолчанию (канал 1), а в течение последних нескольких месяцев Mozilla изучает использование DNS по HTTPS для защиты трафика DNS (канал 2). Результаты тестирования неплохие, и в ближайшие месяцы функцию выкатят для всех пользователей Firefox. IP-адрес остаётся проблемой, но во многих случаях несколько сайтов совместно используют тот же IP-адрес, так что главным каналом утечки является SNI.

В своё время технологию Server Name Indication (SNI) начали использовать именно потому, что на одном IP-адресе располагается несколько хостов. В этом случае поле SNI сообщает серверу, к какому хосту вы пытаетесь подключиться, позволяя ему выбрать правильный сертификат. Другими словами, SNI помогает обеспечить работу крупномасштабного TLS-хостинга. То есть эту функцию вводили ради безопасности, а теперь приходится с ней бороться как с каналом утечки данных.

О проблеме SNI было известно давно, пишут разработчики Mozilla, и было понятно, что это поле нужно зашифровать. Но каждый дизайн, какой они пробовали, включал какой-то компромисс производительности. Был ещё один важный недостаток: сам факт, что конкретный сайт переходит на ESNI, являлся сигналом, что ему «есть, что скрывать», то есть у цензоров появлялась возможность банально фильтровать трафик по ESNI. В конце концов было решено выпустить стандарт TLS 1.3 без ESNI.

Только в начале 2018 года разработчики поняли, что существует довольно хороший вариант: большие сети распространения контента (CDN) хостят много сайтов на одних и тех же физических серверах. Если они согласятся перевести на ESNI сразу всех клиентов, то внезапно ESNI перестаёт быть полезным сигналом для злоумышленника. Таким образом появилась возможность реализовать ESNI в TLS 1.3, путём массовой настройки множества сайтов на имеющемся наборе серверов.

ESNI — совершенно новая технология, и Firefox является первым браузером, который её реализовал. Чтобы активировать её в Firefox Nightly, следует совершить следующие действия:

  1. Убедиться, что у вас есть включен DNS по HTTPS (DoH):
    • about:config
    • установить network.trr.mode в значение 2

    • выставить network.trr.uri на сервер DoH (например, https://mozilla.cloudflare-dns.com/dns-query).

    • about:config
    • установить network.security.esni.enabled в значение true


Это должно автоматически включить ESNI для любого сайта, который его поддерживает. В данный момент из крупных хостеров и CDN это только Cloudflare, но разработчики Firefox надеются, что вскоре подключатся и другие провайдеры. Проверить работу шифрования можно по этой ссылке.



В ближайшие месяцы Mozilla будет проверять, как ESNI взаимодействует с разными типами файрволов и других сетевых устройств. Если вы включили шифрование и что-то сломалось — просьба сообщить разработчикам через баг-трекер.



Комментарии (25)


  1. saipr
    24.10.2018 14:51

    А наше импортозамещение никак не дойдет до использования TLS на ГОСТ-ах ни в Firefox, ни в GoogleChrome, ни для полноценной защиты сайтов.


    1. iborzenkov
      25.10.2018 10:38

      импортозамещение и гост в одном предложении со словом полноценный :)


  1. gaf
    24.10.2018 15:05

    Что помешает подменять публичный ключ на известный тебе при запросе его из DNS? Насколько я помню, доля зон с DNSSEC довольно мала


    1. rogoz
      24.10.2018 15:51

      Прямо в статье же:

      Убедиться, что у вас есть включен DNS по HTTPS (DoH):


      1. gaf
        24.10.2018 16:07

        По аналогии с SNI, предположу, что ESNI — это расширение TLS и тогда он к DoH напрямую не относиться и это два параллельно развивающихся концепта. Хорошо что вопрос пользовательской криптографии развивается, но пока это лишь концепты. И обрести жизнь может любой из них и ни один из них.

        Кстати, насколько DoH медленее чем обычный через UDP? Я бегло поискал, но не нашел


        1. YourChief
          24.10.2018 19:04

          Я использую DoH на OpenWRT — разницы незаметно. Гораздо сильнее проявляется разница между обычным DNS-резолвером и резолвером, валидирующим DNSSEC. Ещё лучше скрадываются задержки TCP если использовать несколько разных DoH-резолверов и dnsmasq, отправляющий запросы сразу во все и принимающий наиболее быстрый ответ.


  1. kolu4iy
    24.10.2018 15:32
    +1

    … Ну и главные каналы утечки информации — сами сайты. Скрипты, кросс-доменные запросы и прочие радости.


    1. ivan386
      24.10.2018 16:23

      Это противодействие блокированию и слежению со стороны провайдера. А остальное на совести админа сайта.


      1. kolu4iy
        24.10.2018 18:27

        Да нет совести ни у кого. Как минимум, реклама есть у всех — вот ваш персональный трекер.


        1. ivan386
          24.10.2018 21:32

          С этим можно бороться плагинами блокировщиками.


  1. Dukat
    24.10.2018 15:37
    +1

    Цензорам придётся блокировать IP-адреса, а это сомнительная практика

    В России, к сожалению, это мало кого останавливает. Заблокировать пару-другую миллионов IP? Пфф, да не вопрос.

    Мне интересно, когда поддержка ESNI появится в веб-серверах?

    ЗЫ: Mozilla — мои герои.


    1. ksenobayt
      24.10.2018 17:42

      Мне интересно, когда поддержка ESNI появится в веб-серверах?
      Разработчики nginx говорят, что поддержка появится тогда, когда она появится в OpenSSL и\или BoringSSL. Для BoringSSL, судя по всему, уже есть приватные патчи.


  1. vvsvic
    24.10.2018 16:28

    А сколько времени сервер будет определять, ключом от какого домена зашифровано имя домена?


    1. AMDmi3
      24.10.2018 16:55

      Читайте внимательнее, имя домена не шифруется ключами от доменов.


      Хотя вообще это самое очевидное решение, непонятно почему оно не было сразу реализовано как опция для защиты SNI там где это применимо.


  1. iVoene
    24.10.2018 16:54

    каким ключом шифруется имя хоста?
    если ключ всегда один и тот же, то это ничем не отличается от открытого имени


    1. AMDmi3
      24.10.2018 16:56
      +2

      Из факта использования одного ключа не следует неизменность шифротекста.


    1. ShashkovS
      24.10.2018 21:30

      публичным ключом, пришедшим от dns-сервера. Если у тебя есть домен foo.com, делаешь, условно, text-запись с публичным ключом. Браузер при попытке входа на foo.com берёт ip и публичный ключ, которым шифрует домен. И шлёт запрос по ip. Сервер имеет приватный ключ (админ сам создаёт пару, публичную часть которой кладёт в dns), поэтому может расшифровать запрашиваемый домен.
      Там правда должна быть пачка тонкостей, когда один домен живёт на целой пачке ip-адресов, но было бы логично иметь по публичному ключу на ip-адрес.


      1. iVoene
        25.10.2018 10:48

        публичный ключ меняется раз в год, или когда там истекает срок,
        так вот если домен, который не меняется, и ключ который не меняется в течении срока жизни ключа будут давать одну и туже комбинацию в зашифрованном виде.

        чем список доменных имен отличается от списка доменных имен в зашифрованном виде, если они не меняются во времени?


        1. ivan386
          25.10.2018 12:34

          Публичный ключь шифрует временный ключь. Временный ключь шифрует SNI. Благодаря временному ключу запросы на один и тот же домен будут разными.


    1. dimmaq
      25.10.2018 11:31

      В оригинальной статье blog.cloudflare.com/encrypt-that-sni-firefox-edition есть скриншот wireshark image
      Хорошо видно, что шифруется имя сервера с помощью AES, и наверняка с рандомным ключем.
      Т.ч. каждый запрос на один сервер будет разным.


  1. vviz
    25.10.2018 12:23

    Все это чудесно. Но как, в этом случае, резать доступ в корпоративной среде к внешним сайтам с поддержкой ESNI?


    1. ivan386
      25.10.2018 12:57

      Видимо только непосредственно на ПК пользователя.


    1. ShashkovS
      25.10.2018 13:13

      В корпоративной среде — можно тупо по ip.
      Ситуация, когда очень нужный сервис настолько невелик, что на его ip висят ещё 10 сервисов, доступ к которым дать нельзя, видится крайне маловероятной.


      1. AMDmi3
        25.10.2018 15:51

        Напомню что в новости упоминается CDN Cloudflare.


    1. AMDmi3
      25.10.2018 18:32

      В идеале никак, ибо это явный случай нарушения приватности, против которого и идёт борьба.