Глава 12. SSH: Безопасная работа в сети

Содержание

12.1. ssh—Secure Shell
12.2. scp—безопасное копирование
12.3. sftp—безопасная передача файлов
12.4. SSH демон (sshd)
12.5. Механизм аутентификации SSH
12.6. Проброс порта
12.7. Конфигурация SSH демона при помощи YaST
12.8. Дополнительная информация

Аннотация

Часто бывает необходимо получить доступ к компьютеру удаленно. Если пользователь отправляет логин и пароль в виде обычного текста, они могут быть перехвачены и использованы злоумышленником для того, чтобы получить доступ к удаленной системе от имени этого пользователя. Это откроет нападающему доступ ко всем файлам пользователя и может быть использовано для попытки получения root привилегий или попытки проникновения на другую систему. В прошлом для удаленных соединений использовались telnet, rsh и rlogin, не шифровавшие передаваемый траффик и не защищенные от прослушивания. Есть и другие незащищенные каналы связи, создаваемые, например, при использовании FTP или других программ для копирования через сеть, например rcp.

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

В openSUSE пакет OpenSSH установлен по умолчанию и включает в себя программы ssh, scp и sftp. В конфигурации по умолчанию удаленный доступ к openSUSE возможен только с помощью служебных программ из комплекта OpenSSH, и только если запущен sshd и открыты соответствующие порты в брандмауэре.

12.1. ssh—Secure Shell

Используя ssh можно подключаться к удаленным системам и работать с ними в интерактивном режиме. Для того, чтобы подключиться к sun как пользователь tux используйте одну из следующих команд:

ssh tux@sun
ssh -l tux sun

Если имя пользователя на локальном и удаленном компьютере совпадает, Вы можете его опустить: ssh sun. Удаленный компьютер запросит пароль удаленного пользователя. После успешной аутентификации Вы можете работать на удаленном компьютере в режиме командной строки и использовать интерактивные приложения, например YaST, в текстовом режиме.

Более того, ssh предоставляет возможность удаленного запуска неинтерактивных команд на удаленной системе ssh HOST COMMAND. COMMAND должна быть при необходимости взята в кавычки. Как и в обычной командной строке, можно объединить несколько команд.

ssh root@sun "dmesg | tail -n 25"
ssh root@sun "cat /etc/issue && uptime"

12.1.1. Запуск приложений X на удаленном компьютере

SSH также упрощает использование удаленных приложений X. Если Вы запустите ssh с ключем -X, переменная DISPLAY будет автоматически установлена на удаленном компьютере и весь вывод X-сервера будет экспортироваться по SSH соединению. Следует отметить, что запущенные удаленно приложения X не могут быть перехвачены посторонними лицами.

12.1.2. Проброс агента

Используя опцию -A, механизм аутентификации ssh-agent переносится на следующий компьютер. Таким образом, Вы можете работать с различных компьютеров без вода пароля, но только если Вы распространили свой публичный ключ на целевые машины и сохранили его там надлежащим образом.

По умолчанию этот режим выключен, но может быть активирован в в любое время в файле конфигурации /etc/ssh/sshd_config установкой AllowAgentForwarding yes.

12.2. scp—безопасное копирование

scp копирует файлы на удаленный компьютер или с него. Если имя пользователя на jupiter отличается от имени пользователя на sun, укажите последнее используя формат username@host. Если файл требется скопировать в директорию, отличную от домашней директории удаленного пользователя, укажите ее как sun:DIRECTORY. Следующие примеры показывают, как скопировать файл с локальной машины на удаленную и наоборот.

# local -> remote
scp ~/MyLetter.tex tux@sun:/tmp
# remote -> local
scp tux@sun:/tmp/MyLetter.tex ~
  
[Tip]Опция -l

Команда ssh может быть использована с опцией -l, чтобы указать удаленного пользователя (как альтернатива формату username@host). С командой scp опция -l используется для ограничения потребляемого scp канала.

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

scp также поддерживает рекурсивное копирование директорий. Команда

scp -r src/ sun:backup/

скопирует содержимое всей директории src, включая все поддиректории, в директорию backup системы sun. Если поддиректории не существуют, они будут созданы автоматически.

При использовании ключа , scp сохранит дату последнего изменения источника. Ключ -C позволит сжать передаваемые данные. Это минимизирует объем передаваемых данных, но нагрузит процессоры на обеих машинах.

12.3. sftp—безопасная передача файлов

Если Вы хотите скопировать несколько файлов, утилита sftp будет удобной альтернативой scp. Эта утилита открывает консоль с набором команд похожим на команды стандартной ftp консоли. Введите help в подсказке sftp для получения списка доступных команд. Дополнительную информацию можно получить на странице man sftp (1).

sftp sun
Enter passphrase for key '/home/fs/.ssh/id_rsa': 
Connected to sun.
sftp> help
Available commands:
bye                                Quit sftp
cd path                            Change remote directory to 'path'
[...]
  

12.4. SSH демон (sshd)

Для работы с программами ssh и scp, в фоновом режиме должнен быть запущен SSH-демон, который будет использовать порт 22 TCP/IP. При запуске в первый раз, демон генерирует три пары ключей. Каждая пара стоит из секретного и открытого ключа. Таким образом, эта процедура называется основанной на открытом ключе. Чтобы гарантировать безопасность соединения через SSH, доступ к файлу с секретным ключом должен быть только у системного администратора. По умолчанию, этот файл имеет именно такие права. Секретный ключ используется только локальным SSH-демоном и не должен быть предоставлен кому-то ещё. Открытый ключ (узнаваемый по расширению файла .pub) отправляется клиенту, запросившему соединение. Файл, в котором находится открытый ключ, может прочитать любой пользователь системы.

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

OpenSSH для связи между SSH-сервером и SSH-клиентом поддерживает первую и вторую версию протокола SSH. По умолчанию используется вторая версия. Если Вы хотите использовать первую версию, используйте ключ -1.

При использовании версии 1, SSH-сервер посылает свой открытый ключ и так называемый "ключ сервера", которые генерируются раз в час. На основании этих ключей SSH-клиент генерирует ключ сессии, который в последствии он посылает SSH-серверу. SSH-клиент также говорит серверу какой метод шифрования использовать. Вторая версия протокола SSH не требуют ключа сервера. Обе стороны используют алгоритм Диффи-Хеллмана (Diffie-Hellman) для обмена ключами.

Секретный и серверный ключи необходимы для расшифровки ключа сессии и не могут быть получены, при использовании лишь открытых ключей. Только запрашиваемый SSH-демон может расшифровать ключ сессии, используя свои секретные ключи. Эта начальная фаза установки соедининения может быть исследована более детально (включая отладочную информацию) при помощи ключа -v SSH-клиента.

Рекомендуестся сохранять секретные и открытые ключи, которые находятся в /etc/ssh/, на каком-нибудь безопасном внешнем носителе. В этом случае можно отследить подделку ключей или использовать старые ключи повторно, к примеру, после переустановки системы.

[Tip]Существующие SSH ключи

Если Вы установите openSUSE на машину с уже установленной Linux системой, SSH ключ этой системы будет автоматически импортирован во время инсталляции с сохранением последнего времени доступа к нему.

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

В случае, если открытый ключ сервера изменился (что необходимо выяснить перед попыткой подключения к такому серверу), несоответствующие ключи могут быть удалены командой ssh-keygen -r HOSTNAME

12.5. Механизм аутентификации SSH

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

Для входа в систему, не используя пароль удаленного пользователя, SSH использует другую пару ключей, которая должна быть сгенерирована пользователем. Она состоит из открытого (id_rsa.pub или id_dsa.pub) и защищенного ключа (id_rsa или id_dsa).

Чтобы войти в систему не указывая пароль удаленного пользователя, открытый ключ «пользователя SSH» должен существовать в ~/.ssh/authorized_keys. Этот подход также предполагает, что удаленный пользователь получает полный доступ: добавление ключа требует знания пароля удаленного пользователя и удаление ключа лишает прав удаленного подключения к системе.

Для максимальной безопасности этот ключ должен быть защищен паролем, который вводится при каждом использовании команд ssh, scp и sftp. В отличие от простой аутентификации, этот пароль не зависит от удаленного пользователя и поэтому не изменяется.

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

[Note]Права доступа к файлам при использовании host-аутентификации

При использовании host-аутентификации, файл /usr/lib/ssh/ssh-keysign (32-битные системы) или /usr/lib64/ssh/ssh-keysign (64-битные системы) должен иметь SETUID бит, который в openSUSE не установлен по умолчанию. Вы должны установить его сами вручную. Используйте для этого файл /etc/permissions.local, чтобы быть уверенным, что SETUID бит сохранится и после обновления OpenSSH.

12.5.1. Генерация SSH ключа

  1. Для создания ключа с настройками по умолчанию (RSA, 2048 bits), введите команду ssh-keygen.

  2. Согласитесь с дефолтным размещением ключа (~/.ssh/id_rsa), нажав Enter (крайне рекомендуется) или введите альтернативное размещение.

  3. Введите пароль из 10 - 30 символов. Для него справедливы правила создания безопасных паролей. Крайне рекомендуется не оставлять его пустым.

Вы должны быть абсолютно уверены, что Ваш защищенный ключ недоступен никому кроме Вас (всегда устанавливайте его права доступа в 0600). Защищенный ключ никогда не должен попадать в чужие руки.

Для смены пароля к существующему ключу используйте команду ssh-keygen -p.

12.5.2. Копирование ключа SSH

Для копирования открытого SSH ключа в файл ~/.ssh/authorized_keys пользователя удаленного компьютера, используйте команду ssh-copy-id. Для того, чтобы скопировать Ваш личный ключ из ~/.ssh/id_rsa.pub Вы можете использовать короткую форму. Для копирования ключей DSA или ключей других пользователей, Вы должны указать путь:

# ~/.ssh/id_rsa.pub
ssh-copy-id -i tux@sun

# ~/.ssh/id_dsa.pub
ssh-copy-id -i ~/.ssh/id_dsa.pub  tux@sun

# ~notme/.ssh/id_rsa.pub
ssh-copy-id -i ~notme/.ssh/id_rsa.pub  tux@sun

Для успешного копирования ключа, Вам потребуется ввести пароль удаленного пользователя. Для удаления существующего ключа отредактируйте вручную файл ~/.ssh/authorized_keys.

12.5.3. Использование ssh-agent

При необходимости произвести большое количество операций довольно неудобно водить пароль SSH для каждой из них. Поэтому пакет SSH содержит еще один инструмент, ssh-agent, который сохраняет секретные ключи на время X-сессии или консольной сессии. Все остальные окна или программы запускаются как клиенты ssh-agent. После запуска агента, устанавливается набор переменных окружения, который будет использован командами ssh, scp и sftp, чтобы произвести автоматический вход посредством агента. За подробностями обратитесь к man 1 ssh-agent.

После запуска ssh-agent Вам понадобится добавить ключи используя команду ssh-add. Она запросит пароль. Затем Вы сможете использовать в текущей сессии команды ssh не вводя пароль для каждой из них.

12.5.3.1. Использование ssh-agent в X-сессии

В openSUSE ssh-agent запускается автоматически оконными менеджерами GNOME и KDE. Для того, чтобы добавить свои ключи посредством ssh-add при старте X-сессии, необходимо:

  1. Войти в систему как пользователь и проверить, существует ли файл ~/.xinitrc.

  2. Если он не существует,использовать шаблон или скопировать его из /etc/skel:

    if [ -f ~/.xinitrc.template ]; then mv ~/.xinitrc.template ~/.xinitrc; \
    else cp /etc/skel/.xinitrc.template ~/.xinitrc; fi
  3. Если Вы скопировали шаблон, найдите следующие строки и раскомментируйте их. Если ~/.xinitrc уже существует, добавьте следующие строки (без знаков комментария).

    # if test -S "$SSH_AUTH_SOCK" -a -x "$SSH_ASKPASS"; then
    #       ssh-add < /dev/null
    # fi
  4. при старте новой X-сессии, у Вас будет запрошен SSH пароль.

12.5.3.2. Использование ssh-agent в консольном сеансе

В консольном сеансе Вам необходимо вручную запустить ssh-agent и затем вызвать ssh-add. Есть два способа запуска агента. Первый из приведенных ниже примеров запускает новую сессию bash поверх существующей. Второй пример запускает агент в существующей сессии и модифицирует окружение.

ssh-agent -s /bin/bash
eval $(ssh-agent)
    

После того, как агент будет запущен, выполните ssh-add, чтобы добавить в него свои ключи.

12.5.4. Аутентификация основанная на хостах

12.6. Проброс порта

ssh также может быть использован для перенаправления TCP/IP подключений. Эта опция, называемая SSH туннелированием, перенаправляет TCP соединения на определенный порт другого компьютера по зашифрованному каналу.

Используя следующую команду, любое соединение на jupiter порт 25 (SMTP) перенаправляется на SMTP порт на sun. Это особенно полезно для тех, кто использует SMTP серверы без SMTP-AUTH или POP-before-SMTP. Электронная почта, откуда бы она ни пришла, будет передана для дальнейшей доставки «домашнему» почтовому серверу.

ssh -L 25:sun:25 jupiter

Аналогично, все POP3 запросы (порт 110) на jupiter погут быть перенаправлены на POP3 порт sun при помощи следующей команды:

ssh -L 110:sun:110 jupiter

Обе команды должны быть выполненны с правами root, так как соединение использует привилегированные порты. При использовании электронной почты обычными пользователями будет использоваться SSH соединение. SMTP и POP3 должны быть установлены в localhost, чтобы это работало. Дополнительную информацию можно найти в man-руководствах для каждой из программ, описанной выше, а также в документации проекта OpenSSH: /usr/share/doc/packages/openssh.

12.7. Конфигурация SSH демона при помощи YaST

Модуль YaST для настройки SSHD не входит в установку по умолчанию. Для работы с ним установите пакет yast2-sshd.

Для настройки sshd-сервера с помошью YaST запустите YaST и выберите Сетевые службы+Настройка SSHD. Затем сделайте следующее:

  1. На вкладке Общий, в таблице SSHD TCP Ports выберите порты, которые будет использовать sshd. По умолчанию используется порт 22. Вы можете выбрать несколько портов. Чтобы добавить новый порт нажмите кнопку Добавить, введите номер порта и нажмите кнопку OK. Для удаления порта, найдите его в таблице, нажмите кнопку Удалить и подтвердите удаление.

  2. Выберите опции, которые будут использоваться демоном sshd. Чтобы запретить переадресацию TCP, снимите флажок Разрешить переадресацию TCP. Отключение переадресации TCP не улучшает безопасность, если пользователи имеют доступ к терминалу, так как они всегда могут установить свои собственные переадресации. См. Раздел 12.6, «Проброс порта» для получения дополнительной информации о переадресации TCP.

    Чтобы отключить переадресацию X, снимите флажок Разрешить переадресацию X11. Если эта опция отключена, любые запросы переадресации X11 будут приводить к ошибке. Однако пользователи всегда могут установить свою собственную переадресацию. См. Раздел 12.1, «ssh—Secure Shell» для получения дополнительной информации о переадресации X.

    Опция Разрешить сжатие определяет, должно ли соединение между сервером и клиентом подвергаться компрессии.

  3. Вкладка Настройки входа в систему содержит общие настройки входа в систему и аутентификации. В Показывать Сообщение дня после входа в систему определяется, должен ли sshd выводить сообщение из /etc/motd при интерактивном режиме входа в систему. Если Вы хотите отключить возможность входить в систему пользователю root, отключите Разрешать вход администратора в систему.

    Максимальное число попыток аутентификации устанавливает количество попыток аутентификации за одно соединение. Аутентификация RSA определяет, разрешена ли RSA аутентификация. Этот параметр применяется только к первой версии протокола SSH. Аутентификация по открытому ключу определяет, разрешена ли аутентификация пользователя с помощью открытого ключа. Этот параметр используется только во второй версии протокола SSH.

  4. На вкладке Протокол и шифрования определяются версии протокола SSH, которые должны поддерживатся. Вы можете выбрать первую или вторую версию, а так же параллельную поддержку обоих SSH-протоколов.

    В Поддерживаемые методы шифрования перечислены все поддерживаемые алгоритмы шифрования. Вы можете удалить шифр, выбрав его в списке и нажав кнопку Удалить. Чтобы добавить шифр, выберите его из выпадающего меню и нажмите кнопку Добавить.

  5. Нажмите ОК для сохранения настроек.

12.8. Дополнительная информация

http://www.openssh.com/ru

Страница проекта OpenSSH

http://en.wikibooks.org/wiki/OpenSSH

Викиучебник OpenSSH

man sshd

man-страница OpenSSH-демона

man ssh_config

Man-страница файлов конфигурации клиента SSH OpenSSH

man scp , man sftp , man slogin , man ssh , man ssh-add , man ssh-agent , man ssh-copy-id , man ssh-keyconvert , man ssh-keygen , man ssh-keyscan

man-страницы о программах копирования файлов (scp, sftp), login (slogin, ssh), и ключах.