Amazon EC2 のキーペアを安全に運用するために、秘密鍵のフィンガープリントを確認する
はじめに
一般的に、SSHで公開鍵暗号方式によって認証する仕組みを構築する場合、接続元となるクライアントで秘密鍵と公開鍵を作成し、公開鍵をサーバに転送して配置します。サーバで秘密鍵と公開鍵を作成して、秘密鍵をクライアントに転送するのはアンチパターンです。何故なら秘密鍵は誰にも見せるべきでは無い情報であり、転送によって漏洩するリスクがあるからです。秘密鍵が漏洩すると、暗号化された通信が復号されてしまいます。
AWSでは、EC2インスタンスと通信をする際に公開鍵と秘密鍵のキーペアを使います。具体的には、LinuxインスタンスではSSHの認証に、WindowsインスタンスではAdministratorのパスワードの入手のためにです。このキーペアを設定する方法は2通りあり、一つは既にクライアント側で作成している公開鍵をインポートする方法です。これだと前述の通り、秘密鍵は一切転送していないので、漏洩のリスクは最小限に抑えられます。
もう一つはAWS側で公開鍵と秘密鍵を作成する方法です。 AWS管理コンソールから[Create Key Pair]をすると、秘密鍵がダウンロードされます。
さて、このダウンロードされた秘密鍵は、基本的に複数人で共有したり、メールに添付して誰かに渡したりするべきでは無い、のですが、もしどうしても渡さなくてはいけなかったとして。貴方が入手したそれは本当にAWSに登録されたキーペアの秘密鍵でしょうか?
もし悪意ある人がキーペアをすり替えてしまっていた場合、悪意ある人はキーペアを所持していることになりますので、その秘密鍵を使った通信は以降全て盗聴されてしまう可能性があります。受領した秘密鍵と、AWSに登録されているKey Pairが同一であることを確認しなくてはなりません。
そこで確認に使うのがFingerprintです。AWS管理コンソールのKey Piar画面では、そのキーペアのFingerprintが表示されています。手元にある秘密鍵のFingerprintを確認して、AWS管理コンソールのFingerprintと一致すれば、その秘密鍵はAWSに登録されたKey Pairと同一である、と確認できます。
ということでやってみました。
やってみる
Fingerprintの確認はopensslコマンドでは行えます。
AWS管理コンソールでCreate Key Pairをしたとき
$ openssl pkcs8 -in mykey.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c 57:52:07:c4:92:a1:3b:0c:0b:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
出力されたFingerprintが、AWS管理コンソールのKey Pair画面で表示されるFingerprintと一致することを確認します
AWS管理コンソールでImport Key Pairをしたとき
$ openssl rsa -in id_rsa -pubout -outform DER | openssl md5 -c Enter pass phrase for id_rsa: writing RSA key 92:0e:f5:0e:7f:27:fc:db:b4:XX:XX:XX:XX:XX:XX:XX
出力されたFingerprintが、AWS管理コンソールのKey Pair画面で表示されるFingerprintと一致することを確認します
さいごに
この情報はAmazon EC2: User Guide for Linux Instancesに記載されています。
原則として、Import Key Pairによって自分の公開鍵を登録することで秘密鍵の転送は避け、かつ秘密鍵の複数人での共有はしないべきだと思いますが、運用の都合上共通ユーザーを使っている場合もあるかと思います。秘密鍵の管理と正当性の確認はしっかり行いましょう!