web-dev-qa-db-ja.com

事前に共有されているキーがない場合、クライアントはどのようにSFTPサーバーを認証しますか?

FTPSの場合、最初の接続時にFTPサーバーを認証するためにDNSとパブリックPKIを使用します。最初の接続では、foo.example.comは1.2.3.4に解決され、検証できる秘密キーによって暗号化された接続が返されます。検証できるのは、foo.example.comによって本当に所有されています(多かれ少なかれ、PKIの問題を考えると)。

しかし、これはSFTPでどのように機能しますか(はい、SSHであることは知っていますが、それについてはあまり詳しくありません)。

この質問に関して、人々がSFTPを使用する一般的な方法が2つあることを知っています。

  1. クライアントは、接続に使用するキーを事前に認識しています。これは理にかなっており、私の質問には明白です。私はこれについて尋ねていません。
  2. クライアントは、接続に使用されるキーを事前に認識していません。代わりに、ユーザー名とパスワードがあります。これは私が特に尋ねているシナリオです。

その2番目のシナリオでは、最初にSFTPサーバーに接続するときに、それが本当に目的のサーバーであり、MITM攻撃を実行して自分のパスワードを取得する他のサーバーではないことを確認するにはどうすればよいですか(うまくいけば、これはハッシュされ、簡単に盗まれないでしょう)。またはデータ?

私は この質問 を見つけましたが、サーバー認証のトピックに対応していないようで、クライアント認証のみです。

4
Jaxidian

SFTPは、基礎となるトランスポートとしてSSHを使用するため、SSHとまったく同じセキュリティモデルです。 SSHを使用すると、サーバーに初めて接続するときに、クライアントからサーバーのフィンガープリントが提示されます。これは次のようになります。

The authenticity of Host 'myserver.com (123.45.67.89)' can't be established. 
RSA key fingerprint is 12:34:56:78:9a:bc:de:f0:0f:ed:cb:a9:87:65:43:21. 
Are you sure you want to continue connecting (yes/no)? no

最高のセキュリティを確保するために、ユーザーはこのホストキー/フィンガープリントを、別の安全な帯域外チャネルを通じて取得する必要がある実サーバーのフィンガープリントと比較する必要があります。これは多くの場合、サーバーの所有者が自分の指紋を公開したWebサイトであるか、対面式の会議や電話、または以前にチェックを行った別の信頼できるユーザーによる可能性があります。 SSH自体は、この指紋の帯域外通信をどのように行うかを指定していません。

しかし、人々はしばしば、提示された指紋を信頼します。これが発生すると、SSHクライアントは通常フィンガープリントを記憶するため、今後の再接続ではユーザーにフィンガープリントの再確認を要求せずに自動的に接続し、サーバーのフィンガープリントが変更された場合、クライアントは通常大きな警告メッセージを表示します。このモデルで使用する場合、SSHのセキュリティモデルは基本的にTOFU( trust-on-first-use )です。

または、SSHは SSH証明書を使用 をサポートしてサーバーを認証します。 SSH証明書の動作は、基本的にx509証明書と同じですが、より単純で互換性のない証明書形式を使用します。 SSH証明書を使用する場合、信頼できるユーザーを認証局として割り当て、サーバーやユーザーの証明書に署名できます。この方法では、ユーザーはすべてのサーバーのホストキーを個別に検証するのではなく、単一のCA証明書をインストールするだけで済みます。

4
Lie Ryan

Lie Ryanの優れた回答に加えて、sshホストキーは、SSHFPエントリを使用してDNSで公開することもできます。ゾーンがDNSSECで正しく構成されていて、リゾルバーがDNSSECをサポートしている場合は、ssh_configファイルで VerifyHostKeyDNS オプションをyesに自動的に設定することもできます。それを信頼します(一般のPKIの場合と同様)。

2
user2313067