Internet Engineering Task Force (IETF) D. Miller Request for Comments: 9987 OpenSSH Category: Standards Track May 2026 ISSN: 2070-1721
Secure Shell (SSH) Agent Protocol
Протокол агента SSH
Аннотация
В этом документе определён протокол агента ключей для использования с протоколом Secure Shell (SSH).
Статус документа
Документ содержит проект стандарта Internet (Standards Track).
Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.
Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9987.
Авторские права
Copyright (c) 2026. Авторские права принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.
К этому документу применимы права и ограничения, перечисленные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с пересмотренной лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Revised BSD License).
1. Введение
Протокол Secure Shell (SSH) [RFC4251] предназначен для защищённых соединений [RFC4253] и входа в систему (login) [RFC4254] через незащищённые сети. Он поддерживает множество механизмов проверки подлинности [RFC4252], включая аутентификацию с открытым ключом. Этот документ задаёт протокол взаимодействия с компонентом управления ключами (обычно называемым агентом), который хранит секретные ключи. Клиенты SSH (возможно, и серверы) могут обращаться к агенту по этому протоколу для выполнения операций с использованием открытого ключа и секретного ключа, хранящегося у агента.
Сохранение ключей в агенте обеспечивает удобство и безопасность их загрузки и извлечения при использовании, поскольку при каждом извлечении ключа может требоваться ввод пароля. Доступ к агенту может перенаправляться через соединение SSH, что позволяет удаленным системам использовать сохранённые ключи без прямого раскрытия ключевого материала удалённой системе. Агент можно реализовать как выделенный компонент, который менее подвержен атакам, нежели ключ, загруженный на полный сервер SSH, или клиент, и которому может быть обеспечена специальная защита со стороны более широкой системы.
2. Уровни требований
Ключевые слова должно (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.
3. Обзор протокола
Протокол агента основан на пакетах запросов и откликов, которыми единолично управляет клиент. Протокол включает ряд запросов клиента к агенту и набор откликов, передаваемых в ответ. Агент передаёт сообщения лишь в ответ на запросы клиентов, соблюдая порядок отправки.
Запросы включают возможность загрузки ключей в агент, удаления всех или некоторых ключей и выполнение операций подписи с использованием загруженных ранее ключей.
Агент может поддерживать лишь подмножество доступных типов ключей, а также может отклонять (отвергать) некоторые операции в определённом контексте. Например, агент может разрешать добавление ключей только локальным клиентам или предоставлять данному клиенту лишь определённый набор ключей. Поэтому клиенту следует быть готовым к аккуратному отказу, если какая-либо операция будет отклонена.
4. Термины и обозначения
Далее в документе термин «агент» применяется для обозначения компонента управления ключами, реализующего отвечающую сторону протокола, а термин «клиент» — запрашивающую сторону, которая взаимодействует с агентом протокола. Если рассматриваемый клиент является клиентом Secure Shell [RFC4251], он называется явно «клиентом SSH, а термин «сервер SSH» обозначает сервер Secure Shell.
Кодируемые типы данных (byte, uint32, string и т. д.) описаны в разделе 5 [RFC4251]. Тип byte[] без указания размера внутри квадратных скобок указывает последовательность байтов (возможно, пустую), размер которой определяется контекстом. Все размеры указываются в байтах, если явно не указано иное.
5. Сообщения протокола
Сообщение включает элементы (поля) length, type и contents.
uint32 length
byte type
byte[length - 1] contents
В последующих параграфах элемент length не указывается. Для наглядности приводятся символьные имена типов сообщений, а номера (численные значения) указаны в параграфе 8.1.
5.1. Базовые отклики агента
Агент может передавать в ответ на запрос клиента показанные ниже базовые сообщения. В случае успеха агент должен ответить однобайтовым сообщением
byte SSH_AGENT_SUCCESS
или зависящим от запроса сообщением об успехе, которое может включать дополнительные поля.
В случае отказа агент должен отвечать однобайтовым сообщением
byte SSH_AGENT_FAILURE
или зависящим от запроса сообщением об отказе, которое может включать дополнительные поля. Сообщения SSH_AGENT_FAILURE должны также передаваться в ответ на непонятные или неподдерживаемые типы запросов.
5.2. Добавление ключей в агент
Ключи могут добавляться в агент с помощью сообщений SSH_AGENTC_ADD_IDENTITY или SSH_AGENTC_ADD_ID_CONSTRAINED. Базовый формат SSH_AGENTC_ADD_IDENTITY имеет вид
byte SSH_AGENTC_ADD_IDENTITY
string key type
byte[] key data
string comment
Поле key type указывает тип ключа, например, ssh-rsa для ключей RSA, определённых в [RFC4253]. Поле key data содержит открытую и секретную часть ключа и зависит от типа ключа, как описано в параграфах 5.2.1 — 5.2.4 для наиболее распространённых ключей. Поле comment содержит понятное человеку имя ключа или комментарий в форме строки символов UTF-8 и может служить для идентификации ключа в видимых пользователю сообщениях. Эта строка может быть пустой. Сообщение SSH_AGENTC_ADD_ID_CONSTRAINED имеет похожий формат с одним добавочным полем
byte SSH_AGENTC_ADD_ID_CONSTRAINED
string key type
byte[] key data
string comment
constraint[] constraints
Поле constraints служит для задания ограничений пригодности или использования ключа. Типы и формат ограничений описаны в параграфе 5.2.7. Клиентам следует применять сообщение SSH_AGENTC_ADD_IDENTITY, вместо SSH_AGENTC_ADD_ID_CONSTRAINED с пустым полем constraints, хотя пригодны (и эквивалентны) оба варианта.
Агент должен отвечать сообщением SSH_AGENT_SUCCESS, если ключ был успешно загружен в результате одного или нескольких таких сообщений. В иных случаях передаётся сообщение SSH_AGENT_FAILURE.
При добавлении ключа, уже имеющегося в агенте, новый ключ и ограничения (при наличии) следует помещать взамен имеющихся, поскольку это обеспечит наилучшее соответствие связанных с безопасностью ограничений ожиданиям пользователя. В иных случаях агент может отклонить загрузку уже имеющегося у него ключа.
Агент может поддерживать лишь часть заданных здесь типов ключей и может поддерживать дополнительные типы, как описано ниже. Если агент не распознаёт тип указанного в запросе на добавление ключа, он должен ответить сообщением SSH_AGENT_FAILURE.
5.2.1. Ключи DSA
Ключи DSA (Digital Signature Algorithm), указываемые как ssh-dss, определены в [RFC4253]. Эти ключи могут добавляться с использованием показанного ниже сообщения. Поле constraints присутствует только в сообщениях SSH_AGENTC_ADD_ID_CONSTRAINED.
byte SSH_AGENTC_ADD_IDENTITY или
SSH_AGENTC_ADD_ID_CONSTRAINED
string ssh-dss
mpint p
mpint q
mpint g
mpint y
mpint x
string comment
constraint[] constraints
Значения p, q, g являются параметрами домена DSA, y и x указывают открытый и секретный ключ, соответственно. Значения определены в параграфе 4.1 [FIPS.186-4].
5.2.2. Ключи ECDSA
Ключи ECDSA (Elliptic Curve Digital Signature Algorithm) имеют тип ecdsa-sha2- и определены в [RFC5656]. Эти ключи могут добавляться с использованием указанного ниже сообщения. Поле constraints присутствует только в сообщениях SSH_AGENTC_ADD_ID_CONSTRAINED.
byte SSH_AGENTC_ADD_IDENTITY или
SSH_AGENTC_ADD_ID_CONSTRAINED
string key type
string ecdsa_curve_name
string Q
mpint d
string comment
constraint[] constraints
Q и d указывают открытую и секретную часть, соответственно. Значения определены в параграфе 6.2 [FIPS.186-5].
5.2.3. Ключи EdDSA
В [RFC8709] определены ключи EdDSA (Edwards-curve Digital Signature Algorithm) (см. [RFC8032]) Ed25519 и Ed448 с именами ssh-ed25519 и ssh-ed448, соответственно. Эти ключи могут добавляться с использованием указанного ниже сообщения. Поле constraints присутствует только в сообщениях SSH_AGENTC_ADD_ID_CONSTRAINED.
byte SSH_AGENTC_ADD_IDENTITY или
SSH_AGENTC_ADD_ID_CONSTRAINED
string ssh-ed25519 или ssh-ed448
string ENC(A)
string k || ENC(A)
string comment
constraint[] constraints
Первое значение является открытым ключом EdDSA — ENC(A), а второе — конкатенацией секретного ключа k и открытого ключа ENC(A) (повтор открытого ключа служит для совместимости с широко распространёнными реализациями). Содержимое и интерпретация значений ENC(A) и k определены в параграфе 3.2 [RFC8032].
5.2.4. Ключи RSA
Ключи RSA, именуемые как ssh-rsa, определены в [RFC4253]. Эти ключи могут добавляться с использованием указанного ниже сообщения. Поле constraints присутствует лишь в сообщениях SSH_AGENTC_ADD_ID_CONSTRAINED.
byte SSH_AGENTC_ADD_IDENTITY или
SSH_AGENTC_ADD_ID_CONSTRAINED
string "ssh-rsa"
mpint n
mpint e
mpint d
mpint iqmp
mpint p
mpint q
string comment
constraint[] constraints
Поле n указывает открытый композитный модуль, e — секретный, а d — открытый показатель степени. Поля p и q — секретные простые сомножители, значение iqmp — обратно q по модулю p. Все значения, кроме iqmp (которое может быть рассчитано по другим значениям), определены в параграфе 5.1 [FIPS.186-5].
5.2.5. Другие ключи
Агенты и их клиенты могут поддерживать не указанные в этом документе типы ключей. Фирменные типы ключей должны использовать связанное с доменом именование, как указано в разделе 6 [RFC4251], пока коды не будут выделены IANA [IANA-PUBKEYS].
5.2.6. Добавление ключей из токенов
Ключи, хранящиеся на смарт-картах и других носителях (token), могут добавляться с помощью запросов SSH_AGENTC_ADD_SMARTCARD_KEY и SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED. Поле constraints включается лишь в вариант SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED.
byte SSH_AGENTC_ADD_SMARTCARD_KEY или
SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED
string token id
string PIN
constraint[] constraints
Поле token id содержит неанализируемый (opaque) идентификатор носителя, а PIN — необязательный пароль или код PIN для разблокировки ключа. Протокол не задаёт интерпретацию token id, полностью отдавая её агенту.
Как правило, в агент загружаются лишь открытые компоненты ключей, поддерживаемых носителем, и, строго говоря, эти сообщения предназначены для будущих операций с секретным ключом, делегируемых данному носителю.
Агент должен отвечать сообщением SSH_AGENT_SUCCESS, если хотя бы 1 ключ был успешно загружен в результате одного или нескольких таких сообщений. Если ключей не найдено, поле token id не распознано, запрос не соответствует правилам агента или агент не поддерживает ключи на аппаратных носителях, агент должен возвращать сообщение SSH_AGENT_FAILURE.
5.2.7. Ограничения ключей
В запросах добавления ключа с ограничениями может передаваться множество типов ограничений, каждое из которых сопровождается байтом типа, за которым могут следовать байты данных ограничения. Ограничения могут включаться в любые сообщения *_CONSTRAINED, как показано ниже.
byte constraint1_type
byte[] constraint1_data
byte constraint2_type
byte[] constraint2_data
....
byte constraintN_type
byte[] constraintN_data
Для полного разбора ограничений нужно заранее знать их структуру, а восстановление нераспознанного ограничения может оказаться небезопасным. Поэтому агент, не распознавший или не поддерживающий указанное в запросе ограничение, должен прервать разбор, отклонить запрос и возвратить клиенту сообщение SSH_AGENT_FAILURE.
В последующих параграфах описываются ограничения, определённые к настоящему моменту.
5.2.7.1. Ограничение срока действия ключей
По таким запросам агент ограничивает срок действия ключей, удаляя их по истечении заданного числа секунд с момента добавления ключа в агент.
byte SSH_AGENT_CONSTRAIN_LIFETIME
uint32 seconds
5.2.7.2. Требование подтверждения ключа
По таким запросам агент будет требовать явного подтверждения пользователя для каждой операции с использованием секретного ключа. Например, агент может представлять диалог подтверждения перед завершением операции подписи.
byte SSH_AGENT_CONSTRAIN_CONFIRM
5.2.7.3. Расширения для ограничений
Агенты могут реализовать экспериментальные или приватные ограничения с помощью расширений, поддерживающих именованные ограничения.
byte SSH_AGENT_CONSTRAIN_EXTENSION
string extension name
byte[] extension-specific details
Поле extension name должно содержать строку UTF-8. В фирменных расширениях должен применяться суффикс домена реализации (например, foo@example.com), определяемый схемой именования из раздела 6 в [RFC4251].
Отметим, что с учётом приведённого выше требования отклонять ключи с неподдерживаемыми ограничениями, расширения для ограничений применимы лишь в случае их поддержки как клиентом, так и агентом. В противном случае агент должен будет отклонить ключ. Это желательно, поскольку расширения для ограничений могут задавать пределы, игнорирование которых может создавать ситуации, когда ключ будет доступен там, где это не предусмотрено (например, при безопасном завершении агента в случае отказа).
5.3. Кодирование открытых ключей
Загруженные в агент ключи указываются блобами открытых ключей, которые представляют собой стандартное кодирование открытых ключей SSH для передачи в линию, заданное в [RFC4253] для ключей ssh-rsa и ssh-dss, в [RFC5656] — для ecdsa-sha2-* и в [RFC8709] — для ssh-ed25519и ssh-ed448.
5.4. Удаление ключей из агента
Клиент может запросить у агента удаление всех хранящихся в нем ключей с помощью сообщения
byte SSH_AGENTC_REMOVE_ALL_IDENTITIES
При получении такого запроса агенту следует удалить все сохранённые ключи и возвратить сообщение SSH_AGENT_SUCCESS. В случае отклонения запроса он должен передать сообщение SSH_AGENT_FAILURE. Такие запросы следует выполнять независимо от правил агента, ограничивающих действия для данного клиента, поскольку в ином случае пользователь не сможет быстро и полностью удалить свои ключи в экстренной ситуации.
Конкретный ключ можно удалить с помощью сообщения
byte SSH_AGENTC_REMOVE_IDENTITY
string key blob
где key blob — стандартное кодирование удаляемого ключа (параграф 5.3). Агент должен возвращать отклик SSH_AGENT_SUCCESS при удалении ключа и SSH_AGENT_FAILURE, если ключ не найден.
Хранящиеся в носителях ключи можно удалить с помощью сообщения
byte SSH_AGENTC_REMOVE_SMARTCARD_KEY
string token id
string PIN
Поле token id — это неанализируемый (opaque) идентификатор носителя ключа, а PIN — необязательный пароль или PIN (обычно не применяется) в кодировке UTF-8. По запросу на удаление хранящегося в носителе ключа агенту следует удалять все ключи, загруженные с устройства, соответствующего token id. По запросу SSH_AGENTC_REMOVE_ALL_IDENTITIES агентам следует быстро и полностью удалять все ключи независимо от локальной политики. Удаление хранящегося на носителе ключа происходит только в агенте, а хранящийся на носителе ключ удалять не следует.
Агент должен отвечать сообщением SSH_AGENT_SUCCESS после удаления ключа и SSH_AGENT_FAILURE, если ключ не найден.
5.5. Запрос списка ключей
Клиент может запросить у агента список ключей с помощью сообщения
byte SSH_AGENTC_REQUEST_IDENTITIES
Агент должен отвечать сообщением
byte SSH_AGENT_IDENTITIES_ANSWER
uint32 nkeys
где nkeys указывает число ключей, за которым могут следовать предоставляемые клиенту ключи в формате
string key blob
string comment
Поле key blob содержит стандартное кодирование открытого ключа (параграф 5.3), comment — понятную человеку строку комментария в кодировке UTF-8.
5.6. Операции с секретным ключом
Клиент может запросить у агента операцию подписи с секретным ключом, используя сообщение
byte SSH_AGENTC_SIGN_REQUEST
string key blob
string data
uint32 flags
Поле key blob указывает запрошенный для подписи ключ (кодирование в соответствии с параграфом 5.3), data — данные для подписания, а flags — битовое поле с побитовым объединением (OR) флагов подписи (см. ниже). Если агент не поддерживает запрошенные флаги или по иной причине не может создать подпись (например, заданного ключа нет или пользователь не подтвердил ключ с ограничением), он должен ответить сообщением SSH_AGENT_FAILURE. При успешном подписании агент должен передать сообщение
byte SSH_AGENT_SIGN_RESPONSE
string signature
Формат подписи (signature) зависит от алгоритма используемого ключа. Форматы подписей протокола SSH заданы в [RFC4253] для ключей ssh-rsa и ssh-dss, в [RFC5656] — для ecdsa-sha2-* и в [RFC8709] — для ssh-ed25519и ssh-ed448.
5.6.1. Флаги подписи
В настоящее время для запросов подписи заданы флаги SSH_AGENT_RSA_SHA2_256 и SSH_AGENT_RSA_SHA2_512 (см. параграф 8.3). Оба эти флага пригодны лишь для ключей ssh-rsa и запрашивают у агента подпись с использованием метода rsa-sha2-256 или rsa-sha2-512, соответственно. Схемы подписи заданы в [RFC8332].
5.7. Установка и снятие блокировки агента
Протокол агента поддерживает возможность временной блокировки агентом самого себя с помощью пароля. Заблокированный агент должен приостановить выполнение конфиденциальных операций (по меньшей мере, операций подписи с секретным ключом) до момента снятия блокировки с тем же паролем. Для блокировки служит сообщение
byte SSH_AGENTC_LOCK
string passphrase
Агент должен возвращать сообщение SSH_AGENT_SUCCESS после установки блокирования и SSH_AGENT_FAILURE в иных случаях (например, когда агент уже заблокирован).
Для снятия блокировки служит сообщение
byte SSH_AGENTC_UNLOCK
string passphrase
Если агент заблокирован и пароль совпадает с заданным при блокировке, агент должен снять блокировку и ответить сообщением SSH_AGENT_SUCCESS. Если агент не заблокирован или пароль не совпадает, агент должен ответить сообщением SSH_AGENT_FAILURE.
5.8. Механизм расширения
Протокол агента включает необязательный механизм расширения, позволяющий передавать через протокол фирменные и экспериментальные сообщения. Запрос расширения имеет вид
byte SSH_AGENTC_EXTENSION
string extension type
byte[] зависящее от запроса содержимое
Поле extension type указывает тип сообщения с расширением в форме строки UTF-8. Зависящие от реализации расширения должны иметь суффикс, соответствующий схеме из раздела 6 [RFC4251] (например, foo@example.com).
Агент, не поддерживающий предложенный тип расширения, должен отвечать сообщением SSH_AGENT_FAILURE. Такое же сообщение передаёт агент, не поддерживающий механизм расширения.
Содержимое отклика об успешном расширении зависит от extension type. В случае успеха агент должен возвращать SSH_AGENT_SUCCESS или зависящее от расширения сообщение вида
byte SSH_AGENT_EXTENSION_RESPONSE
string extension type
byte[] зависящее от отклика содержимое
где поле extension type совпадает с полученным в запросе.
Отказы при расширении следует передавать в сообщении SSH_AGENT_EXTENSION_FAILURE
byte SSH_AGENT_EXTENSION_FAILURE
Расширениям не следует применять стандартное сообщение SSH_AGENT_FAILURE. Это позволит отличать запросы с отказом от неподдерживаемых расширений.
5.8.1. Расширение Query
Необязательный запрос query определён для того, чтобы узнать набор поддерживаемых агентом расширений.
byte SSH_AGENTC_EXTENSION
string "query"
Если агент поддерживает расширение query, ему следует отвечать списком имён поддерживаемых расширений.
byte SSH_AGENT_EXTENSION_RESPONSE
string "query"
string[] поддерживаемые типы расширений
6. Соединение с агентом
Агенты раскрываются локальным системам через ориентированные на соединения конечные точки. В системах класса Unix агент обычно прослушивает связанный с файловой системой сокет домена Unix, в Microsoft Windows обычно используется Windows Named Pipe. Доступ к конечным точкам следует контролировать в соответствии с разделом 10. Через такие сокеты к одному агенту может подключаться множество клиентов. В обоих случаях имя или адрес прослушивающей конечной точки обычно раскрывается через переменную окружения SSH_AUTH_SOCK, которую клиенты используют для поиска и подключения к прослушивающему агенту. Как вариант, агенты могут использовать неявные механизмы обнаружения их конечной точки, например, заданное по умолчанию расположение для каждого пользователя.
7. Перенаправление доступа к агенту
С помощью протокола соединений, описанного в [RFC4254], можно пересылать протокол агента через соединение SSH. Это позволяет запрашивать перенаправление к агенту для любого канала сессии с использованием модели, похожей на перенаправление X11 Forwarding (параграф 6.3 в [RFC4254]). Это свойство является необязательным для реализаций протокола SSH и клиентов.
7.1. Анонсирование поддержки перенаправления
Сервер SSH может анонсировать перенаправление к агенту с помощью расширения, описанного в [RFC8308], используя имя agent-forward в сообщении SSH_MSG_EXT_INFO.
string "agent-forward"
string "0" (version)
Отметим, что этот протокол появился существенно раньше механизма расширения, описанного в [RFC8308]. Также следует отметить, что несколько широко распространённых реализаций SSH с поддержкой перенаправления к агенту не анонсируют эту поддержку. Клиенты SSH могут пытаться в отсутствие анонсов (см. [RFC8308]) запрашивать перенаправление с помощью фирменных имён, указанных ниже. Серверы SSH могут реализовать фирменные имена в дополнение к описанным здесь.
7.2. Запрос перенаправления
Клиент SSH может запросить перенаправление к агенту для ранее созданной сессии (см. параграф 6.1 в [RFC4254]), используя показанный ниже запрос, который передаётся после создания канала, но до вызова оболочки, команды или подсистемы.
byte SSH_MSG_CHANNEL_REQUEST
uint32 channel_id
string "agent-req" или "auth-agent-req@openssh.com"
boolean want_reply
Поле channel_id содержит идентификатор канала созданной сессии (возвращённый из предыдущего запроса SSH_MSG_CHANNEL_OPEN), а флаг want_reply указывает, следует ли серверу SSH подтверждать успешность запроса (как указано в параграфе 5.4 [RFC4254]). Если сервер SSH воспринимает запрос, он обычно предоставляет конечную точку (например, прослушивающий сокет) и анонсирует это в подчинённую сессию. Большинство реализаций в Unix-подобных системах деляют это, предоставляя приватный пользовательский прослушивающий сокет домена Unix и записывая его местоположение в переменную среды SSH_AUTH_SOCK.
Многие развёрнутые реализации поддерживают лишь предстандартное имя запроса auth-agent-req@openssh.com. Имя agent-req следует применять лишь при явном анонсировании поддержки, как указано в параграфе 7.1.
7.3. Запрос соединения с агентом
После запроса клиентом SSH включения в сессии перенаправления к агенту сервер SSH может запросить соединение с этим агентом для связи с агентом клиента SSH по выделенному каналу путём отправки приведённого ниже сообщения.
byte SSH_MSG_CHANNEL_OPEN
string "agent-connect" или "auth-agent@openssh.com"
uint32 channel_id
uint32 local_window
uint32 local_maxpacket
Поля channel_id, local_window и local_maxpacket следует интерпретировать в соответствии с параграфом 5.1 [RFC4254]. Тип agent-connect следует применять лишь при явном анонсировании поддержки, как указано в параграфе 7.1.
Клиенту SSH следует быть готовым к обработке одновременно нескольких соединений, пересылаемых к агенту клиентской стороны, иначе запросы на доступ к агенту с удалённой стороны, перекрывающие прежние запросы, могут столкнуться с отказом. Перекрытие запросов может возникать из-за того, что протокол соединения SSH [RFC4254] допускает множество пользовательских сессий через один транспорт (см. [RFC4253]) и каждая сессия может запрашивать использование агента (возможно, одновременно).
Клиент SSH может воспринимать запросы соединения с агентом (по результату проверки полномочий) без предварительного запроса на перенаправление к агенту для случаев, когда желательно перенаправление без организации сессии. Клиент SSH может продолжать восприятие запросов соединения с агентом после завершения сессии, для которой было запрошено перенаправление. Клиент SSH должен отвергать несанкционированные запросы на соединение с агентом, когда перенаправление к агенту не запрашивалось и нежелательно для клиента, но сервер SSH всё равно передаёт запрос на соединение с агентом.
Поскольку запрос agent-connect не включает идентификатора, позволяющего отличать канал сессии, передавший запрос на соединение, SSH-соединение фактически может перенаправлять доступ лишь к одному клиентскому агенту SSH с использованием этого протокола (хотя агент допускает множество одновременных соединений).
8. Протокольные номера
8.1. Типы сообщений
В таблице 1 приведены номера, используемые для типов сообщений в запросах от клиента к агенту.
Таблица 1.
|
SSH_AGENTC_REQUEST_IDENTITIES |
11 |
|
SSH_AGENTC_SIGN_REQUEST |
13 |
|
SSH_AGENTC_ADD_IDENTITY |
17 |
|
SSH_AGENTC_REMOVE_IDENTITY |
18 |
|
SSH_AGENTC_REMOVE_ALL_IDENTITIES |
19 |
|
SSH_AGENTC_ADD_SMARTCARD_KEY |
20 |
|
SSH_AGENTC_REMOVE_SMARTCARD_KEY |
21 |
|
SSH_AGENTC_LOCK |
22 |
|
SSH_AGENTC_UNLOCK |
23 |
|
SSH_AGENTC_ADD_ID_CONSTRAINED |
25 |
|
SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED |
26 |
|
SSH_AGENTC_EXTENSION |
27 |
В таблице 2 приведены номера, используемые для типов сообщений в откликах клиенту со стороны агента.
Таблица 2.
|
SSH_AGENT_FAILURE |
5 |
|
SSH_AGENT_SUCCESS |
6 |
|
SSH_AGENT_IDENTITIES_ANSWER |
12 |
|
SSH_AGENT_SIGN_RESPONSE |
14 |
|
SSH_AGENT_EXTENSION_FAILURE |
28 |
|
SSH_AGENT_EXTENSION_RESPONSE |
29 |
8.1.1. Резервные номера сообщений
Для реализаций с поддержкой устаревшей версии протокола SSH v1 зарезервированы номера сообщений 1-4, 7-10, 15-16, 24. Эти номера могут применяться реализациями с поддержкой устаревшей версии протокола, но в иных случаях их использование недопустимо.
Сообщение с номером 0 также является резервным и применять его недопустимо.
Сообщения с номерами 240-255 зарезервированы для приватного использования (Private Use) в расширениях протокола агента и их недопустимо применять в реализациях общего назначения (см. [RFC8126]).
8.2. Идентификаторы с ограничениями
В таблице 3 указаны номера для ограничений. Они применяются лишь в ограничениях для ключей и не передаются как номера сообщений. Ограничение с номером 0 является резервным.
Таблица 3.
|
SSH_AGENT_CONSTRAIN_LIFETIME |
1 |
|
SSH_AGENT_CONSTRAIN_CONFIRM |
2 |
|
SSH_AGENT_CONSTRAIN_EXTENSION |
255 |
8.3. Флаги подписи
В таблице 4 указаны номера, которые могут присутствовать в запросах подписи (SSH_AGENTC_SIGN_REQUEST). Эти флаги формируют битовое поле (возможно, пустое) с помощью операции OR (или). Значение флага 1 зарезервировано для старых (historical) реализаций.
Таблица 4.
|
SSH_AGENT_RSA_SHA2_256 |
0x00000002 |
|
SSH_AGENT_RSA_SHA2_512 |
0x00000004 |
9. Взаимодействие с IANA
Для этого протокола создаётся 5 реестров: номера типов сообщений, номера ограничений, флаги запросов подписи, имена расширений для ограничений и имена запросов на расширение. Кроме того, добавляются значения в три существующих реестра.
9.1. Рекомендации назначенным экспертам
Когда назначенного эксперта (Designated Expert или DE) просят прорецензировать добавления в новые реестры, описанные здесь (параграфы 9.2, 9.3, 9.5, 9.6), это означает запрос на проверку наличия и общедоступности соответствующих документов, как описано в [RFC8126]. DE также предлагается проверить ясность назначения и использования запрошенных кодов. DE также следует убедиться, что созданные в IETF спецификации, которые запрашивают коды в этих реестрах, доступны для ознакомления рабочей группе SSHM (почтовая конференция ssh@ietf.org). Запросы для кодов из спецификаций, выполненных вне IETF, не должны конфликтовать с активными работами IETF или прежними спецификациями IETF.
Доступное число кодов в реестрах номеров протокола агента SSH (параграф 9.2), номеров ограничений (параграф 9.3) и флагов подписи агента SSH (параграф 9.5) ограничено, поэтому DE должен убедиться, что использование кодов должным образом обосновано. Для номеров сообщений протокола агента SSH именованные запросы на расширения (параграф 9.6) предоставляют для большинства применений практически неограниченное число доступных кодов. Для номеров ограничений для ключей механизм расширения ограничений (параграф 5.2.7.3) также обеспечивает неограниченное число вариантов.
9.2. Реестр SSH Agent Protocol Message Type Numbers
Реестр SSH Agent Protocol Message Type Numbers содержит номера типов сообщений для запросов клиента и откликов агента. Реестр размещается в разделе Secure Shell (SSH) Protocol Parameters [IANA-SSH]. Исходное содержимое реестра привадено в таблице 5, а выделение значений нужно выполнять по процедуре Expert Review [RFC8126].
Таблица 5.
|
Номер |
Идентификатор |
Документ |
|---|---|---|
|
0 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
1 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
2 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
3 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
4 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
5 |
SSH_AGENT_FAILURE |
Параграфы 5.1 и 8.1 в RFC 9987 |
|
6 |
SSH_AGENT_SUCCESS |
Параграфы 5.1 и 8.1 в RFC 9987 |
|
7 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
8 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
9 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
10 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
11 |
SSH_AGENTC_REQUEST_IDENTITIES |
Параграфы 5.5 и 8.1 в RFC 9987 |
|
12 |
SSH_AGENT_IDENTITIES_ANSWER |
Параграфы 5.5 и 8.1 в RFC 9987 |
|
13 |
SSH_AGENTC_SIGN_REQUEST |
Параграфы 5.6 и 8.1 в RFC 9987 |
|
14 |
SSH_AGENT_SIGN_RESPONSE |
Параграфы 5.6 и 8.1 в RFC 9987 |
|
15 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
16 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
17 |
SSH_AGENTC_ADD_IDENTITY |
Параграфы 5.2 и 8.1 в RFC 9987 |
|
18 |
SSH_AGENTC_REMOVE_IDENTITY |
Параграфы 5.4 и 8.1 в RFC 9987 |
|
19 |
SSH_AGENTC_REMOVE_ALL_IDENTITIES |
Параграфы 5.4 и 8.1 в RFC 9987 |
|
20 |
SSH_AGENTC_ADD_SMARTCARD_KEY |
Параграфы 5.2.6 и 8.1 в RFC 9987 |
|
21 |
SSH_AGENTC_REMOVE_SMARTCARD_KEY |
Параграфы 5.4 и 8.1 в RFC 9987 |
|
22 |
SSH_AGENTC_LOCK |
Параграфы 5.7 и 8.1 в RFC 9987 |
|
23 |
SSH_AGENTC_UNLOCK |
Параграфы 5.7 и 8.1 в RFC 9987 |
|
24 |
Резерв |
Параграф 8.1.1 в RFC 9987 |
|
25 |
SSH_AGENTC_ADD_ID_CONSTRAINED |
Параграфы 5.2 и 8.1 в RFC 9987 |
|
26 |
SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED |
Параграфы 5.2.6 и 8.1 в RFC 9987 |
|
27 |
SSH_AGENTC_EXTENSION |
Параграфы 5.8 и 8.1 в RFC 9987 |
|
28 |
SSH_AGENT_EXTENSION_FAILURE |
Параграфы 5.8 и 8.1 в RFC 9987 |
|
29 |
SSH_AGENT_EXTENSION_RESPONSE |
Параграфы 5.8 и 8.1 в RFC 9987 |
|
240-255 |
Приватное использование |
Параграф 8.1.1 в RFC 9987 |
9.3. Реестр SSH Agent Key Constraint Numbers
Реестр SSH Agent Key Constraint Numbers содержит номера ограничений на использование ключей и размещается в разделе Secure Shell (SSH) Protocol Parameters [IANA-SSH]. Исходное содержимое реестра приведено в таблице 6, а выделение значений нужно выполнять по процедуре Expert Review [RFC8126].
Таблица 6.
|
Номер |
Идентификатор |
Документ |
|---|---|---|
|
0 |
Резерв |
Параграф 8.2 в RFC 9987 |
|
1 |
SSH_AGENT_CONSTRAIN_LIFETIME |
Параграф 8.2 в RFC 9987 |
|
2 |
SSH_AGENT_CONSTRAIN_CONFIRM |
Параграф 8.2 в RFC 9987 |
|
255 |
SSH_AGENT_CONSTRAIN_EXTENSION |
Параграф 8.2 в RFC 9987 |
9.4. Реестр SSH Agent Key Constraint Extension Names
Реестр SSH Agent Key Constraint Extension Names содержит имена, применяемые в типе расширения ограничений SSH_AGENT_CONSTRAIN_EXTENSION (параграф 5.2.7.3), и размещается в разделе Secure Shell (SSH) Protocol Parameters [IANA-SSH]. Исходно реестр пуст, а выделение значений нужно выполнять по процедуре Expert Review [RFC8126].
9.5. Реестр SSH Agent Signature Flags
Реестр SSH Agent Signature Flags содержит значения флагов запроса подписи (SSH_AGENTC_SIGN_REQUEST) и размещается в разделе Secure Shell (SSH) Protocol Parameters [IANA-SSH]. Исходное содержимое реестра приведено в таблице 7. Отметим, что флаги объединяются побитово операцией OR, все значения флагов должны быть степенями 2, а максимальное значение флага составляет 0x80000000. Новые флаги подписей нужно выделять по процедуре Expert Review [RFC8126].
Таблица 7.
|
Номер |
Идентификатор |
Документ |
|---|---|---|
|
0x01 |
Резерв |
Параграф 8.3 в RFC 9987 |
|
0x02 |
SSH_AGENT_RSA_SHA2_256 |
Параграф 8.3 в RFC 9987 |
|
0x04 |
SSH_AGENT_RSA_SHA2_512 |
Параграф 8.3 в RFC 9987 |
9.6. Реестр SSH Agent Extension Request Names
Реестр SSH Agent Extension Request Names содержит имена, используемые в базовых сообщениях запроса расширений (SSH_AGENTC_EXTENSION), и размещается в разделе Secure Shell (SSH) Protocol Parameters [IANA-SSH]. Исходное содержимое реестра приведено в таблице 8. Новые имена нужно выделять по процедуре Expert Review [RFC8126].
Таблица 8.
|
Имя расширения |
Документ |
|---|---|
|
query |
Параграф 5.8.1 в RFC 9987 |
9.7. Дополнение в реестр Extension Names
Агентство IANA добавило в реестр Extension Names [IANA-SSH-EXT] раздела Secure Shell (SSH) Protocol Parameters [IANA-SSH] значение, приведённое в таблице 9.
Таблица 9.
|
Имя расширения |
Документ |
|---|---|
|
agent-forward |
Параграф 7.1 в RFC 9987 |
9.8. Дополнение в реестр Connection Protocol Channel Request Names
Агентство IANA добавило в реестр Connection Protocol Channel Request Names [IANA-SSH-CHANREQ] раздела Secure Shell (SSH) Protocol Parameters [IANA-SSH] значение, приведённое в таблице 10.
Таблица 10.
|
Тип запроса |
Документ |
|---|---|
|
agent-req |
Параграф 7.2 в RFC 9987 |
9.9. Дополнение в реестр Connection Protocol Channel Types
Агентство IANA добавило в реестр Connection Protocol Channel Types [IANA-SSH-CHANTYPE] раздела Secure Shell (SSH) Protocol Parameters [IANA-SSH] значение, приведённое в таблице 11.
Таблица 11.
|
Тип канала |
Документ |
|---|---|
|
agent-connect |
Параграф 7.3 в RFC 9987 |
10. Вопросы безопасности
Агент — это служба, задачей которой является хранение и предоставление учётных данных (обычно долгосрочных) для аутентификации при входе в систему. По своей природе агент является конфиденциальным и доверенным компонентом. Сам протокол агента не включает какой-либо проверки подлинности или транспортной защиты. Возможности взаимодействовать с агентом обычно достаточно, чтобы вызвать агент для выполнения операций с секретным ключом. Поэтому очень важно раскрывать агент только владельцу и его полномочным представителям. В Unix-подобных системах это может обеспечиваться на основе прав доступа к файловой системе для сокета агента и/или проверки подлинности клиента, подключаемого к сокету (например, SO_PEERCRED в некоторых Unix-подобных системах). В Windows доступ к именованным каналам может контролироваться через дескриптор защиты, присваиваемый в момент создания канала.
Задачей агентов является предотвращение злоумышленникам с непривилегированным доступом к агенту жертвы возможности скопировать какой-либо из загруженных в агент ключей. Это может не предотвратить возможность злоумышленника захватывать использование этих ключей (например, при загрузке ключей без ограничения на подтверждение). С учётом этого агенту следует, насколько это возможно, препятствовать считыванию своей памяти другими процессами для предотвращения кражи загруженных ключей. Обычно это включает запрет отладочных интерфейсов и обработки дампов памяти, создаваемых при аварийном завершении.
Более изощренным способом кражи ключей является использование побочных криптографических каналов. При операциях с секретными ключами может происходить утечка этих ключей из-за различий во времени, энергопотреблении или побочных эффектов в подсистеме памяти (например, кэш CPU) на хосте, где работает агент. В случае локального злоумышленника и агента, хранящего ключи без ограничений, единственным ограничением числа операций с секретными ключами, которые атакующий может наблюдать, является скорость выполнения подписей процессором (CPU). Это даёт атакующему почти идеальное предсказание для атак по побочным каналам. Хотя полное рассмотрение атак по побочным каналам выходит за рамки этой спецификации, агентам следует использовать криптографические реализации, стойкие к атакам по побочным каналам, и можно принимать дополнительные меры для сокрытия фактического времени выполнения операций с секретными ключами. Неисполнение этих требований может раскрывать ключи через побочные каналы.
Перенаправление доступа к локальному агенту через соединение SSH (раздел 7) по своей сути создаёт транзитивные отношения доверия. Реализациям SSH не следует перенаправлять использование агента по умолчанию, а пользователям не следует перенаправлять использование агента на хост, к которому нет полного доверия, поскольку это может приводить к тому, что злоумышленники на удалённых хостах получат доступ к ключам пользователя. Агентам следует реализовать дополнительные средства контроля за видимостью ключей и их использованием для перенаправленных к агенту соединений, иначе у пользователя будет лишь один вариант для перенаправления к агенту — «всё или ничего».
Реализации ключей в токенах и смарт-картах также требуют осторожности. В некоторых системах к токенам можно обращаться по пути к общей библиотеке (например, библиотеке конкретного модуля PKCS#11), которую нужно загрузить для использования размещенных на устройстве ключей. Загрузка общей библиотеки на большинстве платформ предполагает автоматическое исполнение кода этой библиотеки в адресном пространстве загрузившего её процесса. Для предотвращения загрузки потенциально вредоносного кода агентам с поддержкой ключей из токенов через путь к библиотеке следует убедиться, что загружаться могут лишь библиотеки доверенных поставщиков токенов. Кроме того, агентам следует гарантировать, что загруженный код библиотеки токенов не получит доступа к другим ключам, загруженным в агент, и можно полностью запрещать удаленным клиентам загрузку ключей из токена. Защиту имеющихся ключей от кода библиотеки токенов можно обеспечить путём загрузки этой библиотеки в отдельный процесс для агента и организации вызова агентом операций с токеном для этого процесса через IPC1.
В части функциональности блокировки (параграф 5.7) агенту следует принимать меры против подбора парольной фразы (brute-force). Это можно сделать путём внесения задержки при вводе некорректного пароля (возможно, увеличивающейся после каждой попытки), временной блокировки ввода, когда агент отвергает дальнейшие запросы после некого числа неудачных попыток и/или удаления всей ключей после определённого числа неудачных попыток.
11. Литература
11.1. Нормативные документы
[FIPS.186-4] NIST, «Digital Signature Standard (DSS)», NIST FIPS 186-4, DOI 10.6028/NIST.FIPS.186-4, June 2013, <https://doi.org/10.6028/NIST.FIPS.186-4>.
[FIPS.186-5] NIST, «Digital Signature Standard (DSS)», NIST FIPS 186-5, DOI 10.6028/NIST.FIPS.186-5, February 2023, <https://doi.org/10.6028/NIST.FIPS.186-5>.
[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.
[RFC4251] Ylonen, T. and C. Lonvick, Ed., «The Secure Shell (SSH) Protocol Architecture», RFC 4251, DOI 10.17487/RFC4251, January 2006, <https://www.rfc-editor.org/info/rfc4251>.
[RFC4253] Ylonen, T. and C. Lonvick, Ed., «The Secure Shell (SSH) Transport Layer Protocol», RFC 4253, DOI 10.17487/RFC4253, January 2006, <https://www.rfc-editor.org/info/rfc4253>.
[RFC4254] Ylonen, T. and C. Lonvick, Ed., «The Secure Shell (SSH) Connection Protocol», RFC 4254, DOI 10.17487/RFC4254, January 2006, <https://www.rfc-editor.org/info/rfc4254>.
[RFC5656] Stebila, D. and J. Green, «Elliptic Curve Algorithm Integration in the Secure Shell Transport Layer», RFC 5656, DOI 10.17487/RFC5656, December 2009, <https://www.rfc-editor.org/info/rfc5656>.
[RFC8032] Josefsson, S. and I. Liusvaara, «Edwards-Curve Digital Signature Algorithm (EdDSA)», RFC 8032, DOI 10.17487/RFC8032, January 2017, <https://www.rfc-editor.org/info/rfc8032>.
[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[RFC8308] Bider, D., «Extension Negotiation in the Secure Shell (SSH) Protocol», RFC 8308, DOI 10.17487/RFC8308, March 2018, <https://www.rfc-editor.org/info/rfc8308>.
[RFC8332] Bider, D., «Use of RSA Keys with SHA-256 and SHA-512 in the Secure Shell (SSH) Protocol», RFC 8332, DOI 10.17487/RFC8332, March 2018, <https://www.rfc-editor.org/info/rfc8332>.
[RFC8709] Harris, B. and L. Velvindron, «Ed25519 and Ed448 Public Key Algorithms for the Secure Shell (SSH) Protocol», RFC 8709, DOI 10.17487/RFC8709, February 2020, <https://www.rfc-editor.org/info/rfc8709>.
11.2. Дополнительная литература
[IANA-PUBKEYS] IANA, «Public Key Algorithm Names», <https://www.iana.org/assignments/ssh-parameters/>.
[IANA-SSH] IANA, «Secure Shell (SSH) Protocol Parameters», <https://www.iana.org/assignments/ssh-parameters/>.
[IANA-SSH-CHANREQ] IANA, «Connection Protocol Channel Types», <https://www.iana.org/assignments/ssh-parameters/>.
[IANA-SSH-CHANTYPE] IANA, «Extension Names», <https://www.iana.org/assignments/ssh-parameters/>.
[IANA-SSH-EXT] IANA, «Connection Protocol Channel Request Names», <https://www.iana.org/assignments/ssh-parameters/>.
[RFC4252] Ylonen, T. and C. Lonvick, Ed., «The Secure Shell (SSH) Authentication Protocol», RFC 4252, DOI 10.17487/RFC4252, January 2006, <https://www.rfc-editor.org/info/rfc4252>.
[RFC8126] Cotton, M., Leiba, B., and T. Narten, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 8126, DOI 10.17487/RFC8126, June 2017, <https://www.rfc-editor.org/info/rfc8126>.
Благодарности
Протокол разработал и впервые реализовал Markus Friedl на основе похожего протокола для агента, поддерживающего устаревший протокол SSH версии 1, разработанного Tatu Ylonen.
Спасибо Simon Tatham, Niels Möller, James Spencer, Simon Josefsson, Matt Johnston, Jakub Jelen, Rich Salz, Caspar Schutijser, Florian Obser, Martin Thomson, Deb Cooley, Tero Kivinen за рецензии и помощь в улучшении документа.
Адрес автора
OpenSSH
Email: djm@openssh.com
Перевод на русский язык
Николай Малых
1Inter Process Communications — взаимодействие между процессами. Прим. перев.