Многие мои знакомые так или иначе используют протокол SSH (заходя на свои роутеры, веб хостинги и непосредственно на собственные компьютеры дома и в офисе), при этом не все об этом знают.

Я расскажу о нескольких стандартных возможностях, не открою ничего нового и сакраментального администраторам, но простые пользователи существенно упростят себе работу и, возможно, даже начнут активнее пользоваться этим великолепным протоколом.
В этой заметке вы узнаете:
Чтобы подключиться к удаленному компьютеру или роутеру, можно воспользоваться клиентом ssh, который есть во всех популярных операционных системах, будь то Linux или MacOSX. Вам необходимо знать IP адрес или хостнейм машины, к которой будете подключаться, порт, который прослушивает SSH демон (sshd, по умолчанию 22), а так же актуальные логин и пароль, под которыми разрешено подключение.
ltsony — ноутбук
home — домашний компьютер
далее все действия на клиенте
Согласитесь, ssh -l babl -p 22 babl.starlink.ru команда довольно длинная и даже более короткий вариант ssh babl@babl.starlink.ru не делает ее более приятной, когда приходится по несколько раз в день заходить на одни и те же компьютеры.
Создадим (если его нет) файл ~/.ssh/config со следующим содержимым:
Выполняем:
Итого задачу себе немного упростили. Что можно сделать дальше? Согласитесь, вводить пароль каждый раз при попытке войти на один и тот же компьютер — занятие радости доставляющее не так много, как хотелось бы.
В этой части заметки мы создадим публичный ключ, передадим его на сервер и будем входить по нему без пароля.
Для начала проверим необходимые опции:
на клиенте (/etc/ssh/ssh_config):
на сервере (/etc/ssh/sshd_config):

Я расскажу о нескольких стандартных возможностях, не открою ничего нового и сакраментального администраторам, но простые пользователи существенно упростят себе работу и, возможно, даже начнут активнее пользоваться этим великолепным протоколом.
В этой заметке вы узнаете:
- как прописать псевдонимы для соединений
- как настроить авторизацию без пароля
- как передавать файлы по SSH
- как запускать графические приложения по SSH
- а так же получите общие советы по опциям SSHD
Используем псевдонимы
Чтобы подключиться к удаленному компьютеру или роутеру, можно воспользоваться клиентом ssh, который есть во всех популярных операционных системах, будь то Linux или MacOSX. Вам необходимо знать IP адрес или хостнейм машины, к которой будете подключаться, порт, который прослушивает SSH демон (sshd, по умолчанию 22), а так же актуальные логин и пароль, под которыми разрешено подключение.
ltsony — ноутбук
home — домашний компьютер
babl@ltsony:~$ ssh -l babl -p 22 babl.starlink.ru
Password:
Linux localhost 2.6.30-1-686-bigmem #1 SMP Sat Aug 15 20:10:47 UTC 2009 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: Tue Nov 3 12:12:31 2009 from articleness.incense.volia.net
babl@home:~$
далее все действия на клиенте
Согласитесь, ssh -l babl -p 22 babl.starlink.ru команда довольно длинная и даже более короткий вариант ssh babl@babl.starlink.ru не делает ее более приятной, когда приходится по несколько раз в день заходить на одни и те же компьютеры.
Создадим (если его нет) файл ~/.ssh/config со следующим содержимым:
Host bbh
HostName babl.starlink.ru
User babl
Port 22
Выполняем:
babl@ltsony:~$ ssh bbh
Password:
Linux localhost 2.6.30-1-686-bigmem #1 SMP Sat Aug 15 20:10:47 UTC 2009 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: Tue Nov 3 12:12:31 2009 from articleness.incense.volia.net
babl@home:~$
Итого задачу себе немного упростили. Что можно сделать дальше? Согласитесь, вводить пароль каждый раз при попытке войти на один и тот же компьютер — занятие радости доставляющее не так много, как хотелось бы.
Авторизация по ключу
В этой части заметки мы создадим публичный ключ, передадим его на сервер и будем входить по нему без пароля.
Для начала проверим необходимые опции:
на клиенте (/etc/ssh/ssh_config):
# StrictHostKeyChecking ask
# IdentityFile ~/.ssh/identity
IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# Port 22
на сервере (/etc/ssh/sshd_config):
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
Лирическое отступление
Стоит так же обратить внимание на такие параметры sshd_config:
PermitRootLogin no - разрешить пользователю root логиниться по SSH. Лучше запретить, так как действительно права рута нужны не так часто, а повысить свои привилегии можно с помощью того же sudo. К тому же в этом случае имя пользователя так же для злоумышленника будет загадкой, а root стандартен везде.
На крайняк можно описать следующую конструкцию:
PermitRootLogin no
Match Host 192.168.0.*,127.0.0.1
PermitRootLogin yes
В этом случае рут сможет залогиниться только из указанных подсетей.
PermitEmptyPasswords no - разрешить использовать пустые пароли. Так же плохой вариант, фактически пустой пароль сводит всю защиту на нет, так что и разрешать его в общем-то не стоит.
AllowUsers - указывает список пользователей, под которыми можно входить по SSH. Крайне рекомендую использовать эту опцию! Если ее нет в конфиге - создайте. AllowUsers babl vasya. Так же в качестве логинов можно указывать babl@babl.starlink.ru (или babl@192.168.0.1) что позволит логиниться пользователю babl только с адреса babl.starlink.ru
Port - указывает прослушиваемый демоном SSHD порт. Стандартный 22, первый в списке искомых злоумышленником. Советую сменить его на что-то выходящее за пределы 1024 или еще лучше, за пределы 10000. К примеру поставить 33333, легко запоминается, а вот nmapом фиг достанешь.
создадим ключ командой ssh-keygen -t rsa
babl@ltsony:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/babl/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/babl/.ssh/id_rsa.
Your public key has been saved in /home/babl/.ssh/id_rsa.pub.
The key fingerprint is:
13:35:3b:4c:34:d4:86:85:aa:f5:da:e5:b7:25:00:b7 babl@ltsony
The key's randomart image is:
+--[ RSA 2048]----+
| o.+o o+|
| o o .o +|
| . = . .. |
| . +o. |
| S oE. |
| .. . .|
| o.o.|
| . .oo|
| ...|
+-----------------+
Итак, введя ssh-keygen -t rsa и ответив на несколько простых вопросов, мы создали публичный ключ нашего клиента: /home/babl/.ssh/id_rsa.pub. Теперь необходимо этот ключ запихнуть на сервер в домашнюю директорию пользователя, под которым мы логинимся, в файл ~/.ssh/authorized_keys. Путей это сделать множество, но я настоятельно рекомендую использовать скрипт ssh-copy-id, как правило входит в пакет openssh-client.
babl@ltsony:~$ ssh-copy-id bbh
Password:
Now try logging into the machine, with "ssh 'babl@babl.starlink.ru'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
Проверяем:
babl@ltsony:~$ ssh bbh
Linux localhost 2.6.30-1-686-bigmem #1 SMP Sat Aug 15 20:10:47 UTC 2009 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: Tue Nov 3 12:12:31 2009 from articleness.incense.volia.net
babl@home:~$
ну что же, поздравляю, теперь мы можем входить на удаленный терминал одной маленькой командой и без надобности вводить сложные пароли. Безусловно, если Вы будете подключаться с другой машины — ключа там не будет и ssh попросит ввести пароль.
подводные камни
Часто бывает что вместо заветного входа в удаленную систему, Вы получаете все тот же запрос на ввод пароля. Что следует делать в этом случае?
1. не паниковать.
2. запустить с клиента:
ssh -v babl@babl.starlink.ru
и посмотреть полный вывод попытки установить соединение.
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering public key: /home/babl/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: password
Опа… ключик то послали, а сервер отверг, сказал пошли дальше пробовать и вводи ка пароль, парень!
Идем на сервер, смотрим /var/log/auth.log
Nov 3 10:38:54 localhost sshd[14846]: Authentication refused: bad ownership or modes for directory /home/babl
и понимаем, что SSH демон довольно параноидальный и заботится о том, чтобы соединение по ключу было доступно ТОЛЬКО нужному пользователю. Внимательно осматриваем права доступа к домашней папке и непосредственно к файлам в ~/.ssh и видим, к домашней папке, к примеру, есть права на запись у всех — ssh это не понравилось и демон отверг вход по ключу, посчитав его небезопасным. Выставляем стандартные права 0755 и вуаля:
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering public key: /home/babl/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
все работает!
На всякий случай, корректные права:
drwxr-xr-x 135 babl babl 16384 Ноя 2 19:07 /homd/babl
-rw------- 1 babl babl 792 Ноя 3 10:15 /home/babl/.ssh/authorized_keys
Работаем с файлами по SSH
Я встречал людей, которые держат веб или фтп серверы для того, чтобы периодически кидать себе домой несколько файлов или же забирать их оттуда. При этом они по SSH копируют файл в веб/фтп папки и потом скачивают их браузером или wget'ом, но ведь все можно сделать гораздо проще… Если Вы делаете так же — этот пункт для Вас!
Приложение scp входит в комплект openssh-client и работает по своей сути как и программа cp, но при этом позволяет использовать SSH адреса. Рассмотрим пример:
babl@ltsony:~$ scp babl@babl.starlink.ru:/mnt/gtb1*.avi ./
Password:
gtb12.avi 100% 41MB 412.4KB/s 01:42
gtb13.avi 100% 41MB 422.9KB/s 01:39
babl@ltsony:~$
Я скачал на ноутбук 2 файла, которые находятся по адресам:
/mnt/gtb12,avi
/mnt/gtb13,avi
на моем домашнем компьютере. При этом /mnt не смотрит в веб или фтп, но у пользователя babl есть к нему доступ и права на чтение этих файлов. Другими словами Вы можете получить любой файл, к которому может дотянуться Ваш пользователь на целевой системе, указав адрес вида:
login@host:/путь_к_файлу
С учетом того, что мы сделали ранее (авторизация без ключа и прописанный псевдоним) — все становится совсем просто
scp bbh:/mnt/gtb1*.avi ./
gtb12.avi 100% 41MB 412.4KB/s 01:42
gtb13.avi 100% 41MB 422.9KB/s 01:39
babl@ltsony:~$
Замечательная возможность приложения состоит еще и в том, что SSH адрес можно указать не только в качестве источника, но и в качестве назначения. Так же часто используемой опцией может стать -r, позволяющая (с/за)качивать рекурсивно папки со всем их содержимым.
Перенаправляем Х11 приложения
На сервере в /etc/ssh/sshd_config подключаем следующую опцию:
X11Forwarding Yes
Теперь введя на клиенте:
ssh -Y bbh kate
мы увидим окно редактора kate (пример чисто символический, можно было вызвать и gedit и даже eclipse), который физически будет работать на хосте bbh (домашний компьютер), но отображаться у нас на ноутбуке. Так можно поступить практически с любым графическим приложением, полезно бывает.
Извращаемся
SSH поистине может творить чудеса! Так как клиент может выполнять приложения на удаленном сервере и при этом напрямую передавать в них поток — открываются большие возможности для управления всем чем угодно. Вот несколько примеров, буду рад если пригодятся в жизни, но их основная задача — показать что есть куда копать и стоит это делать.
Упаковываем директорию и копируем на удаленный хост с распаковкой, все это происходит налету и без использования scp:
$ tar cf - /путь_к_источнику | ssh babl@babl.starlink.ru "(cd /путь_к_папке_назначения; tar xpf -)"
и на локальный:
$ ssh babl@babl.starlink.ru "tar cf - /путь_к_источнику" | (cd /путь_к_папке_назначения; tar xpf -)
так же можно было дописать свой rsa ключ на сервер не с помощью ssh-copy-id, а выполнив:
$ cat ~/.ssh/id_rsa.pub | ssh babl@babl.starlink.ru "cat - >> ~/.ssh/authorized_keys"
P.S.: Желаю удачи в освоении таких сложных на первый взгляд и таких полезных на второй утилит, как SSH.