2.6.1.2 Служба SSHD
Скачать документ Аутентификация
Вход в систему
SSH-доступ для root
SSHRC
Формат файла authorized keys
Формат файла ssh_known_hosts
Файлы
Предостережения
OpenSSH Daemon - это программа-сервер, обслуживающая запросы программы-клиента ssh. Вместе эти программы заменяют rlogin и rsh и обеспечивают защищённую и зашифрованную связь между двумя непроверенными компьютерами через незащищённую сеть.
sshd - это служба, принимающая запросы на соединения от клиентов. Обычно она запускается при загрузке системы из /etc/rc. Для каждого нового соединения создаётся (с помощью вызова fork) новый экземпляр службы. Ответвлённый экземпляр обрабатывает обмен ключами, шифрование, аутентификацию, выполнение команд и обмен данными.
Параметры определяются при помощи ключей командной строки или файла конфигурации (по умолчанию - sshd_config). Ключи командной строки имеют больший приоритет, чем значения, указанные в файле конфигурации. При получении сигнала отбоя SIGHUP перечитывает свой файл конфигурации путём запуска собственной копии с тем же самым именем, с которым был запущен, например, /usr/sbin/sshd.
Доступны следующие ключи:
Ключ | Описание ключа |
-4 | Использовать только адреса IPv4. |
-6 | Использовать только адреса IPv6. |
-b | Определяет число битов в ключе сервера протокола версии 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.
- Запускается оболочка пользователя или выполняется указанная команда.
SSH-доступ для root
В начале установки операционной системы РЕД ОС предоставляется возможность разрешить вход пользователем root с паролем через ssh.
Но даже если не указывать данное разрешение при установке, его можно настроить после завершения установки системы.
Для этого на рабочем столе необходимо открыть меню и перейти в файловую систему (/). Затем требуется найти папку /etc и перейти в неё.
В папке /etc необходимо открыть папку /ssh от имени администратора.
Затем нужно найти файл sshd_config и отредактировать в нем строку PermitRootLogin prohibit-password на PermitRootLogin yes.
После редактирования необходимо сохранить внесенные изменения.
Далее следует открыть терминал и перезапустить ssh-сервер (перезапуск сервера необходимо делать после каждого изменения файла конфигурации для последующего применения) командой:
systemctl restart sshd
Теперь можно подключаться по SSH от имени суперпользователя root.
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 независимо от протокола составляет 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. Необязательное поле комментария занимает всю оставшуюся часть строки и игнорируется.
Комментариями также считаются пустые и строки начинающиеся с «#».
Идентификация машины принимается, если любая совпавшая строка содержит правильный ключ. Таким образом, можно (хотя это не рекомендуется) иметь несколько строк или различных ключей для одного и того же хоста. Это неизбежно случается при помещении в файл кратких форм имён хостов из различных доменов. В файлах может содержаться противоречивая информация. Идентификация принимается, если адекватная информация имеется в любом из них.
Пример файла 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 | Идентификатор процесса, ожидающего запросов на подключение (если одновременно работает несколько экземпляров служб для нескольких портов, в него записывается идентификатор экземпляра запущенного последним). Содержимое этого файла может не быть защищено и может быть доступно всем. |
Предостережения
Дата последнего изменения: 03.09.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.