4.5 Служба sshd — OpenSSH, сервер протокола SSH, описание

OpenSSH Daemon — это программа-сервер, обслуживающая запросы программы-клиента ssh. Вместе эти программы заменяют rlogin и rsh и обеспечивают защищённую и зашифрованную связь между двумя непроверенными компьютерами через незащищённую сеть.

sshd — это служба, принимающая запросы на соединения от клиентов. Обычно она запускается при загрузке системы из /etc/rc. Для каждого нового соединения создаётся (с помощью вызова fork) новый экземпляр службы. Ответвлённый экземпляр обрабатывает обмен ключами, шифрование, аутентификацию, выполнение команд и обмен данными.

Параметры определяются при помощи ключей командной строки или файла конфигурации (по умолчанию — sshd_config). Ключи командной строки имеют больший приоритет, чем значения, указанные в файле конфигурации. При получении сигнала отбоя SIGHUP перечитывает свой файл конфигурации путём запуска собственной копии с тем же самым именем, с которым был запущен, например, /usr/sbin/sshd.

Доступны следующие ключи:

Ключ Описание ключа
-4 Использовать только адреса IPv4.
-6 Использовать только адреса IPv6.
-b длина_ключа_1 Определяет число битов в ключе сервера протокола версии 1 (по умолчанию 768).
D Не переходить в фоновый режим и не становиться службой. Это упрощает слежение за экземпляром sshd
d Режим отладки. Сервер посылает расширенную отладочную информацию в файл журнала событий системы и не переходит в фоновый режим работы. Также сервер не создаёт дочерних процессов и обрабатывает только одно соединение. Этот параметр предназначен только для отладки работы сервера. Несколько параметров -d указанных один за другим, повышают уровень отладки. Максимум — это 3:
e Направлять вывод в консоль (stderr) вместо механизма журналирования событий системы.
-f файл_конфигурации Определяет имя файла конфигурации. По умолчанию — это /etc/ssh/sshd_config отказывается работать, не имея файла конфигурации.
-g время_задержки Определяет период, в течение которого клиент должен себя идентифицировать (по умолчанию — 120 секунд). Если клиент не смог идентифицировать себя в течение этого времени, экземпляр сервера прекращает свою работу. Значение равное нулю отменяет ограничение на время ожидания.
-h файл_ключа Определяет файл, из которого будет считан ключ хоста Этот параметр должен быть указан, если запущен не от имени суперпользователя (так как обычно стандартные файлы хоста доступны для чтения только суперпользователю). Стандартное расположение файла — /etc/ssh/ssh_host_key для протокола версии 1, и /etc/ssh/ssh_host_rsa_key и /etc/ssh/ssh_host_dsa_key для протокола версии 2. Можно иметь несколько ключей хоста для разных версий протокола и алгоритмов генерации ключей.
i Этот ключ позволяет уведомить программу о том, что она запускается службой inetd(8). Обычно не запускается из inetd, так как требуется генерировать ключ сервера до ответа клиенту, а это может отнять десятки секунд. Клиент будет вынужден ожидать слишком долго, если ключ будет повторно генерироваться каждый раз. Однако, при малых размерах ключа (например, 512), использование из inetd может быть оправдано.
-k частота Определяет, как часто будет регенерироваться ключ сервера протокола версии 1 (по умолчанию 3600 секунд — один раз в час). Мотивацией для регенерации ключа так часто служит то, что ключ нигде не сохраняется и, по истечении примерно часа, восстановить ключ для прерванных соединений становится невозможно даже если машина была взломана или захвачена физически. Значение ноль означает, что ключ никогда не будет регенерирован.
-о директива Позволяет указывать директивы в формате файла конфигурации, например такие, для которых нет соответствующего ключа командной строки. Директивы файла конфигурации описаны в sshd_config(5).
-p порт Порт, на котором сервер будет ожидать соединения (по умолчанию — 22). Возможно указание нескольких ключей с разными портами. Если данный ключ указан, параметр Port файла конфигурации игнорируется, однако порты, указанные в ListenAddress имеют больший приоритет, чем указанные в командной строке.
-q Не заносить в системный журнал регистрации событий никакой информации. В обычном режиме в нём фиксируется подключение, аутентификация и разрыв каждого соединения.
-t Режим тестирования. Выполняется только проверка соответствия файла конфигурации и готовность ключей. Полезно для проверки состояния службы после обновления, при котором были изменены файлы конфигурации.
-u длина Размер поля в структуре utmp хранящей имя удалённого хоста. Если разрешённое имя хоста превышает указанное значение, то взамен будет использован десятичное представление IP-адреса через точку. Это позволяет уникально идентифицировать машины со слишком длинными именами. Указание -u0 включает использование в файле utmp IP-адресов во всех случаях. При этом будет производить DNS-запросы только если это явно требуется конфигурацией (from=pattern-list) или механизмом аутентификации (либо RhostsRSAAuthentication либо HostbasedAuthentication ). Использование DNS также обязательно в случае задания параметрам AllowUsers и DenyUsers значения в формате USER@HOST.

Аутентификация

Служба OpenSSH SSH поддерживает версии протокола SSH 1 и 2. Запретить использование одного из протоколов можно, указав в параметре Protocol файла sshd_config. Протокол 2 поддерживает ключи RSA и DSA; протокол 1 поддерживает только ключи RSA. Независимо от протокола, каждый подключающийся хост имеет собственный, обычно 2048-битный идентифицирующий его ключ.

Для протокола версии 1 подтверждение субъекта сервера обеспечивается 768-битным ключом, который генерируется при запуске сервера. Ключ генерируется заново каждый час, при условии его использования, и не хранится на диске. При получении запроса на подключение со стороны клиента служба посылает в ответ свой открытый ключ и свои ключи. Клиент сравнивает ключ хоста RSA со своими данными, чтобы убедиться в том, что это тот же сервер. Затем клиент генерирует 256-битное произвольное число, шифрует его при помощи обоих ключей (своего и сервера) и отправляет результат серверу. Это число становится ключом сеанса, и с его помощью выполняется кодирование всей последующих данных, по согласованному методу — Blowfish или 3DES (клиент выбирает метод из предложенных сервером). В настоящее время по умолчанию используется 3DES.

Для протокола версии 2 подтверждение субъекта сервера обеспечивается по схеме Диффи—Хеллмана, в результате которой также получается общий ключ сеанса. Дальнейший обмен данными шифруется симметричным кодом, 128-битным AES, Blowfish, 3DES, CAST128, Arcfour, 192-битным AES или 256-битным AES, который выбирает клиент из предложенных сервером. Кроме того, целостность передаваемых данных обеспечивается кодом подтверждения подлинности сообщения (hmac-sha1 или hmac-md5).

Далее, сервер и клиент переходят в режим аутентификации. Клиент пытается аутентифицировать себя по своему хосту, открытому ключу, паролю или с помощью беспарольного механизма («вызов-ответ»).

Независимо от типа аутентификации служба проверяет доступность соответствующей учётной записи в системе. Так, она может быть заблокирована посредством добавления её в параметр DenyUsers или её группы в DenyGroups. Механизм общесистемной блокировки учётной записи выполняется разными системами по-разному. Одни системы ведут собственную базу данных учётных записей (AIX), другие вносят соответствующие изменения в поля файла passwd (‘*LK*’ — Solaris и UnixWare, ‘*’ — на HP-UX, ‘Nologin’ — Tru64, ‘*LOCKED*’ во FreeBSD и ‘!!’ в GNU/Linux). Для запрета только аутентификации по паролю укажите в файле passwd ‘NP’ или ‘*NP*’.

После успешной аутентификации себя клиентом связь переходит в режим подготовки сеанса. В этот момент клиент может запросить такие вещи, как выделение псевдо-терминала, перенаправление соединения Х11, перенаправление соединения TCP/IP или перенаправление соединения агента аутентификации через защищённый канал.

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

По завершении работы пользовательской программы и закрытии всех перенаправленных Х11 и других соединений сервер посылает клиенту команду со статусом выхода и сеанс завершается.

Вход в систему

После успешной аутентификации пользователя выполняет следующие действия:

  • Если регистрация в системе произведена на терминале (tty) и не указана никакая команда, то отображается время последнего входа в систему и содержимое файла /etc/motd (если только это не отключено в файле конфигурации или ~/.hushlogin).
  • Если регистрация в системе произведена на терминале, записывается время регистрации.
  • Проверяется /etc/nologin, если он присутствует, выводится его содержимое и завершается работу (исключение — root).
  • Осуществляется переход к выполнению с правами обычного пользователя.
  • Устанавливаются значения основных переменных среды.
  • Интерпретируется файл ~/.ssh/environment, если таковой имеется, и пользователям разрешено изменять среду.
  • Переходит в домашний каталог пользователя.
  • Если имеется файл ~/.ssh/rc, то производится его выполнение, а если нет и имеется /etc/ssh/sshrc, то выполняется он, в противном случае выполняется   Файлам ‘rc’ на стандартный ввод передаётся протокол аутентификации Х11 и cookie.
  • Запускается оболочка пользователя или выполняется указанная команда.

SSHRC

Если файл ~/.ssh/rc существует, он будет выполняться после файлов определения переменных среды, но перед запуском оболочки пользователя или команды. Если используется подмена Х11, то на его стандартный ввод будет передана пара «proto cookie», также ему будет доступна переменная среды DISPLAY. Сценарий должен вызывать xauth(1) самостоятельно для добавления cookie X11.

Основная цель этого файла состоит в выполнении процедур инициализации, необходимые прежде, чем станет доступным основной каталог пользователя. AFS — пример такой среды.

Этот файл будет, вероятно, содержать блок аналогичный следующему:

if read proto cookie && [ -n "$DISPLAY" ]; then
if [ 'echo $DISPLAY | cut -c1-10' = 'localhost:' ]; then
 X11UseLocalhost=yes
echo add unix:'echo $DISPLAY
| cut -c11-' $proto $cookie
else
 X11UseLocalhost=no
echo add $DISPLAY $proto $cookie
fi | xauth -q -
fi

Если этот файл отсутствует, то выполняется /etc/ssh/sshrc, а если отсутствует и он, то для добавления cookie используется xauth.

Формат файла authorized keys

Параметр файла конфигурации AuthorizedKeysFile определяет путь к файлу с открытыми ключами. Значение по умолчанию —/.ssh/authorized_keys. Каждая строка файла содержит один ключ (пустые строки или строки, начинающиеся с символа ‘#’ считаются комментариями и игнорируются). Открытые ключи протокола 1 (RSA) состоят из следующих полей, разделённых пробелами: параметры, битность, порядок, модуль, комментарий. Открытые ключи протокола версии 2 состоят из: параметр, тип ключа, ключ в виде base64, комментарий. Поля параметров необязательны; их отсутствие определяется наличием в начале строки цифры (поле параметра никогда не начинается с цифры). Поля битности, порядка, модуля и комментарии определяют ключ RSA; поле комментария не используется (но может быть удобно пользователю для отметки ключа). Для протокола версии 2 типом ключа является ssh-dss или ssh-rsa.

Заметьте, что строки в этих файлах, обычно имеют длину в несколько сотен байт (из-за размера открытого ключа RSA) и могут достигать длины в 8 килобайт (таким образом, максимальный размер ключа DSA — 8 килобит, а RSA — 16 килобит). Очевидно, не стоит вводить их вручную. Вместо этого скопируйте файл identity.pub, id_dsa.pub или id_rsa.pub и отредактируйте их.

Минимальная длина модуля RSA независимо от протокола составляет 768 бит.

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

 Параметр  Значение
command=команда Выполнять команду при каждом использовании данного ключа для аутентификации. Команда, передаваемая пользователем, будет игнорироваться. Команда выполняется на псевдо-терминале, если последний запрашивается клиентом; в противном случае она выполняется без терминала. Если требуется «чистый» 8-битный канал, запрашивать псевдо-терминал или указывать no-pty нельзя. В команду может быть включена кавычка, предварённая обратной косой чертой. Данный параметр полезен для ограничения использования определённых RSA-ключей. Примером может служить ключ, по которому можно выполнять удалённые операции резервного копирования и ничего более. Учтите, что клиент по-прежнему может запросить перенаправление TCP и/или X11, если только это не запрещен явно. Команда запрашиваемая клиентом заносится в переменную SSH_ORIGINAL_COMMAND. Заметьте, что данный параметр относится к выполнению оболочки, команды или подсистемы.
environment=ПЕРЕМЕННАЯ=значение Добавить переменную в среду (или переопределить её значение) при регистрации в системе с использованием данного ключа. Допускается указание нескольких таких директив. По умолчанию изменение переменных среды таким образом отключено. За его включение отвечает параметр PermitUserEnvironment. Этот параметр отключается автоматически при включении UseLogin.
from=список-шаблонов Если параметр определён, то в дополнение к прохождению аутентификации по открытому ключу каноническое имя удалённого хоста должно соответствовать одному из шаблонов в списке (шаблоны указываются через запятую). Цель этого параметра — увеличение степени защиты: если частный ключ хоста каким-либо образом удастся похитить, то он позволит злоумышленнику войти в систему из любой точки мира. Этот дополнительный параметр делает использование ворованных ключей более затруднительным (кроме перехвата ключа, требуется взлом серверов имён и/или маршрутизаторов). См. секцию ШАБЛОНЫ в ssh_config(5).
no-agent-forwarding Запретить перенаправление агента аутентификации при аутентификации данным ключом.
no-port-forwarding Запретить перенаправление TCP/IP при аутентификации данным ключом. Любой запрос на перенаправление порта приведёт к получению клиентом сообщения об ошибке. Это может быть использовано, например, вместе с параметром command.
no-pty Запретить назначение терминала (запросы на назначение псевдо-терминала не будут удовлетворены).
no-X11-forwarding Запретить перенаправление Х11 при аутентификации данным ключом. Любой запрос на перенаправление порта возвратит клиенту сообщение об ошибке.
permitopen=хост:порт Для функции перенаправления данных с локального клиентского порта на порт удалённой системы (выполняемого при указании ssh -L) ограничить набор возможных целей для перенаправления указанной машиной и портом. Для указания адресов IPv6 можно использовать альтернативный синтаксис: хост / порт. Допускается указание нескольких целей через запятую. Значение параметра не интерпретируется как шаблон (т.е. является литеральным).
tunnel=n Принудительно использовать устройство tun(4) на сервере. Без этого параметра при запросе клиентом туннеля используется ближайшее доступное для этого устройство.

Пример файла authorized_keys:

# допустимы комментарии только на всю строку
ssh-rsa AAAAB3Nza...LiPk== user@example.net
from="*.sales.example.net,!pc.sales.example.net" ssh-rsa
AAAAB2...19Q== john@example.net
command="dump /home",no-pty,no-port-forwarding ssh-dss
AAAAC3...51R== example.net
permitopen="192.0.2.1:80",permitopen="192.0.2.2:25" ssh-dss
AAAAB5...21S==
tunnel="0",command="sh /etc/netstart tun0" ssh-rsa AAAA...==
jane@example.net

Формат файла ssh_known_hosts

В файлах /etc/ssh/ssh_known_hosts и ~/.ssh/known_hosts хранятся открытые ключи всех машин, с которыми когда-либо устанавливалась связь. Глобальный файл должен быть подготовлен администратором (это необязательно), пользовательский файл поддерживается автоматически: каждый раз, когда поступает запрос на соединение от неизвестной машины, её ключ автоматически заносится в пользовательский файл.

Каждая строка в этом файле содержит следующие поля: имена хостов, битность, порядок, модуль, комментарий. Поля разделены пробелами.

Имена хостов — это разделённый запятыми список шаблонов (символы подстановки — (‘*’ и ‘?’); каждый шаблон сопоставляется с каноническим именем машины (при аутентификации клиента) или с именем, которое указано пользователем (при аутентификации сервера). Этот шаблон может также быть предварён знаком ‘!’ для обозначения отрицания: если имя машины соответствует отрицаемому шаблону, оно будет отвергнуто (этой строкой) даже если оно соответствует другому шаблону в этой же строке. Также можно, заключив имя хоста или IP-адрес в квадратные скобки — ‘[‘ и ‘],’ — через ‘:’ указать нестандартный порт.

Вместо имён хостов можно записывать их хэши. Это позволит скрыть их от злоумышленника в случае попадания файла в его руки. Для различия хэшей от имён хостов первые предваряются символом ‘|’. На одной строке может быть не больше одного хэша, операция отрицания в этом случае не доступна.

Разрядность, порядок и модуль копируются из ключа хоста RSA, например, /etc/ssh/ssh_host_key.pub. Необязательное поле комментария занимает всю оставшуюся часть строки и игнорируется.

Комментариями также считаются пустые и строки начинающиеся с ‘#’.

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

Заметьте, что строки в этих файлах, обычно имеют длину в несколько сотен символов и, очевидно, не стоит вводить имена хостов вручную. Вместо этого их можно сгенерировать при помощи сценария оболочки или взять из файла / etc/ssh/ssh_host_key.pub, добавив в начале имя хоста.

Пример файла ssh_known_hosts:

# допустимы явные комментарии только на всю строку
closenet       192.0.2.53 1024 37 159...93 closenet.example.net
cvs.example.net,192.0.2.10 ssh-rsa AAAA1234 =
# хэш имени хоста
|1|JfKTdBh7rNbXkVAQCRp4OQoPfmI=|USECr3SWf1JUPsms5AqfD5QfxkM= ssh-rsa
AAAA1234 =

Файлы

Файл Назначение
-/.hushlogin Позволяет отключить вывод времени последнего входа в систему и содержимого файла /etc/motd если в файле конфигурации включены соответственно PrintLastLog и PrintMotd. Файл не влияет на вывод содержимого Banner.
-/.rhosts Этот файл используется для аутентификации по хосту (см. ssh(1)). На некоторых машинах, если каталог пользователя находится на разделе NFS, для того чтобы он был доступен пользователю root, он должен быть доступен для чтения всем. Файл должен принадлежать пользователю и не должен быть доступен для записи другим. Рекомендуемый набор прав доступа в общем случае — чтение/запись для пользователя и недоступность для других.
-/.shosts Аналогичен файлу .rhosts но позволяет проводить аутентификацию на основе хоста не разрешая вход в систему с помощью rlogin/rsh.
~/.ssh/authorized_keys Содержит список открытых ключей (RSA/DSA), которые могут быть использованы для регистрации данного пользователя. Формат файла описан выше. Этот файл не очень важен для злоумышленника, но мы рекомендуем сделать его доступным только пользователю (чтение/запись).

Если этот файл, каталог ~/.ssh или домашний каталог пользователя доступны для записи другим пользователям, этот файл может быть изменён или заменён любым пользователем системы, имеющим сколько угодно мало прав. В этом случае sshd не будет использовать этот файл, если только параметр StrictModes не имеет значение ‘no’ Установить рекомендуемый набор прав доступа можно командой chmod go-w ~/ ~/.ssh ~/.ssh/authorized_keys.

~/.ssh/environment Этот файл (при его наличии) считывается в среду при регистрации в системе. Он может содержать только пустые строки, строки комментария (начинающиеся с ‘#’), и определения значений переменных в виде: переменная=значение. Правом на запись этого файла должен обладать только пользователь; он не должен быть доступен остальным. Задание переменных среды отключено по умолчанию, за что отвечает параметр PermitUserEnvironment.
~/.ssh/known_hosts Список адресов, к которым когда-либо подключался пользователь и которые отсутствуют в общесистемном файле, и соответствующих им открытых ключей. Формат файла описан выше. Файл должен быть доступен для записи только владельцу и администратору. Он может также быть доступен для чтения всем остальным, но это не обязательно.
~/.ssh/rc Сценарий инициализации, запускаемый перед запуском оболочки пользователя или команды. Этот файл должен быть доступен для записи только пользователю и не должен быть вообще доступен другим.
/etc/hosts.allow
/etc/hosts.deny
Данные о разрешении и запрете соединений с хостами для надстроек TCP. См. hosts_access(5).
/etc/hosts.equiv Используется для аутентификации на основе хоста (см. ssh(1)). Должен быть доступен для записи только root.
/etc/moduli Группы для схемы Диффи—Хеллмана. Формат файла описан в moduli(5).
/etc/motd См. motd(5).
/etc/nologin Если существует, подключение будет разрешено только суперпользователю. Любому, кто пытается войти в систему, будет показано содержимое этого файла и запросы на регистрацию в качестве не суперпользователя будут отвергнуты. Этот файл должен быть доступен для чтения всем.
/etc/shosts.equiv Аналогичен hosts.equiv но позволяет проводить аутентификацию на основе хоста не разрешая вход в систему с помощью rlogin/rsh.
/etc/ssh/ssh_known_hosts Общесистемный список известных хостов и их ключей. Этот файл должен составляться администратором. В него следует включать открытые ключи всех компьютеров организации. Формат файла описан выше. Файл должен быть доступен всем для чтения и владельцу/администратору для записи.
/etc/ssh/ssh_host_key
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_rsa_key
Содержат частные ключи хостов. Файлы должны принадлежать root, и быть доступными только для него. не запустится если эти файлы доступны для чтения кому-либо кроме суперпользователя.
/etc/ssh/ssh_host_key.pub
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_rsa_key.pub
Содержат открытые ключи хостов. Должны быть доступны всем для чтения и только суперпользователю для записи. Содержимое файлов должно соответствовать содержимому соответствующих файлов с частными ключами. Эти файлы не используются программой и предназначены для копирования пользователем в файлы known_hosts. Эти файлы создаются командой ssh-keygen(1).
/etc/ssh/sshd_config Конфигурация службы sshd Формат файла и параметры конфигурации описаны в sshd_config(5).
/etc/ssh/sshrc Аналогичен ~/.ssh/rc позволяет задавать инициализационный сценарий глобально для всех пользователей. Должен быть доступен всем для чтения и только root для записи.
/var/empty Каталог chroot(2) используемый при отделении полномочий на предаутентификационном этапе. В папке не должно быть никаких файлов, она должна принадлежать только root и не должна быть доступна другим для записи.
/var/run/sshd.pid Идентификатор процесса ожидающего запросов на подключение (если одновременно работает несколько экземпляров служб для нескольких портов, в него записывается идентификатор экземпляра запущенного последним). Содержимое этого файла может не быть защищено и может быть доступно всем.

Предостережения

Использование этой службы не повысит уровень защиты системы пока rshd rlogind и rexecd не будут полностью отключены в системе.

Если вы нашли ошибку, выделите текст и нажмите Ctrl+Enter.