Sshを介したサーバーとの最初の接触時に、選択されたキーアルゴリズムのサーバーの公開キーがユーザーに提示され、検証されます。検証後、結果は通常、後のMITM攻撃に対抗するために~/.ssh/known_hosts
ファイルに保存されます。
$ ssh Host.example.com
The authenticity of Host 'Host.example.com (1.2.3.4)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?
これは明らかに最初の接続でのMITM攻撃に対しては役に立たず、問題をユーザーに移すだけです。ユーザーは、提示された公開鍵を検証するための何らかのプロセスを実施する必要があります。これがどのように終了するかは誰もが知っています。
企業CAで署名されたsshサーバーキーを配布して、最初の接触時のMITM攻撃に対抗することは可能ですか?証明書チェーンを備えた公開鍵と秘密鍵のインフラストラクチャは、これを一般的にサポートしていますが、企業環境でsshサーバーを保護するために使用されるのを見たことがありません。
一般的な考え方は、一連のホストのCAキーを信頼することです。
trust *.example.com SHA256:<fingerprint(public key(corporate-ca))>
そして、これをこぶし、CAによって署名されたすべてのホストは信頼されています。
ca.example.com
+- Host.example.com
これはHTTPSの保護方法に似ており、sshは同じ基盤技術を使用しているため、OpenSSHにすでに実装されているようなもので、見つかりませんでしたか?
これは可能です。
引用 ドキュメント :
AUTHORIZED_KEYS FILE FORMAT
[...]
cert-authority
Specifies that the listed key is a certification authority (CA)
that is trusted to validate signed certificates for user authentication.
Certificates may encode access restrictions similar to these key options.
If both certificate restrictions and key options are present, the most
restrictive union of the two is applied.
これを達成するためのステップ:
ssh-keygen -f server_ca
ssh-keygen -t ecdsa -b 521 -N '' -C 'somehost.example.com' -f ssh-ecdsa.key
ssh-keygen -s server_ca -I somehost.example.com -h -n 'somehost.example.com,somehost,<list of SANs>,<list of IPv4>,<list of IPv6>' -V +3650d ssh-ecdsa.key
/etc/ssh
にコピーし、/etc/ssh/sshd_config
を編集します)。HostCertificate /etc/ssh/ssh-ecdsa.key-cert.pub
HostKey /etc/ssh/ssh-ecdsa.key
@cert-authority example.com ssh-rsa AAAA[...]
メモ:
以下のリンクで詳細を確認してください。特に、ユーザーのキーに署名するようにこれを設定する方法については、こちらをご覧ください。
リンク:
別のアプローチは、SSHキーフィンガープリントをSHFPレコードとしてDNSに公開することです。
RFC 4255を参照 https://tools.ietf.org/html/rfc4255
これにより、(グローバル)sshクライアントのデフォルトで VerifyHostKeyDNS
をyes
に設定すると、公開鍵の検証が自動化されます。
企業環境にある場合は、すべてのマシンのSSHキーの集中管理リストを作成して、お気に入りの構成管理ツールを使用してすべてのクライアントの/etc/ssh/ssh_known_hosts
に展開することもできます。これは、マシン間の直接ホストベースの認証にも使用できます。 (SSHホストキーを一元的に管理することは、サーバーが再インストールされたときに不要なホストキーの変更を防ぐのにも役立ちます。)
もちろん、このアプローチは、クライアントとサーバーの両方が制御下にある「内部」SSHアクセスに対してのみ機能します。 SSHインする任意の外部ユーザーが必要な場合(そして、それらにknown_hostsファイルを与えることはできません)、DNSSECで保護されたDNSのSSHFPレコードがおそらく最適な方法です。