SSH

Материал из Lblss.ru
Перейти к: навигация, поиск

Содержание

Запуск SSH сервера

FreeBSD

Для запуска sshd на FreeBSD при каждом старте системы в /etc/rc.conf добавляем строку

sshd_enable="YES"

При следующей загрузке системы будут сгенерированы ключи хоста, если их нет.

Linux

На Linux прописать соответствующий симлинк в нужном runlevel или во всех. Должно получиться что то вроде такого:

$ ls /etc/rc*/*sshd
/etc/rc0.d/K26sshd  /etc/rc2.d/S54sshd  /etc/rc4.d/S54sshd  /etc/rc6.d/K26sshd
/etc/rc1.d/K26sshd  /etc/rc3.d/K26sshd  /etc/rc5.d/K26sshd

Впрочем, развитые гуёвые конфигурялки пропишут что где надо, а в некоторых дистрибутивах ssh вобще включен по дефолту.

Настройка

Файлы конфигурации

~/.rhosts - определяет адрес машины и имя пользователя, с которой данному пользователю открыт доступ.

~/.shosts - аналогичен .rhosts, но предназначен исключительно для ssh.

Формат: имя_хоста имя_юзера.

user1.test.ru user1
userstend.test.ru user1

/etc/hosts.equiv - также содержит пары имя машины/имя пользователя, но имеет эффект на всех пользователей.

/etc/shosts.equiv - аналог hosts.equiv, но применяется только ssh.

Формат: [+|-] имя_хоста имя_юзера.

+ user1.test.ru user1
- server.test.ru xakep

+ - разрешение; - - запрет

/etc/ssh/ssh_known_hosts и ~/.ssh/known_hosts - содержат список адресов и соответствующих им публичных ключей.

Формат: адрес (или адреса, разделённые запятой), публичный ключ для него одной(!) строкой и дополнительное поле комментариев (необязательно). Адрес клиента должен быть в полном формате (name.domain), иначе могут быть проблемы. Кроме этого, в адресе можно использовать шаблоны * и ?.

user1.test.ru {SOME_VERY_LONG_PUBLIC_KEY}

Поддержка соединения

Обычно, через некоторое время, при бездействии пользователя (терминала) сервер закрывает сессию. Можно попробовать отредактировать в файле /etc/ssh/sshd_config параметры:

  • ClientAliveCountMax - количество проверок, пока сервер не решит, что клиент "отвалился".
  • ClientAliveInterval - интервал проверок (секунды).

Затем следует перезапустить SSH-сервер:

$ sudo service sshd restart

Генерация пользовательских ключей

Команда ssh-keygen

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vk/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vk/.ssh/id_rsa.
Your public key has been saved in /home/vk/.ssh/id_rsa.pub.
The key fingerprint is:
fb:b3:48:d1:65:86:5c:12:d7:c3:ad:ea:a5:1e:0a:32 vk@vk-pc.local

Иногда может потребоваться указать тип генерируемого ключа (по алгоритму RSA)

$ ssh-keygen -t rsa

Передача ключа

Для размещения первого ключа достаточно выполнить команду scp - безопасное копирование.

$ scp ~/.ssh/id_rsa.pub username@server.name:~/.ssh/authorized_keys
Password:
id_rsa.pub                                              100%  396     0.4KB/s   00:00

Если имя пользователя совпадает с текущим, то его можно не указывать.

Права на файл authorized_keys должны быть 600, на папку .ssh должны быть 700 - для ограничения доступа посторонних.

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

$ ssh user@host "cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub

В некотроых системах существует скрипт ssh-copy-id. Кроме копирования он так же устанавливает правильные права на файл.

$ ssh-copy-id -i .ssh/id_rsa.pub user@server.name

Примеры использования

Монтирование удалённой директории по SSH (sshfs)

Для начала необходимо установить поддержку sshfs

$ sudo apt-get install sshfs

И загрузить модуль fuse

$ sudo modprobe fuse

Теперь можно попытаться смонтировать

$ sshfs remoteuser@server.domain:/path/to/folder/on/remote/server /path/to/local/mount/point 

Если будет ругань на нехватку прав на устройство /dev/fuse, нужно добавить юзера в группу fuse

Выполнение команд на удалённой машине

Протокол SSH предусматривает возможность выполнить команду на удалённой машине, получив результат на машине клиента (терминале). Пример

$ ssh user@server 'ls -l /path/to/dir'

Однако, в некоторый случаях программе (скрипту) на удалённой машине требуется выполнить вывод в консоль, а она как бы не существует. Например, при использовании sudo в вызываемом скрипте. В таком случае возможно сообщение об ошибке вроде такого: sudo: no tty present and no askpass program specified. Ключик -t (принудительное использование терминала) скорей всего решит проблему:

$ ssh user@server 'ls -l ~/path/to/my_script param1 param2'

Туннель

Здесь локальный порт 12345 будет проброшен на порт 3306 на remote.host. Таким образом, подключаясь на 127.0.0.1:12345 можно работать с удаленной БД "локально".

$ ssh -L 12345:localhost:3306 user@remote.host

В следующем примере локальный порт 12345 (допустим, с домашнего компьютера) будет проброшен на порт 22 internalhost.local (компьютера из рабочей локальной сети) через шлюз remote.host той самой сети. Таким образом, подключиться к удаленной машине можно 'ssh -p 12345 localhost'.

$ ssh -L 12345:internalhost.local:22 user@remote.host

Проброс X через туннель

Подготовка туннеля с внутреннего хоста из удаленной локальной сети через шлюз на локальную машину:

$ ssh -fNL 12345:internal.local:22 user@remote.host

Запуск приложения VirtualBox на удаленной машине с выводом графики на локальную:

$ ssh -YvCp 12345 username@localhost VirtualBox

Ссылки

Персональные инструменты