cat_mucius: (Default)
О блин. Мечтал, как бы организовать контроль исходящего трафика для удалённых виртуальных десктопов - а решение, хоть и неудобное, валялось под носом. Обыкновенный "Windows Firewall with Advanced Security", что на каждой винде стоит, умеет разрешать или запрещать открываемые соединения в зависимости от личности юзера, в том числе и по группам в Active Directory.



То есть можно приготовить GPO со всеми правилами - скажем, только группа OURDOMAIN\SQL_Admins может подключаться к серверам баз данных - приложить его к OU с машинами, входящими в пул удалённых дескпотов, и готово.

Недостатки:

- Невозможность задавать destinations, к которым открываем или закрываем доступ, иначе чем по IP-адресам или IP-диапазонам. Никаких имён или тем более групп, которых можно было бы использовать в множественных правилах, тут вам не чекпойнт и не фортигейт, всё примитивно как оглобля. Даже по именам DNS не задашь. Омерзительно. :-(

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

Кстати, идея для стартапа: сервис с графическим интерфейсом, позволяющий задавать объекты для хостов и сетей, объекты для сервисов, группы объектов с любой степенью вложенности, в общем, всё как мы любим - и генерящий на выходе такие вот GPO для Windows Firewall.
cat_mucius: (Default)
Вот пара вещей, которые бы хотелось иметь в цифровом мире:

1. Есть много систем, предоставляющих "удалённый рабочий стол" - RDS, Citrix, Azure Virtual Desktop, VMware Horizon... Они все, разумеется, проверяют юзерскую личность на входе. А вот интересно, какие-нибудь из них умеют регулировать трафик, исходящий с этих удалённых десктопов - причём не на основе заранее предопределённых адресов пулов, а на основе этой самой юзерской личности? Групп, к которой эта личность относится, ролей, ей предоставленных?

То есть, скажем, зашёл член группы SQL_Admins - и на здоровье, запускай удалённо SQL Studio и подключайся к своим базам данных. Зашёл кто другой - его трафик к SQL-серверам просто не пройдёт.

В идеале хотелось бы такое иметь не на виртуальных машинах (слишком большой overhead и в техническом, и в финансовом смысле), а на чём-то вроде контейнеров - им можно присваивать личные IP-адреса. Юзер подключается к такому контейнеру, гоняет внутри свои програмки, система автоматически ассоциирует IP контейнера с identity юзера и разрешает или запрещает трафик согласно правилам, базирующихся на этой самой identity, её группам, ролям и прочим критериям.

Есть что-то такое?
(Update: есть, причём на каждой винде!)

(Ну и если б эта самая identity и всё, с ней связанное, передавалась бы на дальнейшие файерволлы по пути, так вообще восторг).



2. Фича, которую хотелось бы иметь в мессенджерах. Вот, допустим, пишет мне некто "Здравствуйте, я Вася из компании ТяпЛяп!" Было бы очень полезно, если бы мессенджер при этом:
- показывал бы мне некий сертификат, выданный каким-нибудь удостоверяющим центром и доказывающий, что это и вправду Вася из компании ТяпЛяп (вариант: выданный ТяпЛяпом и подписанный тяпляповским сертификатом, который в свою очередь подписан центром);
- делал бы это лишь удостоверившись, что мессенджер-клиент Васи доказал владение приватным ключом к сертификату. В идеале удостоверяться в этом должен мой клиент, но даже если это будет сервер - тоже неплохо.

Ещё более замечательным было б, если б на основе этого сертификата между нами устанавливался канал end-to-end encryption, но даже в мессенджерах, где никакого end-to-end по настоящему нет, цифровое доказательство личности собеседника не помешало бы. Мессенджеры на этом зарабатывать бы могли: объявив ли эту фичу платной, или выступая в роли удостоверяющего центра.
cat_mucius: (Default)
У Микрософта нашли очередную дыру, и не абы где, а в святая святых, в домен контроллере. В общем, патчим, товарищи, не ленимся.




Там, похоже, читают мой бложик: cтоило обругать Azure Firewall, как в нём появилась именно та фича, которой мне и не хватало. :-) То есть можно указать в качестве destination любое имя, которое резолвится DNS в IP-адрес или список адресов, и Firewall разрешит (ну или заблокирует) соединение на любой из этих адресов, независимо от аппликативного протокола.

Но есть некоторая разница с Фортигейтом - для этой фичи Микрософт требуют превратить Azure Firewall в DNS proxy и настоятельно рекомендуют указать его внутренний адрес в качестве DNS-резолвера для всей живности, что будет через него свой трафик пускать. Делается это для того, чтобы минимизировать ситуации, когда Firewall резолвит то же имя в один список IP-адресов, а клиент - в другой.

Тем не менее, пока эта фича в preview и работает скорее теоретически. В моём опыте, примерно две трети соединений блокировались файерволлом даже тогда, когда он сам же клиенту список IP и резолвил. Правда, у DNS-имени, с которым я экспериментил, был очень короткий TTL, секунд в десять. Ну, будем надеяться, к запуску в продакшен её доведут до ума.




В связи с этими делами, стал стучаться в башку такой вопрос: поле Host в HTTP и SNI в TLS вводили, конечно, не ради файерволлов, а чтобы можно было множество сайтов на один серверный IP вешать. Но тем не менее, получилось довольно удобно, что теперь файерволл, работающий в режиме explicit / transparent proxy, может их использовать для сверки со своими правилами:
- и правила эти можно сделать гораздо более точными, чем если иметь для принятия решения лишь пару destination IP & port;
- и файерволл теперь может самостоятельно новое соединение к цели открыть, согласно собственному DNS lookup, независимо от destination IP в пакете, пришедшему от клиента;
- и заодно серверный сертификат может сверить на соответствие.

Так может стоит эту практику на прочие аппликативные протоколы распространить? Ну скажем, на NTP, IMAP, SMTP. Прописывать в явном виде "авторскую интенцию" - DNS-имя, на которое открывается соединение или посылается запрос.

В наш-то век облачных сервисов, когда то же DNS-имя переводится тем же самым DNS-сервером в разные списки IP в ответ на разные запросы, причём интервал между этими разными ответами может измеряться секундами, с традиционным файерволлом пытаться ограничивать исходящий трафик - практически безнадёжная задача, проще сразу "destination = ALL" прописать.

Из-за того иногда приходится прибегать к разным уродливым костылям, чтобы разрешить нужный исходящий трафик, не разрешая всё на свете. Ну, скажем, нужно позволить посылать письма через smtp.googlemail.com. Но поскольку даже если на файерволле можно прописать этот FQDN, по прежнему вероятна ситуация, когда клиент резолвнет этот адрес в IP1, а файерволл - в IP2 (даже используя тот же DNS-сервер!) и заблокирует соединение, то приходится идти на следующий некрасивый трюк: прописывать на внутреннем DNS-сервере (используемый ими обоими) зону smtp.googlemail.com с постоянным ограниченным набором IP-адресов - а дальше надеяться, что Гугл их в обозримом времени будет поддерживать в рабочем состоянии.




С другой стороны, это мне-то, решающему задачу ограничения исходящего трафика, это было бы удобно. Но вообще-то, это огромный вопрос - должен ли сетевой протокол быть дружелюбным к файерволлу или же напротив, максимально недружелюбным к нему - и вопрос этот политический. Если мы исходим из того, что государственная цензура - зло (а я так и считаю), то напротив, протокол должен быть как более непрозрачен, чтобы затруднить жизнь Великому китайскому файерволлу, Роскомнадзору и их аналогам. И тенденция идёт как раз в этом направлении - см. Encrypted SNI.

Наверное, дело решится настройкой, позволяющей клиенту запускать соответствующий протокол как в firewall-friendly, так и в unfriendly режимах. Корпоративные сети будут использовать первый, частные юзеры - второй. Серверам, по идее, должно быть всё равно.




Технически этот Encrypted SNI представляет собой раздражающий костыль. Давайте посылать юзеру шифровальный ключ в сертификате, а чтобы никто не догадался, какой именно сертификат (и сайт) запрашивается - разместим ещё один ключ в DNS, и пускай клиент свой запрос этим ключом шифрует. Блин, а почему б тогда сам первый ключ в DNS не разместить? А потому, что если враги его подменят, то это будет game over, а так они разве что увидят, на какой сайт юзер лезет. Хорошо, а по DNS-запросам они это не поймут? Поймут, но вот если юзер будет обращаться к заранее известным надёжным DNS-серверам, расположенным за границей, и само соединение с ними шифровать по TLS... Ну хорошо, а если враги запретят с такими серверами соединяться?...

В общем, похоже, пока моё старое предложение располагать крамольный сайт так, чтобы по хостнейму опознать его было нельзя, релевантности не теряет.
cat_mucius: (Default)
Внезапно пригодился генератор ругательств шекспировской эпохи, который когда-то доставленный [personal profile] el_d в Удел. Я на него перенаправляю незаконные запросы к API.



За последнее время много работаю с микрософтовым облачком, Azure - весь вокабуляр этого генератора очень хочется приложить к его, облачка, создателям. Там есть много что ругать - и невозможность переименовывать объекты, и скорость внесения изменений (вместе прекрасный эффект выходит: хочешь исправить опечатку - стирай-пересоздавай кучу всего, убей на это часа четыре) - но больше всего бесит сваливание ответственности за функционирование и безопасность платформы на пользователя.

Вот, к примеру, есть у них типа как изолированная среда для запуска веб-приложений, ASE. Заливаешь туда код сайта или вебсервиса, он автоматически размещается на каких-то закадровых виртуалках - и всё это в твоей изолированной сети. Сам регулируй доступ из и в эту сеть, направляй трафик по каким хошь маршрутам, ставь какие хошь фильтры - всё в твоих руках.

Звучит клёво. Да только при первой же попытке это построить натыкаешься на вот такущий список исключений, который ты обязан реализовать - и в раутинге, и в фильтрации - и все они относятся к общению между этим микрософтовским продуктом, ASE, и другими микрософтовскими же сервисами в том же Ажуре, и всё это общение должно почему-то проходить через твою типа частную сеть. Причём список этот максимально недружелюбен - не во всякий файерволл его и вобьёшь. Хочешь просто указать IP-диапазоны? - а хрен тебе. Нет, на тебе стопиццот хостнеймов, причём их один и тот же DNS-сервер будет резолвить в разное время в разный список IP-адресов. Мало тебе? - на ещё и wildcard-хостнеймы, которые файерволлу вообще указать нельзя, тут transparent proxy нужен. И причём отделить трафик собственно ASE от трафика живущих в нём приложений нельзя по определению - всё из того же сабнета.

А не реализуешь по списку - ну пожалуйста, либо у тебя дыра в безопасности будет, либо наш замечательный ASE возьмёт и сломается, сам будешь виноват, дурень.

И то же самое с каждым ихним изобретением - к каждому прилагается список УРЛов, без регулярного общения с которыми оно помрёт, хорошего вам настроения.

Какого чёрта? Почему я должен отвечать за связность микрософтовского продукта с микрософтовскими сервисами в микрософтовском же облаке? Почему нельзя вывести всю эту радость в отдельную сеть, оставив мне мой трафик? Доступ-то физических серверов к Windows Update вы же как-то осилили, не сбрасывая его организацию на клиентскую шею?

Подозрение, что это делается с целью заставить использовать Azure Firewall, не добавляет желания всем этим пользоваться. Файерволл, кстати, хороший, с фичей transparent proxy, частично удолетворяющих моим мечтаниям. Но есть и раздражающий момент: указать ему хостнейм, чтобы он сам его перевёл в IP-адрес или список адресов, нельзя. Фортигейт умеет, а он нет. Точнее, умеет, но лишь для тех протоколов, что поддерживает его proxy - HTTP(S) и MSSQL. А для всех остальных шиш, вбивайте по IP.

Ye roguish sour-faced cutpurses!
cat_mucius: (Default)
Задумался вот. Допустим, пишем мы вебсайт, к которому есть такое интересное требование - non-repudiation. То есть если юзер выполняет на нём некое действие - он не должен иметь возможности отрицать, что он его совершил, даже если сайт вместе со своей датабазою взломан вдребезги и пополам.

На первый взгляд, всё довольно тривиально - даём юзеру смарт-карту с секретным ключом, им подписывается тело любого POST- или PUT-запроса на сайт. Запросы сохраняются в лог и хранятся там, пока релевантность не отпадёт.

На второй - немного сложнее. Насколько я понимаю, не существует никакой возможности обращаться к ключам на смарткартах, TPM, Windows store и т.д. из бегущего в браузере JavaScript-а. И по хорошей причине - такая возможность дала бы недобросовестным сайтам выполнять операции с юзерскими ключами (подписывать или расшифровывать что-то) без ведома юзера. Даже если юзер должен разрешить доступ к ключу введением кода - ему неоткуда знать, как именно ключ используется, приходится полагаться на приложение.

Существует "Web Cryptography API", но он, насколько я понимаю, не позволяет обращаться к смарткартам и прочим устройствам PKCS#11 - он позволяет генерить ключи прямо в браузере и хранить их в local storage и т.д. Защитой, необходимой для non-repudiation, такие ключи не обладают.

Существует также проект "Web eID", который позволяет это ограничение обойти за счёт установки расширений к браузеру - но он предполагает, насколько опять же понимаю, доверие к сгруженному с сервера Джаваскрипту, а нам именно это Заратустра и не позволяет.

Таким образом выходит, что клиентская часть должна быть обычным десктопным приложением и её логика не должна задаваться на серверной стороне. Так ведь?



Ну а для контента, выдаваемого сервером, организовать non-repudiation не в пример легче, и не дорого - генерим неизвлекаемый ключ в каком-нибудь online HSM, скажем, в том же Azure Key Vault, и подписываем отсылаемые файлы.



То, что смарт-карта не должна позволять экспорт ключей, тривиально - а вот есть ли смарт-карты, не разрешающие также и импорт? Чтобы ключ можно было бы сгенерировать лишь в ней, и быть уверенным, что он существует лишь в единственном эксземпляре?
Это свойство и для аутентификации полезно, но для non-repudiation - особенно.



Даже и в этом случае хитрый юзер мог бы отпираться "я не я и корова не моя" - мало ли что в сертификате написано, может, админ CA сам его себе на моё имя выписал. А смарткарту и потерять можно. Способ это побороть - заставить расписаться (ручкой по бумажке) при получении смарткарты, с указанием thumbprint сертификата - для каждого ключа уникального. Ну или использовать такие карты, от которых особо не пооткрещиваешься, типа нового израильского "биометрического" удостоверения личности - хоть там косяков и полно.
cat_mucius: (Default)
Azure Key Vault - очей разочарованье. Читаешь - вау, круто, хардверная защита, неэкспортируемые ключи, файерволлы, managed identities, access control!
Вникаешь в детали - и тут же выясняется, что для SSL защита ключей нерелевантна. Потому что то, что реально происходит, это:
- сертификаты с секретными ключами просто сохраняются где-то на диске,
- ажурные виртуалки, на которых бегают App Services или App Gateways, попросту переписывают их себе - вместе с ключами - и используют локально.

Таким образом:
- HSM вообще не при делах,
- да и импортировать ключ в этот HSM тоже нельзя - только сгенерировать внутри (поправка: не точно, но для того требуется исходный HSM, так что один хрен),
- да и просто сохраняемый на диске software-protected key тоже экспортируемым быть обязан - иначе для SSL он неприменим. То есть любой, имеющий доступ к Key Vault, его скачает без проблем.

Умом, впрочем, и так понимаешь, что не могёт того быть, чтобы для любой новой SSL-сессии к HSM обращаться - а всё одно обидно.
cat_mucius: (Default)
Подрядился пофрилансить - построить облачную инфраструктуру под мемориальный сайт "Мучеников Аль-Аксы". Что скажете, где лучше разместить - в Azure, в Амазоне, ещё где? Израильские облака, понятно, лучше не использовать.
cat_mucius: (Default)
Нашёл ответ на давно мучивший меня вопрос, который, я уверен, и вам покоя не давал, дорогие читатели - почему в виртуальных сетях микрософтовского облачка, Azure, нельзя передавать любой трафик, что не на unicast IPv4. Не значит ли это, что у них там не привычный Ethernet, а что-то своё эзотерическое?

Ну в общем-то да.
cat_mucius: (Default)
Вот, скажем, ElasticSearch. Для того, чтобы избежать ситуации split brain, надо конфигурировать три узла - чтобы при потере любого из них оставшиеся смогли выбрать главного. Допустим, один из них может не хранить данные, а только участовать в выборах - но это всё равно процесс, который надо где-то гонять.

А если у меня есть WSFC (Windows Server Failover Cluster) о двух серверах + witness (общий диск или общая папка на третьем хосте), то почему бы не гонять ElasticSearch как "роль" на этом кластере? Это ж просто Windows service, в конце концов. На одном сервере опустили - на другом тут же подняли. Нужен общий диск для данных, конечно, что будет мигрировать вместе с сервисом.

Да, не будет распределения нагрузки и будет некоторый downtime во время фэйловера. Но если это пофигу, то вай бы и нот, действительно?

Update: не, для узлов с данными идея плоха. Фэйловер-то отрабатывается гладко, но только активация шардов может занять кучу времени, во время которого кластер будет в red state.

Зато если у нас есть узел кластера, который занимается исключительно выборами мастера или становится мастером сам, но данных не содержит - то его посадить на WSFC вполне реально. Фэйловер занимает секунд 15, и никому от этого плохо не становится - максимум роль мастера перейдёт к другому узлу.

Если у нас есть множество кластеров ElasticSearch о двух серверах, то можно создать один такой центальный WSFC, который будет гонять множество таких вот "master-only" узлов - один на кластер.
cat_mucius: (Default)
В продолжение этой темы: если бы мне нужно было сдизайнить сеть типичной компании с нуля, то, думаю, у меня вообще не было бы понятия "корпоративный LAN / вайфай". Был бы Private VLAN, из которого доступ был бы исключительно на VPN gateway (ну или ещё на Интернет, если мы хотим принимать гостей). Любой доступ к внутренним серверам компании - через VPN.

(Что куда лучше 802.1x, который предоставляет аутентификацию, но не защищает от перехвата трафика, его подделки, replay attacks).

Таким образом и любой трафик за пределами серверной комнаты защищён шифрованием, и правила доступа полностью привязаны к юзерской identity и её принадлежностям к разным группам, и user experience одинаковый, где бы юзер не находился - на работе, дома, в кафешке.

А если при этом для аутентификации использовать ключи в чипе TPM, то можно опознавать не только юзера, но и девайс, с которого он подключается, и строить политики по обоим этим критериям. Если какой-то станции нужен доступ для процессов, не связанных с конкретным юзером (скажем, Windows service) - никаких проблем, вводим правило лишь по девайсу. Опять же, ключ неизвлекаемый - им не поделишься, как паролем, его не потеряешь, как смарткарту (только вместе с устройством).

В общем, ye olde plain IP - лишь до VPN-гейта, а поверх - туннель, и между файерволлами - туннели, туннели, сорок тысяч одних туннелей.

Да, и каждый сервер - в собственный VLAN. Чтобы любой трафик через файерволлы тёк.
cat_mucius: (Default)
Накатал много букв с картинками по поводу своих облачных странствий и изысканий - как построить высокодоступный файлсервер без общих дисков. Авось кому из братьев-админов и пригодится.

Поправки, замечания, идеи - всё приветствуется.

Попутно хочу поблагодарить продакт-менеджеров корпорации Микрософт - эти славные люди взяли две абсолютно разные про природе и функциональности сущности и обозвали их одинаково - "witness". При том, что обе имеют отношение к Failover Cluster, и обе - к shared folders. Чтобы жизнь мёдом не казалась, очевидно.
cat_mucius: (Default)
Пришла в голову идея объеденить два VLAN-а в разных облачных датацентрах в один - прокинув между ними туннель VXLAN. Чтобы Ethernet-фреймы между ними ходили, как у себя дома.

Сказано - сделано: разобрался, как это делается на Фортигейте, для пущей безопасности пустил VXLAN поверх IPsec. Сценарий с NAT документирован не был, но ничего, скумекал. Ура, заработал мой туннель. И не успел я возликовать, как получил лопатой по всей морде. Облачко-то на VMware, ограничивает каждую виртуалочку её собственным MAC-адресом, и изменить это возможности не даёт. Стало быть, если мой Фортигейт начнёт вдруг фреймы от других машин передавать, то их жестокий vSwitch выкинет, и конец делу. Элементарная же штука, сто лет её знаю - а вовремя не сообразил. Ну хоть конфигурацию в технобложик задокументировал, и то хлеб.

Попутно это дело зарезало мне ещё пару-тройку идеек. Мир их праху.

Но до чего ж обидно, а! Посылает, скажем, виртуалка ARP-запрос. Фортигейт его принимает, инкапсулирует в VXLAN, шифрует IPsec-ом, суёт в UDP-пакет для NAT traversal, внешний раутер меняет source IP, пакет через ещё надцать раутеров добирается до дальнего датацентра, там всё это декапсулируется обратно, удалённая виртуалка посылает ARP-ответ, тот проходит весь этот путь в обратном направлении - и вот когда осталось Фортигейту своему соседу по VLAN-у ответ вручить, вмешивается таможня и выкидывает его нафиг. Эх.
cat_mucius: (Default)
Давно я Микрософт не ругал.

Понадобилось тут прокинуть site-to-site IPsec-туннель между FortiGate и Windows-сервером. Документации по такому сценарию нагуглилось ноль, пришлось действовать методом проб и ошибок. Благодаря сниффингу, дебаггингу и молитвам к известной матери построить таки получилось - см. описание в технобложике. Но до чего ж я в процессе пыли нажрался, и всё благодаря замечательным качествам Windows RRAS (Routing & Remote Access Service).

Сюрприз первый - ограничить принимаемые сертификаты от второй стороны только выписанными определённым CA нельзя. Можно жмякнуть по галке "Verify Name and Usage attributes of the server's certificate", и на этом всё. То есть да, будет проверено, что в сертификате значится хостнейм, к которому мы обращаемся, что сертификат не протух и что он подписан валидным CA. Да только этих валидных CA на любом Windows - несколько десятков!

То есть если между двумя сторонами сидит хакер, который может направить трафик на адрес Фортигейта на свой сервер (через DNS ли, через раутинг ли) - то он может как нефиг делать получить на этот хостнейм сертификат от LetsEncrypt, с их-то смехотворной верификацией. И затем выдавать себя за Фортигейт. Подключиться к Фортигейту от имени RRAS ему не выйдет - Фортигейт-то как раз проверяет, какой CA удостоверил вторую сторону. Но если обе стороны - Windows, то вот вам полноценный рецепт на man-in-the-middle.

В общем-то, эта проблема касается практически всех VPN-клиентов для рабочих станций, но для гейтов, связывающих сети разных организаций, хотелось бы большего.

(Справедливости ради, Windows позволяет использовать поверх IPsec протокол EAP, а вот там-то CA ограничивать можно. Но:
  • это усложняет инфраструктуру - нужен RADIUS (и проверяется сертификат именно RADIUS, а не VPN-гейта)
  • документации по такому использованию EAP у Фортинета примерно ноль, но в этом не Микрософт виноват,
  • это поверх - уже после аутентификации IPsec; проверяет оно юзера, и клиентский сертификат должен сидеть в профиле юзера. Как это заставить работать с автоматическим подключением RRAS? Может, если запустить certmgr.msc под SYSTEM и импортировать туды, то и выгорит...
    В общем, дикие траблы. Скорее всего, не взлетит. Да и точно ли это устраняет MiTM?)

    Этого можно было бы легко избежать, попросту перейдя с сертификатов на pre-shared keys, однако тут нас ждёт сюрприз второй - это работает примерно с десятого раза на двадцатый. Подозреваю баг. Девять раз получаешь "authentication failed", на десятый неожиданно подключаешься. Забиваешь PSK заново - сразу подключаешься; если отключишься, то по новой. Причём, похоже, работает только если сессию инициирует Фортигейт.

    Сюрприз третий - назначить статический адрес диал-ап интерфейсу нельзя, настройки игнорируются. Because fuck you. В какой-то момент получилось через "netsh interface ipv4 add address", потом снова обломись.

    Сюрприз четвёртый - банальный forwarding между LAN и туннелем раз работает, а раз нет. Почему - понять не удалось.

    В общем - если рассудок и жизнь дороги вам, держитесь подальше от торфяных болот.
  • cat_mucius: (Default)
    Настраивал давеча в одной сеточке синхронизацию часов и был поражён, внезапно обнаружив, что в il.pool.ntp.org не осталось ни одного IP-адреса. Совсем недавно была парочка, а теперь всё.

    В Израиле публичных NTP-серверов не дофига. Попытался использовать сервер Israel Internet Association, timeserver.iix.net.il - но и тут вышел облом. Он, похоже, лишь израильские IP обслуживает - а у моей сеточки, так уж вышло, они значатся как зарубежные. Плюнул и пошёл тянуть время с иностранных серверов.

    Всё-таки, мне кажется, должен быть какой-то минимум сетевых служб, которое приличное государство должно поддерживать для своих жителей - без тоталитарных попыток заставить пользоваться только ими, и без дурацких попыток ограничить доступ к ним лишь определённым сетям. Я бы в перечень включил DNS, NTP, e-mail и службу аутентификации, IdP.

    Всё ж таки ситуация, когда огромное количество организаций, включая государственные, полагаются на гугловский DNS 8.8.8.8 как на главный и зачастую единственный источник, нездоровая.
    cat_mucius: (Default)
    Скажите, мне одному кажется, что схема верификации, которую использует LetsEncrypt - это издевательство над логикой?

    Работает так:
    * клиент хочет сертификат для сайта example.org;
    * пускай он разместит нечто по адресу http://example.org/some/path - мы это нечто проверим, и если оно окажется тем, что мы ожидаем увидеть, то это послужит доказательством того, что юзер - законный владелец этого имени хоста и вправе получить на него сертификат.

    Но ведь это же абсурд. Сертификат нам затем и нужен, чтобы удостоверять подлинность сайта - как же можно считать обращение к сайту доказательством его подлинности, когда сертификата ещё нет?

    Да, они там важно надувают щёки, что дескать все посылаемые значения криптографически заверены - но откуда берётся это доверие изначально, как можно знать, что чувак, зарегистрировавшийся в LetsEncrypt с каким-то там личным ключом и подписавший им это самое нечто, вообще имеет право на этот сайт?

    И если ни личный ключ, ни запрос на сайт не доказывают ничего, то как может являться доказательством их гибрид?

    Для того, чтобы оценить маразм идеи, достаточно знать следующее: в новой версии Google Sites при создании сайта с custom domain Гугл автоматически выписывает ему сертификат от LetsEncrypt. Автоматически. LetsEncrypt у держателя домена не проверяет ничего. Сразу выдаёт сертификат Гуглу. Всё. Совершенно не нужно ничего понимать в криптографии, чтобы понять, какая это профанация.

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

    Да, более традиционные процедуры domain validation тоже не лишены слабых мест: и создание DNS-записей с рандомальными значениями, и уж тем более получение мейла на адрес вида admin@example.org. Но то, что позволяет LetsEncrypt - это man-in-the-middle как он есть. Это не безопасность, это сапоги всмятку.

    Поразительно, сколько админов в Сети радостно пишут: сертификаты! бесплатно! бежим брать! - совершенно не задаваясь вопросом, что именно те сертификаты удостоверяют. Бесплатный сыр удивительно эффективно отключает мозги.
    cat_mucius: (Default)
    Зашёл почитать, что новенького есть в новой версии шифровального протокола TLS, в девичестве SSL (которая скоро будет использоваться всякий раз, когда мы жмём на линк с https:// и во многих, многих других случаях) - и был крайне сильно шокирован. Прямо в RFC, официальном документе, описывающем протокол, открытым текстом признаётся, что он подвержен replay attack, и что борьба с этим - ответственность разработчиков серверного приложения: вот вы, мол, и постройте систему так, чтобы это было неважно.

    О чём вообще речь? )
    Почему это возможно в новой версии TLS? )
    Что предлагается? )
    Почему это скверная идея? )
    Частный случай )

    В общем, брат-админ, где фичу 0-RTT увидишь - там её и прибей.

    P.S. Полезные ссылочки: 1, 2, 3.
    cat_mucius: (Default)
    За последнее время много вожусь с IaaS-облаком; хочется излить несколько наблюдений, как подходы, принятые в обычных, невиртуализированных системах некритически переносятся в облачную среду:

    1. Неоднократно наблюдал, как на облачных серверах баз данных или там Exchange люди привычно ставят диск для баз, и отдельно - диск на transaction logs, думая, что это улучшит производительность. Да с чего бы? На обычном железе в этом был простой, понятный смысл: на диске баз данных считывающая головка может прыгать между секторами как угодно, а на диске логов будет большую часть времени просто записывать в хвост. Соответственно, лучше, чтобы диски были разные.
    Но зачем это делать в облаке, где все эти диски - всего лишь файлы на датасторе? Если они хранятся на одном и том же физическом хард-диске - ну так значит, он обречён крутиться псевдорандомально. Но даже если мы разнесём их на разные хранилища - один чёрт каждое из них используется тучей прочего народу. Предсказать, как реально будут крутиться хард-диски в этих хранилищах - абсолютно невозможно.

    Впрочем, по мере ухода магнитных дисков этот вопрос отпадёт окончательно. Хотя и тогда по инерции админы будут разносить базы и логи - у нас так заведено.


    2. Продолжая тему дисков - объясните мне кто-нибудь, а какой смысл в локальных дисках в облаке? Почему не определить любой, или хотя бы любой data disk как shared? (Шишков, прости...) Это в физическом мире у нас есть либо SAN, либо просто SCSI-кабель к дискам, который больше чем в один компьютер не воткнёшь. А в виртуальном какая разница, какое устройство эмулировать - SCSI-контроллер или HBA какой-нибудь? Один чёрт наши диски - просто файлы на каком-то датасторе.

    Сегодня облака shared disks обычно не предоставляют, и поэтому, чтобы завести какой-нибудь кластер на виртуалках, который их требует (да хотя бы файлсервер на микрософтовском Failover Cluster) нужно сооружать дикие турусы на колёсах. А как было бы просто: кликаешь в облачном портале мышкой пару раз - вот тебе виртуалка с диском. Кликаешь ещё - вот тебе вторая, третья, восьмая виртуалка, и все видят тот же диск. А дальше дело твоё, как их координировать: либо только главный сервер кластера юзает диск, либо ставь файловую систему, поддерживающую доступ со многих, типа VMFS или GFS2.


    3. VLANs и, шире говоря, Ethernet вообще. Как-то упускается из виду, что в обычных локальных сетях broadcast domains существуют не от хорошей жизни, а оттого, что каждый компьютер в порт файерволла не воткнёшь. Хотелось бы инспектировать трафик между любыми двумя хостами - но что делать, свитчи функциональностью современного файерволла не обладают, а если такие и есть, то цена у них заоблачная, pun intended. Поэтому, если не хочется угробить производительность, приходится разбивать сеть на какие-то секьюрити-зоны, отказываться от возможности фильтровать трафик внутри них и удолетворяться фильтрацией между ними. Кроме того, VLAN-ы позволяют с лёгкостью гонять групповой и широковещательный трафик.

    Но это не то, что я хотел бы от облака! Там-то мне возможность фильтровать трафик между двумя любыми машинами гораздо чаще пригождалась бы, чем преимущества broadcast domains.

    Пример: допустим, у меня классический расклад - 20 вебных фронтэндов, за ними SQL Server. По логике секьюрити-зон, мне надо засунуть фронтэнды в один VLAN, SQL - в другой, и контролировать трафик между ними. Но тогда фронтэнды могут между собой неограниченно общаться - а зачем мне это надо? Им нужно говорить с HTTP-клиентами и с SQL-сервером, а друг дружке им что-либо передавать незачем.

    Тут пригодился бы Private VLAN, но облако такое не предоставляет. Наштамповать отдельный VLAN под каждый фронтэнд можно, но мы упрёмся в иные ограничения. Приходится сажать их в общий, а это лишний риск.

    Надо сказать, что Микрософт это как раз осознали - в Azure классического Ethernet-а нету, они там наворотили что-то своё на Layer2 (апдейт - таки да). В результате можно фильтровать трафик между любыми машинами, даже если они сидят в одном сабнете - но любой неюникастовый и, шире, любой не-IP трафик не поддерживается. По-моему, выбор в правильную сторону.


    А у вас какие наблюдения?
    cat_mucius: (Default)
    У аутентификации по клиентским сертификатам есть множество ограничений, из-за которых она редко используется:
    - общая сложность для понимания и настройки,
    - сложность с управлением ключами, особенно когда юзеру надо ходить с нескольких устройств, с их обновлением,
    - сложность с отзывом сертификатов, необходимость держать доступными точки CRL и OCSP, что может быть довольно геморройно, если у нас не общий Интернет, а изолированые сети,
    - нельзя защитить часть сайта - скажем, чтобы https://hostname/public был доступен всем, а https://hostname/private требовал сертификата для опознания юзера. Точнее, этого результата можно добиться, но лишь при применении определённых хитростей.
    - отсутствует нормальный logout - для того, чтобы сайт перестал тебя опознавать, надо полностью закрывать браузер (или изначально заходить в incognito-окне).

    Но есть одно крутое преимущество - по сравнению с другими методами логина поверх SSL, она сильно усложняет проведение атаки man-in-the-middle, она же SSL interception. Вплоть до "вообще никак".

    Подменить серверный сертификат на лету, при условии, что браузеры доверяют подменному, вполне тривиально - и есть организации, делающие это на регулярной основе: как для хороших целей (отлавливать всякую малварь), так и для менее хороших.

    Способов добавить сертификат в список доверяемых есть масса, начиная с домейновых group policies и windows update, и заканчивая малварью и банальной социальной инженерией. Более того, тот же Avast antivirus делает это просто по дефолту - добавляет сертификат своего типа-CA в "Trusted Root Certification Authorities" и расшифровывает трафик.

    Но когда требуется сертификат ещё и клиентский, то всё намного усложняется, посколько тогда система-перехватчик должна подменить и его тоже. А сервера куда недоверчивее в этих вопросах, чем браузеры. Им, как правило, просто указывают - сертификаты от этого CA и от этого принимать, а остальных лесом. К примеру, в FortiGate при создании PKI-юзера надо в явном виде задать и CA, которым его сертификат должен быть подписан, и что у этого сертификата должно быть в Subject. К тому же, тот может быть и вовсе самоподписанным. Тут не разгуляешься.

    А подменить серверный сертификат, не подменяя клиентский, посылая его как есть - не выйдет. У сервера банально циферки не сойдутся, на чём подключению и конец.

    Так что стоящая вещь, товарищи, пользуйтесь. :-)

    (Это я тут с админом одной сеточки пообщался - негодовал, что не может инспектировать наш SSL-VPN. Ну, мои тебе соболезнования, приятель. :-))
    cat_mucius: (Default)
    Понакидал в технобложик своих постов из внутренней вики - авось широкой публике пригодятся:
  • про то, как удобно настроить раутинг для VPN-клиентов TMG, мир его памяти. С картинками!
  • про то, как опознавать на Tomcat юзеров из Active Directory, используя Kerberos и LDAP - фактически, очень подробное продолжение этого поста,
  • и про то, как то же самое можно делать, заменив Kerberos на сертификаты. На самом деле, заменять они друг друга не обязаны, могут и дополнять.
  • cat_mucius: (Default)
    Коллега порадовал сообщением, что Whatsapp безопаснее, чем SMS, поскольку сообщения в нём шифруются. Верно, шифруются, и юзерам даже дали возможность ключи сравнить (прочие скайпы до таких высот не дошли).

    Да вот только беда в том, что шифрование это производится между клиентами, написанными Whatsapp, и серверами Whatsapp, по протоколам Whatsapp, и любая из этих составляющих может быть изменена в любой момент - включая саму схему этого шифрования, даже если на данный момент описана она аккуратно. Никакой ясности, никаких гарантий, никаких открытых протоколов и независимых способов верификации подписей на ключах не предусмотрено, здесь вам не SSL. Даже если проверочные циферки на обоих сторонах и сходятся - это не означает совершенно ничего.

    Поэтому когда компания гордо заявляет: да мы сами не можем расшифровать ваши сообщения, даже если захотим! - то это враньё в чистом виде. Для того, чтобы это было правдой, надо, чтобы любой желающий мог написать свой клиент Whatsapp с гарантией, что он будет работать, покуда он придерживается заранее определённых и открытых для всех правил. Точно так же, как любой желающий может написать свой клиент для электронной почты или для WWW. С возможностью для юзера проверить подпись на любом ключе самостоятельно, не полагаясь на честное слово программы.

    А пока эти заверения означают не больше, чем "мамой клянёмся, мы не подсматриваем". Если даже законодательство не обязывает компанию обеспечивать органы специально проверченными дырками для "lawful interception", полагаться всерьёз на это слово после Сноудена, Lavabit, и так далее...

    Разумеется, к iMessage, скайпу и прочим вайберам это всё относится в той же мере.


    Вообще впечатляет, насколько при мощных успехах опен-сорса на многих фронтах, безрадостна ситуация на рынке мобильных аппликаций. Особенно касаемо мессенджеров - децентрализации ноль, открытости ноль, полная зависимость от малого числа компаний. Феодализм, как сказал Брюс Шнайер.
    Page generated Jun. 15th, 2025 10:27 pm
    Powered by Dreamwidth Studios