如何限制反向 SSH 隧道端口?

如何限制反向 SSH 隧道端口?

我们有一个公共服务器,它接受来自防火墙后面的多个客户端的 SSH 连接。

ssh -R每个客户端都使用命令从其位于端口 80 的 Web 服务器创建到我们的公共服务器的反向 SSH 隧道。

反向 SSH 隧道的目标端口(在客户端)为 80,源端口(在公共服务器端)取决于用户。我们计划为每个用户维护一个端口地址映射。

例如,客户端 A 将其 Web 服务器的 80 端口隧道传输到我们的 8000 端口;客户端 B 将其 Web 服务器的 80 端口隧道传输到 8001 端口;客户端 C 将其 Web 服务器的 80 端口隧道传输到 8002 端口。

Client A: ssh -R 8000:internal.webserver:80 clienta@publicserver

Client B: ssh -R 8001:internal.webserver:80 clientb@publicserver

Client C: ssh -R 8002:internal.webserver:80 clientc@publicserver

基本上,我们要做的是将每个用户与一个端口绑定,然后不允许让它们通过隧道连接到任何其他端口。

如果我们使用 SSH 的正向隧道功能ssh -L,我们可以使用配置来允许哪个端口进行隧道传输permitopen=host:port。但是,反向 SSH 隧道没有等效功能。

有没有办法限制每个用户的反向隧道端口?

答案1

由于您已放置不允许粗体部分,我假设您希望在 SSH 客户端进行某种运行时拒绝,以防止端口绑定。因此,我为您挖掘了源代码:

服务器循环.c:

/* check permissions */
if (!options.allow_tcp_forwarding ||
    no_port_forwarding_flag ||
    (!want_reply && listen_port == 0)
#ifndef NO_IPPORT_RESERVED_CONCEPT
    || (listen_port != 0 && listen_port < IPPORT_RESERVED &&
    pw->pw_uid != 0)
#endif
    ) {
        success = 0;
        packet_send_debug("Server has disabled port forwarding.");
} else {
        /* Start listening on the port */
        success = channel_setup_remote_fwd_listener(
            listen_address, listen_port,
            &allocated_listen_port, options.gateway_ports);
}

不幸的是,正如您所看到的,除了标准条件之外,似乎没有太多条件可以阻止端口转发。

mod_owner我原本要推荐同样的使用建议iptables,但 Jeff 抢先了一步。

最干净的解决方案就是修改此文件(例如,您可以用来pw->pw_uid获取连接用户的 uid,并将其映射到正确的端口)并重新编译您的 SSH 服务器,但这取决于您对此的熟悉程度。

答案2

我的建议是使用 SELinux。您必须配置允许打开哪些端口的用户配置文件。sshd在打开要转发的端口之前,进程会分叉并放弃用户的权限,因此任何应用于用户进程的操作都将在 上强制执行sshd。请注意,您需要限制所有用户进程,因为一旦使用,就可以netcat用来转发另一个端口。稍后我会尝试为您整理正确的语法(或者欢迎任何其他用户为我编辑它)。

或者,您可以尝试使用iptables

iptables -m owner --add-owner $user -p tcp --sport 8000 -j ACCEPT
iptables -m owner --add-owner $user -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT

但这并不能阻止他们打开端口并拒绝其他用户。

相关内容