Запуск процесса подсистемы с помощью sshd в ограниченной встроенной системе - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь получить yuma123 реализацию с открытым исходным кодом сервера NETCONF, работающего во встроенной системе Linux.

Сервер NETCONF использует sshd, и yuma123, по-видимому, предполагает, что это openssh реализация sshd, поскольку он использует файл /etc/ssh/sshd_config.

В частности, файл README в yuma123 гласит:

Tell sshd to listen on port 830. Add the following 2 lines to /etc/ssh/sshd_config:

Port 830
Subsystem netconf "/usr/sbin/netconf-subsystem --ncxserversockname=830@/tmp/ncxserver.sock"

Однако во встроенной системе в настоящее время используется ограниченная реализация dropbear sshd из-за ограничений памяти, и у меня возникают трудности с установкой openssh (вместе с yuma123), установленной на встроенная система из-за размера исполняемых файлов, зависимых библиотек и т. д.

Могу ли я получить / изменить dropbear sshd, чтобы дать мне аналогичную функциональность? Можно ли резко сократить openssh sshd до достаточно маленького размера? Любые (другие) предложения о том, как решить эту проблему?

1 Ответ

1 голос
/ 22 марта 2019

Согласно исходному коду dropbear , единственная подсистема, встроенная в SSH-сервер dropbear, - это дополнительная поддержка SFTP, которую я опишу ниже.

Поддержка другой подсистемы требует внесения изменений в исходный код для dropbear. Если это вариант, рассматриваемый код находится в функции sessioncommand() в файле svr-chansession.c:

#if DROPBEAR_SFTPSERVER
            if ((cmdlen == 4) && strncmp(chansess->cmd, "sftp", 4) == 0) {
                m_free(chansess->cmd);
                chansess->cmd = m_strdup(SFTPSERVER_PATH);
            } else 
#endif
            {
                m_free(chansess->cmd);
                return DROPBEAR_FAILURE;
            }

По сути, вы бы добавили некоторый код, похожий на раздел «sftp», который проверяет имя вашей подсистемы и вызывает нужную команду.

Если вы не хотите создавать собственную версию dropbear, вы можете обойтись с помощью принудительной команды. Есть два способа сделать это.

Если пользователи этой подсистемы будут проходить аутентификацию с помощью ключа SSH, тогда вы можете поместить директиву «command» в файл authorized_keys пользователя:

command="/usr/sbin/netconf-subsystem..." ssh-rsa AAAAB3NzaC1yc2...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Когда клиент аутентифицируется с помощью ключа из этой строки в файле, то любая команда, оболочка или запрос подсистемы от клиента будут вызывать dropbear для вызова указанной команды вместо команды, запрошенной клиентом. Это функция сервера OpenSSH, которая также поддерживается dropbear.

В качестве альтернативы, dropbear имеет параметр командной строки -c, который позволяет указать принудительную команду для всех клиентов:

dropbear -p 830 ... -c '/usr/sbin/netconf-subsystem ...'

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

Поддержка подсистемы SFTP:

Я опишу это, потому что это, очевидно, плохо документировано. Если dropbear скомпилирован с параметром DROPBEAR_SFTPSERVER, то dropbear вызовет команду "/ usr / libexec / sftp-server" для клиентов, запрашивающих подсистему "sftp". Чтобы это работало, администратор обычно создает копию программы OpenSSH sftp-server из исходного кода OpenSSH и устанавливает получившуюся программу как /usr/libexec/sftp-server.

.

Изменение dropbear для запуска другой команды требует изменения исходного кода dropbear и перекомпиляции dropbear.

...