LTSでは、OpenSSHサーバーのバージョンが8.2にアップデートされました。このバージョンではU2F/FIDOハードウェアデバイスのサポートが追加されており、ハードウェアベースの2要素認証が簡単に行えます。Yubico[1]を使い、SSHログインに2要素認証を導入する方法を紹介します。[1]YubiKeyには様々なモデルが存在しますが、SSHログインのみを行う場合はU2F/FIDOにのみ対応していれば問題ありません。YubiKeyの上位モデルではワンタイムパスワードやOpenPGPなどにも対応していますが、これらの機能は利用しません。Onlineの略で、「⁠使いやすさ」「⁠プライバシーとセキュリティ」「⁠標準化」の3つを核とした、パスワードにかわる新しい認証規格です。FIDOはGoogleやAmazonといった企業も参加している「FIDOアライアンス」によって標準化されています。Factorの略で、FIDOによって公開されているプロトコルのひとつです。簡単に言えば、従来のID/パスワードに追加する2要素認証の、2要素目を標準化しようというものです。Password(TOTP)を使うケースが多いでしょう。TOTPは、ログインの都度スマホアプリを見てワンタイムパスワードを入力する必要があるなど、運用が面倒くさい点は否定できません。U2Fでは、物理的なセキュリティキーを使って2要素認証を行います。これにより、セキュリティレベルを犠牲にすることなく、認証を簡略化できるのです。[2]FIDO2において、U2FはCTAP1と呼ばれています。GitHubに2要素認証の要素としてセキュリティキーを登録した例。サインイン画面でパスワードを入力した後、セキュリティキーを使用するボタンが表示される。セキュリティキーを使うと、ワンタイムパスワードのかわりに物理キーへのタップ操作を要求される。Yubicoを使ってSSHサーバーへのログインを行ってみましょう。LTSを使い、自分自身にSSHログインすることで動作を検証しています。GitHubなどのWebサービスでは、アカウントにセキュリティキーを登録することで、そのキーでの2要素認証を可能にしています。対してセキュリティキーを用いたSSHログインでは、そのキーに対応した鍵ペアを作成する必要があります。8.2では、ssh-keygenコマンドの-tオプションで指定できる鍵タイプに「ecdsa-sk」と「ed25519-sk」という、ふたつの「-sk」というサフィックスを持つタイプが追加されています。このどちらかを指定して、新しい鍵を作成してください。ここではed25519-skを使用しました。ssh-keygenコマンドを実行すると、まずキーへのタッチを要求されます[3]⁠。その後は鍵を保存するファイル名の指定とパスフレーズの設定という、お馴染みの手順になります。[3]タッチせずにいると、タイムアウトしてコマンドは終了します。鍵のファイル名を指定する。タッチを要求されている時は、鍵マークが点滅するなおセキュリティキーがシステムに接続されていない状態で鍵タイプにed25519-skやecdsa-skを指定した場合、ssh-keygenコマンドは即座に終了します。found作成された公開鍵(この例では.ssh/id_ed25519_sk.pub)を、サーバーのauthorized_keysに登録してください。今回はローカルマシン上で検証を行うので、catコマンドで出力してしまえばよいでしょう。~/.ssh/authorized_keysセキュリティキーを使ってSSHログインしてみる作成した鍵を使用して、サーバーにログインしてみましょう。sshコマンドに-iオプションで、秘密鍵ファイルを指定して実行してください。今回作成したように、鍵ファイルにデフォルトの名前(~/.ssh/id_ed25519_sk)をつけている場合は、-iオプションは省略可能です。秘密鍵ファイルのパスフレーズを入力すると、続いてキーへのタッチが要求されます。タッチをすると、サーバーへログインできます。従来の公開鍵認証では、サーバーに登録した公開鍵と、手元のクライアントにある秘密鍵を使って認証を行っていました。セキュリティキーに対応した鍵で認証を行う場合、クライアント上に作成されている秘密鍵ファイルは、実際にはキーハンドルと呼ばれるものにあたります。このキーハンドルと、セキュリティキー内に保存されているデバイスシークレットを組み合わせることで、実際に使用する秘密鍵を認証時に生成しています。そのためセキュリティキーを使ったSSH認証は、サーバーから見れば従来の公開鍵認証と同じです。公開鍵でログインできるサーバーであれば、sshd_configなどの設定を変更することなく[4]⁠、U2Fを導入することが可能です。[4]sshd_configのPubkeyAcceptedKeyTypesを変更することで、セキュリティキーを使用しない(従来の)鍵を拒否し、セキュリティレベルを高めるようなことも可能です。yubicoのタッチ操作は、あくまでキーを使用する合図でしかなく、指紋認証などでキーをロックしているわけではありません。タッチ操作を省いたからといってセキュリティレベルが下がるわけではありませんから、面倒ならタッチ操作は省いてしまいたいと思うのは人情というものでしょう。タッチ操作を省略するには、鍵とサーバーの両方でオプションを指定する必要があります。no-touch-required」オプションを指定しておく必要があります。no-touch-required作成した公開鍵をauthorized_keysに追加する際、ここにも「no-touch-required」というプレフィックスを付加してください。AAAAGnNrLXNzaC1lZDI1NTE5QG...(略)以降、この鍵を使用する際はキーがUSBに挿入されていればよく、タッチ操作なしでのログインが可能になります。LTSでは、サーバーに変更を加えたり、クライアントに特別なアプリをインストールすることなく、SSHでセキュリティキーを利用することができます。SSHの認証を強化する施策のひとつとして、導入してみてはいかがでしょうか。SSH以外でのU2Fの活用例は、第570回でも紹介しています。あわせて参考にしてください。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します⁠。個別にライセンスが設定されている記事等はそのライセンスに従います。