hnwの日記

GitHubユーザーのSSH鍵6万個を調べてみた

(2015/1/30 追記)時期は不明ですが、現時点のgithub.comはEd25519鍵にも対応しています。
(2016/5/31 追記)「GitHubにバグ報告して賞金$500を頂いた話」で紹介した通り、既に弱い鍵はGitHubから削除され、新規登録もできなくなっています。


GitHub APIを利用して、GitHubの31661アカウントに登録されているSSH公開鍵64404個を取得してみました。抽出方法*1が適当すぎて偏りがあるような気もしますが、面白い結果が得られたと思うのでまとめてみます。

SSH鍵の種類

鍵の種類 個数 割合
RSA 61749 (95.88%)
DSA鍵 2647 (4.11%)
ECDSA鍵 8 (0.01%)

約6万個の鍵のうち、8個だけECDSA(楕円DSA)鍵が見つかりました!常用しているのか試しに登録してみただけなのかはわかりませんが、何にせよ意識高い感じでステキですね。

SSH鍵のbit長

RSA

鍵長 個数 割合
800bit 1 (0.00%)
1024bit 2034 (3.29%)
1026-2046bit 15 (0.02%)
2048bit 58773 (95.18%)
2050-4094bit 25 (0.04%)
4096bit 827 (1.34%)
4098bit- 74 (0.12%)

2048bit鍵が多数派という結果になりました。これは多くのSSH実装がデフォルトで生成する鍵長だと思うので、当然の結果ではあります。

1024bit鍵の人もボチボチ見つかります。最短の鍵長はなんと800bitでした。あとで触れますがよろしくないですね。

DSA鍵

鍵長 個数 割合
512bit 1 (0.04%)
1024bit 2484 (93.84%)
1280bit 2 (0.08%)
2048bit 151 (5.70%)
3072bit- 9 (0.34%)

実は、OpenSSHのssh-keygenは1024bitのDSA鍵しか作れません。そういった事情からか、2048bit未満の鍵を使っている人がかなり多い結果になりました。RSA鍵と同様、よろしくない結果と言えるでしょう。特に512bitの鍵は今回の調査中で最弱の可能性があります。

ECDSA鍵

鍵長 個数 割合
256bit 3 (37.5%)
521bit 5 (62.5%)

NISTのガイドラインRecommendation for Key Management: Part 1: General (Revision 3)」(PDF) によれば、256bit ECDSA鍵は3072bit RSA鍵に、521bit ECDSA鍵は15360bit RSA鍵に相当するそうです。安心感がありますね。

ちなみに521bitというのはtypoではありません。念のため(参考:「楕円曲線暗号に 512 bit は存在しない」)。

強度の低いSSH鍵が現役で使われている懸念

今回調べてみて気づいたのは、強度の低いSSH鍵がまだまだ使われているのではないか、ということです。1024bit以下のDSA鍵とRSA鍵はそろそろ捨てるべき時期が来ているというのが僕の認識です。

少し前に「暗号アルゴリズム2010年問題」という言葉が叫ばれたことがありました。米政府や日本政府のシステムでの暗号強度に関するガイドラインが出され、2010年までに一定以上の安全性の暗号に置き換えよう、という動きがあったことを指します。このガイドラインでは、2048bit未満のRSA、2048bit未満のDSA、223bit以下のECDSAが切り替えるべきとされました。上の調査結果でいうと全体の約7%の鍵が該当します。

暗号技術調査WG(計算機能力評価)活動報告」(PDF)の8ページ目のグラフを見る限り、あと数年くらいの間は、1024bit RSA鍵の解読に世界トップレベルのスパコンを1年占有するくらいの計算量が必要そうです。個人のSSH鍵が1024bit長だからといって現実味のある脅威とは言いにくいですが、理屈上は既に危険水域と認識すべきでしょう。

SSH公開鍵が全世界に公開されることに対する懸念

今回このような調査ができたのは、GitHubユーザーの公開鍵をAPIで公開しているためです。自分の公開鍵がGitHubの特定URLから読み取れることで他人に公開鍵を伝えるのが楽になりますから、僕個人としては非常に便利な機能だと感じています。ただ、サービス全体の設計としては問題があるようにも考えています。

確かに、公開鍵暗号は「秘密鍵さえ知られなければ公開鍵はバレても安全」という性質がありますから、公開鍵を公開しても問題が無さそうに思えます。ただ、その前提として「十分な強度の鍵ペアを使っている」ことも必要です。7%のユーザーが強度に疑問のある鍵を登録している状況で全ユーザーの公開鍵を公開して本当に大丈夫なのでしょうか。

また、SSHの場合は不特定多数と通信するHTTPSなどとは利用シーンが異なっており、誰にでも公開鍵を公開する必要性はありません。万一公開鍵を元に素因数分解や離散対数問題が解かれてしまうとSSHログインを許すことになりますから、公開しない方が安全なのは間違いないはずです。ユーザーがリスクを承知で公開するなら個人の勝手ですが、サービスとして全員の公開鍵を公開するのは疑問です。

自衛策として、GitHubに登録する鍵ペアを普段使いの鍵とは別にする、というのも手かもしれません。ただ、マシンごとに鍵ペアを2組作るのも面倒なので、僕個人はあまりやる気がしませんね…。

この点については識者の意見も伺いたいところです。セキュリティ界隈の方々よろしくお願いいたします。

SSH鍵の鍵長を確認する方法

本稿を読んで「自分のSSH鍵は大丈夫なんだっけ?」と不安になった方のために、SSH公開鍵から鍵長を簡単に調べる方法を紹介します。これは、OpenSSH付属のssh-keygenで次のようにして調べることができます。

$ ssh-keygen -l -f $HOME/.ssh/id_rsa.pub
2048 1a:a3:de:59:da:d5:9f:b9:a2:09:2b:eb:4c:8d:7b:83  hnw@macalon.local (RSA)

1カラム目がbit長、最後のカラムが鍵の種類です。オプションの指定を間違えて鍵ペアを上書きしないよう、気をつけてくださいね。

まとめ

  • GitHubユーザーのSSH鍵を取得して傾向を調べました
    • 強度に疑問のある鍵が約7%存在しました
  • GitHubに登録しているSSH公開鍵が全世界に公開されていることについて疑問を呈しました
  • 自分のSSH鍵の鍵長を調べる方法を紹介しました

僕個人の判断としては、2048bit RSA鍵で2030年まで戦えるらしいので当分それでいいと思っています。闇雲にSSHの鍵長を長くするとDH鍵交換やその他の暗号化プロセスも計算量が増えて、結果として処理が重くなってしまうんじゃないでしょうか。何事もトレードオフがあるよねってことで。

*1:GitHubのユーザID1番から1万番、100万番から101万番、…800万番から801万番の人のうちSSH鍵を登録している人の全ての公開鍵を先月末に取得しました