SSH (ч.2): Настройка сервера OpenSSH

Оглавление

1. Что такое SSH. Утилиты SSH

2. Настройка сервера OpenSSH

2.1 Как настроить SSH сервер (sshd)

2.2 Перезапуск службы SSH

2.3 Как изменить порт, на котором работает сервер OpenSSH

2.4 Как выбрать интерфейс (IP) для прослушивания

2.5 Почему пользователь root не может подключиться по SSH с верным паролем. Как запретить или разрешить подключение root по SSH

2.6 Запрет и разрешение входа в SSH по паролю обычным пользователям

2.7 Разрешение входа без пароля

2.8 Как разрешить или запретить пользователям входить через SSH

2.9 Шаблоны в файле настроек SSH

2.10 Как разрешить подключение только с определённого IP или группы IP. Как заблокировать определённые IP для SSH

2.11 Настройка журналов SSH сервера

2.12 Запуск SSH без отсоединения от терминала

2.13 Запуск сервера SSH с другим конфигурационным файлом

2.14 Как проверить конфигурационный файл сервера SSH без запуска службы

2.15 Другие важные опции командной строки сервера SSH

2.16 Другие опции sshd

3. Как подключиться к SSH. Настройка клиента OpenSSH

4. Создание и настройка ключей OpenSSH

5. Копирование файлов с помощью scp и sftp

6. Подсказки и сложные случаи использования OpenSSH


Как настроить SSH сервер (sshd)

Служба sshd считывает настройки из конфигурационного файла /etc/ssh/sshd_config. Этот файл содержит пары «ключевое слово — аргумент», одна пара на одной строке. Для каждого ключевого слова будет использовано первое полученное значение (исключение составляют несколько директив, которые можно использовать несколько раз, и каждого значение будет учтено, например это Port и ListenAddress).

Опционально аргументы можно заключить в двойные кавычки ("), чтобы передать аргументы, содержащие пробелы.

Ключевые слова не чувствительны к регистру, а аргументы чувствительны к регистру.

Многие директивы закомментированы, но они указывают на значение по умолчанию, которое всё равно используется. Если вас устраивает значение по умолчанию, то не нужно ничего менять. Если же вы хотите другое значение, то нужно раскомментировать строку с соответствующей директивой (убрать символ #) и внести изменения.

Дополнительно можно указать опции командной строки — они имеют приоритет над настройками в конфигурационном файле.

Перезапуск службы SSH

Если между sshd.service и sshd.socket (подробности в разделе «Управление службой OpenSSH») вы выбрали запуск sshd.service, то чтобы внесённые в конфигурационный файл изменения вступили в силу, необходимо перезапустить службу:

sudo systemctl restart sshd.service

Для sshd.socket перезапуск службы требуется только при изменении номера порта (как это показано ниже) и делается так:

sudo systemctl restart sshd.socket

Как изменить порт, на котором работает сервер OpenSSH

Все настройки выполняются в файле /etc/ssh/sshd_config или в строке команды запуска sshd.

Для sshd.socket смена прослушиваемого службой порта происходит иначе. 

Если вы используете sshd.service (объяснения в первой части), то смена порта также происходит в файле /etc/ssh/sshd_config. Для этого раскомментируйте директиву Port и укажите новое значение:

Port 2222

Опцию Port разрешено использовать несколько раз.

Также порт можно установить с помощью ListenAddress.

Если вы используете сокет sshd.socket и хотите поменять для SSH прослушиваемый порт, то вам нужно редактировать специальный файл следующим образом:

sudo systemctl edit sshd.socket

Там можно указать только порт:

[Socket]
ListenStream=
ListenStream=23456

А также IP и порт:

[Socket]
ListenStream=
ListenStream=172.0.0.1:12345

Обратите внимание, что использование ListenStream дважды в одном конфигурационном файле не является ошибкой. Если вы используете ListenStream только один раз с указанием порта, тогда будут прослушиваться и 22 порт и порт, который вы указали. Первое использование ListenStream= отключает прослушивание 22 порта.

Для sshd.socket другие настройки, как обычно, в файле /etc/ssh/sshd_config. Но директивы Port и ListenAddress будут игнорироваться (если выбрано прослушивание сокета).

Как выбрать интерфейс (IP) для прослушивания

В системе может быть несколько сетевых интерфейсов с несколькими IP адресами, по умолчанию sshd прослушивает их все, в том числе IPv6 адреса:

ListenAddress 0.0.0.0
ListenAddress ::

Если вы хотите, чтобы компьютер в локальной сети был доступен только для устройств в локальной сети, то можно указать его локальный IP:

ListenAddress 192.168.1.20

Кстати, смотрите статью «Как настроить Kali Linux на использование статичного IP адреса».

Директиву ListenAddress можно использовать несколько раз в одном конфигурационном файле. Разрешены следующие форматы:

ListenAddress hostname|address [rdomain domain]
ListenAddress hostname:port [rdomain domain]
ListenAddress IPv4_address:port [rdomain domain]
ListenAddress [hostname|address]:port [rdomain domain]

Если порт не указан, то sshd будет прослушивать на указанном порту в соответствии со всеми установленными опциями Port в этом файле.

Квалификатор rdomain является необязательным, он имеет отношение к маршрутизации.

Также обратите внимание, что с ListenAddress обязательно должен быть указано имя хоста (адрес) ИЛИ порт. Можно указать отдельно имя хоста (адрес), можно указать отдельно порт, а также можно указать их вместе. Во всех вариантах rdomain может отсутствовать.

Опции командной строки (об их использовании далее) имеют приоритет над директивами конфигурационного файла. В том числе опция для установки используемого порта приводят к тому, что Port в конфигурационном файле игнорируется. Но порты указанные с ListenAddress перезаписывают порты в строке команды.

Вы можете указать конкретный IP, который будет прослушиваться в ожидании подключений. А опцией AddressFamily вы можете выбрать для прослушивания все адреса, только IPv4 или только IPv6:

AddressFamily any

Варианты:

  • any (по умолчанию — любые адреса),
  • inet (использовать только IPv4),
  • inet6 (использовать только IPv6),

Почему пользователь root не может подключиться по SSH с верным паролем. Как запретить или разрешить подключение root по SSH

Если при подключении к удалённой системе по SSH вы сталкиваетесь с ошибкой, что не удаётся войти под пользователем SSH даже с верным паролем:

Permission denied, please try again.
Permission denied (publickey,password).

То проверьте значение директивы PermitRootLogin:

#PermitRootLogin prohibit-password

По умолчанию она закомментирована, но указанное значение всё равно используется по умолчанию.

Директива PermitRootLogin определяет, может ли root выполнить вход используя ssh. Аргументами могут быть: yes, prohibit-password, forced-commands-only или no. Значением по умолчанию является prohibit-password.

Если эта опция установлена на prohibit-password (или устаревший псевдоним without-password), то вход по паролю и интерактивная аутентификация с клавиатуры отключены для пользователя root.

Если эта опция установлена на forced-commands-only, вход root с аутентификацией по публичному ключу будет разрешён, но только если была указана опция ForceCommand с командой (это может быть полезно для получения удалённых бэкапов, даже если нормальный вход root не разрешён). Все другие методы аутентификации отключены для root.

Если эта опция установлена на no, то root'у не разрешён вход вовсе.

Если опция установлена на yes, то разрешён вход для рута без ограничений.

Итак, если вы столкнулись с проблемой, что не можете выполнить вход с верным паролем под пользователем root, то либо настройте вход без пароля — по публичному ключу, либо установите значение этой директивы на yes.

Запрет и разрешение входа в SSH по паролю обычным пользователям

Чуть выше мы рассмотрели вариант, когда пользователю root запретить вход по паролю. Такую же настройку можно сделать для всех остальных пользователей, для этого используется директива PasswordAuthentication. Значением по умолчанию является yes, то есть вход по паролю разрешён. Для запрета входа по паролю всем пользователям, установите значение этой директивы на no.

Разрешение входа без пароля

За разрешение входа без пароля отвечает директива PermitEmptyPasswords. Она нужна для специфичных случаев, чтобы разрешить вход аккаунтам с пустой парольной строкой. По умолчанию установлена на no.


Как разрешить или запретить пользователям входить через SSH

Всего имеется 4 директивы, которые разрешают или запрещают пользователям и группам подключаться к SSH. Эти директивы в порядке обработки: DenyUsers, AllowUsers, DenyGroups и наконец AllowGroups.

За ключевым словом AllowUsers может следовать список шаблонов имён пользователей, разделённых пробелами, например:

AllowUsers alice bob

Если директива используется, то вход разрешён только пользователям, имена которых соответствуют шаблонам. Принимаются только имена пользователей, цифровые идентификаторы пользователей не распознаются. По умолчанию вход разрешён для всех пользователей. Если шаблон имеет вид ПОЛЬЗОВАТЕЛЬ@ХОСТ, тогда раздельно проверяются ПОЛЬЗОВАТЕЛЬ и ХОСТ и вход разрешается только определённым пользователям с определённых хостов. В качестве ХОСТа могут быть адреса в формате CIDR, то есть в виде адрес/маска.

Далее о шаблонах, которые могут принимать директивы DenyUsers, AllowUsers, DenyGroups и AllowGroups.

Шаблоны в файле настроек SSH

Шаблон состоит из нуля или более символов, которые не являются белыми пробелами, ‘*’ (подстановочного символа, который соответствует нулю или более символам), а также ‘?’ (подстановочный символ, который соответствует ровно одному любому символу). Например, чтобы охарактеризовать любой хост в наборе доменов ".co.uk" можно использовать следующий шаблон:

Host *.co.uk

Следующий шаблон будет соответствовать любому хосту в сетевом диапазоне 192.168.0.[0-9]:

Host 192.168.0.?

Список шаблонов — это несколько шаблонов, разделённых запятой. Шаблоны внутри списка могут иметь противоположное значение если перед ними стоит восклицательный знак («!»). Например, для разрешения ключа использовать откуда угодно внутри организации, кроме пула "dialup", можно использовать следующее (в authorized_keys):

from="!*.dialup.example.com,*.example.com"

Помните, что отрицательное совпадение никогда само по себе не даст положительных результатов. Например, попытка сопоставить хост "host3" следующими списку шаблонов не найдёт совпадений:

from="!host1,!host2"

Решением для предыдущей ситуации является включение термина, который приведёт к положительному совпадению, им может быть подстановочный символ:

from="!host1,!host2,*"

Как разрешить подключение только с определённого IP или группы IP. Как заблокировать определённые IP для SSH

С помощью директив (перечислены в порядке обработки) DenyUsers, AllowUsers, DenyGroups и AllowGroups и шаблонов можно настроить разрешения для доступа к SSH по IP.

Рассмотрим несколько примеров. Если в файл sshd_config добавить фильтрацию с AllowUsers:

AllowUsers johndoe@192.168.1.* admin2@192.168.1.* otherid1 otherid2

Это разрешит доступ для johndoe и admin2 только с адресов 192.168.1.*, а для otherid1, otherid2 доступ будет открыт с любого адреса.

Чтобы разрешить доступ к SSH любым пользователям, но только с определённых IP, в файле /etc/ssh/sshd_config используйте директиву AllowUsers с подстановочным символом:

AllowUsers *@192.168.1.100

Или:

AllowUsers *@ИМЯ_ХОСТА

Возможно ограничить ключ ssh или ключ на основе ca набором адресов в файле .ssh/authorized_keys домашнего каталога данного пользователя:

from="192.168.1.*,192.168.2.*" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABA...etc...mnMo7n1DD useralias

В этом примере открытый ключ для useralias будет действовать только с заданных адресов.

Настройка журналов SSH сервера

Служба SSH не ведёт свой собственный лог и записывает события в системный журнал. О том, как его просмотреть, обратитесь к разделу «Как проверить журнал событий SSH службы».

Можно настроить подробность ведения журнала — уровень вербальности, то есть какие именно сообщения будут записываться в этот журнал. Для этого используется директива LogLevel. Её значем по умолчанию является INFO. Также доступны следующие варианты:

  • QUIET
  • FATAL
  • ERROR
  • INFO
  • VERBOSE
  • DEBUG
  • DEBUG1
  • DEBUG2
  • DEBUG3

DEBUG и DEBUG1 являются эквивалентами. DEBUG2 и DEBUG3 — каждый указывает на более высокие уровни вывода отладочной информации.

Ведение журнала на уровне DEBUG нарушает политику приватности пользователей и не рекомендуется.

Запуск SSH без отсоединения от терминала

Запуск службы sshd описан в первой части. Также демон sshd можно запустить по имени файла. Для этого нужно указать полный путь до файла sshd, чтобы его узнать:

which sshd
/usr/bin/sshd

Запущенная таким образом sshd отключиться от терминала (перейдёт в фоновое выполнение) и не будет выводить что-либо в стандартный вывод.

Можно запустить sshd как процесс без отсоединения от терминала (чтобы процесс не стал демоном), для этого используйте опцию -D — это позволяет упростить процесс мониторинга работы SSH, поскольку сообщения о событиях и проблемах службы будут выводиться в стандартный вывод. Дополнительно можно указать опцию -d для включения режима отладки:

sudo /usr/bin/sshd -D -d

Запуск сервера SSH с другим конфигурационным файлом

С помощью опции -f можно указать путь до другого конфигурационного файла (значение по умолчанию /etc/ssh/sshd_config). sshd откажется запускаться без конфигурационного файла.

Как проверить конфигурационный файл сервера SSH без запуска службы

-t

Тестовый режим. Только проверяет правильность файла конфигурации и работоспособность ключей. Это полезно для надёжного обновления sshd, поскольку параметры конфигурации могут измениться.

-T

Расширенный тестовый режим. С этой опцией sshd проверит правильность файла конфигурации, выведет действующую конфигурацию в стандартный вывод и затем завершит работу. При желании, правила соответствия могут применяться путём указания параметров соединения с использованием одной или нескольких опций -C.

-C connection_spec

Укажите параметры соединения для использования в расширенном тестовом режиме -T. Если установлены, любые директивы Match в файле конфигурации, которые будут применяться, применяются до записи конфигурации в стандартный вывод. Параметры соединения предоставляются в виде пар «ключевое слово=значение» и могут предоставляться в любом порядке, с несколькими опциями -C или в виде списка через запятую. Ключевыми словами являются «addr», «user», «host», «laddr», «lport» и «rdomain», и они соответствуют адресу источника, пользователю, разрешённому имени хоста источника, локальному адресу, номеру локального порта и домену маршрутизации соответственно.

Другие важные опции командной строки сервера SSH

-c host_certificate_file

Указывает путь к файлу сертификата для идентификации sshd во время обмена ключами. Файл сертификата должен соответствовать файлу ключа хоста, указанному с помощью параметра -h или директивы конфигурации HostKey.

-h host_key_file

Указывает файл, из которого читается ключ хоста. Эта опция должна быть указана, если sshd не запускается от имени пользователя root (поскольку обычные файлы ключей хоста как правило не читаются никем, кроме root). По умолчанию это /etc/ssh/ssh_host_ecdsa_key, /etc/ssh/ssh_host_ed25519_key и /etc/ssh/ssh_host_rsa_key. Можно иметь несколько файлов ключей хоста для разных алгоритмов ключей хоста.

-E файл_журнала

Добавить журналы отладки в файл_журнала вместо системного журнала.

-e

Записывать журналы отладки в стандартный вывод ошибок вместо системного журнала.

-o опция

Может использоваться для задания параметров в формате, используемом в файле конфигурации (sshd_config). Это полезно для указания параметров, для которых нет отдельного флага командной строки. Самые важные директивы конфигурационного файла рассмотрены выше.

-p порт

Указывает порт, на котором сервер прослушивает соединения (по умолчанию 22). Допускается использование нескольких портов. Порты, указанные в файле конфигурации с параметром «Port», игнорируются, если указан порт командной строки. Порты, указанные с помощью параметра ListenAddress, переопределяют порты командной строки.

-q

Тихий режим. Ничего не отправляется в системный журнал. Без этой опции обычно запуск, аутентификация и завершение каждого соединения регистрируются.

Другие опции sshd

Рассмотрены самые востребованные опции конфигурационного файла sshd, кроме них имеется ещё много других, которые настраивают используемые шифры, могут более тонко определить порядок аутентификации и требования к подключающемуся, настраивают возможности пересылки (forwarding), установить выполняемую команду при подключении пользователя, вывод определённой информации при подключении и так далее.

С другими опциями конфигурационного файла sshd (на английском языке) вы сможете ознакомиться с помощью команды:

man sshd_config

Информацию об опциях командной строки можно увидеть с помощью:

man sshd

Рекомендуется Вам:

Добавить комментарий

Ваш e-mail не будет опубликован.