私のチームは、独自のファイアウォールを備えた複数の場所にあるファイアウォールの背後にある複数の Linux デバイスにリモートでアクセスして更新するためのソリューションを模索しています。従来は、企業の物理的なサイトを訪問し、ネットワーク内で実行されている Ansible を使用してデバイスを更新するか、RDP と個別の SSH アクセスを介して変更を加えていました。ポート転送は、要塞であってもオプションではありません。
||REMOTE SERVER|| ===> ||LOCATION 1 FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]
(executing cmds) ===> ||LOCATION 2 FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]
===> ||LOCATION 3 FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]
...
===> ||LOCATION N FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]
AutoSSH のベスト プラクティスは何ですか。または、これらのデバイスを保守するためのより効果的な代替手段はありますか。これまでのところ、2 つの解決策があります。
ソリューション 1 - すべてのデバイスに AutoSSH を使用する:
- 各ネットワーク上のすべての個別のデバイスから AutoSSH 接続を確立します (場所ごとに数百の可能性があります)。各デバイスの SSH アクセスを構成します。
Host loc_1_device_1
HostName localhost
Port 6000
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
Host loc_1_device_2
HostName localhost
Port 6001
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
Host loc_1_device_3
HostName localhost
Port 6002
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
Host loc_2_device_1
HostName localhost
Port 7000
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
Host loc_2_device_2
HostName localhost
Port 7001
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
ソリューション 2 - プロキシ/ジャンプ ホストのみの AutoSSH:
- 各クライアント ネットワーク上の単一のプロキシ (フェイルオーバー用のセカンダリ プロキシも可能) から AutoSSH 接続を確立します。各デバイスからリモート サーバーのポートへの SSH アクセスを構成します。
Host location_1
HostName localhost
Port 6000
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
Host location_2
HostName localhost
Port 6001
User maintenance
IdentityFile /home/devops/.ssh/remote_maint
そこからは、またはプロキシ コマンド用の Ansible 構成を使用して接続するのは簡単なようです。ssh -t location_1 ssh [email protected]
私は、リモート サーバーから Ansible コマンドを実行するというソリューション 2 の概念実証を行いましたが、うまく機能しているようです。しかし、チームの他のメンバーからは、すべてのデバイスの 1 対 1 のインベントリを維持するためにソリューション 1 を採用すべきだという反対意見が出ています (これが Ansible の本来の目的であるべきでしょうか?)。ソリューション 1 に関して私が懸念しているのは、数千台のデバイスが同時にリバース SSH を維持しようとする可能性があり、その結果、不必要なネットワーク オーバーヘッドが発生する可能性があることです。また、そのネットワークにデバイスを追加したり削除したりするのに、不必要な作業量がかかるようにも思えます。
これに取り組む別の方法はあるでしょうか? 私の考えは正しいのでしょうか、それともチームの他のメンバーがおかしいと思っているのはおかしいのでしょうか?
答え1
私はソリューション 1 を使用していますが、ポート番号は自動的に割り当てられます。
各デバイスを個別に構成する必要はありません。
これは、複数の段階のプロセスによって行われます。デバイスが初めて接続する場合、どのポート番号を使用すればよいかわかりません。そのため、デバイスは SSH 経由でサーバーに接続し、自身の MAC アドレスを送信します。
サーバーは空きポート番号を割り当てて保存し、デバイスにポートを伝えます。デバイスは、今後のすべての接続のためにポート番号を保存します。
その後、デバイスはポート番号で再接続します。
すべてのデバイスは同じ「秘密鍵」を使用しますが、その鍵はサーバーへのトンネルを構築するためにのみ使用できます。デバイスを接続するために、公開鍵が各デバイスに保存されます。
サーバー上のauthorized_keysファイルには、そのキーの簡単なコマンド(MACによる新しいキーの割り当てスクリプト)が含まれています。トンネルは次のように実行する必要があります。-N
command="/home/tunnel/reverse_server/reverse_server.py",no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa <PUBLIC-KEY-FOR-ALL-DEVICES>
サーバーではGatewayPorts no
、外部ポートへのアクセスを回避するために、/etc/sshd/sshd_config でオプションを設定する必要があります。