「yubikey」タグアーカイブssh-agentとpkcs11をmacOSXで使うコメントを残すすごくわかりにくいタイトルYubikeyにSSHの秘密鍵を入れて、ローカルのハードディスクに鍵は置かないといころまではうまく行った。つぎにあちこちのPCやらサーバから鍵を消しまくりたいのだが、接続した先のサーバから別のサーバに接続なんてケースはママある。いうことでssh-agentの登場となるわけですが、ssh-agentにファイルとして存在していない鍵(Yubikeyのようなスマートカード)をどう追加するかという話。/usr/local/lib/opensc-pkcs11.soこれで行けることはわかっているんですが、Macだとどうしても動いてくれない。ssh-agentのマニュアルを読むと-Pオプションで、信頼できるpkcsライブラリで指定するらしい。これがデフォルトだと/usr/lib*/*と、/usr/local/lib*/*になっているようで、上のopensc-pkcs11.soも問題ないじゃないかと思っていのだが、MacOSXの場合はHomebrewでopenscをインストールしており、上記のパッケージもシンボリックリンクでおいてあった。-Pオプションにオリジナルの場所を追加しようとしたのだが、どうもうまく行かず、非常に安直なworkaroundだが、オリジナルをコピーして/usr/local/libにおいたらうまく動いた。アップデートしたら動かなくなるかもしれないし、脆弱性があっても放置される可能性があるので、おすすめはできない。-Pオプションで解決したい。(スマートカード)に入れた秘密鍵を使ってSSHにログインするコメントを残すラノベのタイトルみたいになってしまったすったもんだしてYubikeyにSSHの秘密鍵を入れるところまで行ったのだが、これを利用して、ローカルのハードディスクに秘密鍵を置かずに、SSHのログインを使用という話。クライアントはWindows,Mac,Linuxを想定している。いままで、公開鍵暗号でのSSH接続ができていたことが前提。OpenSCのインストール。場合はhomebrewでインストールするのがよさ気。openscこれだけでいける。インストール先は/usr/local/opt/openscになる。環境によっては、/usr/local/Cellar/openscになることもある。インストールされたディレクトリは以下のコマンドでも確認できる。openscOSXはメジャーバージョンアップの際に/usr/localにものがあるとしくじる前科があるので若干心配だ。Linuxの場合は、それぞれのパッケージ管理ソフトに従う。次に参考したページにはssh-keygenで公開鍵を取り出して、リモートホストのauthorized_keysに追加せよとあるが、今まで同じ鍵でサーバ運用していた場合は関係なし。必要なのはpkcs11のライブラリの場所を調べてそいつがスマートカードを読み取れるかどうか。Debianしかないのだが、VMのゲストOSがスマートカードを認識できないので確認できない。slotsというエラーが出る)あとはsshコマンドを叩くときにIオプションでpkcs11ライブラリの場所を指定するだけ。remotehostこうするとYubikeyの中の秘密鍵を使ってセッションを確立します。これを毎回打つのは面倒なので、~/.ssh/configに記述しておきます。私の場合はこんな感じ。/usr/local/opt/opensc/lib/opensc-pkcs11.so4行目に書いてあるPKCS11Providerが追加されたところ。WindowsWindowsのSSHクライアントといえば、TeratermかPuttyが思い浮かぶ。そんな人に手っ取り早いのが、Puttyの中に入っているPageantを使う方法。認証エージェントですが、スマートカード対応版があります。Puttyシリーズをスマートカード対応にしているPutty-CACというプロジェクトがあってバイナリを公開しています。SSHサーバに接続するだけなら、Putty本体とTeratermでも使えるPageantをダウンロードするだけで大丈夫です。certで証明書を選び、PIN入力が出てくれば接続可能です。同じようにpageantにも証明書を指定しておき、Teratermで接続する際にSSH認証で、pageantを使う、でPIN入力が出てくれば接続可能です。pageantはOS起動時に起動させれば良いと思います。その他それにしてもECDSAの鍵を使えないのが痛い。SSHの秘密鍵を格納するコメントを残すYubico社のYubikey4は単なるワンタイムパスワード生成器じゃなくて証明書を格納可能になった。SSHの秘密鍵をYubkikeyに入れて、sshでログインするときだけYubikeyをPCに挿せば、秘密鍵をあちこちのPCに保存しておく必要がなくなり安心である。Yubikey4は日本のAmazonでも販売されている(AA)Yubikey自体に鍵生成機能があるので、そこで秘密鍵と公会議のペアを作っても良いのだが、あちこちのサーバの公開鍵を置き換えるのが面倒なのと、Yubikey内で生成した秘密鍵はセキュリティ上取り出すことができないので、既存の鍵を使いたい。鍵は取り出せないのが安全なのだが、万が一Yubikeyごと秘密鍵をなくしてしまったら二度とその鍵でログインできなくなるのが怖いのだ。ちなみに、既存の秘密鍵をYubkikeyに入れたものも取り出せないので、一通り設定が終わったら、あちこちのPCにある秘密鍵を消し去って、信頼できるところにだけ秘密鍵のコピーを持っておくつもり。なんなら秘密鍵を紙に印刷しておくのが一番安全かもしれない。以上の理由で、既存の秘密鍵をYubikeyに入れるのだが、やり方が簡単ではなかったのでメモっておく。鍵の変換まずは既存の鍵の変換から。sshの鍵生成は普通ssh-keygenで行うと思うのだが、これで作られる秘密鍵と公開鍵はopensshの独自仕様のようなので、まずはPEM形式に変換する。PEMとかDERとかいうのは鍵のエンコーディング形式でPEMは鍵をBASE64でエンコーディングしてあり、DERはバイナリのようだ。opensshはBASE64なのだが、PEMとヘッダーとかが違うそうだ。pemこれでPEM形式に変換。次にyubico社からダウンロードしたyubico-piv-toolを使う。サンプルのとおりにコマンドを打ってもエラーが出る(Windows)ので多少工夫が必要。yukbikeyをUSBに差し込んで、まずはPINコード、PUKコード(管理者用)、マネジメントキーを変更する。マネジメントキーを登録する。(16進数48文字)すでにマネジメントキーが登録されている場合は、-kオプションのあとに既存のキーを書く。不思議なのは、-kオプションの後にスペースをおいてキーを指定してもうまく動かない。オプションの後のスペースはあってもなくてもいいのだが、kオプションだけはなぜかスペースがあるとうまく動かない。change-pinデフォルトのPINは123456で、同じくデフォルトのPUKは12345678。change-puk同じく変更する。この辺のキーの変更はGUIツールのほうが使いやすい。(ただしGUIツールはなぜかPUKコードが変更できない。なんだか中途半端......)あと、好みではあるが、リトライ回数を設定する。key)秘密鍵の格納PEM形式に変換した秘密鍵をyubikeyに格納する。Authenticationらしい。今回は9aに格納する。次に公開鍵を自己署名する。自分で作った秘密鍵の正当性をどのように担保するかについて、第三者にお墨付きをつけてもらう方法もあるが、今回の目的は他人に自分の秘密鍵の正当性を主張したいわけではないので、自分の秘密鍵の正当性は自分で担保する。これをwebでやるといわゆるオレオレ証明書になるやつだ。今回、yubkikeyはOSから見るとスマートカードとして見えるので、SSHの秘密鍵の対になる公開鍵を自己署名して、自己署名証明書を作り鍵ペアをyubikey内部においておく。公開鍵の自己署名証明書から。この操作は指定されたスロットに秘密鍵が入っていることが前提。秘密鍵を入れずにやってもエラーになる。--valid-days=(日数)この操作にはPINコードが必要になる。Sオプションはx.509証明書の記述だ。Name)さえ入っておけば大丈夫だと思う。OSの証明書選択画面などで使われる名前だ。–valid-daysは証明書の有効期限で、指定しないとでおフォルトで365日となる。試しに1日で作ったのだが、2日経っても期限切れの証明書が使えた。本当に意味あるのか不安。次に、この証明書をyubikeyに格納する。statusで証明書の状態を確認できる。普通は必要ないと思うが、実験などでハードウェアリセットをかけてしまうとCHUIDがなくなってしまう。ランダムでCHUIDを発行する必要がある。同じ手順で、ECDSA384bit鍵の登録を試みた。同じ鍵を複数鍵を登録することは不可能なので、スロット82に格納してみたいが、Windowsからだと証明書の一覧にECDSAの鍵が出てこない。スロット82だとダメなのかと思って、9aに入れてみたが、やっぱり出てこない。Photoshopで「仮想タイルはこれ以上割り当てられません。Photoshopで「仮想タイルはこれ以上割り当てられません。