SSH (англ.
Secure Shell — «безопасная оболочка») — сетевой протокол прикладного
уровня, позволяющий производить удалённое управление операционной
системой и туннелирование TCP-соединений (например, для передачи
файлов). Сходен по функциональности с протоколами Telnet и rlogin, но,
в отличие от них, шифрует весь трафик, включая и передаваемые пароли.
SSH допускает выбор различных алгоритмов шифрования. SSH-клиенты и
SSH-серверы имеются для большинства сетевых операционных систем.
Аутентификация пользователя по его публичному ключу.
Устанавливаем ssh на сервере (в большенстве дистрибутивах есть в репозиториях)
# apt-get install openssh-server
На клиенте
# apt-get install openssh-client
Для начала настроим конфиг сервера /etc/ssh/sshd_config
PermitRootLogin no
Остальные настройки можно не производить, и изменять их при твердой надобности.
После в несение в конфиг настроек не забываем запустить сервер
# /etc/init.d/ssh start
Теперь переходим к клиенту, с генерируем для доступа к серверу ключ-файлы (все команды выполняем из под пользователя)
$ ssh-keygen -t rsa -b 1024 -f $HOME/.ssh/id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/dimon/.ssh/id_rsa.
Your public key has been saved in /home/dimon/.ssh/id_rsa.pub.
The key fingerprint is:
83:2c:22:03:9b:a0:86:61:e4:55:78:09:b6:7a:73:1c dimon@siduxbox
The key's randomart image is:
+--[ RSA 1024]----+
| . ++.. |
|o o..o |
|+o ..E |
|*+. .... |
|Bo.o.oo S |
|.o..o. . |
| |
| |
| |
+-----------------+
В результате работы программа запросит ввод пароля (Enter passphrase (empty for no passphrase):) для шифрования секретного
ключа, чтобы исключить использование его при попадании к посторонним лицам, не
знающим пароля (пароль выбирать не короче 10-и символов). Мы создали ключи, шифрованные алгоритмом RSA, длиной в 1024 бита.
Для переноса своего публичного ключа
на сервер надо использовать только безопасные источники, иначе ваш ключ могут
подменить. Для переноса публичного ключа клиента служит программа ssh-copy-id.
Для начала необходимо сделать следующее:
$ ssh-copy-id -i ~/.ssh/id_rsa.pub ki100@192.168.1.100
Enter passphrase for key '/home/dimon/.ssh/id_rsa':
Now try logging into the machine, with "ssh 'ki100@192.168.1.100'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
ki100 - имя пользователя на сервере; 192.168.1.100 - IP-адрес сервера (вместо IP можно использовать и имя сервера); Enter passphrase for key '/home/dimon/.ssh/id_rsa': - введите придуманный Вами пароль RSA;
А если сервер спросит ki100@192.168.1.100's password: - то ввидите пароль пользователя на сервере.
Происходит парольная аутентификация заданного пользователя (или текущего) на
удаленной машине, затем происходит копирование ключа public_key_file на сервер в
$HOME/.ssh/authorized_keys.
Теперь можно подключится к серверу и управлять им с клиента
$ ssh ki100@192.168.1.100
Enter passphrase for key '/home/dimon/.ssh/id_rsa':
Linux debian 2.6.18-6-486 #1 Tue Jun 17 20:57:16 UTC 2008 i686
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Feb 14 13:29:16 2009 from 192.168.1.2
ki100@debian:~$ echo Вот мы и на сервере!
Вот мы и на сервере!
debian:/home/ki100#
Для передачи файлов на сервер через SSH, используем команду SCP.
$ scp ~/Downloads/mstax.pdf ki100@192.168.1.100:
Enter passphrase for key '/home/dimon/.ssh/id_rsa':
mstax.pdf 100% 344KB 344.4KB/s 00:00
Здесь ~/Downloads/mstax.pdf указывает исходный файл, включая путь к нему. Так же можно после ":" указать параметр <remotefile> определяет назначение; это может быть новое имя файла. Если вы не укажите в начале пути удалённого каталога /, будет выбран путь относительно домашнего каталога пользователя username.
Что бы передать файл с сервера на клиент
ki100@debian:~$ scp mstax.pdf ki100@192.168.1.100:
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
RSA key fingerprint is b1:f1:96:9e:53:26:ec:b1:70:28:65:35:af:93:33:4f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.100' (RSA) to the list of known hosts.
ki100@192.168.1.100's password:
mstax.pdf
В качестве исходных файлов можно указать несколько файлов. Например, чтобы переслать содержимое каталога Downloads/ с клиента в существующий каталог Uploads/ сервера
Если нужно настроить другие опции на сервере SSH то редактируем файлы конфигурации ssh_config и sshd_config
ssh_config
# Определение хоста, в данном случае включает все хосты домена test.ru, можно
# использовать одиночный символ * чтобы указать параметры доступа к любому хосту
Host *.test.ru
# Эта опция определяет, будет ли ssh использовать передачу данных от удаленного
# X сервера через свой безопасный канал. Далее будет описано, каким образом
# организуются безопасные туннели через ssh. Данная возможность позволяет
# защищать по идее небезопасные протоколы(X, pop, smtp, ftp) шифрованием ssh. По
# умолчанию данная опция no
ForwardX11 yes
# Список предпочтительных методов аутентификации через ssh версии 2. Первым
# стоит самый предпочтительный протокол, думаю, значения данного параметра ясны
PreferredAuthentications hostbased,publickey,keyboard-interactive
# Этот параметр определяет, будет ли производится стандартная парольная проверка
# По умолчанию yes
PasswordAuthentication yes
# Число попыток ввода пароля перед тем, как клиент отсоединяется от сервера. По
# умолчанию пароль можно вводить трижды
NumberOfPasswordPrompts 3
# Список допустимых пользователей для данного сервера. Можно применять два
# формата: список пользователей, разделенных пробелом, и список пользователей и
# хостов, разделенных пробелом(USER@HOST - разрешает данному пользователю доступ
# только с данного адреса). Можно использовать выражения * и ?. Подобное же
# назначение имеют опции AllowGroups, DenyUsers и DenyGroups(для групп нельзя
# указывать адрес клиента)
AllowUsers *@*.test.ru
DenyUsers xakep lamer
DenyGroups x*
# Использование ssh(2 версия) аутентификации через rhosts и RSA ключи. По
# умолчанию no.
HostbasedAuthentication yes
# Будет ли клиент пытаться работать по rsh, если ssh недоступен или по каким-то
# причинам работает неправильно. По умолчанию no
FallBackToRsh no
# Используем ли rsh. По умолчанию no
UseRsh no
# Режим скрипта, когда не спрашиваются пароли с терминала. По умолчанию no
BatchMode no
# Дополнительно проверяется ключ хоста удаленной машины в
# known_hosts, что исключает подмену ip. По умолчанию yes.
CheckHostIP yes
# Данный параметр означает, будет ли клиент доверять полученным от серверов
# ключам. Параметр может принимать следующие значения: yes - ключи никогда
# автоматически не помещаются в known_hosts, ask - ключ может быть помещен в
# known_hosts только после подтверждения пользователя, no - все ключи
# автоматически размещаются в known_hosts(небезопасно). По умолчанию ask.
StrictHostKeyChecking ask
# Следующие параметры определяют секретные ключи ssh различных форматов:
# rsa и dsa
IdentityFile $HOME/.ssh/id_rsa
IdentityFile $HOME/.ssh/id_dsa
# Порт, на удаленной машине используемый ssh. По умолчанию 22
Port 22
# Версии протоколов, используемые клиентом в порядке убывания приоритета.
Protocol 2
# Протокол шифрования для версии 1 протокола ssh
Cipher 3des
# Возможные протоколы шифрования в порядке убывания приоритета для протокола
# версии 2
Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc
# Значение escape-символа, сигнализирующего, что идущие за ним символы
# необходимо воспринимать специальным образом(например ~. вызовет немедленное
# отключение клиента от сервера) при передаче двоичных данных необходимо
# установить этот параметр в none, что выключает escape последовательности. По
# умолчанию ~
EscapeChar ~
# Управление работой компрессии зашифрованнного трафика. Полезный параметр для
# медленных сетей, т.к. зашифрованные данные обычно увеличиваются в размере за
# счет фиксированной длины ключа. Компрессия позволяет уменьшить количество
# данных, передаваемых через сеть, но увеличит время работы самого протокола.
# Так что включать этот параметр желательно на медленных соединениях. По
# умолчанию no.
Compression yes
# Управляет посылкой сообщений о доступности клиента серверу, что позволяет
# нормально разорвать соединение, если произошла неполадка в сети или иная,
# приведшая к разрыва соединения. Если связь плохая, то лучше эту опцию
# отключить, чтобы дисконнект не происходил после каждой ошибки сети. По
# умолчанию yes.
KeepAlive yes
sshd_config
# Номер порта и версия протокола
Port 22
Protocol 2
# Адреса, на которых слушает сервер, можно также указывать
# порт (server.test.ru:2022), но назначение ssh нестандартного порта
# нецелесообразно, т.к. заинтересует потенциальных взломщиков("А чего это там
# они прячут?")
ListenAddress server.test.ru
# Ключ сервера для протокола версии 1
HostKey /etc/ssh/ssh_host_key
# Ключи rsa и dsa для ssh версии 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
# Данные значения определяют длину ключа сервера и его время жизни для
# использования ssh версии 1(данный ключ будет заново генерироваться через
# заданное время)
#KeyRegenerationInterval 3600
#ServerKeyBits 768
# Далее определяем методы аутентификации для данного сервера и ее параметры
# Сервер отсоединяется по происшествии данного времени в секундах, если клиент
# не проходит аутентификацию
LoginGraceTime 600
# Разрешаем заходить по ssh руту. Долгое время эта тема обсуждалась на форуме,
# но я думаю все же, что со внутренней сети рут может заходить и по ssh (для
# этого надо настроить должным образом iptables). Также можно запретить руту
# входить по паролю: without-password, разрешая вход только по публичному ключу
PermitRootLogin yes
# Проверка sshd прав доступа и владельцев домашних каталогов. Полезно для тех
# пользователей, что дают права всему 0777. Хотя таких болванов лучше держать на
# расстоянии от сервера(лучше всего это делать бревном, подвешенным в серверной
# к потолку, чтобы придать нежеланному гостю должное ускорение, и не забудьте
# оббить конец бревна какой-нибудь железкой, иначе бревна придется менять
# слишком часто ;)
StrictModes yes
# Аутентификация через RSA (версия 1)
RSAAuthentication yes
# Аутентификация пользователя по ключу (версия 2)
PubkeyAuthentication yes
# Определяет публичный ключ пользователя для аутентификации по ключу. Можно
# применять шаблоны: %u - имя пользователя, %h - домашний каталог пользователя.
AuthorizedKeysFile .ssh/authorized_keys
# Не используем аутентификацию rhosts
RhostsAuthentication no
# Можно также игнорировать rhosts и shosts при hostbased autentification,
# используя только known_hosts файл.
#IgnoreRhosts yes
# Используем ли аутентификацию через known_hosts совместно с .rhosts или
# .shosts. Опция действительна только для протокола версии 1.
RhostsRSAAuthentication no
# То же самое, что и предыдущее только для версии 2
HostbasedAuthentication yes
# Если нет доверия к known_hosts, то их можно не использовать при hostbased
# autentification. По умолчанию no
IgnoreUserKnownHosts no
# Чтобы запретить посылку хешей паролей через туннель ssh задайте значение
# данной опции no. По умолчанию аутентификация по паролю разрешена
PasswordAuthentication yes
# Можно также разрешить пустые пароли, но это полный отстой, т.к. это огромная
# дыра на сервере, через которую можно наделать много гадостей! Поэтому должно
# быть no (по умолчанию)
PermitEmptyPasswords no
# Аутентификация через механизм PAM.
PAMAuthenticationViaKbdInt no
# Передача протокола иксов через туннель ssh
X11Forwarding yes
# Используем в качестве x-сервера данный, т.е. клиент, запуская у себя x-клиента
# будет фактически использовать наш сервер, но все данные от сервера к клиенту
# будут шифроваться, что есть хорошо!
X11UseLocalhost yes
# При логине пользователя выводим /etc/motd: в некоторых системах это отменено в
# целях безопасности
PrintMotd yes
# Сообщаем пользователю время и место последнего логина, ситуация, аналогичная
# предыдущей
PrintLastLog yes
# Посылать клиенту сообщения о доступности
KeepAlive yes
# Максимальное число возможных соединений, где не произошло аутентификации. Если
# клиентов, не прошедших аутентификацию больше, то новые соединения не будут
# обрабатываться
MaxStartups 10
# Путь к файлу, который будет отображаться при входе клиента ДО аутентификации
Banner /etc/ssh_message
# Проверка соответствия ip адреса клиента и его символического имени в backzone,
# затем снова сравнение имени с ip адресом. Таким образом (извращенным)
# проверяется подлинность ip, но метод этот достаточно тормозной и по умолчанию
# он отключен
VerifyReverseMapping no
# Новые системы, работающие через ssh. В данном примере определяется
# "безопасный" ftp сервер - sftp, аналогичный доступ пользователя, но с
# возможностью передачи файлов(т.е. пользователь получает доступ ко всем своим
# файлам и нет возможности настройки разрешений и виртуальных пользователей,
# как, например в proftpd). По сути дела подсистемы ssh могут обеспечивать
# прохождение других протоколов по сети, но под "крылышком" ssh. Например, для
# sftp сервера есть одноименный sftp клиент. Его интерфейс полностью идентичен
# оригинальному ftp, но с одним отличием: происходит та же самая аутентификация
# пользователя на удаленном сервере(методами ssh), но вместо оболочки с
# пользователем взаимодействует подсистема, в данном случае sftp.
Subsystem sftp /usr/lib/ssh/sftp-server
В данном примере все объяснено достаточно подробно, но в большинстве случаев опции по умолчанию работают очень даже хорошо.