UbuntuとOpenSSHデーモンを実行しているサーバーがあります。それをS1と呼びましょう。
クライアントマシンからこのサーバーを使用して(そのうちの1つをC1と呼びましょう)、リモートポート転送を使用してSSH逆トンネルを実行します。例:
ssh -R 1234:localhost:23 login@S1
S1では、デフォルトのsshd_configファイルを使用します。私が見ることができることから、S1で適切な資格情報{login、pwd}を持っている人は誰でもS1にログインでき、リモートポート転送andローカルポート転送を実行できます。そのような資格情報は将来の証明書になる可能性があるため、私の理解では、証明書を取得した人はどこからでも(必ずしもC1とは限らない)S1にログインでき、ローカルポート転送を作成できます。
ローカルポート転送を許可すると、ある種のパブリックプロキシを作成できるため、危険です。 -L転送のみを無効にする方法を探しています。
私は以下を試しましたが、これによりローカル転送とリモート転送の両方が無効になります。
AllowTcpForwarding No
私は以下も試しました、これは-LからSX:1までしか許可しません。何もないよりはましですが、それでも私が必要としているものはありません。これは「なし」オプションです。
PermitOpen SX:1
だから私は方法があるかどうか疑問に思っています、それで私はすべてのローカルポートフォワードが次のようなものを書くことを禁止することができます:
PermitOpen none:none
次はいいアイデアですか?
PermitOpen localhost:1
ログイン資格情報を持っている人なら誰でも、ランダムポートで実行されているsshdの独自のインスタンスを起動し、-Lローカル転送を含め、必要なものをすべて許可できます。
% /usr/sbin/sshd -d -f mysshd.config -p 12345
ユーザーがあなたのマシンで何かをすることを信頼しないなら、あなたは彼らが最初にログインすることを許すべきではありません。
(ところで、-Dフラグも一種の「プロキシ問題」です)
別の解決策は、特定のユーザーにのみポート転送を許可することです。
SSHから:決定的なガイド
ポート転送は、sshdでグローバルに有効または無効にできます。これは、/ etc/sshd_configのサーバー全体の構成キーワードAllowTcpForwardingで行われます。キーワードには、yes(デフォルト、転送を有効にする)またはno(転送を無効にする)の値を指定できます。
# SSH1, SSH2, OpenSSH
AllowTcpForwarding no
さらに、SSH2には次のオプションがあります。
# SSH2 only
AllowTcpForwardingForUsers
AllowTcpForwardingForGroups
これらの構文は、AllowUsersおよびAllowGroupsオプションの場合と同じです。 [セクション5.5.2.1、「アカウントアクセス制御」]ポート転送の使用を許可するユーザーまたはグループのリストを指定します。サーバーは、他のユーザーのポート転送要求を受け入れることを拒否します。これらは、SSHセッションのターゲットアカウントを指し、クライアントのユーザー名(多くの場合、不明)を指すことに注意してください。
...
対話型ログインを無効にし、リモート側で実行できるプログラムを制限しない限り、このセクションのディレクティブは実際にはポート転送を妨げないことを理解することが重要です。それ以外の場合、知識のあるユーザーは、SSHセッションを介して独自のポート転送アプリケーションを実行できます。これらの設定だけでも、技術者以外のコミュニティでは十分な抑止力になるかもしれませんが、彼女が何をしているかを知っている人を止めることはできません。
ローカル/リモート転送のみを許可するオプションがあります。
AllowTcpForwarding TCP転送を許可するかどうかを指定します。使用可能なオプションは、許可する「はい」または「すべて」TCP転送、 no "すべてを防止するTCP転送、" local "はローカル(ssh(1)の観点から)転送のみを許可するか" remote "はリモート転送のみを許可する =。デフォルトは「はい」です。TCP転送を無効にしても、ユーザーはシェルアクセスを拒否されない限り、セキュリティを向上させることはできません。ユーザーは常に独自のフォワーダをインストールできるためです。
したがって、すでに述べたように、シェルもnologinに設定する必要があります。
-L転送のみを無効にする方法を探しています
私があなたを正しく理解していれば、ユーザーは完全なシェルアクセス権を持っていますが、ネットの残りの部分への接続を開くことができないようにしたいと思います。
SSHで許可されている「ローカルポートフォワーディング」は、そのための可能な方法の1つにすぎません。その他には、socat
、netcat
、または他の任意の数のツールのインスタンスの起動が含まれます。
Linuxで送信接続と受信接続を制御する最良の方法は、Netfilter(別名IPTables)です。
ローカルで生成されたパケットについて、パケット作成者のさまざまな特性を照合できるようにする、所有者(ipt_owner
)と呼ばれる特別なモジュールがあります。 OUTPUT
およびPOSTROUTING
チェーンで有効です。
これを使用して、特定のユーザーグループによって生成された送信パケットを拒否し、SSHの-L
オプションだけでなく、あらゆる種類のポート転送を禁止できます。
この問題に対する私の解決策は、sshd_configのメインセクションにPermitOpen fo.local:8を追加することでした。
これは単に、fo.local:80以外のローカル転送の要求をすべて拒否します。