家のサーバにTOTPでログインできるようにすると、当然次はYubico OTPを利用して、YubiKeyをポチっと触るだけでログインできるようにしたくなります。git push
するたびに6桁の数字を確認するのはちょっとたいへん。TOTPの前にYubico OTPを試すように設定してみました。
Ubuntu 18.04 LTSのserver版での作業記録です。作業前には、sshdでは公開鍵認証に加えて外からの接続ではTOTPを要求していました。外からは家庭用ルータのポート転送で接続されます。
YubiKeyの用意
YubiKeyはYubico社のハードウェア認証デバイスで、種々の認証プロトコルに対応しています。今回はYubico OTPを利用します。この記事では、2020年7月に購入したYubiKey 5 NFCを利用しています。この多くのモデルでYubico OTPを利用できますが、Yubico OTPを利用できないモデルもあるので購入の際には確認してください。
ログイン先に~/.yubico/authorized_yubikeys
ファイルを下記のような内容で作成します。YubiKeyをUSBポートに挿入してタップするとデフォルトではcccc
で始まるYubico OTPが入力されます。その最初の12文字でYubiKeyを識別するようです。複数のYubiKeyを利用する場合には同じ行に:
(コロン)で区切って12文字を追記します。
<ログイン先ユーザーID>:<YubiKeyをタップした時に入力される文字列の最初の12文字>
sshdの設定
Yubico API Keyの取得
メールアドレスとYubiKeyをYubicoに登録してクライアントIDとシークレットキーをもらいます。今回使うのはクライアントIDのみです。
https://developers.yubico.com/yubico-pam/ で必要事項を記入して、利用規約に同意します。
Yubico PAMのインストール
Yubico CloudにYubiKeyを検証してもらうため、Yubico PAM moduleに従ってPAMをインストールします。
sudo add-apt-repository ppa:yubico/stable
sudo apt update
sudo apt install libpam-yubico
手元では、libpam-yubico
に加えてlibykclient3
、libykpers-1-1
、libyubikey0
がインストールされました。
PAMの設定
/etc/pam.d/sshd
を編集し、sshdが
- まず、Yubico OTPでの認証を試し
- 次に、TOTPでの認証を試す
よう、common-auth
の行をコメントアウトして無効にして、直下の行を下記のように編集します。編集後のsshdの再起動は不要です。
#@include common-auth
auth sufficient pam_yubico.so id=<上記で取得したクライアントID>
auth sufficient pam_google_authenticator.so
/etc/ssh/sshd_config
の内容はTOTPのみを有効にしていた時と同様、sshdが公開鍵に加えてPAM経由での認証を要求するよう、そして、ローカルなネットワーク(ここでは192.168.0.0/16
)あるいはcronで利用するアカウント(ここではautomation
とbackup
)への接続では公開鍵での認証で充分なようにしておきます。このファイルを編集した場合にはsshdの再起動が必要です。
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
Match Address 192.168.0.0/16,::1
AuthenticationMethods publickey
Match User automation,backup
AuthenticationMethods publickey
Match all
ログインを試す
この状態でsshするとSSH鍵対での認証が成功してから、Yubikeyのタップを促されます:
Authenticated with partial success.
YubiKey for `<ログイン先ユーザーID>':
手元にYubiKeyが無い場合にはEnterを押すとTOTPを入力できるようになります:
Verification vode: