inthisfucking.world

💩🌎

YubiKeyを使ってsudoする

sudoをする度にパスワードを入力するのはとても面倒です。だからといって、ユーザのパスワードを無しにしたり、sudoをするのにパスワードが必要ないようにはしたくありません。

Yubicoというスウェーデンで始まった会社が作っている、YubiKeyというハードウェアがあります。2faを実現する手段として用いられることが多いハードウェアですが、ここではこのYubiKeyを使ってパスワードを入力することなくsudoする方法を紹介します。

YubiKeyとは

YubiKeyは、一般的にセキュリティーキーと呼ばれるハードウェアです。色々な種類があり、Yubicoのサイトでそれらを見ることができます。USB-AかUSB-Cのインタフェースを持っているものが多く、それをコンピュータに直接接続して使用します。YubiKeyそのものはUSBのキーボードとして認識され、YubiKeyに触れるとキーボードで値が入力されたように動作します。これによって、YubiKeyからOTPの値などを取得します。

pam-u2fを設定する

Yubicoが既に“Ubuntu Linux Login Guide - U2F”という記事を用意しており、YubiKeyを使ってsudoする方法が記載されています。基本的にはその記事の通り設定を行えば殆ど完了なのですが、その記事ではパスワードを入力した後にYubiKeyに触れてsudoする方法、つまりYubiKeyを2faの手段として使用する方法しか記載されていません。

YubiKeyが2faの手段として求められるのは、/etc/pam.d/sudoにおける以下の設定が理由です。

...
@include common-auth
auth       required   pam_u2f.so authfile=/path/to/u2f_keys
...

私はLinux PAMに詳しい訳ではありませんが、/etc/pam.d/common-authで通常のユーザの認証が行われるようです。それをincludeした後にpam_u2f.soを用いた認証をrequireとしているので、通常のユーザの認証 (パスワードによるもの) が終わった後に、pam_u2f.soを用いた認証 (YubiKeyを使用するもの) が行われることになります。

Linux PAMには、requireの他にsufficientも選択肢として存在しています。”require”は”必須”、”sufficient”は”十分”という意味です。つまり、pam_u2f.soによる認証を/etc/pam.d/common-authの前に持ってきて、pam_u2f.soによる認証を”sufficient”にすれば、YubiKeyのみでユーザの認証が可能になります。

...
auth       sufficient   pam_u2f.so authfile=/path/to/u2f_keys
@include common-auth
...

pam_u2f.soによる認証を”require”にし、common-authをincludeしている部分をコメントアウトするのも選択肢としてあり得ますが、ここではあえてそれはしていません。YubiKeyを持っていない場合でも、通常のユーザの認証でsudoできるようにするためです。pam_u2f.soによる認証を”require”にしてしまうと、YubiKeyを持っていない場合にはsudoができなくなってしまいます。

sudoに対して、YubiKeyを1faの手段として使用して安全なのか?

pam_u2f.soは、YubiKeyがコンピュータに接続されているかどうかだけで判断して認証している訳ではありません。上記の例でauthfile=/path/to/u2f_keysというパラメータを指定していますが、そのファイルはpamu2fcfgを使ったユーザとデバイスのマッピングを行う過程でできる設定ファイルです。そのファイルには、ユーザ名とkey handle、public keyが含まれています。実際にYubiKeyに触れた際には、そのファイルに含まれている情報をYubiKeyで管理されているデータと照合しています。

つまり、そのユーザとしてLinuxにログインでき、YubiKeyに物理的にアクセスできるのが自分だけであるのであれば、安全であると言えるでしょう。

ちなみに、私はsudoとpolkit (GNOMEのGUIのアプリケーションがroot権限を必要とする時に使用する認証の方法) だけYubiKeyによる1faで実行できるようにし、gui/cuiにおけるログインは通常通りユーザ名とパスワードを入力するようにしています。私はGNOMEを使用していますが、ログインの際にkeyringに対する認証も行うようで、それらにYubiKeyを使用するとkeyringのパスワードを何度も要求され、それが面倒からです。

結論

ここでは、YubiKeyを2faの手段としてではなく、sudoで楽をするために使用する方法を解説しました。pam_u2fモジュールに関してはGithHubでコードが公開されているので、セキュリティに興味がある方は見てみるのも良いかと思います (決してお世辞にも綺麗なコードだとは思いませんが)。