質問: sshで2つのポートを2つの異なる認証スキームで開くことは可能ですか? 現在、sshサーバーをセットアップして、ネットワークの外部からのアクセスがsshキーを使用してのみ許可され、ルートへのアクセスや他のユーザー名/パスワードの組み合わせによるアクセスを許可しないようにしています。同時に、ネットワーク内の内部ユーザーは、同じシステムに接続できる必要がありますが、ユーザー名とパスワードを使用して従来の意味でログインすることを期待しています。外部と内部の両方のユーザーがputtysshを使用してwindowsからシステムにアクセスし、外部アクセスは55000などの任意に選択された高い番号のポートで外部ポートに送信元ポートを開くポート転送ファイアウォールを介してシステムに入ります(または管理者が決定すること)次の図は、トラフィックフローをより適切に示しています。 キーだけを使用するように実際のログインを設定する方法を知っています。ルートを拒否する方法も知っています。2つのログインタイプを分離する方法はわかりません。同じipの異なるポートでリッスンしているsshdの2つのコピーを実行し、ポートごとに2つの異なる構成を持つことを検討していました。「一致」ルールの設定も検討しましたが、これらのオプションを使用してサーバー全体の構成を分離できるかどうかはわかりません。最後に、ログインする外部ユーザーは常に同じユーザーであり、この質問では「フランク」と呼びましょう。そのため、「フランク」は外部ipからのログインのみが許可され、実際に前に座ることはありません。内部で接続するシステムの場合、システムの他のすべてのユーザーは内部でのみ接続し、外部ipからは接続しません。彼が接続するfranks ipは動的に割り当てられたものですが、接続しているパブリックipも静的で変更されません。同様に、ポートフォワーダーの内部ipも変更されず、sshサーバーの内部ipアドレスも変更されません。内部クライアントは常に、内部sshサーバーipが一部であり、16ビットマスクであるプライベートネットワーク範囲のipから接続しますeg:192.168.0.0/16これは、1つの構成ファイルと1つのsshサーバーインスタンスを使用して設定できますか?もしそうなら、どうすればいいですか?または構成が異なる2つの実行中のサーバーを使用する方がはるかに良いですか?参考のために、sshサーバーはubuntu 18.04で実行されています。
回答: だから、答えは実際に思ったより簡単だったことがわかりました。しかし、彼のコメントに対して '@jeff schaller'に感謝しなければなりません。もし彼のコメントがなければ、sshの 'match'構成がどのように機能するかを調べ始めなかったでしょう。とにかくトリックは、/ etc/ssh/sshd_configファイルをデフォルトとして設定し、外部インターネット接続からのアクセスに必要な構成にすることです。私の場合、これは次の設定を意味しましたpermitrootlogin no passwordauthentication no usepam no これを行うことで、sshキーを使用したキーベースのログインである必要があるために、どこから来てもすべてのログインを強制します。次に、windowsマシンで「puttygen」を使用してディスクに保存した公開鍵と秘密鍵のペアを生成し、外部ユーザーのホームディレクトリにある「authorized_hosts」ファイルの適切なsshエントリを作成しました。このsshキーをユーザーのホームフォルダーの正しい場所に貼り付け、putygenが生成したプライベート(ppk)ファイルを使用してログインし、プロファイルを保存するようにputtyを設定しました。次に、プロファイルを保存し、安全な方法(パスワードで保護されたzipファイルが添付された暗号化された電子メール)を使用して、そのユーザーとppkキーファイルを外部ユーザーに送信しましたユーザーがputtyのコピーにppkとプロファイルを持ち、ログインできるようになったら、sshd_configファイルの最後の2行として次を追加しましたmatch host server1,server1.internalnet.local,1.2.3.4 passwordauthentication yes 「一致」行で、自分のサーバーの名前を保護するためにサーバー名を変更しました。各サーバードメインはカンマで区切られ、スペースはありません。これは重要です。その中にスペースを入れると、sshdが構成をロードせず、エラーを報告する場合、そこにある3つの一致は次のようになります。server1-ドメインなしで「server1」だけを使用して接続するすべてのユーザーに一致しますeg:「fred @ server1」server1.internalnet.local-完全修飾内部ドメイン名egを使用するすべてのユーザーに一致します。例: 'fred@server1.internalinternet.local'(注:これを正しく機能させるには内部dnsが必要です)1.2.3.4-特定のipに一致sshサーバーに割り当てられたアドレスeg: 'fred@1.2.3.4'これはワイルドカードを使用できます。ワイルドカードを使用する場合は、さらに優れたnet/mask cidr形式eg:1.2。*または192.168.1.0/8を参照してください。いくつかの重要な注意事項については、以下のfchurcaの回答。提供されたパターンのいずれかがアクセスされているホストと一致する場合、実行中の構成に対して行われる唯一の変更は、インタラクティブなパスワードログイン機能をオンにすることです。ここに他の構成ディレクティブを配置することもできます。これらのディレクティブは、一致リストにリストされている内部ホストに対してもオンに戻ります。しかしこれを読んでください: https://man.openbsd.org/openbsd-current/man5/ssh_config.5 マッチブロック内ですべての構成オプションを使用できるわけではないので注意して、「usepam yes」を使用してpam認証をオンに戻そうとしたときにこれがわかりました。変更を加えたら、次のように入力しますsshd -t 次に、サーバーを再起動する前に、テストに戻るために戻ります。エラーがある場合は報告されます。上記のすべてに加えて、私は次の2つのリンクからも多くの助けを得ました。 https://raymii.org/s/tutorials/limit_access_to_openssh_features_with_the_match_keyword.html https://www.cyberciti.biz/faq/match-address-sshd_config-allow-root-loginfrom-one_ip_address-on-linux-unix/