Усиление SSH-соединения


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

Конфигурация традиционна: есть локальный SSH-клиент и удаленный SSH-сервер на базе OpenSSH.
Соединение между ними устанавливается, как говорится, с пол-оборота.
А как сделать его более криптостойким, выжимая из их конфигов по-максимуму и одновременно исключая нестойкие варианты?

Например, в http://books.google.com.ua/boo.....yBits%201024&f=false[link1] описан параметр
ServerKeyBits 1024
но тут же есть приписка, что это только для 1-й версии. А если не 1-й, тогда как?
И каковы пределы это битности?
И т.д. – в конфигах есть множество параметров и в то же время по ним нет рекомендаций.

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

Комментарии
— unknown (26/04/2014 19:11, исправлен 26/04/2014 19:34)   

ServerKeyBits 1024 — это размер эфемерного DH-ключа для протокола первой версии. Эту версию вообще можно отключить. С другой стороны, ключи размером больше 1024 бит для протокола второй версии могут тормозить, поэтому есть смысл перейти для DH на эллиптику и задать максимальный размер эллиптической кривой, например KexAlgorithms ecdh-sha2-nistp521. Более новые версии ssh поддерживают кривые не от НИСТа, а от DJB (Бернштейна), по мере продвижения поддержки имеет смысл перейти на них.


Можно задать фиксированный список хэшей и шифров. Посмотрите в man, в каких опция они встречаются и задайте максимальные параметры: SHA-2-512 И AES-CTR-256.


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


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


Настройте вход только по ключам без возможности войти напрямую по паролю. Это уже как раз потребует смены конфигов и на сервере. При этом сами ключи используются только для аутентификации при входе и подтверждения параметров DH, они не используются непосредственно для шифрования, поэтому их максимальный размер не критичен, что позволяет не завязываться в самих ключах на эллиптику. Можно задать ключ с максимально разумным размеров (RSA-4096).


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


На реальном сервере, даже по сравнению с виртуальным, в отличие от непредсказуемого пользовательского десктопа, с энтропией тоже не очень хорошо. Если сервер не виртуальный, а на реальном железе, то есть смысл поэкспериментировать с HAVEGE[link2]. Это относится не только к SSH, а к любым криптооперациям вообще.

Гость (26/04/2014 19:41)   
1.Отключить парольный вход


После этого аутентификация по сертификату

2. Увеличить битность ключа сервера. Использовать RSA, но не DSA. Просмотреть текущий и создать новый большего размера


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

3. Запретить вход root


Безопасней входить под обычным пользователем и потом повышать права из консоли.

4. Исключить прослушивание IPv6 интерфейсов (если они не используются)


5. Если на машине несколько IP-адресов, то лучше явно указать нужные, чтобы сервер не прослушивал все


Проверить можно командой netstat -pntl

6. Запретить пустые пароли и указать версию 2 протокола. Эти опции по умолчанию, но вреда не будет если их указать явно



Остальные опции по умолчанию вполне разумны.
Гость (26/04/2014 19:46)   
UPD: Аутентификация конечно по ключу, т.к. в SSH не сертификатов
— unknown (26/04/2014 20:15)   
2 — Гость (26/04/2014 19:41)[link3]:

Битность RSA ключа влияет на аутентификацию, а не шифрование. Грубо говоря, это просто подпись параметров. Если в будущем изобретут способ ломать ключи RSA ≥ 4096 бит, то они не смогут вернуться в прошлое и воспользоваться этим ключом. А если говорить про ранее записанный трафик, то его расшифровать не поможет взломанный в (не)далёком будущем ключ RSA.

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

Посторонние пусть каким-угодно способом пытаются влезть в связь с защищаемым SSH-сервером. Они просто не пройдут аутентификацию по RSA. А если они могут это делать, то без разницы, насколько стойкие сеансовые параметры шифрования ECDH/AES/HMAC выбраны — противник знает аутентифицирующие параметры, может делать MitM или сам входить на сервер.
Гость (26/04/2014 20:47)   

По моему мнению, делать RSA-ключи больше, чем 8192, неосмысленно. Если вы боитесь лобовой факторизации, то 3072 хватит на ваш век. Если вы боитесь прогресса в криптоанализе, надеясь выгадать время за счёт более длинных ключей, можно увеличить их до 4096 или даже 8192. Если же n-картное увеличение ключа, далеко выводящее их за пределы лобового брутфорса, вдруг перестанет спасать от новых методов критоанализа, то и n+1 кратное увеличение уже мало чем поможет, тут разумнее было бы алгоритмы менять или завязываться в асимметрике на несколько несвязанных алгоритмов (к примеру, брать протоколы, которые считаются квантовостойкими, и добавлять их к обычным так, чтобы если один из них окажется сломан, вся связка не пострадала; однако, это на отдалённое будущее, пока ничего такого толком не разработано и не внедрено).


Рекомендации ходить под пользователем ведут корнями в старинные инструкции 90-ых годов, где основной вектор угроз — подбор пароля по сети.

Раз вы всё равно будете потом повышать привелегии до рута, принципиального разделения между root'ом и обычным пользователем не будет. В частности, компрометация этого пользователя даст[link4] злоумышленнику доступ и к root-аккаунту.
Гость (26/04/2014 21:51)   
Рекомендации ходить под пользователем ведут корнями в старинные инструкции 90-ых годов, где основной вектор угроз — подбор пароля по сети.
Раз вы всё равно будете потом повышать привелегии до рута, принципиального разделения между root'ом и обычным пользователем не будет. В частности, компрометация этого пользователя даст злоумышленнику доступ и к root-аккаунту.

А ведь действительно! Сколько раз удивлялся и задавался вопросом, почему в Debian/Bubuntu изначально всё настроено под sudo?
Ведь если зашел под юзером, а потом переходишь на рута, то значит, разницы между таким входом и прямым входом рутом с точки зрения перехвата и декодирования пароля не существует, так ведь?
И если да, то почему никто до сих пор не отменил этот архаизм или хотя бы объявил его таковым?
Гость (26/04/2014 22:58)   

Потому что юзерофилия, а не безопасность, превыше всего. Кроме того, убунта — уже давно не айс[link5].

Изначально sudo предназначалось для того, чтобы дать возможность некоторым служебным процессам быть запущенными от имени нужного пользователя, у которого очень мало прав. Для root'а, однако, это проблемы не составляет — никакой su/sudo ему не нужен. В частности, у меня они вообще не установлены, и система работает на ура. Другой паразитный механизм повышения прав (а по сути — дырка в пользу удобства и в ущерб безопасности) — это суидность. Снятие суидности с особо борзых исполнимых файлов — полезное занятие, а иногда их можно вообще удалить без вреда для работы системы (это касается таких утилит как ping и ping6). Обсуждение[link6] этого с фанами sudo уже имело место, можете почитать.


Если без SSH, то, боюсь, повышение привелегий до рута ещё хуже, чем непосредственный логин под рутом, но могут быть нюансы. Если система не полностью скомпрометирована, то украть пароль рута можно, анализируя акустические сигналы от нажатия клавиш (прямого доступа к login-менеджеру нет). Если скомпрометирован конкретный юзер, из-под которого иногда бывает доступ к root-аккаунту, то такие сложности ни к чему — достаточно запустить нужный зловред с его правами.


А почему chroot & noexec[link7] не объявили таковыми? Вопрос, надеюсь, риторический.
Гость (26/04/2014 23:08)   

Жесть! Век живи -век учись...
Гость (26/04/2014 23:54)   


Что самое интересное, фанаты отказа от sudo подчистую слили в том обсуждении.
Гость (27/04/2014 00:23)   
В смысле? Не понял формулировку
Гость (27/04/2014 00:44)   
Битность RSA ключа влияет на аутентификацию, а не шифрование.

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

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

Разве выбор алгоритма при аутентификации (RSA или DSA) влияет на битность сеансового ключа? Насколько я знаю, для усиления DH-ключа используется файл /etc/ssh/moduli, создаваемый с помощью каких-то проверок утилитой ssh-keygen.

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

Согласен, не хватает опции типа


в /etc/ssh_config

Насколько понимаю, настройку параметров защиты можно разделить на четыре части
1. Аутентификация RSA – чем больше ключ, тем лучше
2. Параметры DH – создание файла /etc/ssh/moduli
3. Выбор алгоритмов симметричного шифрования
4. Настройка источника случайности

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

Когда определена переменная окружения SSH_USE_STRONG_RNG=N, при извлечении случайности из /dev/urandom подмешивается N байт из /dev/random (минимум 14). Понятно, что если увеличивать N, то по израсходовании /dev/random, соединение может зависнуть. Для устранения этой проблемы можно запустить на сервере демон типа rngd, но в качестве источника указать не /dev/hwrandom, а обычный файл. На стороне клиента собирать энтропию и кроном регулярно добавлять в файл.

Раз вы всё равно будете потом повышать привелегии до рута, принципиального разделения между root'ом и обычным пользователем не будет.

При сканировании SSH-серверов самый распространённый логин это root. Когда логин неизвестен, его нужно подобрать. Для нестандартного имени это аналогично подбору пароля, при том что количество попыток в единицу времени ограничивается настройками сервера.

Другая причина – невозможность установки трояна в автоматическом режиме. Нужно ждать когда будет вход с правами root.
— unknown (27/04/2014 01:20)   
К тому, что было сказано в /comment78982[link8] на стороне клиента в /etc/ssh/ssh_config можно прописать такие опции:


Если сервер не пускает, смотреть по ssh -vvv user@hostame, что ему не нравится и менять опции на стороне клиента в сторону совместимости с сервером. К сожалению, это всё равно показывает только подробности по DH, а насчёт ECDH показывает только, что оно установилось, но не показывает по какой эллиптической кривой. По мере выхода новых опций ssh, можно смотреть, что поддерживает сервер и добавлять на клиенте улучшенные варианты алгоритмов. На самом сервере лучше принудительно эти алгоритмы не задавать, чтобы не остаться без связи, если какой-то клиент их не может поддерживать.


Аутентификация не влияет. Влияет тип эллиптической кривой в KexAlgorithms.


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


CBC-режимы были уязвимы к BEAST атакам. Это пофиксили, но вроде такие режимы в ssh всё-равно не рекомендуются.


Костыльно очень. Вдруг что-то сбойнёт и в файл что-то не запишется? Или запишется что-то не то? Дважды запишется по-ошибке одно и тоже?


Хорошую энтропию посылаем через канал с плохой энтропией? И храним, пусть и временно, но в простом файле?

При сканировании SSH-серверов самый распространённый логин это root. Когда логин неизвестен, его нужно подобрать. Для нестандартного имени это аналогично подбору пароля, при том что количество попыток в единицу времени ограничивается настройками сервера.

Другая причина – невозможность установки трояна в автоматическом режиме. Нужно ждать когда будет вход с правами root.

При установлении аутентификации только по ключам это всё получается не имеет значения.
Гость (27/04/2014 01:30)   

Там можно добавлять список из шифров, в порядке убывания значимости. Тогда не нужно смотреть как отваливается контакт из-за неумения сервера в шифры, главное не добавлять уязвимые комбинации.
Или можно ещё putty для клиента, с гуем для сортировки шифров, использовать.
Гость (27/04/2014 15:23)   
>Разве выбор алгоритма при аутентификации (RSA или DSA) влияет на битность сеансового ключа?
Аутентификация не влияет. Влияет тип эллиптической кривой в KexAlgorithms.

Выбор RSA с длинным ключом влияет на этот тип?

Костыльно очень. Вдруг что-то сбойнёт и в файл что-то не запишется? Или запишется что-то не то? Дважды запишется по-ошибке одно и тоже?

rngd проверяет файл на случайность перед пополнением /dev/random. И какой есть более простой способ передачи энтропии на сервер? Как вы сами пишете, в виртуалках её мало.

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

Если имеется в виду ключ аутентификации, а не часть DH, можно создать ключевую пару на клиенте и скопировать на сервер. Но это, как вы уже заметили, делается через канал с плохой энтропией, т.к. самое начало настройки. Лучше установить на сервере переменную SSH_USE_STRONG_RNG и создать ключи там. Тогда секретная часть ключа в сеть не попадает и достигается некоторый контроль над качеством материала для него.

>На стороне клиента собирать энтропию и кроном регулярно добавлять в файл.
Хорошую энтропию посылаем через канал с плохой энтропией? И храним, пусть и временно, но в простом файле?

После установки переменной SSH_USE_STRONG_RNG, создания RSA-ключей, запуска rngd и перезапуска SSH-сервера получается надёжный канал. Для его поддержания (регенерации сеансового ключа) с клиента на сервер регулярно идут порции энтропии в определённый файл. Во-первых, этот файл доступен только демону, во-вторых в /dev/random поступает его содержимое смешанное с энтропией из других более слабых источников (хотя это надо проверить).

При установлении аутентификации только по ключам это всё получается не имеет значения.

По-моему в любом случае нужно знать имя пользователя. Открытый ключ аутентификации ищется в его домашнем каталоге (файл /.ssh/authorized_keys). Если пользователь не задан, сервер ищет открытый ключ в домашнем каталоге root. Ключа там нет, а если бы и был, то логин всё равно запрещён.
— unknown (27/04/2014 16:04)   

Нет.


Допустим, виртуальный сервак тупо грохнулся и его восстановили из снэпшота. Тогда и рэндомный файл восстановится. И в демон энтропии дважды попадёт одно и тоже значение. И может даже одинаковая гамма сгенерироваться дважды. Для какого-нибудь потокового шифра или вектора инициализации. Это всё конечно маловероятно, да и простой /dev/urandom, который сохраняет свои состояния между ребутами в такой же простой файл также этому подвержен.
Гость (27/04/2014 17:14)   
Понятно, но ничего лучше пока не придумал. Про бесполезность опции PermitRootLogin при аутентификации по ключам не могли бы прокомментировать с учётом последнего ответа, может я что-то упустил?
Гость (27/04/2014 17:57)   


Попробуйте один раз получить привелегии, скажем:

guest:$ sudo aptitude update && sudo aptitude -y upgrade

И затем выполнить такой Makefile:



guest:$ make -f Makefile
— unknown (27/04/2014 18:59)   

Вот и продолжайте обсуждение sudo в той теме. Или заведите отдельную: «Укрепление Избавление от sudo», «sudo не нужно» и т.д.
Гость (09/05/2014 18:15)   
Господа, а можно по итогам обсуждения темы кратенькое хавту для без-сертификатного варианта?
Пошаговое, для чайников – какой параметр подкрутить и что с ним конкретно сделать.
— unknown (09/05/2014 20:05)   

Имеется ввиду бесключевого, вход только по паролю? Так не рекомендуется, но опции из /comment79001[link9] действовать будут и в этом случае.
— unknown (15/05/2014 10:52, исправлен 15/05/2014 12:02)   

По поводу random-устройств[link11]:

Writing to /dev/random or /dev/urandom will update the entropy pool with the data written, but this will not result in a higher entropy count. This means that it will impact the contents read from both files, but it will not make reads from /dev/random faster.

echo "Initializing random number generator..."
           random_seed=/var/run/random-seed
           # Carry a random seed from start-up to start-up
           # Load and then save the whole entropy pool
           if [ -f $random_seed ]; then
               cat $random_seed >/dev/urandom
           else
               touch $random_seed
           fi
           chmod 600 $random_seed
           poolfile=/proc/sys/kernel/random/poolsize
           [ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
           dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

Т.е., в /dev/{u}random можно напрямую записывать данные безо всяких вспомогательных демонов, они там сами похэшируются и переинициализируют пул энтропии. Надо только быть уверенным в случайности и безопасности записываемых данных.


Т.о., после старта виртуалки в неё можно вкачать энтропии по SSH, а затем переконнектится по SSH заново, надеясь, что из предыдущего сеанса извлечь вкачиваемые в /dev/{u}random данные будет сложнее. Но вообще — это шаманство. Нужен Entropy Broker[link12].


А вот ещё чьё-то простенькое скриптоподелие, похожее на то, что предлагалось в этой теме изначально — entropyservice[link13]:

Allow low entropy machines (eg Virtual Machines) to collect data from another host with high entropy (eg a real computer) via SSH, then stir it in to the kernel's random pool using rngd

Хотя, хотелось бы иметь разработки на формально обоснованных протоколах для этой задачи.

Гость (16/05/2014 02:52)   
Т.е., в /dev/{u}random можно напрямую записывать данные безо всяких вспомогательных демонов, они там сами похэшируются и переинициализируют пул энтропии.

Вспомогательный демон rngd нужен не для обновления пула, а увеличения запаса случайности в /dev/random. Сравните вывод двух команд



и



до и после запуска (/dev/urandom просто для примера)



Надёжный источник случайности по-видимому можно получить двумя способами:

1. Обновление пула записью в /dev/urandom. В этом случае /dev/urandom может в интервале между обновлениями использоваться вместо /dev/random.

2. Пополнение /dev/random с помощью демонов типа rngd

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

Плюс второго способа в большей безопасности. Демон автоматически контролирует качество поступившей энтропии. Минус в необходимости прав root для запуска демона и вероятном зависании программ от нехватки случайности, если связь с источником энтропии по какой-то причине прервётся.

после старта виртуалки в неё можно вкачать энтропии по SSH, а затем переконнектится по SSH заново, надеясь, что из предыдущего сеанса извлечь вкачиваемые в /dev/{u}random данные будет сложнее.

В процессе начальной настройки обычно накапливается достаточно в /dev/random, чтобы хватило для старта последующего более безопасного соединения. По первоначальному (менее безопасному) SSH-соединению энтропию передавать не обязательно. Главное настроить канал передачи случайности до первой регенерации ключей в последующем безопасном SSH-соединении, для его поддержания.

Нужен Entropy Broker

Судя по всему это продвинутый и масштабируемый аналог скрипта entropyservice. Кстати, автор этого скрипта просто оформил рецепт из http://lwn.net/Articles/567731/ По-моему, для индивидуального использования собственноручного скрипта вполне достаточно, а Entropy Broker больше годится для промышленного применения.

хотелось бы иметь разработки на формально обоснованных протоколах для этой задачи

У меня лишь общие соображения. Есть потребитель случайности, есть источник. Между ними канал связи. Источник можно реализовать в виде сервера энтропии, прослушивающего определённый порт. Клиент на основе некоторых критериев периодически обращается к серверу. Критериями могут быть уменьшение запаса энтропии ниже порога или истечение интервала времени. В клиенте можно устанавливать разные параметры – количество запрашивамой энтропии, проверку её качества и т.п. В простейшем случае эта конструкция создаётся скриптами использующими стандартные утилиты netcat, rngd и т.п. Можно скрипт и на Perl написать. Для безопасной связи порты клиента и сервера покрыть SSL с помощью stunnel. Кроме этого, SSL использовать для аутентификации по сертификатам как клиента, так и сервера, чтобы предотвратить разные атаки. Например подмена сервера для отправки клиенту злонамереных данных, или умышленное истощение источника неаутентифицированными клиентами. Хотя при наличии VPN можно и без stunnel обойтись, создавая порты на виртуальных интерфейсах.
— unknown (16/05/2014 09:40, исправлен 16/05/2014 09:42)   

Это понятно, что скриптами и даже эвристически обоснованными программами можно по шифрпанковски всё нагородить. Я подразумеваю, что нужен спецпротокол доказуемо безопасной трансляции энтропии с расчётом Resilience Leakage Entropy, Bounded Retrieval Model, Leakage Oracle и пр. За авторством кого-нибудь, наподобие Евгения Додиса[link14].

Гость (16/05/2014 11:30)   
Теоретические фундаментальные исследования это по вашей части. Это надо рыть статьи в научных журналах и общаться с людьми из институтов, которые сидят на зарплате, имеют время и квалификацию для разработки сложных протоколов. А я лишь простой пользователь, довольствуюсь тем что есть.
— unknown (16/05/2014 15:10)   

Я тоже. Поэтому entropyservice пока сойдёт, но хотелось бы дождаться, когда появится что-то на основе исследованных моделей, будет признано и внедрено в системы, чтобы работало из коробки. Чтобы простой пользователь даже не помнил, что такая проблема когда-то была и требовала каких-то костылей.
Гость (29/05/2014 06:33)   

Брутфорсить пароль — это ещё ладно, но неужели вы всерьёз рассматриваете ещё и брутфорс ключа?

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


Неслучайные данные не должны уменьшать энтропию. Они её просто не увеличат вроде как, но не более того.

Про rngd: вы предлагаете напрямую пополнять пул /dev/random, чтобы увеличить его скорость? Т.е. проигнорировать все страховки и проверки на уровне ОС? Это очень рискованно. Я бы не стал так делать. Если некая модификация системных умолчаний повышает на 1% защиту от каких-то почти гипотетических атак ценой того, что с вероятностью в 30% я внесу фатальную элементарно экспулатируемую уязвимость, после которой всё станет ещё хуже, чем было ранее, то зачем мне такие риски? Они ничем не оправданы.
— unknown (29/05/2014 09:49, исправлен 29/05/2014 09:50)   

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



Разумно.

Гость (29/05/2014 11:56)   
Брутфорсить пароль — это ещё ладно, но неужели вы всерьёз рассматриваете ещё и брутфорс ключа?

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

Помимо аутентификации по ключам есть файерволл, которым можно заблокировать соединение с недоверенных хостов. Но вот поднимать ssh на нестандартном порту или играть в port knocking — это уже прятки.

В стандартной ситуации соединение с VPS осуществляется через NAT провайдера с динамическим IP-адресом. Поэтому обычная фильтрация по IP-адресам средствами iptables не подходит. К тому же она рискованна при смене своего местоположения. А вот нестандартный порт или port knocking могут существенно оградить от разных сканеров и случайных гостей. Хотя от целенаправленной атаки это конечно не поможет.

Про rngd: вы предлагаете напрямую пополнять пул /dev/random, чтобы увеличить его скорость? Т.е. проигнорировать все страховки и проверки на уровне ОС?

Как уже писалось выше, rngd проверяет источник на случайность. Если проверка не пройдена или источник иссяк, то демон аварийно завершается.
Гость (30/05/2014 04:34)   

Любое крипто строится на том, что есть публичная часть алгоритма/протокола и секретная. Секретную часть стараются сделать как можно меньше. На практике весь секрет только в пароле или только в ключе. Если протокол при этом не работает, надо его не латать уловками и засекречиванием публичных частей, а выкидывать на помойку. Кстати, это одна из причин того, почему алгоритмы шифрования должны быть открытыми.


У ISP не бесконечный диапазон адресов. В таких случаях разумно открыть подсеть/подсети, если исходящий адрес динамически меняется.


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


Его можно прогнать через статтесты, которые увидят непреднамеренную закладку или грубые ошибки, но принципиально вопрос тем не решается: нельзя никак узнать, случайным ли образом получена конкретная выборка или нет. Я вам могу нагенерить несколько терабайтов данных методом ГПСЧ, которые пройдут все тесты на случайность, а потом покажу короткий 128-битный ключ, который детерминированным образом получает все эти терабайты.

Раз в вашем случае доверия к каналу нет, сервер не может доверять полученным от клиента случайным данным. Точнее, можно наворачивать протокол «из говна и палок», опираясь на эвристические соображения, но не думаю, что имеет смысл до этого опускаться. Риски неоправданны, смысл неясен.
Гость (30/05/2014 08:54)   

Unknown здесь[link16] привёл хорошую выжимку:

We want the trust in Tor to come from the fact that we are open source and transparent, and that we do Real Science. Everything in Tor is built upon decades of public research. We don't want trust in Tor to come from us doing secret defenses and looking into a crystal ball and guessing what the most devastating imaginary attacks might be, and developing broken pretend defenses against imaginary attacks that probably don't work in reality.

There are plenty of other tools that will sell you magical secret sauce to defend against everything from the future and beyond. We don't do that, because there's another name for that magical secret sauce: Snake Oil.

В общем, то же самое можно сказать не только про Tor, а вообще про любую респектабельную разработку в области ИБ. Прям манифест получился.
Гость (30/05/2014 12:50)   
Любое крипто строится на том, что есть публичная часть алгоритма/протокола и секретная.

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



Таким темпами подбор по словарю занимает слишком много времени. При регулярном просмотре журнала такая атака будет пресечена в самом начале.

У ISP не бесконечный диапазон адресов. В таких случаях разумно открыть подсеть/подсети, если исходящий адрес динамически меняется.

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

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

Для защиты дополнительного сервера возникает та же проблема, что для основного. Или надеяться что его не заметят, но это, как вы подметили, игра в прятки.

В такой ситуации можно просто покрыть SSH-трафик другим протоколом с аутентификацией, например SSL с клиентским сертификатом. Минус в дополнительном оверхеде, связанном с шифрованием. Хотя в ранних версиях stunnel вроде можно было отключить шифрование соединения, в новых не проверял. Но более последовательным является наверное применение SOCKS-сервера. Это чистый слой аутентификации и ПО предназначенное именно для данной цели, с развитыми средствами контроля доступа.

Его можно прогнать через статтесты, которые увидят непреднамеренную закладку или грубые ошибки, но принципиально вопрос тем не решается: нельзя никак узнать, случайным ли образом получена конкретная выборка или нет. Я вам могу нагенерить несколько терабайтов данных методом ГПСЧ, которые пройдут все тесты на случайность, а потом покажу короткий 128-битный ключ, который детерминированным образом получает все эти терабайты.

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

Всё это предназначено как раз для поддержания доверенного канала, изначально созданного надёжным способом. Хотя в принципе вы наверное правы, надёжность такой конструкции низка.
— unknown (30/05/2014 12:55)   
Хуже, если из-за какого-то сбоя в /dev/random попадут одни и те же потоки случайных данных дважды. Rngd это своими статтестами не отловит.
Гость (30/05/2014 14:27)   

Я имел в виду криптографию в обобщённом смысле. Замените слово крипто на слово криптопротокол, например. Смысл должен быть понятен: если секретность пароля/ключа недостаточно, надо сам протокол фиксить, а не секретить его остальные открытые части. Конечно, это максима, которую строго не обосновать, но мысль довольно распространённая, многие считают её правильной.
Гость (30/05/2014 19:58)   
Тут обсуждается не идеальное ПО, а конкретная реализация – OpenSSH, и меры для повышения её уровня защищённости. По моему мнению (которое попытался обосновать), логин отличный от root защищённость повышает, хотя возможно и не по канону. Такой способ относится скорей к административным мерам, а не криптографии. С другой стороны, даже в теоретическом плане существование единой точки отказа тоже имеет свои риски. Всегда лучше наличие дополнительных барьеров, особенно когда они не вносят заметных неудобств.
— popoom_pee_doo (13/09/2014 00:27)   
Спасибо за советы!

Подскажите, куда это прописывать? В /etc/ssh_config? Система Debian.
Гость (13/09/2014 14:34)   
/etc/ssh/sshd_config

Ссылки
[link1] http://books.google.com.ua/books?id=pVo2NL3FPuAC&pg=PA445&lpg=PA445&dq=ServerKeyBits%201024&source=bl&ots=iMfmx6stCj&sig=q3LY9ST2JpZ-_rVMWEdNPYWJj4s&hl=ru&sa=X&ei=IbZbU4KbNuHL4ATN1YAw&ved=0CHsQ6AEwCQ#v=onepage&q=ServerKeyBits%201024&f=false

[link2] https://www.pgpru.com/novosti/2013/havegealjternativnyjjsposobpoluchenijakriptostojjkojjentropiiizprocessorov

[link3] https://www.pgpru.com/comment78983

[link4] https://www.pgpru.com/comment73274

[link5] https://www.pgpru.com/comment67496

[link6] https://www.pgpru.com/comment51610

[link7] https://www.pgpru.com/forum/unixlike/osnovnoenaznachenieopciimontirovanijanoexec

[link8] https://www.pgpru.com/comment78982

[link9] https://www.pgpru.com/comment79001

[link10] https://www.pgpru.com/comment79015

[link11] http://man7.org/linux/man-pages/man4/random.4.html

[link12] http://www.vanheusden.com/entropybroker/

[link13] https://github.com/arussell/entropyservice

[link14] http://www.cs.nyu.edu/~dodis/

[link15] https://www.pgpru.com/comment78999

[link16] https://www.pgpru.com/comment78612