紹介する これは答えの拡張を求める質問です。SSHユーザーがSSHトンネルのみを許可するように制限する方法
問題の説明 参照の提案を実装してシェルアクセスなしでユーザーを作成しようとしましたが、そのユーザーの代わりにトンネルに接続できませんでした。
必要 保護されていないリモートコンピュータ(コンピュータA)がファイアウォールに戻ってリバーストンネルを起動するようにしたいと思います。機械Aは、ユーザー入力のないヘッドレスボックスです。それは野生にあり、おそらくファイアウォールの背後にあります。私のファイアウォール(MyFW)はLinuxシステムであり、CLIルートアクセス権を持っています。
MyFW で再びリバース SSH トンネルを開始するには、マシン A が必要です。通常、ローカルトンネルはMyFWの保護された側のユーザーシステムCに作成されます。ローカルSSHトンネルは、必要に応じてMyFWのリバーストンネルに接続されます。
誰かがマシンAに侵入してリバーストンネルを見つけたら、リバーストンネルを使用してMyFWトンネルエントリ(ポート)の外側のコンテンツにアクセスできないようにしたいと思います。
私は何を試しましたか?
私は数年間SSHとトンネリングを使用してきたので、彼らの一般的な構成と動作を理解しています。テストのために、コンピュータAとBの2台を机の上に設置した。どちらのシステムもLinuxシステムであり、どちらもファイアウォールはありません。目標は、動作するように最も簡単な設定を取得することです。
まず、マシンAからSSHキーを生成します。
ssh-keygen
いつものように。
MyFWとして機能するマシンBにユーザー「トンネル」を追加します。次のコマンドはsudoを使用して他のユーザーによって実行されます。
useradd tunnel -m -d /home/tunnel -s /bin/true
トンネルユーザーにはパスワードはありません。上記のコマンドはホームディレクトリを作成しませんでした。
mkdir /home/tunnel/.ssh
ユーザートンネル用のSSHキーを作成して/home/tunnel
ディレクトリに配置しました。
ssh-keygen
リモートシステムAの公開鍵をMyFWシステムBの/home/tunnel/.ssh/authorized_keysファイルに手動でコピーしました。
SSH構成ファイルに値を設定しました。
AllowTcpForwarding Yes
GatewayPorts yes
ExitOnForwardFailure=yes
この目的は、ファイアウォールにユーザーを作成し、ハッカーのアクセス試行をブロックしながらトンネルを作成して接続することです。実際のリモートシステムAには何の価値もないので、ハッカーがそれを傷つけても特別な問題はありません。
テスト
テストするために、リモートシステムAにローカルトンネルを設定し、システムAからMyFWにSSHを試みました。
これは一般的な「ユーザー」に適用されます。
$ ssh -L 9022:localhost:222 [email protected]
$ ssh localhost -p 9022
予想通り、最初のコマンドはトンネルを生成します。 2番目のコマンドは、SSHトンネルを介して他のコンピュータのCLIに接続します。
しかし、これは限られた「トンネル」では機能しません。
$ ssh -L 9222:localhost:222 [email protected]
$ ssh localhost -p 9222
CLIは接続が閉じられたことを報告します。問題が何であるかを示すシステムログには何も表示されません。
トンネリングされたユーザーにシェルがない場合、トンネリングされたSSHが機能すると予想する必要がありますか?この記事を書いておそらくそうではないかもしれないと思います。トンネルをどのようにテストしますか?
質問
私は何が間違っていましたか? ?
誰かがこれを試してみて、作業指示やバグを投稿できますか?
制限されたユーザーでトンネルをテストする方法は?
編集する
ユーザートンネルアカウントはパスワードなしで作成されます。トンネルアカウントがロックされていると報告されているため、SSHを使用すると問題が発生します。
パスワードハッキング(パスワードがないと復号できない)を防ぐためにパスワードなしでアカウントを作成するのは悪い考えであり、セキュリティを弱めるようです。
答え1
-N
トンネル専用接続を確立するために使用されます。
ssh -N -L 9222:localhost:222 [email protected] &
答え2
設定ファイルなどを変更せずに、次のコマンドシーケンスを試しました。これらのコマンドは、シミュレートされたリモートコンピュータからシミュレートされたローカルファイアウォールコンピュータにトンネルを構築します。トンネルエントリはリモートコンピュータのポート9222です。
リモートコンピュータの端末から:
$ ssh -L 9222:localhost:22 -N [email protected]
IP 172.30.21.157 でファイアウォールのトンネルを設定します。 -N オプションが含まれていない場合、接続は自動的に終了します。トンネルユーザーはファイアウォールにのみ存在し、パスワードはありません。トンネルユーザーがリモートコンピュータに存在しません。ファイアウォールがトンネルユーザーへの接続を許可するように、SSH キーは事前に交換されます。トンネルを構築するために使用されたsshコマンドはフォアグラウンドに残ります(テスト用にのみ)。上記のコマンドを入力した後、プロンプトは表示されません。cntl-C
プロンプトは、トンネルが閉じていて「これは予想される動作です」の場合にのみ表示されます。
リモートシステムをファイアウォールCLIに接続するために、リモートシステムの他の端末で次のコマンドを実行しました。
$ sudo ssh -p 9222 fwuser@localhost
リモートシステムでは、このコマンドはローカルホスト(リモートシステム)のポート9222でファイアウォールシステムのfwuserアカウントへのSSH接続を確立します。これが質問に示されている私のコマンドの根本原因の問題です。失敗したコマンドに正しいユーザー(fwuser)が指定されていません。
sshは、コマンドが入力されたのと同じシステムで接続を確立していると思います。実際、ポート9222への接続を確立し、それをfwuserとしてログインしたトンネルのもう一方の端にトンネルします。リモートコンピュータでターミナルを実行していますが、ファイアウォールがあるコンピュータでメッセージが表示されます。
トンネルが構築されると、トンネルユーザはトンネルを通過するトラフィックを効果的に見ることができない。
要約すると、シェルアクセスなしで制限されたユーザーを使用することは、トンネルを構築するときに他のユーザーと同じように機能します。 SSHキーを交換するには、より多くの努力が必要です。 -N オプションは、トンネルを構築するコマンドで非常に重要です。