ssh使ってますか?公開鍵認証使ってますか?クラウドサービスやVPSサービスでリモートログインする際、セキュリティを強化するために使われる公開鍵認証ですが、鍵の作り方(暗号化方式)にいくつか種類があります。この暗号化方式でちょっと困ったことがあったので、セキュリティ強化の意味も込めて、設定を見なおしてみることにしました。
Ububtu 16.04にログインできない事件
困った。SSHでログイン出来ないんです。某クラウド環境に作ったUbuntu 16.04環境に、sshログインできない。何度も環境作りなおしたんですが、上手く行かず、何が起きているのか分からずに悩むこと数時間。最終的に、公開鍵を作りなおすことで、ログインできるようになりました。
何がダメだったかというと、元々使っていた公開鍵がdsa形式だったため。rsaに変更したら、ログインできました。
こんなところで引っかかったことが無かったので、ログを見てみると・・・
sshd[2157]: userauth_pubkey: key type ssh-dss not in PubkeyAcceptedKeyTypes [preauth]
なんと。「PubkeyAcceptedKeyTypes」なる設定で引っかかってる。マニュアルを見てみると・・・
PubkeyAcceptedKeyTypes Specifies the key types that will be accepted for public key authentication as a comma-separated pattern list. Alternately if the specified value begins with a ‘+’ character, then the specified key types will be appended to the default set instead of replacing them. The default for this option is: ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521-cert-v01@openssh.com, ssh-ed25519-cert-v01@openssh.com, ssh-rsa-cert-v01@openssh.com, ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, ssh-ed25519,ssh-rsa The -Q option of ssh(1) may be used to list supported key types.
これは利用可能なSSH鍵のタイプを制限するもので、dsa(ssh-dss)はデフォルトでは使えなくなったらしい。OpenSSHのバージョンはこちらです。
OpenSSH_7.2p2 Ubuntu-4ubuntu1, OpenSSL 1.0.2g-fips 1 Mar 2016
セキュリティ強化のため、ssh-dssはデフォルト無効になっている
この変更はどうやらOpenSSHのバージョン7.0辺りから反映されているようです。ssh-dssはセキュリティ的な脆弱性(鍵長が固定で今となっては短い)から無効化されたとのことです。
残念なのが、このssh-dss(キータイプdsa)については、ssh2対応のとき、当時セキュリティ強化のために使うようになったという経緯があることです。意外に古くからsshを使っている人ほど、「ssh2ならdsa」と思っていることが多いのではないかと(少なくとも私はそうだった・・・)。
なので、今でも鍵作成の時とかは「ssh-keygen -t dsa」という常套句を使っていたりしました。なるほど、難しいのね。
という訳で、SSH鍵の暗号化について調べてみようと思いました。合わせて、脱dsaを進めてみようかな、と。
OpenSSHが対応するkey typeについて
ssh-keygenで指定できるキータイプには、rsa1、dsa、ecdsa、ed25519、rsaがあります。この中で、ssh v1で使えるのがrsa1、それ以外はssh v2で利用できます。
- rsa1・・・ssh v1で使える方式だが、脆弱性があるため奨励されない。ssh v1しか使えない環境で使う。
- dsa・・・RFC 4251に規定されており、接続性が高い。ssh-keygenで作成できる鍵長が1024bit固定なため、あまり強力とは言えなくなっている。
- rsa・・・現状のデファクト。鍵長4096bit等も指定できるため、強力だけど、RFC 4251に定義されているわけではないので、接続性に問題がある場合があるかもしれない。
- ecdsa・・・楕円曲線DSA。楕円曲線暗号は、RSAよりも解読が困難でありbit効率が良くて処理も早いとか。良く分からないが、なんだか凄いらしい。ポストRSAとして期待されている。
- ed25519・・・同じく楕円曲線暗号を用いた方式で、ecdsaより処理が速い。現状最強と言える。
という訳で、正直暗号の細かな話になってしまうと良く分かりませんが、流石に楕円曲線暗号を用いた方式は技術的にも新しくて、安全性も性能も高くて良い感じです。接続性から言うと、RFC 4251の規定があるので、とはいえdsaが有利なようですが、実際rsaやecdsaでも困ることは無いと思います(少なくとも私は困ったことは無いです)。
ではkey-pairは何を使うか
じゃぁ、DSAを捨てて、rsa、ecdsa、ed25519にしていきましょうか、という話になるわけですが、opensshの場合、これらの鍵ファイルのデフォルトファイル名はすべて別になるようになっていますので、とりあえず全部作っておいて、使えるものの中で一番強いものから、公開鍵を配布していく、という対応が実現可能です。早速、鍵を作っていきます。クライアント環境はMac(10.11.5)です。当然ながら、opensshのバージョンによっては、ed25519に対応しない、などの制限があります(CentOSが非対応。だいたいecdsaには対応しているようです)。
RSAは鍵長を長いほうがより安全ですのでとりあえず4096bitにしてみます。
ssh-keygen -t rsa -b 4096
ecdsaについては、bit長として、256bit、384bit、521bitが使えるので、一番長い521bitを使ってみます。
ssh-keygen -t ecdsa -b 521
ed25519についてはbit長が指定できそうに見えますが固定長(256bit)です。
ssh-keygen -t ed25519
これで、~/.ssh以下に以下のファイルができます。
id_dsa id_dsa.pub id_ecdsa id_ecdsa.pub id_ed25519 id_ed25519.pub id_rsa id_rsa.pub
id_dsaは元々あったdsaキー、それ以外が、各々の暗号化方式で作成した鍵です。rsa1のidentityは流石に作ってません。
ecdsaでログインしてみる
早速ですが、dsa以外の公開鍵をサーバーに設定してログインしてみます。鍵の入れ替え時は、ログイン不可になる事態をさけるため、設定を変更するセッションと、ログインを試すセッションと、2枚準備して作業を行います。
やることは暗号化方式にかかわらず、authorized_keysに公開鍵を追記するだけです。
ただ、当然ながら、サーバーが対応していない暗号化方式は使えませんので、適宜ed25519、ecdsa、rsaの順に使えるものを設定していきます(いや、本当はどれか1つにしたほうが良いのかな、と思いつつ)。
現状では多くのサーバーがecdsaまでしか対応しないので、ed25519で実際繋がったのはubuntuのサーバーくらいでしたが、ちゃんとdsa以外の鍵でも繋がることが確認できました。
安全になって良かった
実際のところ、キータイプを変えたからと言って、何か使用感が変わるようなことは全く無いのですが、やっぱり安全で新しい方式でログインするのは、気持ちの良いものです(苦笑)。何より、これまで何も考えずにdsaを使ってきたのですが、今回の一件で、いろいろ見直すことができて良かったです。
古くからsshを使っている人ほど、これ、意外にハマってるじゃないかなぁ、と思います。
ちなみに・・・
やっぱり意識高い人居るのね(笑)。僕も仲間入りしたい。
コメント
[…] SSH鍵の暗号化方式を強化してみた。 […]
> ssh-dssはデフォルト無効になっている
目から鱗でした。
久しぶりにFreeBSDサーバのバージョンあげて、パスワード認証で繋いだスーパーユーザーから設定いじっては別のターミナルやSFTPで繋がらず。の繰り返しを丸二日やってました。
今にも切れそうなSSH一本の火を消さないように。
まさかのDSA、記事拝見して3分で解決しました。
ありがとうございました!おかげでようやく接続切ることができました。
あっ鍵作ったユーザー、テスト用でwheelに登録してなかった…
(でも精神的にとても快適です)