Содержание
Настраивать SSH-сервер, я считаю, очень нужно, потому как он обеспечивает более безопасную по сравнению с telnet передачу данных, позволяет подключаться удалённо к серверу и выполнять команды в контексте нужного пользователя, передавать файлы, и ещё много чего другого! Настройка SSH идентична в разных системах, я уже приводил тут руководства для FreeBSD, сейчас же раздобыл дистрибутивчик Debian, на нём покажу для разнообразия более полную схему организации SSH-доступа.
Задачи, решаемые в этой теме:
- Знакомство с конфигурационными файлами SSH-сервера;
- Смена порта по-умолчанию для SSH;
- Авторизация по паролю в SSH;
- Авторизация с помощью файлов-ключей SSH;
- Автоматический вход в систему с помощью файлов-ключей SSH;
- Копирование файлов на удалённый хост по открытому протоколу;
- Копирование файлов на удалённый хост по безопасному протоколу;
Представлена схема взаимодействия.:
Серверу предоставим IP-адрес 192.168.0.3, клиенту – 192.168.0.5
Итак, у нас в системе есть два пользователя. Суперпользователь root с паролем qwer1234 и пользователь user с паролем 12345. Разумеется, это демонстрационные пароли, на практике такие использовать нежелательно.
Конфигурационные файлы SSH сервера.
Входим на сервер с адресом 192.168.0.3. Равно как и клиента, конфиги сервера хранятся в директории /etc/ssh
. Для сервера это файл sshd_config, для клиента соответственно ssh_config.
Открываем файл конфигурации сервера и обращаем внимание на некоторые параметры:
# mcedit /etc/ssh/sshd_config
Port 22
– номер порта сервера. Поменяем это значение на 2990.
Protocol 2
– вторая версия протокола, предпочитаем использовать её.
PermitRootLogin yes
– скорее всего у вас стоит no и строчка закомментирована. Убираем комментарий и ставим yes. Эта опция разрешает логин учётной записи суперпользователя.
Остальные настройки оставляем по-умолчанию, пока нам ничего этого не надо. Перезапускам (запускаем сервер):
# service ssh restart
Проверяем, запустился ли демон sshd:
# netstat -ltnpu | grep sshd
увидели запущенный демон с портом 2990! Всё ок.
Коннектимся к серверу с клиента:
# ssh -p 2990 user@192.168.0.3
При первом подключеннии у нас запрашивается разрешение на добавление отпечатка в хранилище. Напишем yes и увидим консоль пользователя user, открытую на сервере.
Убеждаемся, что мы user и что подключены с узла 192.168.0.5 (клиент):
$ id
$ w
Помните, раскомментировали строчку PermitRootLogin в yes? Это значит, что входить можно и под root-ом. Попробуйте.
# ssh -p 2990 root@192.168.0.3
Как вы уже поняли, -p 2990 – это порт подключения. По-умолчанию он равен 22, тогда его можно не писать. Но если мы изменили в конфигурации sshd_config порт по-умолчанию, то порт указывать придётся.
Рекомендую строчку PermitRootLogin вернуть в no.
Так, дальше надо развивать аутентификацию по ключам.
Аутентификация по ключам RSA и DSA.
Для каждого узла можно сгенерировать свой набор ключей (закрытый и открытый), который позволяет аутентифицироваться в системе без пароля пользователя.
Для генерации ключа выполняем команду ssh-keygen [-t dsa]
, которая генерирует набор ключей (открытый и закрытый). Действия эти производим на клиенте.
# ssh-keygen
…
Ключи находятся (по-умолчанию) в папке пользователя в каталоге .ssh.
# ls -la ~/.ssh/
id_rsa – закрытый ключ (его никому не давайте!)
id_rsa.pub – открытый ключ (его нужно загрузить на сервер). Сейчас этим и займёмся.
Авторизация с помощью RSA и DSA ключей.
Для того, чтобы передать открытый ключ на сервер в Linux есть отличная утилита ssh-copy-id.
Кстати, у вас ничего не получится с этой утилитой, пока не исправите порт по-умолчанию в настройках клиента: Утилита долбится на тот же 22-ой и нет возможности указать вручную другой порт. Поэтому делаем так:
# mcedit /etc/ssh/ssh_config
там ищем и раскомментируем строчку Port 22 и указываем значение ей 2990, применительно этой статьи. Теперь с утилитой ssh-copy-id всё получится.
Ну чтож, попробуем подключиться и авторизоваться не по паролю пользователя, а по ключу.
# ssh user@192.168.0.3
выполняем на клиенте и вводим секретную фразу, которой зашифровали ключ.
Получилось! Теперь вовсе необязательно знать авторизационные данные пользователя. Можно обойтись только лишь секретной фразой.
Сгенерируем DSA-ключ аналогичным образом.
Передадим его небезопасным способом, который я обещал, кстати, показать. Для этого используем утилиту netcat (команда nc).
На сервере переходим в директорию /home/user/.ssh/ (для удобства) и выполняем команду:
# nc -l 9999 >> authorized_keys
Что делает эта команда? Все данные, полученные с порта 9999 дописывает в конец файла публичных ключей. Порт задаётся произвольно. Что теперь делаем на сервере? Правильно! Пошлём файл публичных ключей на хост сервера на порт 9999! Тот их получит и запишет в файл. Как бы копирование по сети.
# cat /home/user/.ssh/id_dsa.pub | nc -w 2 192.168.0.3 9999
Команда выводит содержимое файла открытого ключа на конвейер в утилиту nc, которая посылает данные на сокет, указаннаый в параметрах. -w – это таймаут
Выведем теперь на экран содержимое файла authorized_keys с сервера. Легко заметить, что данные dsa-ключа дописались в него:
Автоматизация входа без пароля по ключам.
Всё бы хорошо, но надоедает каждый раз вводить парольную фразу при коннекте. Есть и решение этой проблемы. Заключается оно в применении утилиты хранения ключей.
# ssh-add [ключи]
С её помощью мы забьём фразу один раз и можем подключаться свободно тогда, когда пожелаем. Кстати, у утилиты есть параметры -l – показ хранимых ключей и -d – удаление ключей из хранилища.
Но прежде, чем воспользоваться этой утилитой, нужно настроить у себя аутентифицирующий агент. Нет ничего проще, я вам скажу.
# ssh-agent bash
Команда введённая параметром в командной строке будет выполняться после аутентификации. Запуск командного интерпретатора – то, что нужно!
Ну теперь пробуем подключиться к серверу ещё раз:
# ssh user@192.168.0.3
Как мы видим, никакой пароль пользователя, никакая секретная фраза больше не спрашивается. И тем не менее, у нас есть шифрованный канал связи до сервера. Самое время научиться безопасно передавать файлы.
Для этого я расскажу, как пользоваться утилитой scp.
# scp [-r] <что> <user@host>:<куда>
-r – рекурсивный подход, если копируем директорию;
<что> – файл или папка у нас на компьютере.
<user@host> – идентификация пользователя-хоста, куда производится копирование;
<куда> – путь, по которому скопировать файл.
Вот и всё. Надеюсь, было интересно!
Для добавления публичного ключа в authorized_keys есть команда ssh-copy-id, но вариант с nc — это забористый Ъ-хардкор, одобряю