Ставшая сегодня фактическим стандартом во многих средах, версия защищенной оболочки Open SSH с открытыми исходными кодами позволяет устанавливать надежные соединения и осуществлять шифруемую аутентификацию. Если вход в систему по паролю через сеть посредством SSH удается на большинстве систем Linux и UNIX с первого раза, то остальные варианты использования требуют некоторых знаний и определенного опыта.

Когда в 60—70-х гг. разрабатывались сетевые протоколы, в частности TCP/IP и основанные на нем telnet и rlogin, едва ли можно было предвидеть современные проблемы безопасности. Те, кто до сих пор пытаются получить доступ к удаленному компьютеру с помощью telnet, остаются с точки зрения безопасности на уровне 70-х гг.: имя пользователя и пароль передаются в виде открытого текста, а их перехват представляет собой детскую задачку для хакера, если ему удается получить доступ к одной из машин, через которые проходит трафик данных. Удобнее и даже немного защищеннее, чем telnet, «удаленный командный процессор» rsh в системах UNIX/Linux. Обычно, правда, там тоже требуется ввести имя пользователя и пароль, однако если каталог /home/goetz целевого компьютера содержит файл .rhosts, а он, в свою очередь, — строку вида

berlichingen goetz,

то пользователь goetz с компьютера berlichingen может входить в систему без пароля — т. е. пароль, по крайней мере, никто не в состоянии прочитать. Одновременно посредством rsh на целевом компьютере можно выполнять команды без ввода пароля.

Но тем не менее точек для атаки остается более чем достаточно. Так, ничего не стоит, к примеру, при помощи Knoppix CD подключить под именем berlichingen ноутбук, а, кроме того, все пакеты данных проходят по сети в виде открытого текста.

Современным уровнем считается Secure Shell SSH, предлагающий следующие функции:

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

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

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

ПРИМЕНЕНИЕ SSH

Использовать SSH с операционной системой Linux обычно достаточно просто: при помощи строки

ssh ll_mw

можно получить доступ к компьютеру ll_mw под текущим именем пользователя (или, соответственно, путем ввода строки ssh -l goetzvb ll_mw — под именем goetzvb). Как и при регистрации на консоли, демон SSH спрашивает пароль, после чего работу можно продолжить как обычно. Если нужны приложения Х, то доступ необходимо производить при помощи строки

ssh -Х ll_mw

(или внести запись ForwardX11 yes в $HOME/.ssh/config) — задавать переменные DISPLAY или команды xhost не потребуется. Этот метод можно порекомендовать как безопасный, поскольку без SSH хакеры могут вклиниться в поток (атака man-in-the-midlle) данных и отслеживать на локальном Х-сервере любые приложения. Немного сложнее подключить удаленную настольную систему. Под Suse Linux существует возможность графически войти в режиме «защиты от сбоев», получить доступ к удаленному компьютеру из xterm посредством SSH и запустить на нем команду kde&. Важным приложением SSH является копирование локальных файлов на другие компьютеры:

scp	my_file
remote_host:backup_
directory

Еще один пример приводится во врезке «Защищенное отображение через сеть»; там благодаря SSH команда выполняется удаленно. Наконец, строки

ssh -L
local _port:remote_host:remote_p
ort -N -f...

позволят создать зашифрованный туннель к удаленному компьютеру (а команда -R... возвращает к локальному компьютеру). Здесь SSH действует как VPN на фиксированный адрес порта (см. ssh(1)).

АУТЕНТИФИКАЦИЯ

Надежная аутентификация важна в той же мере, что и обеспечение конфиденциальности и целостности передаваемых данных. Стандартный метод связан с вводом пароля. Однако он утомляет своей длительностью и во многих случаях оказывается как непрактичным (к примеру, при автоматическом резервном копировании), так и рискованным. В качестве решения можно было бы привести так называемые методы идентификации на основании хоста, однако они недостаточно защищены от подделки IP-адреса. Поэтому наилучшим методом является применение цифровых подписей (аутентификация с открытым ключом). Необходимый для подписи личный ключ всегда остается на локальном компьютере и должен быть защищен трудно угадываемой фразой-паролем. Как это обычно происходит, описывается во врезке «Беспарольный вход с Open SSH для всех».

Сохраняющаяся необходимость ввода имени и пароля теоретически обусловлена содержанием конфигурационных файлов /etc/ssh/*config и $HOME/.ssh/config. Однако сам командный процессор ничего не сообщает о причинах, даже в режиме отладки (ssh -v -v -v) он остается верным правилу «каждая справка — подсказка хакеру». Возможные «подводные камни»:

  • обычно на сервере в /etc/ssh/sshd_config задано StrictModes yes, однако домашний и .ssh каталоги пользователя могут, например, описываться для своей группы;
  • стандартом является и CheckHostIP yes, однако клиент получает свой IP-адрес посредством DHCP;
  • вход на сервер с помощью коммерческой версии SSH не работает. Для этого формат открытого ключа должен быть сначала переведен в формат Ssh2 посредством ssh-keygen -e -t rsa.

В неясных случаях помогут только интерпретация конфигурационных файлов при помощи справочника Ssh и Sshd длиной примерно 2000 строк и утомительный поиск причины.

ПОВЫШЕНИЕ БЕЗОПАСНОСТИ

На практике слабым звеном являются секретные ключи. Из практических соображений их можно запретить защищать фразой-паролем, но тогда придется задуматься о переносе содержимого каталога $HOME/.ssh на дискету или флэш-память с интерфейсом USB и монтировании устройства на .ssh перед работой. Тем самым можно было бы получить ощутимую выгоду. Если указанные действия проделают все, администратор сможет на сервере в sshd_config установить PasswordAuthentication no и таким образом полностью запретить удаленный вход при помощи пароля. Ни один хакер не должен иметь возможности незаметно внести свой собственный открытый ключ в .ssh/authorized_keys. В этом случае Open SSH уже помочь не сможет. Рекомендация руководства — доступ только для владельца — должна по этой причине никогда не нарушаться.

Такие опции, как from=... в authorized_keys, определяют, с какого компьютера разрешен доступ. Имена машин можно подделать, однако взломщику необходимо об этом знать. Кроме того, и против мошенничества со стороны сервера можно кое-что предпринять. Каждый сервер при регистрации отправляет свой ключ хоста. Если он еще неизвестен, то после запроса добавляется к локальному файлу .ssh/known_hosts. Для проверки SSH показывает «слепок». Как правило, централизованный учет «слепков» (к примеру, при помощи ssh-keyscan или ssh-keygen -l) не представляет проблемы, но побуждает пользователя к критической проверке. В закрытых сетях может помочь центральный файл /etc/ssh/ssh_ known_hosts (вместе с опцией IgnoreUserKnownHosts yes в sshd_config).

Незаметная подмена SSH-демона Sshd, очевидно, наиболее привлекательна для хакеров. Такие инструменты, как Tripwire, позволят осуществить проверку и предотвратить опасность, однако гораздо проще регулярно выполнять в фоновом режиме небольшой сценарий для проверки целостности двоичных кодов и нескольких конфигурационных файлов при помощи md5sum.

ЗАКЛЮЧЕНИЕ

Компьютеры под управлением UNIX и Linux не должны разрешать доступ посредством таких ненадежных инструментов, как telnet или rlogin, когда имена и пароли передаются по сети в открытом виде. Если приложения предусматривают беспарольный вход в систему (или, соответственно, удаленное выполнение команд), то замена происходит практически незаметно для пользователя. В других случаях с незащищенными частными секретными ключами можно получить более высокую степень безопасности, которую при необходимости можно дополнительно повысить.

Рейнхард Вобст — независимый автор. С ним можно связаться по адресу: redaktion@lanline.awi.de


? AWi Verlag


Беспарольный вход с Open SSH для всех

Следующие действия могут быть осуществлены любым пользователем самостоятельно.

1. Создать при помощи команды ssh-keygen -t rsa пару ключей RSA. Эта команда автоматически создает каталог .ssh в домашнем каталоге с соответствующими правами доступа. В качестве фразы-пароля следует задать «нелогичное» предложение или, например, начальные и конечные буквы его слов (изменение при помощи ssh-keygen --p)

2. Созданный открытый ключ перенести на сервер(ы)

ssh my_server
Password: ...
mkdir .ssh
# начиная с этой строки удаленная работа
chmod 700 ssh
exit
cd .ssh
# начиная с этой строки снова локальная работа
scp id_rsa .pub my_server: .ssh/authorized_keys

При выполнении команды scp в последней строке также запрашивается ввод пароля. Во время следующей попытки доступа (ssh my_server) ssh уже запрашивает фразу-пароль для ключа RSA, если она не пуста.

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

3. Локальное изменение строки usessh = no на usessh = yes в файле .xsession каталога Home (поиск ssh в тексте).

4. В файле .xinitrc после # Add your own lines here («введите собственные строки») вставьте ssh-add ~/.ssh/id_rsa. При следующем доступе перед запуском рабочего стола будет запрошен пароль RSA, после чего доступ будет проходить без ввода пароля. Подробности в ssh-agent(1).

«Подводный камень»: если доступ к компьютеру осуществляется с использованием протокола 1, необходимо дополнительно запустить ssh-keygen без аргументов, ввести такую же фразу-пароль, добавить на серверах протокола 1 сгенерированный ключ identity.pub в authorized_keys и записать в .xinitrc:

ssh-add ~/.ssh/id_rsa ~/.ssh/identity

Защищенное отображение через сеть

find src ( -name ?*.cc? -o -name ?*.h? )
 -print|cpio -oc|ssh
rechner2 cd $PWD ; cpio -idm

Эта команда переносит все исходные данные проекта С++ в аналогичный каталог на машине rechner2. Важно, что каждый файл не копируется в отдельности (что повлекло бы за собой очень большое количество служебных сигналов из-за аутентификации с открытым ключом), а все файлы упаковываются в архив и переносятся за одну операцию. $PWD в последней строке интерпретируется локальным командным процессором, последующая же точка с запятой игнорируется из-за предшествующих кавычек. Сценарий работает надежно лишь тогда, когда запускается не из корня (по причине вероятности некорректного задания владельцев). Кроме этого, необходимо написать cpio -o -H odc, если archiv_server совместим с SVR4 (а также cpio -idcm, если в качестве целевой системы используется HP-UX).


Как заставить применять Open SSH

Переход от telnet или, соответственно, rlogin/rsh (с паролем) к Open SSH происходит абсолютно прозрачно:

  • необходимо деактивировать службу telnet на сервере (in.telnetd, например, под Suse YaST при помощи редактора на уровне выполнения);
  • ввести на пользовательских компьютерах следующие команды:
    cd usr/bin
    mv telnet telnet.old
    ln -s ssh telnet
    

С этого момента любой доступ по telnet будет происходить через SSH, возможно за исключением ввода имени пользователя. Аналогично следует поступить с rsh, rlogin и rcp. SSH-демон sshd входит в стандартный комплект всех распространенных дистрибутивов Linux.

Поделитесь материалом с коллегами и друзьями