Ресурсы: техническое описание TLS, LaTeX - в картинки (img), криптографическая библиотека Arduino, шифр "Кузнечик" на ассемблере AMD64/AVX и ARM64
Надо подчеркнуть, что использование сервисов вроде Google Public DNS – не слишком хорошо защищает от подмены и перехвата (блокировки) доступа. Как я уже писал, никто не мешает узлу, переправляющему ваш трафик в строну сервиса Google, ответить на DNS-запрос вместо сервиса Google (да ещё и быстрее). То есть, пока нет криптографических механизмов проверки подлинности ответа, подменить гугловский DNS не так трудно, адреса его известны.
Занятно, что подобная подмена распространяется и на все другие этапы разрешения имён DNS. Если вы контролируете подходящий маршрутизатор, то отвечать можно и за корневой сервер доменной системы имён (так блокируют доступ к сайтам на практике, например, в Китае). А из-за особенностей протоколов DNS, ответ, пришедший якобы от корневого сервера, может сразу содержать адрес узла, соответствующего запрошенному имени. Спросили www.yandex.ru? Ну вот и получите в ответ – 127.0.0.1.
Комментарии (1) »
Для публикации сертификатов буду использовать домен root-key.net. Очень логично. Например, мой корневой сертификат – под доменом cert.root-key.net, думаю настроить Apache так, чтобы сразу отдавался именно сертификат, а копию ещё разместить в DNS. (Я поддерживаю собственный, карманный, УЦ для выпуска сертификатов, используемых в админках CMS и для других задач, в том числе, для организации VPN. Свои ключи – это правильно.)
Комментарии (2) »
Теперь для DANE есть соответствующий RFC-6698. Ждём поддержки браузерами. Есть шансы, что реализуют оперативно, а Chrome сохранит статус первопроходца.
Addon: учитывая, что DANE позволяет перевести самоподписанные сертификаты в новый статус, который не вызывает предупреждения в барузере, эта технология может сильно ускорить внедрение DNSSEC, а то регистраторы и даже некоторые реестры – затормаживают процесс. (Понятно, что бесплатный и “полноценный” SSL-сертификат хотят очень многие администраторы веб-сайтов.)
Комментарии (1) »
Меня попросили поделиться инструкцией о том, как настраивается VPN с использованием виртуального сервера из амазоновского EC2 (часть AWS – Amazon Web Services). Инструкцию размещаю на dxdt.ru, ведь в современном Интернете VPN – полезный инструмент. Подобные инструкции есть в Сети, но я попробовал ещё раз пройти всё детально по шагам, собрать все этапы вместе, включая настройку DNS. Более того, в рамках данной инструкции мы ещё разберёмся с созданием собственного “удостоверяющего центра” для выпуска SSL-сертификатов и создания инфраструктуры для аутентификации узлов. И DNS, и особенности управления сертификатами (отзыв сертификатов; проверка имён, например, при помощи директивы VPN tls-remote) – среди тех ключевых моментов, о которых постоянно забывают, настраивая “личный” VPN.
О том, для чего в технократическом хозяйстве пригодится VPN – я писал раньше, и не один раз. Если вдруг кто забыл, то под VPN подразумеваются зашифрованные каналы связи, организованные поверх открытого Интернета и ведущие от клиента к серверу VPN, при этом множество клиентов может быть объединено в виртуальную сеть. Главная особенность: трафик, идущий по VPN, практически недоступен для анализа и перехвата.
Описание длинное, с картинками, поэтому прячу под “Читать полностью”.
Комментарии (12) »
Тут спрашивают, достаточно ли устроить DNS-резолвер на собственном сервере или использовать сервис наподобие Google Public DNS, чтобы меньше беспокоиться о подмене ответов DNS (которые могут увести куда угодно)? Нет, не достаточно. Ключевой момент тут в IP-адресах. Предположим, что у вас настроен в качестве резолвера собственный сервер (пусть это будет BIND), доступный по IP-адресу 1.2.3.4. Откуда ваша локальная операционная система знает, что, отправляя запросы и получая ответы от 1.2.3.4, – она “разговаривает” именно с нужным резолвером?
Если в качестве точки перехвата трафика используются ближайший к вашему узлу шлюз, то очень легко сделать так, что по адресу 1.2.3.4 будет отвечать какой угодно подставной сервер. Посудите сами: сейчас даже новомодные точки доступа WiFi используют такую технологию, чтобы вместо нужного сайта показывать в браузере собственную страницу с сообщением об “ошибке соединения”, если там, например, кабель выпал (делать так, конечно, форменное безобразие). То же нередко реализуют интернет-провайдеры. Технология простая: маршрутизатор, вместо того, чтобы отправить пакеты в Интернет, перенаправляет их внутреннему узлу. Так что на запрос к 8.8.8.8 (гугловский DNS) может поступить самый неожиданный ответ: mail.google.com = 192.168.1.1. Более того, благодаря возможностям по спуфингу, существующим в типичной локальной сети, перехватить трафик может не только маршрутизатор. Ну и существует ещё несколько способов, позволяющих подставить другой сервер вместо вашего резолвера. Что, кстати, напоминает ситуацию со спуфингом GPS. (Как страшно жить.)
Возвращаемся к DNS. Что делать? А просто не нужно забывать об аутентификации. Так, если вы используете свой резловер без VPN, то потребуется настроить TSIG – то есть, подписывание запросов и ответов клиентом и сервером, стандартный механизм при обмене файлами зон.
Я делаю так: на локальной машине в качестве резолвера поднят BIND с поддержкой TSIG, для него в качестве “форвардера” настроен сервер резолвера – в файле конфигурации named.conf директива forwarders:
forwarders {
1.2.3.4;
};
(1.2.3.4 – IP-адрес резолвера).
Для удостоверения сообщений требуется общий секретный ключ. Его можно сгенерировать утилитой dnssec-keygen, входящей в пакет BIND9:
$ dnssec-keygen -a HMAC-MD5 -b 128 -n HOST megakey
(пояснения к параметрам: тип алгоритма HMAC-MD5, 128-бит, ключ для хоста).
Результатом работы является пара файлов, примерно с такими именами: Kmegakey.+157+14629.key и Kmegakey.+157+14629.private. Значение ключа, в виде строки Base64, можно взять из .private. Ключ, понятно, секретный.
Теперь в конфигурацию обоих BIND-ов, на клиенте, и на сервере, нужно добавить записи о ключе и директивы, предписывающие этот ключ использовать. Самый правильный способ: ключи вынести в отдельный файл, защитить его правами доступа, а в конфигурацию добавить с помощью include. Что, кстати, на отдельном виртуальном сервере может оказаться избыточным.
Описание ключа, для speckey.conf.key или прямо для named.conf:
key “resolver-key” {
algorithm hmac-md5;
secret “SuperMEGAKey==”;
};
Понятно, что SuperMEGAKey допустимо заменить на ваш собственный секретный ключ.
Назначение ключа узлу (серверу), в named.conf, ничего секретного в строке нет:
server 1.2.3.4 {
keys{
resolver-key;
};
};
Здесь 1.2.3.4 – адреса узлов: на клиенте – серверный адрес, на сервере – клиентский.
Собственно, это всё (после настройки нужно перезапустить BIND): при попытке подмены или перехвата ответов – получаем сообщение об ошибке, не более того.
Осталось напомнить, при чём здесь VPN. При установлении соединения VPN уже проводится аутентификация и сервера VPN, и клиента. По крайней мере, если VPN настроен правильно. Поэтому, если DNS-резолвер работает в той же виртуальной сети, что и шлюз VPN, особого смысла вводить дополнительную проверку транзакций нет. Хотя, можно и ввести, конечно. Всё зависит от типа паранойи.
Комментарии (4) »
Внимательное наблюдение за ситуацией с фильтрацией Интернета позволяет сообразить, где находится корень проблем, – а находится он в глобальных свойствах Интернета, которые сейчас плотно взаимодействуют с суверенностью государств мира. Такого в истории ещё не было. Очередной переломный момент назревает. Но записка немного о другом.
Вот есть такой термин DPI – Deep Packet Inspection (если переводить дословно: глубокий досмотр пакетов). Скрывающиеся за термином технологии позволяют проверять не только и не столько заголовки пакетов данных, проходящих через коммуникационное оборудование, но и само “полезное” содержимое этих пакетов, передаваемые данные. Причём досмотр и фильтрация проводятся на уровень или два выше, чем отдельные пакеты: то есть, можно собирать сессии, выделять потоки данных, анализировать, например, содержимое веб-страниц, поступающих в браузер.
Тут главное выделить побольше вычислительных мощностей: анализ типов пересылаемых файлов, текстов на веб-страницах – по современным меркам, как говорится, не бином Ньютона. При этом к классу “тексты на веб-страницах” относятся личные сообщения в веб-чате, или письма, отображаемые в веб-интерфейсе почты.
Понятно, что системы DPI годятся на роль инструмента, формирующего гибкие, в технологическом смысле, правила блокирования доступа к ресурсам. Есть, конечно, ряд проблем с реализацией масштабного анализа трафика: например, пакеты по Интернету могут ходить разными путями и, перехватив запросы от веб-браузера, можно не получить соответствующих ответов сервера. Но тут главное правильно расставлять точки перехвата. Так, интернет-провайдер заведомо может видеть весь трафик работающих через его сеть конечных пользователей.
Часто ссылаются на HTTPS, как на недоступный для подобного анализа протокол. Да, формально, HTTPS предоставляет зашифрованный канал связи. Но в реальности есть ряд методов, позволяющих, на практике, всю эту защиту перевести в разряд мнимых. Устройства для анализа сетевого трафика, находящиеся между пользователем и тем ресурсом, с которым он соединяется, давно умеют перехватывать сессию HTTPS в момент её установления, на лету генерировать SSL-сертификат для соответствующего ресурса и – пожалуйста, трафик можно прослушивать. Естественно, тут есть проблема с тем, что сертификат, выпущенный перехватывающим устройством, должен успешно помещаться в цепочку доверия браузера – иначе браузер выдаст предупреждение.
Но, во-первых, массовый пользователь игнорирует подобные предупреждения браузера, “заставляя” тот продолжить использование веб-сайта. Во-вторых, нет особых гарантий того, что удостоверяющие центры, входящие в список доверенных браузера, не участвуют в работе систем DPI. Собственно, вокруг второго момента, который, вообще-то, давно известен, сейчас разгорелся нешуточный сыр-бор. В случае, если автоматический инспектор трафика использует для генерации своих “перехватывающих” сертификатов сертификаты доверенного УЦ (не обязательно корневой, годятся промежуточные), то обычный пользователь браузера даже не увидит предупреждения, не заметит подмены. (Кстати, есть неплохой плагин для Firefox, позволяющий следить за тем, как браузер оперирует сертификатами – Certificate Patrol.)
Заметьте, что если у провайдера работает добротная система анализа трафика, то можно блокировать этот трафик не только по контенту или по адресам, но и по типу трафика, используя белый список. Соответственно, если поток не удаётся разбирать и классифицировать, то его можно заблокировать. Естественно, этот принцип работает и для HTTPS – если клиент не стал соединяться с перехватывающим трафик узлом, то соединение вовсе блокируется. Через настроенную подобным образом сеть не пройдёт канал VPN, даже если, скажем, он использует нестандартные порты (например, я использую собственный VPN, работающий по TCP, через 80-й порт).
Проблему передачи шифрованных данных через такую “фильтрующую сеть” можно решить, используя стеганографию – данные закрытого канала помещаются внутрь маскирующего, имитирующего “обычную” работу с рядовым веб-сайтом. Такие решения известны. Из новинок – вот есть Telex. Понятно, подобный канал будет медленным.
Кстати, фокусам с подменой SSL-ей отчасти может помешать внедрение технологий вроде DANE. Но нужно учитывать, что, в теории, тот же DANE, если говорить о типичном пользователе Интернета, перехватывается аналогичными SSL методами, здесь лишь сильно сужается круг тех, кто может осуществить такой перехват. Что, логичным образом, возвращает нас к мысли о реальных причинах шума, высказанной в самом начале заметки.
Комментарии (8) »
(Вынесу сюда из комментов.) Как, в общих чертах, работает спуфинг для GPS? Чтобы разобраться, нужно вспомнить, что такое сама эта GPS в генеральном, так сказать, смысле. GPS позволяет приёмнику определить с высокой точностью расстояние до нескольких спутников, входящих в состав системы. Расстояние вычисляется на основе принимаемых со спутников радиосигналов, ключевыми моментами является знание точного времени, действующего во всей системе (приёмник + спутники), и информация о точном местоположении спутников в каждый момент времени. Дальше – чистая геометрия. Понятно, что для практической работы простого приёмника потребуется четыре спутника (почему, кстати, не три?), до которых известно расстояние, и так далее, и тому подобное.
Спуфинг основан на нескольких особенностях системы (речь о гражданском канале GPS). Во-первых, сигналы и информация об астрономическом движении – открытые, поэтому, используя приёмник, находящийся в какой-то точке Земли, можно точно вычислить сигнальную обстановку GPS в любой другой точке в заданный момент времени (ну, если владельцы системы не внесли специальных помех, да). Вычислить эту обстановку можно с упреждением по времени. Во-вторых, опять же из-за того, что сигналы открытые и незащищённые, а к тому же слабые, требующие накопления для детектирования навигационной информации, можно сгенерировать поддельный сигнал GPS, который будет близок к реальному. Передатчик этого сигнала может находиться на земле, где-то неподалёку от того приёмника, который спуфят – задавить реальный сигнал по мощности несложно. В-третьих, активная помеха должна изменяться, имитируя движение атакуемого приёмника. Соответствующие параметры помехи вычисляются либо заранее, либо в режиме онлайн.
Дальнейшее развитие ситуации, думаю, особых пояснений не требует: приёмник передаёт в систему управления новые координаты, изменяющиеся, система управления старается компенсировать “дрейф” – и беспилотник, который должен был висеть на одном месте, начинает снижаться и, скажем, падает.
Теперь предположим, что навигационная система использует несколько “внешних” источников навигационной информации. Например, GPS + ГЛОНАСС. С одной стороны, такая система может обнаружить расхождение между показаниями, если GPS “подспуфили”. Но не ясно, что в таком случае этой системе делать? Она не может определить, происходит ли спуфинг GPS или, наоборот, ГЛОНАСС. И почему, кстати, GPS заслуживает меньшего доверия, чем ГЛОНАСС? Если отключать навигацию при каждом расхождении показаний, то возникают новые требования к синхронности двух независимых навигационных источников. То есть, дополнительный риск отказа без всякого спуфинга.
Пусть источников для навигации – три. Добавим Galileo. В такой конфигурации можно было бы выбирать два источника, как-то совпадающие в показаниях, до некоторого порога. Проблема в том, что помехопостановщик может один из навигационных сигналов подавить, это даже проще, чем спуфить, а активную помеху поставить любому другому сигналу.
Теоретически, побороться с такой неприятной проблемой можно при помощи криптографии. Допустим, навигационные сигналы подписаны, открытый ключ для проверки зашивается в приёмник (в навигатор, хорошо), вместе с картами. Ключ можно обновлять и менять. Схемы отработаны. Теперь приёмник может определить, что он принимает поддельный сигнал. Это, правда, никак не помогает бороться с глушением сигнала полностью, но исключает проблему с “перехватом” управления тем или иным устройством, которое полагается только на спутниковую навигацию. Впрочем, в случае с криптографией, наложенной на слабые сигналы, возникает целый ряд новых проблем: как быстро проверять подпись? какой временной “фрейм” подписывать (понятно, что нельзя удостоверять каждую микросекунду сигнала)? и так далее. Поэтому, автономная инерциальная навигационная система, в качестве опорной, всё равно не помещает. Тем более, что спуфинг можно обнаруживать даже простым акселерометром.
Комментарии (19) »
Занятно, что, как рассказывают, для того чтобы воспользоваться дефектом в сервисе App Store, позволяющим бесплатно приобретать всякие дополнения к приложениям (которые, штатно – платные) требуется установить специальные доверенные SSL-сертификаты и поменять настройки DNS. Да, а потом будут удивляться очередному “мобильному” ботнету. Но уровень реализации сервисов Apple, конечно, впечатляет. В плане безопасности. Наверное, там есть какая-то причина, по которой они не привязывают сертификат от подобных API к “своему” УЦ.
Комментарии (1) »
В Интернете публикуют файл с пользовательскими паролями, стащенными, как пишут, из некоторого сервиса Yahoo! Сейчас пароли меняют. Традиционная статистика по лидерам среди пользовательских паролей (посчитал по исходному файлу, указаны пароли с числом вхождений больше 128):
123456:1667
password:780
welcome:437
ninja:333
abc123:250
123456789:222
12345678:208
sunshine:205
princess:202
qwerty:172
writer:164
monkey:162
freedom:161
michael:160
111111:160
iloveyou:140
password1:139
shadow:134
baseball:133
tigger:132
1a1a1a1b:131
1a1a1a1b – неплохой вариант, кстати. Интересно, если перечень реальный, то, после того, как пользователей попросят сменить пароли, сильно ли изменится рейтинг? Например, вместо 123456 – в лидеры может выйти 111111. Какой вообще смысл просить менять пароли, если политика позволяет использовать слабые варианты? Которые, к тому же, хранятся в открытом виде.
Комментарии (2) »
То, что спуфинг для сигналов GPS возможен и доступен – известно давно. Сейчас вот обсуждают вполне практическую демонстрацию с беспилотником, который, при помощи интеллектуальной помехи, заставили совершить небезопасный манёвр (“перехватили управление”, так сказать). Это не первая демонстрация спуфинга, но довольно эффектная. Наиболее неприятная картинка вырисовывается, если соединить уязвимость GPS с гипотетическими самоуправляемыми автомобилями. В принципе, даже живые водители склонны излишне верить GPS, а что ожидать от автомобильной программы?
Не, понятно, что в автомобильные программы должны, конечно, встроить защиту и всё такое. И при обнаружении нарушения в сигнале GPS, авто, скажем, будет безопасно останавливаться. Хотя, толпа неожиданно замерших неподалёку от генератора помех автомобилей-роботов тоже вполне себе неприятность. Вообще, в свете управления беспилотниками “по GPS”, неясно, что автомобилю роботу лучше предпринять при сбое навигации. А ведь ещё можно вспомнить, что нынче по GPS ходят круизные лайнеры.
Комментарии (25) »
Технология под названием DANE (DNS-Based Authentication of Named Entities) позволяет размещать в DNS информацию, идентифицирующую заданные элементы криптосистем, используемых различными сервисами в Интернете. DANE распространяет удостоверяющие свойства DNSSEC на другие протоколы, тем самым сильно расширяя возможности и область применения DNSSEC.
Например, используя DANE можно разместить в DNS специальные записи, привязывающие определённый SSL-сертификат к веб-серверу, отвечающему под соответствующим доменом. Программы-клиенты (браузеры), обращающиеся к веб-серсверу, смогут проверить валидность сертификата средствами DNSSEC. Что, потенциально, приводит имеющуюся инфраструктуру к схеме с единым корнем. Или, по крайней мере, позволяет владельцу домена как-то бороться с “левыми” сертификатами, которые могут быть выпущены для его домена: запись в DNS точно указывает на то, какие именно сертификаты браузер должен принимать для данного веб-сайта. Естественно, DANE касается не только HTTPS (TLS), пример работы с которым я приведу ниже, но и распространяется на другие протоколы.
Пока что DANE находится в разработке, которая, надо заметить, идёт неплохо: примерно за год активной деятельности рабочей группы соответствующий RFC уже добрался до завершающей стадии подготовки. Тем не менее, говорить о какой-то поддержке приложениями пока что рано, протокол всё ещё экспериментальный, его ключевые особенности могут измениться. Кроме того, требуется продвижение идеи в пользовательские браузеры.
В качестве тестовой площадки я сделал https://dane.nox.su/ – понятно, что заходить туда имеет смысл только по https. Более того, приготовьтесь увидеть предупреждение системы безопасности браузера. Подробности – ниже.
Как это работает? Основной момент в том, что информация об открытом ключе SSL-сертификата вносится в подписанную зону DNS. В случае с dane.nox.su – с этим проблем нет, так как зона nox.su поддерживает DNSSEC. Веб-сервер dane.nox.su использует самоподписанный SSL-сертификат. Это сделано специально, так как одной из интересных особенностей DANE является то, что этот новый инструмент, благодаря DNSSEC, позволяет превратить самоподписанный (бесплатный, заметьте) сертификат во вполне сносный механизм аутентификации веб-сайта. Хотя, на практике лучше использовать не самоподписанный, а полноценный сертификат – с ним DANE, понятно, также совместим.
Процедура настройки DANE для TLS довольно проста. Я опущу описание процесса генерации SSL-сертификата, предположим, что он уже есть и установлен. Требуется добавить в зону DNS запись особого вида, содержащую отпечаток (хеш) открытого ключа сертификата. Используем SHA-256 (один из вариантов, указанных в RFC). Прежде всего, отпечаток нужно получить:
$ openssl x509 -noout -fingerprint -sha256 -in yourcert.crt
– здесь yourcert.crt – файл с вашим сертификатом.
Вообще, для использования в DNS, значение SHA-256 потребуется в записи без двоеточий, так что лучше сразу сказать как-то так:
$ openssl x509 -noout -fingerprint -sha256 -in nox.su.self.crt | perl -ne ‘s/://g; print $_’
Результат примерно такой (для сертификата dane.nox.su):
SHA256 Fingerprint =
12B1BC2AF0D87C6E0E259CE364CE6921
B74F0C748328C4A33A11F19467700EB2
(Как вариант: отпечаток ключа можно подсмотреть браузером, открыв ваш сайт и заглянув в окно со свойствами SSL-сертификата.)
Запись DNS выглядит, соответственно, так (для dane.nox.su):
_443._tcp.dane.nox.su. IN TYPE65468 \# 35
( 03000112B1BC2AF0D87C6E0E259CE364CE6921
B74F0C748328C4A33A11F19467700EB2 )
Думаю, нетрудно догадаться, что имя построено из номера порта, типа протокола и хоста: TCP и 443 – это стандартный транспорт HTTPS. Тип TYPE65468 – это временный тип записи, выделенный для тестирования DANE. Собcтвенно, сейчас IANA уже выделила “нормальный” тип – TLSA (52). Но с TLSA пока что удобства ещё меньше.
Значение: тут к отпечатку, в качестве префикса, добавлено три байта (октета), со значениями 03,01,01. Это, в порядке следования:
* метод использования сертификата – 3 – обозначает, что сертификат не должен проверяться по цепочке доверия (PKIX) браузера, а только сверятся с отпечатком в DNS; подходит для самоподписанного сертификата; другие варианты предусматривают проверку цепочки внутри иерархии подписей;
* проверяемая часть сертификата – 1 – проверятся отпечаток открытого ключа; 0 – проверяется отпечаток всего сертификата;
* тип хеш-функции – 1 – SHA-256; тут всё понятно.
То есть, значение записи строится так: {метод}{часть}{тип-хеша}{значение-хеша} – просто и прозрачно. Извлечь тестовую запись, вместе с подписью, из DNS можно попробовать такой командой:
$ dig +dnssec -t TYPE65468 _443._tcp.dane.nox.su
После того, как запись успешно размещена в зоне и зона подписана – всё готово для использования DANE.
Тут и кроется основная практическая трудность (или, скажем так, засада): поддержки DANE пока нет. Из того, что мне удалось обнаружить: плагин для Firefox Extended DNSSEC Validator, альфа-версия. В принципе, Chrome должен поддерживать DANE, но, на правах первопроходца, он делает это в манере, отличающейся от описанной в текущем RFC (который, напомню, черновик). Для того, чтобы заработал Chrome, требуется другая запись в DNS и специальное поле в сертификате. Поэтому, в случае с dane.nox.su, Chrome выдаёт предупреждение о “плохом” сертификате. Надеюсь, что по мере развития технологии, всё нормализуется и будет один стандарт.
Комментарии (11) »
Новый