リバースSSHチューニングポートを制限する方法


9

ファイアウォールの背後にある複数のクライアントからのSSH接続を受け入れるパブリックサーバーがあります。

これらの各クライアントはssh -R、ポート80のWebサーバーから公開サーバーへのコマンドを使用して、リバースSSHトンネルを作成します。

リバースSSHトンネルの宛先ポート(クライアント側)は80で、送信元ポート(パブリックサーバー側)はユーザーによって異なります。各ユーザーのポートアドレスのマップを維持することを計画しています。

たとえば、クライアントAは、ポート80のWebサーバーをポート8000​​にトンネルします。80から8001のクライアントB。80から8002のクライアントC。

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
SELinuxやIPTABLESなどのシステム全体のポリシーによってのみ。
Andrew Smith

回答:


6

太字でallowを配置していないので、SSHクライアント側でポートのバインドを妨げるある種の実行時の拒否が必要だと思います。だから、私はあなたのためにソースコードを掘り下げました:

serverloop.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_owneriptablesでの使用についても同じ提案を勧めようとしていましたが、Jeffが私を打ちのめしました。

最もクリーンな解決策は、このファイルを変更して(たとえば、pw->pw_uidユーザーの接続のuidを取得し、それを正しいポートにマップするために使用できます)、SSHサーバーを再コンパイルするだけですが、これは、これをどれだけ使いやすいかに依存します。 。


これは本当に良いです。実際に同じ構文を-Lオプション(トンネリング)からコピーして機能させることができます。ありがとうございました。
Utku Zihnioglu

3

私の提案は、これに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

ただし、ポートを開いて別のユーザーを拒否することはできます。


すばらしい答えをありがとう。SELinux /ユーザープロファイルの設定を試します。私の質問に対する解決策のようです。
Utku Zihnioglu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.