🇯🇵

2要素認証で安心ログイン

2021/01/31に公開

2要素認証の導入

TOTPとパスワードの2要素認証を導入します。
libpam-google-authenticatorモジュールを使用します。
対象は、リモートログイン全般とデスクトップ画面のログイン画面です。
2要素認証(OTP + password)を必須にします。

Authyが、LinuxとAndroid両方で動作し設定を共有できて、扱いやすかったです。

ここではパスワードとワンタイムパスワードの2要素認証について、書いています。
sshで公開鍵認証(パスワードなし)とワンタイムパスワードの組み合わせによる、2要素認証を行う場合は他を参考にしてください。


以下の手順は、sshでのログインを 2要素認証必須 にします。
端末のパスワードと(タイムベースの)ワンタイムパスワード、2つを共に入力して認証ができない場合は、sshでのログインは不可能になります。
リモートでの作業が不可能になることもありえます。
慎重に、実行してください。思い込み、きめつけは、やめましょう。


認証用アプリの用意

OTP用のアプリを用意します。
Google認証システム、Authy、Duo mobileなどがあります。
LinuxのDesktop版としては、Authyがsnapでbetaリリースされています。スマホのAuthyと設定を共有するので楽でした。

snap install --edge authy

arch系LinuxでのCUIクライアントは、oath-toolkit(oathtool)も利用できます。

sudo pacman -S oath-toolkit
oathtool -b --totp  'secret key'

認証モジュールにgoogle authenticatorを利用する

sudo pacman -S libpam-google-authenticator qrencode

qrencodeは、コンソール画面にQRコードを出力してくれるパッケージです。
秘密鍵を生成する際に、コンソール画面にQRコードが出力されます。

アプリから、カメラで読み込んで登録できるので便利です。


system-remote-loginを2要素認証にする

認証手続き(PAM)でgoogle authenticatorを利用するように変更します。
もしリモート先の設定を変更する場合には、十分、注意してください。

/etc/pam.d/system-remote-login の先頭に一行追加します。
先頭に追加することで、TOTPによる認証が先に行われます。

auth        required    pam_google_authenticator.so    nullok echo_verification_code no_increment_hotp       #2FA
auth        include     system-login
-auth       optional    pam_gnome_keyring.so
account     include     system-login
password    include     system-login
session     include     system-login
-session    optional    pam_gnome_keyring.so auto_start

sshサーバーの設定も変更しておきます。
/etc/ssh/sshd_config チャレンジレスポンス認証を有効(yes)にします。

ChallengeResponseAuthentication yes

lightdmを2要素認証にする

/etc/pam.d/lightdm の先頭に一行追加します。

auth        required    pam_google_authenticator.so    nullok echo_verification_code no_increment_hotp       #2FA
auth        include     system-login
-auth       optional    pam_gnome_keyring.so
account     include     system-login
password    include     system-login
session     include     system-login
-session    optional    pam_gnome_keyring.so auto_start

秘密鍵の生成

google-authenticator

最初の質問に回答すると秘密鍵が更新されます。
このコマンドを実行したら、最後まで一通りやりましょう。


認証クライアントに秘密鍵を登録

QRコードをスキャンするか、入力して登録してください。
表示された数字を入力することで、タイムベースのOTP認証が問題なく行われているか確認します。
いくつかの質問に答えて、秘密鍵の設定は終了です。

うまくいかない場合には、見直してやり直します。
ArchWikiでは、時間に余裕をもたせるかどうかの質問にnとなっていますが、yにするのもいいでしょう。


接続テスト

sshでの接続テストを行います。
他の管理者アカウントでも2要素認証でログインできるように、アカウントを設定しておいた方が良いかもしれません。
万一に備えた、復旧手順を明確にすることは、とても大事です。

確認してから、sshサーバー再起動

sudo systemctl restart sshd

設定が正常なら、ログイン先が、リブートしたとしてもログインできるでしょう。


デスクトップのログインテスト。

ログアウトして、セッションを終了します。
最初に、TOTPを尋ねられます。その次にパスワードです。
両方、認証されたら、ログインできます。

参考情報

Google Authenticator - ArchWiki

Use oathtool Linux command line for 2 step verification (2FA) - nixCraft

Discussion