【问题标题】:Starting a subsystem process with sshd on a constrained embedded system在受限嵌入式系统上使用 sshd 启动子系统进程
【发布时间】:2019-08-12 15:51:39
【问题描述】:

我正在尝试获得在嵌入式 Linux 系统上运行的 NETCONF 服务器的 yuma123 开源实现。

NETCONF 服务器使用sshd,而yuma123 似乎假定它是sshdopenssh 实现,因为它使用/etc/ssh/sshd_config 文件。

特别是yuma123 中的README 文件指出:

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"

但是,由于内存限制,嵌入式系统目前使用sshddropbear 缩减实现,并且我很难将openssh(与yuma123 同时安装在嵌入式系统由于可执行文件、依赖库等的大小。

我可以获取/修改dropbear sshd 以提供类似的功能吗?我可以将opensshsshd 大幅缩减到足够小的尺寸吗?关于解决此问题的好方法的任何(其他)建议?

【问题讨论】:

    标签: embedded-linux openssh sshd ietf-netconf dropbear


    【解决方案1】:

    根据dropbear source code,dropbear SSH 服务器内置的唯一子系统是对 SFTP 的可选支持,我将在下面描述。

    支持另一个子系统需要更改 dropbear 的源代码。如果这是一个选项,那么有问题的代码在函数sessioncommand() in the file 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 密钥进行身份验证,那么您可以在用户的​​ authorized_keys 文件中添加“命令”指令:

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

    当客户端使用文件中此行中的密钥进行身份验证时,来自客户端的任何命令、shell 或子系统请求都将导致 dropbear 调用列出的命令,而不是客户端请求的命令。这是一个 OpenSSH 服务器功能,dropbear 也支持。

    或者,dropbear 有一个命令行选项-c,它允许您为所有客户端指定一个强制命令:

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

    Dropbear 将为连接到此 dropbear 实例的任何客户端调用指定的命令。如果您想允许客户端执行该命令以外的其他操作,则必须运行两个 dropbear 实例,监听不同的端口或地址。

    SFTP 子系统支持:

    我将对此进行描述,因为似乎没有很好的文档记录。 如果 dropbear 是compiled with the option DROPBEAR_SFTPSERVER,那么 dropbear 将为请求“sftp”子系统的客户端调用命令“/usr/libexec/sftp-server”。为此,管理员通常会从 OpenSSH 源代码构建 OpenSSH sftp-server 程序的副本,并将生成的程序安装为 /usr/libexec/sftp-server

    更改 dropbear 以运行不同的命令需要更改 dropbear 源代码并重新编译 dropbear。

    【讨论】:

    • 我使用dropbear-c 选项来启动子系统,正如@Kenster 所建议的那样。这允许我使用 OpenSSH 的 ssh localhost -p 830 连接到 yuma123 NETCONF 服务器并启动 NETCONF 会话,即 NETCONF 服务器在 <hello> 标签元素中为我提供了会话 ID。但是,尝试使用yuma123yangcli NETCONF 客户端进行连接会导致会话立即终止。 sshyangcli 作为 NETCONF 客户端有区别吗?当 NETCONF 服务器使用 OpenSSH 的 sshd 进行 NETCONF 会话时,使用 yangcli 没有问题。
    • 自从我上次发表评论以来,我现在已经设法通过应用@Kenster 建议的代码更改来使yangcli 连接正常工作。 yangclinetconf 指定为子系统名称,这必须与netconf-subsystem 可执行文件匹配(加上正确的参数,例如--ncxserversockname=830@/tmp/ncxserver.sock)。子系统执行时,NETCONF Client 和 NETCONF Server 之间建立输入/输出,为 NETCONF 会话提供安全通道。显然,sshsftp 客户端分别使用自己的 SSH 和 SFTP 服务器子系统。
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2011-10-07
    相关资源
    最近更新 更多