秘密鍵、管理してますか? YubiKeyで鍵の一元管理とSSH接続、2段階認証の高速化を試す

  • 163
    Like
  • 9
    Comment
More than 1 year has passed since last update.

はじめに

突然ですが、みなさんは秘密鍵の管理、どうしていますか?
SSHの接続用、メールの暗号化・署名用など、日常的に使用する様々な鍵があると思います。
私は主サーバへのSSH接続に利用する程度ですが、数台のサーバへのアクセスのため複数の端末(Win/Mac/Linux)に秘密鍵をコピーしており、鍵ファイル数が10を超えて来たあたりから「何とか上手く管理出来ないかな…」と悩んでいました。
大事な鍵のコピーが各所に散らばっているのは、かなり気持ちが悪いです。
また、言葉通りで「秘密鍵」は「秘密」にしなければなりませんが、ファイルとして存在していると、他人に見られたり、万が一ですが標的型攻撃に遭い外部に送信される・自分で誤ってDropBox等の共有サービスに公開してしまう等の危険性もゼロではありません。
理想的には、秘密鍵は物理的には直接読めないようにしたいものです。
更に、管理上、鍵の数は出来るだけ減らしたいとも思っていました。

そこで最近、以前から気になっていたハードウェアトークン、YubiKey NEO、及びYubiKey 4を購入し、課題の解消を試みました。
使い始めてまだ一週間程ですが、実際の使用感や各種設定方法、YubiKeyでSSH接続する手順等をご紹介したいと思います。
(※記事内で紹介したコマンド等は、主にYubiKey NEOで確認しています)

目的

  • 秘密鍵の安全な保管・一元化
  • U2F対応Webサービスにおける2段階認証の簡略化
  • GnuPG / Gpg4winと組み合わせてEメールの署名・暗号化等 <- まだ

動作確認環境

YubiKeyって?

YubiKeyはスウェーデンのYubico社が開発している製品で、USBポートに差し込んで使うハードウェアトークンです。
スニッカーズと大きさの比較

差込口の端子が昔懐かしのファミコンカセットに似ていて、少し変わっていますね。
重さはわずか3gとかなり軽いですが、硬質のプラスチック製で、手で強引にねじっても全く平気です。
USB給電のため電池は不要、また水に濡れたり車に踏まれても大丈夫など、耐久性の高さも特徴とのこと。

さすがに海に潜る人はいないと思いますが、間違って洗濯しても平気ですね。
ところで、USBメモリの読み込みが制限されているPCでも使用できました。個人的には結構重要なポイントです。

製品名は日本語風(指キー?)ですが、"Your Ubiquitus Key"の略だとか。

国内ではソフト技研クラウドゲートが代理店となっており、ソフト技研のオンラインショップAmazon.co.jpから、または本家のYubico Storeからも購入できます。
(2015/12/2現在、Yubicoストアでは、Githubユーザに向け20%オフのキャンペーンが実施中です)

また、2015年11月には新機種のYubikey 4が発売されました。
新機能として、RSA-4096のサポートや、Dockerでのコード署名が簡単に出来るようになったとのこと。

今回はYubico Storeから直接購入しました。

品名 価格 備考
YubiKey 4 $40
送料 $5
GitHubクーポン -$8 20%割引
合計 $37 +消費税

購入から3日後、普通郵便で届きました。送料に\$5を払ったのに封筒には£0.63(≒\$1)と記載が…気にしないでおこう。

何が出来るの?

クラウドゲート社の紹介ページがとても分かりやすい説明でお勧めです。
Yubico社のスペック比較表を見ると機能が多いため概要を掴みづらいのですが、以下の様に捉えると分かりやすいかと思います。

  • タップするとパスワードを自動入力する特殊なキーポード
  • スマートカード(PIV規格 / OpenPGP card規格)。鍵は直接読み出せない。パスワードで保護

機種によって機能の差がありますが、この記事で主に紹介するスマートカード機能はYubiKey4/4 nanoかYubiKey NEO/NEO-nのみに搭載されています。
U2Fによる2段階認証は、Standard以外の全ての機種が対応しています。
また、機種名に「Nano」が付くモデルは、名前の通り本体が小さく、USBポートに刺してもほとんど出っ張りません。
ノートPCで使う場合はこちらの方が使い勝手が良さそうです。
持ってくるのを忘れてしまいサーバにログイン出来ない! という悲劇がなくなります(意外に重要なポイント)。

特徴 機種 機能
FIDO U2F対応 Yubikey 4
YubiKey NEO
YubiKey Edge
YubiKey Security
2段階認証のパスワード入力を不要にする
スマートカード(PIV,OpenPGP card) Yubikey 4
YubiKey NEO
鍵の安全な保管・読み取り保護

YubiKey NEOが一番高価ですが、この機種の特徴はNFCに対応していることです。携帯電話にかざす事で通信が出来ます。
もしNFCが必要なければ、もっと安い機種で良いでしょう。
私はNEOを使っていますがNFC機能は全く使っていません。

ワンタイムパスワード(OTP)

カード上面の丸い金色の部分をタップすると、静電気が感知され文字が入力されます。
この入力されるパスワードは、Yubico社の独自アルゴリズムによるワンタイムパスワード(OTP)であり、タップする度に毎回違う文字列が生成されます。
OTPのイメージ
普通のタップ(Slot 1)、3秒長押し(Slot 2)の2つのモードがあり、デフォルトでは普通のタップのみ有効です。
Slotの割り当てはYubico Personalization Toolで行います。

固定(静的)パスワード

YubiKeyのユニークな特徴の一つですが、タップされたら固定のパスワードを出力するよう設定することが出来ます。
16文字から48文字のパスワードを設定可能です。

普通の人間にとって、覚えやすい単語を含まない10文字以上のパスワードを記憶するのは大変な困難が伴いますが、YubiKeyに記憶させる事で、長さが十分で強度の高いパスワードを簡単に使うことが出来ます。
OTPの場合、Webサービスやアプリ側でYubiKeyをサポートしてくれないと使えないのに対し、固定パスワード機能はYubiKeyに対応していないサービス・アプリでも使えます(当たり前ですが)。
ただし、YubiKeyが出力する生のパスワードをサービス等に設定してしまうと、YubiKeyを物理的に盗めばそのサイトにログイン出来る事になりますから危険です。
パスワードの最初の数文字は手入力し、残りをYubiKeyに入力させる方法が推奨されています。

FIDO U2F (U2F = Universal Second Factor)

加えて、Standard以外の機種はFIDO U2Fに対応しているため、FIDO U2F対応のサービスとの組み合わせで
2段階認証をパスワード入力不要で行うことができます。
2015/12/2現在、GoogleアカウントやGitHub、DropBoxなどがFIDO U2Fに対応しています。
また、MicrosoftはWindows 10でのFIDO U2F対応を表明しています。

参考

2段階認証とは

その名の通りで、2段階の認証を通って初めてログインが出来る仕組みです。
パスワード認証後、もう一段階の認証を通らないとログインできません。
2段階目の認証として一般的なのは、携帯電話をサービスに登録し、サービス側から携帯電話に送られてきたパスコードで認証することです。
また、携帯電話にGoogle認証やAuthyなどの2段階認証用アプリをインストールし、アプリに表示されるパスコードを入力することで、同様の認証を行うこともできます。

ところで、私は最近Bitcoinに興味を持ち、数社に取引口座を開設したのですが、そこで驚いたのが各社ともログインに2段階認証を選択可能、かつ利用が強く推奨されていることでした。
これは考えてみれば当たり前の事で、仮に自分の口座に誰かにパスワードを破られる等してログインされてしまうと、それはほとんど口座のお金を盗まれる事に等しいからです。パスワード認証だけでは十分なセキュリティとは言えません。パスワード認証以外にも、もう一段階認証をするようにした方が良いですよ、という訳です。
昨今ハッキング被害やマルウェア等による情報の盗難・流出のニュースが絶えません。
自分ではちゃんとしているつもりでも、流出した情報を元に不正アクセスされてしまう可能性もありますし、もしIDとパスワードを使いまわしていた場合には、被害は更に大きくなってしまいます。
突然セキュリティ意識が高まった私は、利用中のオンラインサービスで2段階認証が提供されている所では全て2段階認証を慌てて有効にしました。

2段階認証のある日常

最初は「こういう仕組みなのか、なるほどな~」「セキュリティ重要だから」等と自分を納得させながら使っていましたが、段々面倒になってきました。
2段階認証を有効にすると、1ログインごとに約20秒ほど余計に時間がかかるのです。

2段階認証を有効にした状態でGoogleにログインする際の流れはこのような感じです。

  1. ログイン画面にIDとパスワードを入力
  2. 2段階目の認証を行うため携帯電話を取り出す
  3. 携帯電話のロック解除
  4. Google認証アプリを立ち上げる
  5. 表示されたパスコードを記憶
  6. パスコードをブラウザのフォームに転記してログインボタンを押す
  7. ログイン成功

ここまで大体30秒前後掛かるのですが、ログインに毎回30秒は不便と言わざるを得ません。
かといって「面倒だからログインしっぱなし」になってしまっては本末転倒です。
YubiKeyを導入することで、ログイン完了まで10秒ほどになりすごく快適になりました。
具体的には、2から6が不要になり、その替わりにYubiKeyをタップする流れになります。

YubiKeyを使う

YubiKeyをFIDO U2F対応ハードウェアとして使うのは、何も設定が要らずただ差し込むだけでOKです。
PIV/OpenPGP cardとして使うには、設定が必要になります。
今回の記事では、主にPIV規格のスマートカードとして使う方法をご紹介します。

CCIDモードの有効化 (NEOのみ)

YubiKey NEOをスマートカードとして使うには、CCIDモードの有効化が必要です。
YubiKey 4はデフォルトで設定されているため不要でした。

設定するために Yubico Manager をインストールします。
起動後、CCIDにチェックしてOKをクリック。

初期パスワード

PIN Admin PIN (PUK) Management Key
123456 12345678 0807605403020108070605040302010807060504030201

PIVカードとして使う

公式ドキュメント - yubico-piv-tool

Yubico PIV Toolのインストール

GUIで設定できるアプリケーションもあるのですが、
コマンドラインツールの方が手順が書きやすく設定も確実に行えるため、Yubico PIV Toolを使って設定していきます。

好きなディレクトリにアーカイブを展開して、PATH環境変数にディレクトリを追加します。

PATH

YubiKeyの状態の確認

まずはカードの状態を確認します。
初期状態だとこうです。

C:\>yubico-piv-tool -a status
CHUID:  No data available
Slot 9a:        No data available.
Slot 9c:        No data available.
Slot 9d:        No data available.
Slot 9e:        No data available.
PIN tries left: 3

一通り設定した後はこのような感じで表示されます。

C:\> yubico-piv-tool -a status
CHUID:  3019d4e739da739ced39ce739d836858210842108421384210c3f534101b4434c29e36e6
e33decc520807b56a8350832303330303130313e00fe00
Slot 9a:
        Algorithm:      RSA2048
        Subject DN:     CN=SSH key
        Issuer DN:      CN=SSH key
        Fingerprint:    d02a231d53230664df8d766cf7a7aadc1e74e7f43f98bc7802cdd0b2
98ed4f2d
        Not Before:     Nov 25 11:45:50 2015 GMT
        Not After:      Nov 24 11:45:50 2016 GMT
Slot 9c:        No data available.
Slot 9d:        No data available.
Slot 9e:        No data available.
PIN tries left: 3

エラーになった場合は、YubiKeyを一回抜いてから再度差しこんでみて下さい。

鍵の生成

REM 公開鍵はローカルファイルにも出力しておく

C:>yubico-piv-tool -s 9a -a generate -o public.pem
Successfully generated a new private key.

-Aオプションで鍵生成アルゴリズムを指定可能です。省略するとRSA-2048になります。

オプション 意味 備考
-A RSA1024 RSA 1024-bit 暗号強度が弱いため避けるべき
-A RSA2048 RSA 2048-bit デフォルト
-A RSA4096 RSA 4096-bit YubiKey4のみ
-A ECCP256 楕円曲線暗号 P-256
-A ECCP384 楕円曲線暗号 P-384

秘密鍵が読み込めない事を確認

Internet Explorerを開き、[Internet Option] - [コンテンツ] - [証明書]を選択します。
個人タブにYubiKey内の証明書が出てくるので、選択し、[エクスポート]ボタンを押します。

想定通り、秘密鍵のエクスポートは出来ませんでした。

自己証明書の作成

REM -S オプションについて、CN=一般名 O=機関名

C:>yubico-piv-tool -a verify-pin -P 123456 -a selfsign-certificate -s 9a -S "/CN=SSH key/" -i public.pem -o cert.pem

Successfully verified PIN.
Successfully generated a new self signed certificate.

証明書の読み込み

C:>yubico-piv-tool -a import-certificate -s 9a -i cert.pem

公開鍵の読み出し

C:\Program Files (x86)\OpenSC Project\OpenSC\tools>pkcs15-tool --read-public-key
 1
Using reader with a card: Yubico Yubikey NEO OTP+U2F+CCID 0
Please enter PIN [PIV Card Holder pin]: 2015-12-01 00:17:40.105 cannot lock memo
ry, sensitive data may be paged to disk
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi8jcJZelTVppQju8JNxp
dkZoguyEFDFiDUneQa/vD5rTPI7s3j6hGxuWjdMbM2+I8sj+lxFciCgSxdF29hQJ
mnZziPq3MNWYX6KAJnxs5FcNtxS37+LoZbPRevljlnzPtnRgb+KYZrG36GF7GJD5
08Pk2WfXiHNA80OCmitJaoSrLU0jKwrbIiimGrW+ir3xPxaZ04gvqD8IFZ23Y5+S
Avf/L3B9Qd0pxriCrADn4h0kEY7wSX9zASnQFwpjBkcGvaMIaR/spqPzCnXD30oX
C6tsMDp8gwGgnigd+ReadXaAE+IRKi2jESV27aYaRuPn66ikrkLB/04SbnZMq5I4
IQIDAQAB
-----END PUBLIC KEY-----

公開鍵の読み出し (SSH形式)

C:\Program Files (x86)\OpenSC Project\OpenSC\tools>pkcs15-tool --read-ssh-key 1
Using reader with a card: Yubico Yubikey NEO OTP+U2F+CCID 0
Please enter PIN [PIV Card Holder pin]: 2015-12-01 00:18:04.585 cannot lock memo
ry, sensitive data may be paged to disk
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCLyNwll6VNWmlCO7wk3Gl2RmiC7IQUMWINSd5Br+8P
mtM8juzePqEbG5aN0xszb4jyyP6XEVyIKBLF0Xb2FAmadnOI+rcw1ZhfooAmfGzkVw23FLfv4uhls9F6
+WOWfM+2dGBv4phmsbfoYXsYkPnTw+TZZ9eIc0DzQ4KaK0lqhKstTSMrCtsiKKYatb6KvfE/FpnTiC+o
PwgVnbdjn5IC9/8vcH1B3SnGuIKsAOfiHSQRjvBJf3MBKdAXCmMGRwa9owhpH+ymo/MKdcPfShcLq2ww
OnyDAaCeKB35F5p1doAT4hEqLaMRJXbtphpG4+frqKSuQsH/ThJudkyrkjgh PIV AUTH pubkey

公開鍵の読み出し (OpenSSH)

OpenSSHのssh-keygenコマンドでも出来る。出力形式は若干違うだけ (最後のコメントが付かない)

C:\> ssh-keygen -D opensc-pkcs11.dll
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCLyNwll6VNWmlCO7wk3Gl2RmiC7IQUMWINSd5Br+8P
mtM8juzePqEbG5aN0xszb4jyyP6XEVyIKBLF0Xb2FAmadnOI+rcw1ZhfooAmfGzkVw23FLfv4uhls9F6
+WOWfM+2dGBv4phmsbfoYXsYkPnTw+TZZ9eIc0DzQ4KaK0lqhKstTSMrCtsiKKYatb6KvfE/FpnTiC+o
PwgVnbdjn5IC9/8vcH1B3SnGuIKsAOfiHSQRjvBJf3MBKdAXCmMGRwa9owhpH+ymo/MKdcPfShcLq2ww
OnyDAaCeKB35F5p1doAT4hEqLaMRJXbtphpG4+frqKSuQsH/ThJudkyrkjgh

最後に: PINの設定

一番大切な手順です。PINがデフォルトのままでは意味がありません。
決めるのはなかなか大変ですが、決まったら紙などにメモして金庫等の大事な場所に保管しましょう。
個人的には覚えやすいパスワードで良いと思います。難しいパスワードを設定し、かつ紙にメモを残すより完全に脳内に記憶出来るパスワードの方が安全性が高いのではないでしょうか。
考えるのが面倒な人は、パスワード生成サービスを利用するのも手かもしれません。
サーバに情報が残らない、クライアントサイド(JavaScript)でパスワードを生成してくれるサービスがお勧めです。
いろいろありますが、私はLastPassのパスワード生成サービスを使っています。
また、Wolframのサービスでは、パスワードのエントロピーなど詳細情報が表示可能で、こちらも便利です。

PINの変更

REM 凡例 yubico-piv-tool -a change-pin -P [old PIN] -N [new PIN]

C:> yubico-piv-tool -a change-pin -P 123456 -N PIN0

PUKの変更 (PUK = PIN UnlocK code)

REM 凡例 yubico-piv-tool -a change-puk -P [old PIN] -N [new PIN]

C:> yubico-piv-tool -a change-puk -P 12345678 -N PUK1

管理パスワードの変更

REM 管理パスワードは必ず48文字(24byte)の英数字

C:> yubico-piv-tool -a set-mgm-key -n 0807605403020108070605040302010807060504030201

SSHサーバに接続する

YubiKeyに保管された秘密鍵を使ってSSHに接続する手順です。
Yubico社のドキュメントはかなり充実していますが、SSH接続の手順に関しては、Mac OSX, Linux用の紹介のみで少し薄い感じがしました。
WindowsでGpg4winを利用してSSH接続する方法が紹介されていますが(gpg-agentをpagentの替わりに使う)、私の環境依存の問題かもしれませんが上手く設定できなかったです。
この記事で補完出来たら良いなと思います。

PuTTYの場合

公式版PuTTYはYubiKeyを認識しないため、スマートカードのサポートが追加されているPuTTY-CACを使用します。
PuTTY-CACのページから適切な実行ファイルをダウンロードすればOKです。

2015/12/2現在、最新の実行ファイルは「testing」の下にあります。
http://risacher.org/putty-cac/testing/Release/

PuTTY-CACの設定

サイト毎のPuTTYの設定画面を開き、[Connection]-[SSH]-[CAPI]を選択します。
1. Attempt "CAPICertificate" (Key-only) auth (SSH-2)をチェック

2. Browseボタンをクリック。ダイアログが開くので適切な証明書を選択する。
3. SSH keystring: に文字列が表示されるので、コピーしてサーバの~/.ssh/authorized_keysに追記します。
4. SSH - Tunnels の Local ports accept connection sfrom other hostsのチェックを外す。警告が出るため

5. 設定を保存します。この設定でSSH接続すると、ログイン時にPINコードの入力が求められるようになります。

OpenSSH for Windowsの場合

OpenSSH for Windowsでも接続できます。
OpenSSH for Windowsについてはこちらの記事が詳しいです。

  1. OpenSSH for Windows,Open SC for Windowsをインストールします。 ちなみに、Open SC for Windows v1.5の64bit版はインストーラのパッケージングに問題があるようで、うまく動きませんでした。 (この問題で数時間ハマりました・・・) 32bit版を使えば大丈夫です。
  2. PuTTYの時と同様、サーバの~/.ssh/authorized_keysに秘密鍵情報を追記します。
  3. opensshに「-I opensc-pkcs11.dll」オプションを足して接続します。
C:> openssh -I opensc-pkcs11.dll userid@example.com

ログインの前にPIN入力が求められ、確認が行われているのにお気づきでしょうか。

毎回 -I ... を入力しなくても良いように、~/.ssh/config に設定を追加することが出来るようです(未検証)。

~/.ssh/config
PKCS11Provider opensc-pkcs11.dll

Webサービスに登録する

YubiKeyの鍵をWebサービスに登録してみます。

DigitalOcean

Putty-CACかssh-keygenでYubiKeyから公開鍵を読み出しファイルに保存しておきます。
DigitalOceanにログインし、[Settings]-[Security]を選択、Add SSH Keyボタンをクリック、
公開鍵をコピーして、Update SSH Keyボタンを押します。

この後、Dropletを起動すれば、~/.ssh/authorized_keysに登録したキーが追記されているので、
前に紹介したようにSSH接続出来るはずです。

SSHの鍵一覧には、公開鍵の指紋(Fingerprint)の値が表示されますが、
手持ちの公開鍵と一致するかどうかは、この指紋の値を比べる事で判別できます。

公開鍵の指紋の確認

openssh 6.8以降:

C:> ssh-keygen -E md5 -lf id_ssh.pub
2048 MD5:b2:dd:f7:3d:35:40:6e:94:f2:6f:aa:ce:2e:23:ad:84 PIV AUTH pubkey (RSA)

openssh 6.8以前:

C:> ssh-keygen -lf id_ssh.pub
2048 b2:dd:f7:3d:35:40:6e:94:f2:6f:aa:ce:2e:23:ad:84 /c/Users/d-shinozaki/.ssh/yubikeyneo.pub (RSA)

ハードウェアリセット (工場出荷状態に戻す)

パスワード等を忘れてしまった時の最後の手段です。
以下の手順で工場出荷状態に戻すことが出来ます。

Yubico - PIN and Management Key
から引用:

If an incorrect PIN is given 3 times consecutively, the PIN will become disabled.
If you’ve set a PUK, then you can use that PUK to reset the PIN to a new value, and it will become enabled and usable again.
If an incorrect PUK is given 3 times consecutively, it will become blocked as well. When both the PIN and the PUK are blocked, the device can be reset.
This returns the PIV functionality of the YubiKey to a factory setting, setting the default PIN, PUK and Management Key values, as well as removing any stored keys and certificates. Once reset, the device is ready to be re-initialized.

PINを3回、PUKを3回誤入力してブロック状態にしてから、PIVのリセットコマンドを発行すれば工場出荷状態に戻るとのこと。
ちょっと怖いですが、本当に出来るかやってみます…後ほど。

参考

おわりに

YubiKeyを使い始めて最近感じているのが「忘れない」ことの重要性です。
YubiKeyを持参し忘れると、最悪サーバにログインできなくなってしまう訳で、絶対にどこかに置き忘れたり紛失する訳にはいけません。
YubiKey in the KeyChain
画像の用に鍵束に一緒にするのが良いのかもしれませんが、個人的には本体の穴にチェーンを通して首からぶら下げるのが良さげかなと思っています。
良いチェーンないですかね…。悩み中です。お勧めありましたら教えて下さい。

思いがけず長い記事になってしまいました。
次回は、Gpg4winやThunderbird、Enigmail と組み合わせて、メールの署名や暗号化を行う記事を書けたらなと思っています。
また、サーバサイドでのYubiKeyサポートの実装も試してみたいです。

最後になりますが、Amazon.co.jpのアソシエイトリンクを作成してみましたので、
もしこの記事を読んで「使ってみようかな」と思われた方がいましたら、こちらのリンクを辿ってご購入頂けますと幸いです (´・ω・`)

YubiKey 4 YubiKey NEO Yubikey NEO-n YubiKey Edge YubiKey Edge-n Yubico
セキュリティキー
YubiKey 4 YubiKey NEO YubiKey NEO-n YubiKey Edge YubiKey Edge-n Yubico セキュリティキー
¥4,480 ¥6,480 ¥6,480 ¥4,480 ¥4,480 ¥3,400

※参考価格