Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Всеволод Стахов
Когда стали широко использоваться алгоритмы шифрования при передаче данных в сети, одной из первых возникла задача организации безопасной оболочки. До этого существовала система rsh, которая позволяла определённым пользователям с определённых машин (между ними должны были быть доверительные отношения) работать на сервере с его оболочкой. Это практически то же самое, что и telnet-доступ. Но с развитием сетей стали видны вопиющие дыры rsh: данные, передаваемые через сеть, никак не шифруются, включая пароли; они, могут быть без проблем получены либо модифицированы третьей стороной; злоумышленник может спокойно подменить ip клиента и, используя полученный ранее хеш пароля, пройти аутентификацию на сервере со всеми вытекающими последствиями. Поэтому сейчас rsh применяется в чрезвычайно редких случаях, например, при переносе данных между двумя попарно соединёнными машинами (мне так пришлось работать с двумя машинами в разных комнатах). В основном стандартом де-факто стал ssh.
Первая буква «s» означает безопасный (secure), то
есть все данные, передаваемые через ssh, шифруются, а значит, защищены от
просмотра. Существует несколько версий протокола ssh, различающиеся
используемыми алгоритмами шифрования и общими схемами работы. В настоящее время
повсеместно используется протокол ssh версии 2. Протокол младших версий
является по современным меркам небезопасным (там есть несколько очень опасных
дыр). Вообще-то сейчас ssh является коммерческим продуктом (что само по себе
противоречит требованиям безопасности – всем должен быть известен исходный код
системы защиты информации, чтобы убедиться в отсутствии всяких backdoors), но
тем не менее доступна свободная реализация ssh – OpenSSH, которая может быть
найдена на
Итак, начнём, как обычно, с теории. SSH предоставляет 3 способа аутентификации клиента: по ip-адресу клиента (небезопасно), по публичному ключу клиента и стандартный парольный метод. Вот как работает ssh версии 2: при запросе клиента сервер сообщает ему, какие методы аутентификации он поддерживает (это определяется в опции Preferred Authentications sshd.conf), и клиент по очереди пытается проверить их. По умолчанию клиент вначале пытается аутентифицироваться своим адресом, затем публичным ключом и, если ничего не сработало, передаёт пароль, введённый с клавиатуры (при этом пароль шифруется асимметрическим шифрованием). После прохождения аутентификации одним из методов из имеющихся у клиента и сервера пар ключей генерируется ключ симметрического шифрования, который, как я описывал ранее (см. статью «Теория и практика OpenSSL»), генерируется на основании своих секретного и удалённого публичного ключей. После чего все последующие данные, передаваемые через ssh, шифруются данным ключом (обычно используется алгоритм aes с длиной ключа 128 бит). Отмечу, что протокол ssh версии 1 имел некоторые баги в шифрации передаваемого трафика и являлся, по сути, методом безопасной аутентификации, поэтому по современным меркам данный протокол считается небезопасным. Протокол версии 2 поддерживает более современные методы шифрования трафика, также вместе с данными посылаются контрольные суммы формата sha или md5, что исключает подмену или иную модификацию передаваемого трафика (чего не было у ssh версии 1).
Теперь пару слов о способах аутентификации пользователей через ssh.
По адресу клиента
При данном способе аутентификации происходит следующее: каждый клиент и сервер имеют свои пары ключей RSA, которые называются ключами хоста. При этом существует несколько методов проверки адреса клиента. Сервер смотрит файлы $HOME/.rhosts, $HOME/.shosts, /etc/hosts.equiv или /etc/ssh/shosts.equiv, если же сервер настроен на проверку ключей клиентов (а это нужно в соображениях безопасности, т.к. иначе злоумышленник может подменить ip-клиента на свой), то он дополнительно проверяет /etc/ssh/ssh_known_hosts и $HOME/.ssh/known_hosts. Естественно, что файлы, расположенные в домашних каталогах сервера, действуют на пользователя, в чьём каталоге они размещены, а файлы, расположенные в /etc, имеют глобальный эффект. Для начала расскажу о синтаксисе вышеперечисленных файлов:
n .rhosts – определяет адрес машины и имя пользователя, с которой данному пользователю открыт доступ (файл расположен в домашнем каталоге пользователя);
n .shosts – аналогичен .rhosts, но предназначен исключительно для ssh, поэтому использовать лучше именно данный файл. Пример .shhosts:
user1.test.ru user1