Материал просмотрен 2,804 раз(а)

Настраивать SSH-сервер, я считаю, очень нужно, потому как он обеспечивает более безопасную по сравнению с telnet передачу данных, позволяет подключаться удалённо к серверу и выполнять команды в контексте нужного пользователя, передавать файлы, и ещё много чего другого! Настройка SSH идентична в разных системах, я уже приводил тут руководства для FreeBSD, сейчас же раздобыл дистрибутивчик Debian, на нём покажу для разнообразия более полную схему организации SSH-доступа.

Задачи, решаемые в этой теме:

  1. Знакомство с конфигурационными файлами SSH-сервера;
  2. Смена порта по-умолчанию для SSH;
  3. Авторизация по паролю в SSH;
  4. Авторизация с помощью файлов-ключей SSH;
  5. Автоматический вход в систему с помощью файлов-ключей SSH;
  6. Копирование файлов на удалённый хост по открытому протоколу;
  7. Копирование файлов на удалённый хост по безопасному протоколу;

Представлена схема взаимодействия.:

Серверу предоставим 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> – идентификация пользователя-хоста, куда производится копирование;

<куда> – путь, по которому скопировать файл.

Вот и всё. Надеюсь, было интересно!