Pull to refresh

Comments 43

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

Из альтернатив тут только использование сертификатов SSH (подчеркну: не ключей — сертификатов), распространяемых отдельно. Такое решение лучше масштабируется и не требует внедрения DNSSEC. Вот руководство, правда не очень свежее: www.digitalocean.com/community/tutorials/how-to-create-an-ssh-ca-to-validate-hosts-and-clients-with-ubuntu
Да, и как раз именно этим можно обезопасить первое подключение: ссш открывается только тому клиенту, который присылает нужный пакет. Для остальных, в основном, даже не видно, что порт назначен для ссш. После того как я настроил fwknop боты фактически сканируют впустую.
Смысл статьи в противоположном: защитить не сервер от левых клиентов, а клиентов от подложного сервера. Ситуация такая: клиент делает первое подключение, он ещё не знает, какой у сервера должен быть host key. Первый раз обычно мы просто его принимаем на веру, не зная, к кому подключаемся на самом деле. А вот с DNSSEC можно опубликовать подписанную запись, какой должен быть ключ.
Рассмотрим схематичную связку — fwknop && ssh — если не прошел fwknop, то это ложный сервер и ssh не начинается.
Во-первых, как Вы узнаете, прошёл он или нет? Там отправляется с клиента один UDP-пакет больше ничего. Можно узнать только если порт UDP закрыт.

Во-вторых, это никак не поможет защитить само TCP-соединение от перехвата. Атакующий может даже и не знать про какой-то там fwknop — он просто зарулит соединение SSH себе и всё. А SPA-пакет fwknop спокойно дойдёт до сервера, и сервер может его даже получит и что-то там откроет.
У fwknop на сервере есть возможность отсылать на мейл сообщения на открытии и закрытии доступа.

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

речь о fwknop, а не о простом кнокинге.
На сколько понял, SSHFP запись просто предоставляет в открытую fingerprint и не работает если домен не поддерживает DNSSEC?
А почему не использовать обычную TXT запись?
Если не использовать DNSSEC, то запись не подписана и может быть так же подменена по пути.

Вопрос почему это сделали отдельным типом записи — хороший вопрос, могли по идее так же пихнуть ключ в TXT-запись, защищённую DNSSEC.

Из альтернатив тут только использование сертификатов SSH (подчеркну: не ключей — сертификатов), распространяемых отдельно. Такое решение лучше масштабируется и не требует внедрения DNSSEC. Вот руководство, правда не очень свежее: www.digitalocean.com/community/tutorials/how-to-create-an-ssh-ca-to-validate-hosts-and-clients-with-ubuntu
VerifyHostKeyDNS yes

Этого недостаточно. У SSH-клиента должен быть резолвер, валидирующий DNSSEC. В общем случае это не так.

Да, об этом сказано в конце.

Это довольно нетривиальная часть — речь не просто о системном резолвере, а буквально о резолвере в локалке, который тоже должен поддерживать и валидировать DNSSEC. Если компьютер переносной, то придётся использовать что-то вроде dnssec-trigger. Либо иметь ssh, собранный с поддержкой ldns и unbound-anchor.

Довольно громоздко получается в результате, я бы сказал.
А в чём заключается проблема, которую решают? Лень проверять fingerprint сервера? Потому как для получения пароля или для передачи своего публичного ключа нужно уже иметь доверенный канал связи. Почему по этому каналу стандартно не запрашивать fingerprint? Если нам это лень сделать, то почему нам не лень найти ОС и SSH-клиент, которые поддерживают SSHFP, настроить DNSSEC, изменить конфигурацию по умолчанию SSH-клиента?

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

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

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

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

Не очень понимаю как. Ключ передаётся по одному каналу, а сообщения потом идут по другому же.

Не очень понимаю, где вы видите другой канал, разве что в середине, на просторах «большого» Интернета, и то магистральные провайдеры могут быть одни и те же, не говоря уже про СОРМ и прочие системы, которые могут и на многих провайдеров распространяться.

Запустите traceroute с вашего рабочего места до SSH-сервера, а затем запустите traceroute с рабочего места (или, скорее, почтового сервера вашего предприятия) до следующего(-их) hop на пути e-mail и от администратора SSH-сервера до последнего или пред-последнего почтового сервера, через который прошла почта. Каждый совпавший hop в traceroute даст вам некое представление о количестве мест где и ваш e-mail трафик и SSH-сессии могут перехватить. На самом деле, таких мест значительно больше, если учитывать L2-оборудование и даже физические L1-каналы. Как минимум, это оборудование провайдеров вашей компании и компании, где размещён SSH-сервер, но, в большинстве случаев, там ещё масса неявных мест, вроде магистральных провайдеров между городами, IX-точек и т.д. Также, достаточно вероятным вектором (развития) атаки будет взломанное оборудование вашей компании или контрагента.

Более того, как я написал выше, одним из типов атаки будет подмена вашего публичного ключа в e-mail и заход со своим ключом на SSH-сервер, для этого вообще больше ничего перехватывать не надо, только e-mail.
Первое, что хочу сказать — автор молодец, что поднимает такие темы. Этот кейс действительно игнорируют множество разработчиков. Что касается самого способа, то он предназначен больше для случаев, когда надо ходить на большое количество хостов через публичную сеть. Для стандартной схемы с бастион-хостом конечно проще проверить отпечаток самостоятельно один раз и разместить known_hosts файл в репозитории с инструментами управления.
sudo ssh-keygen …

Зачем sudo, публичные части ключей и так кто угодно читать может ;)

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


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

Для пользователей, которым плевать на безопасность, и которые не хотят на неё вообще что-то тратить ("нажимаем Yes не задумываясь", "ведь никто не станет проверять ключи, а будет просто всегда соглашаться"), это всё действительно несколько её увеличит. А те, кому не плевать, будут сверять ключи с полученными по действительно надёжному каналу, который не подвержден перехвату третьими сторонами (DNSSEC, как и общепринятый SSL для сайтов, таковым очевидно не является).

надёжному каналу, который не подвержден перехвату третьими сторонами (DNSSEC, как и общепринятый SSL для сайтов, таковым очевидно не является).

Не понял:


  1. Я использую DoH или DoT
  2. Я выполняю в теминале:
    a)

dig . DNSKEY | grep -Ev '^($|;)' > root.keys

b)


dig +sigchase +trusted-key=./root.keys babai.ru SSHFP | cat -n

и получаю в ответ: "Ok this DNSKEY is a Trusted Key, DNSSEC validation is ok: SUCCESS"


c)


ssh -v root@babai.ru

и получаю в ответ: "found 6 secure fingerprints in DNS"


ГДЕ, ЧТО и КАК здесь подвержено перехвату ?

Такой пример. У меня есть мгтс и мтс в планшете. Я могу DoT делать по одному каналу, а ssh по другому. Как пример.

Ну нет, у настоящего параноика стоит в системе stubby и по-любому каналу DNS будет секурно :)

По любому. Без тире.

У меня DNS over TLS от Android 9.

Всё и везде.


dig. DNSKEY

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


dig +sigchase +trusted-key=./root.keys babai.ru SSHFP | cat -n

Если я правильно понял, эта команда проверяет, что SSHFP-запись домена babai.ru подтверждена ключом, полученным на прошлом этапе. Очевидно, тут имеется третья сторона (владелец того самого ключа рут-зоны — ICANN наверно? а может ещё цепочка CA, не особо в курсе их организационной структуры), которая может своим настоящим ключом злонамеренно или по ошибке подписать подложную SSHFP-запись для mitm-атаки.


ssh -v root@babai.ru
found 6 secure fingerprints in DNS

Даже если прошлая команда не подверглась уже описанным атакам и подтвердила настоящую легитимную SSHFP-запись, полученную с помощью сделанного ей DNS-запроса про домен babai.ru, это не гарантия того, что аналогичный DNS-запрос, сделанный ssh-клиентом (хотя стоит отметить, что в зависимости от настроек dns-кеша и прочих обстоятельств этого второго запроса может и не случиться, но это частный случай), вернёт ту же SSHFP-запись. То есть может выйти так, что dig получит и проверит легитимную запись, а второму запросу (от ssh) отдадут уже подложную.


Итог: вы, если хотите, можете доверять используемому вами DoH-серверу и вообще официальной DNS-инфраструктуре, но надо понимать, это это именно осознанное доверие третьей стороне, снижающее безопасность p2p-соединения. Даже если этой третьей стороной является какая-то крупная известная организация, которой вроде бы незачем вас атаковать, данный риск всё равно должен держаться в голове.


Все эти шифрования и pki защищают только транспорт, а от злонамеренного агента на той стороне они никак не защитят. Как минимум одна "та сторона" неизбежна — это сам сервер, к которому подключается ssh, а вот от всего остального можно избавиться.

  1. Вы всё написали правильно, но если я просто параноик то вы гуру-параноик (в хорошем смысле этого слова) :)
  2. В "обычной" жизни когда я с одного своего сервера поключаюсь к другому своему же серверу по ssh (разумеется вход по ключу а не паролю) я считаю надписи "found 6 secure fingerprints in DNS" достаточно для моего спокойствия что я попал куда надо. Я всё таки Google/Cloudflare (DoT, DoH) и рутовым держателям ключа Dnssec (ICAAN) таки доверяю.
  3. Всё равно спасибо учитель за такой сверхпараноидальный взгляд — мне есть ещё куда расти :)
Теперь IANA, а не ICANN. www.iana.org/dnssec
ещё цепочка CA

Именно, только не CA, а иерархическая зональность, т.е. "." (Root), com., example.com.
Далее вот как выглядит корневая зона, зона точка. www.internic.net/domain/root.zone

Там есть два ключа, zone signing key и key signing key (ZSK и KSK). В зоне есть DS записи с ID ключами, которому зона доверяет (com., например). Вот так.
По опыту эксплуатации пробовал sshfp и CA для ssh. Увы проблема подтверждения отпечатка сервера для виндовых клиентов с putty не решается этими технологиями. Если кто-то знает как это решить буду очень признателен.
Запретите на сервере аутентификацию по паролю и тогда, когда все будут использовать только аутентификацию по публичному ключу, никаких рисков в виде MITM не будет. Вот подтверждение. Все будут только в выигрыше.

Прочтите пожалуйста ещё раз статью, вы абсолютно не поняли ни её суть, ни суть моего комментария.

Вопрос в MitM во время первого подключения к серверу, а не использование на стороне клиента метода аутентификации через пароль или ключ (или сертификат).

Вы написали про то что мы можем перейти на ключи (что нормальные люди уже сделали, в отличии от вас наверное), но это не отменяет MitM на пути к серверу при первоначальной установке соединения (в современных системах часто используются облачное создание виртуалок буквально двумя кликами).

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

Независимо от того используете вы пароль или ключ, соединение будет скомпрометировано.
А вот это неверно, о чём и была заметка, ссылку на которую я дал. Злоумышленнику не удастся стать посредником и вклиниться в сессию. Ему никак не получить таким образом доступ к серверу, потому что подпись для авторизации охватывает идентификатор сессии, а он в свою очередь выведен из общего секрета, согласованного через DH.

По поводу хамства выше я хочу сказать, что вы не поняли о чём речь, но априори считаете собеседника идиотом. В данной ситуации всё вышло ровно наоборот.
Из заметки же ясно, что DH согласование соединения влияет на идентификатор сессии и именно это мешало злоумышленнику иметь неограниченное влияние на соединение. Однако злоумышленник всё ещё может получать данные от клиента и их утечка бОльшая проблема, чем доступ на новый сервер, на котором возможно ничего и нет полезного.
В том, что речь не про MITM, а про подмену целевого хоста.
В windows 10 есть OpenSSH. Из коробки.

Не из коробки, надо отдельно ставить, но перевести парк с другими версиями винды в крупных компаниях не получится так просто.

Это компонент windows. По факту как из коробки. Или вам сложно зайти в установка/удаление компонентов windows?
Не у всех есть админские права)
Sign up to leave a comment.