市井の人々に散々遊ばれたyubikeyであるが、自分はまだそこまで遊んでいなかったのでこれから遊ぶぞ!

今回はsshを様々な方法で行う。

大きく分けて以下の方法がある

YubiCloudを使う

概要

セットアップ

  1. 接続方法に応じて/etc/pam.d/sshd先頭 に行を足す(解説)
    • HTTPS
      auth      required pam_yubico.so id=1
      
    • HTTP+HMAC
      auth      required pam_yubico.so id=nnnnn key=...+U7789ak=
      

接続時

  1. サーバーをインターネットに接続する
  2. クライアント側にyubikeyを刺す
  3. passwordを聞かれたタイミングでそのユーザーのpasswordを入力する
  4. ENTERを押さずに Yubikeyに触る(yubikeyのOTPが末尾で改行を入力する)

Challenge-Response(HMAC-SHA1)を使う

概要

セットアップ

  1. 最初のチャレンジを取得する(slot2に書き込む)
    $ ykpamcfg -2
    
  2. /etc/pam.d/sshd に以下の行を足す
    auth      required  pam_yubico.so mode=challenge-response
    

接続時

  1. サーバーにyubikeyを刺す
  2. 普通にpasswordを入れてENTER
  3. 自動的ににyubico.pamを使って検証が行われる

FIDO2/U2Fプロトコルを使う

概要

セットアップ

Linux

通常版
  1. クライアントにyubikeyを刺す
  2. ssh-keygen -t ed25519-skやって一回タッチ
    • PIN入れる必要あり
  3. 公開鍵をサーバーに登録する
no-touch-requiredフラグ
  1. ssh-keygen -t ed25519-sk -O no-touch-required
    • PIN入れる必要あり
  2. 公開鍵に登録する際にno-touch-required sk-ssh-ed25519@openssh.com AAAA...のようにno-touch-requiredを先頭に付与する

Windows

通常版
  1. git for windowsを用意する
  2. tavrez/openssh-sk-winhelloからwinhello.dllを入手しgit for windowsの/usr/lib等に配置する
  3. git bashを起動し、環境変数を設定する(export SSH_SK_PROVIDER=/usr/lib/winhello.dll)
  4. ~/.ssh/configに以下の内容をマージする
    Host *
        SecurityKeyProvider winhello.dll
    
  5. ssh-keygen -t ed25519-skやって一回タッチ
    • PIN入れる必要あり
no-touch-requiredフラグ

作れるが実際にはタッチする必要がある。詳細についてはopenssh-sk-winhelloのREADME.mdを参照。

接続時

sshコマンド叩いてyubikeyに触れる(no-touch-requiredフラグがあり、Linuxの場合はタッチ不要)

PIVを使う

概要

セットアップ

  1. ykmanを用意する
  2. 鍵を生成する(ykman piv keys generate --algorithm ECCP384 9a 9a.pem)
  3. 証明書を生成する(ykman piv certificates generate --subject "CN=Your Name" 9a 9a.pem)
  4. ssh-keygen -i -m PKCS8 -f 9a.pemで公開鍵を入手して(標準出力に出てくる)サーバーに登録する
  5. ~/.ssh/configの該当ホストに以下のオプションを足す
    Host somehost
      PKCS11Provider /usr/lib/opensc-pkcs11.so
    

接続時

普通にsshする。9aの場合はUSBを刺して最初のアクセスの際PINを入れる必要がある(以後不要)。

GnuPG経由する

やってないので省略

参考

メリデメ

方法メリットデメリット
YubiCloudを使うセットアップが秒で終わる, クライアントに変なことしなくても良い要インターネット接続, YubiCloud依存ってどうなの
Challenge-Response(HMAC-SHA1)を使うクライアントに変なことしなくても良いサーバーに鍵刺すってそれどうなの
FIDO2/U2Fプロトコルを使う一番シンプルgithubは一部非対応だったりgitlabは完全非対応だったり普及途上
PIVを使うPKI基盤がある場合証明書を使い回せるPIVの仕様を知る必要がある, smartcardへのアクセスが遅い
GnuPGを使う(未調査)(未調査)

所感

yubikey依存は嫌だしPIVやGnuPGはツールチェインの習得が難しいのでFIDO2/U2Fプロトコル方式が普及してほしいなぁと思いました。

もうすぐオープン実装のsolokeyが届くので楽しみ(Yubikeyはclosed実装)。

備考

ssh-keygen-O residentというフラグを設定することでそのsmartcardを使用しssh鍵のペアを再生成できる(ssh-add -K)。これを組み合わせた方法が非常に体験が良い。

ssh-add -K
ssh-add -l
ssh -T git@github.com

セキュリティのことを考えるとloginにeval "$(ssh-agent -s)"を行いlogoutにssh-agent -kを行いたい。

またssh-configにAddKeysToAgent yesオプションを入れると更に良い。