二段階認証と通常のパスワード認証をユーザによって分ける方法

Google Authenticatorによる二段階認証を導入すると、ユーザごとにgoogle-authenticatorコマンドを実行してシークレットキーを作らないと、ログインできなくなる。
二段階認証を導入したので、設定をしていないユーザのログインができないのは当たり前だが、一部のユーザだけ通常のパスワードによるログインを許可したい場合は、二段階認証の設定に追加設定が必要となる。

Google Authenticatorの導入

Google Authenticatorのインストールと設定

作業ミス等により接続不能になることを想定して、作業用のターミナルとは別にssh接続をしておく。
まずはinstallを行う。

installが終わったらPAMでGoogle Authenticatorを使う設定を行う。設定ファイルの名前をgoogle-authとし、/etc/pam.dにおく。

SSH時の認証でgoogle-authを読み込むように、/etc/pam.d/sshdを設定する。Google Authenticatorによる認証を行い、その次にパスワードによる認証を行い、合わせて二段階認証とするために、パスワード認証設定(auth include password-auth)の直前にGoogle Authenticatorの認証設定(auth substack google-auth)を書く。

sshd_configでChallengeResponse認証を使うように設定する。

ユーザの設定

二段階認証を使うgauthuserとパスワード認証を使うpauthuserがいるとする。
gauthuserについては、google-authenticatorコマンドでシークレットキーを作成する。

gauthuserでログインするには、ChallengeResponse認証を指定してログイン試行する。するとOne-time Passwordを聞かれる。その後元々のユーザのパスワードが聞かれる。
pauthuserで通常のパスワードログインしようとすると、パスワードを入力してもエラーとなる。/var/log/secureには以下のようなログが記載される。

特定のユーザで二段階認証を回避する設定

設定方法

pauthuserが二段階認証ではなく通常のパスワードでログインできるようにするために、/etc/pam.d/google-authの設定に一部追加する。
以下の設定部分で/home/$username/.google_authenticatorを読もうとして、ファイル読み込みに失敗するため、この設定に行く前に/etc/pam.d/google-authの処理を抜けたい。

PAMでは以下の通り処理の継続を制御できる。(参考

  • requisite:処理を継続するには、requiredモジュールが“success(成功)”を返さなければならない。このモジュールが失敗すると、PAMライブラリは“failure(失敗)”を返し、スタック内のほかのモジュールはそれ以上実行されない。
  • required:これも必須のモジュールであるが、失敗した場合、PAMのAPIは“failure”を返すものの、同じスタック内のモジュールの実行は継続される。
  • sufficient:このモジュールが成功すると、PAMライブラリは、その他のモジュールを実行することなく直ちに“success”を返す。
  • optional:このモジュールの成否に関わらず、スタック内のモジュールの実行は継続される。すべてのモジュールの実行が完了した時点でPAMライブラリの成否が確定していない場合、成功したoptionalモジュールが1つでもあれば承認が与えられる

そのため、ログインしようとしているユーザがpauthuserであればgoogle-auth内の処理はそれ以上行わない(つまりsufficient)という記述を、pam_google_authenticator.soの前にしてあげればよい。

pam_succeed_if.soはユーザIDやグループIDなどの条件を指定できる(参考)ため、このモジュールを使って、ユーザ名がpauthuserであるかどうかをチェックする。
pauthuser01, pauthuser02のようにパスワード認証を使うユーザが複数いて、pauthuserから始まるユーザを一括して設定したいとする。

これをpam_google_authenticator.soの直前の行に書くので、汎用的にするなら以下のように/etc/pam.d/google-authを書きたい。

/etc/pam.d/google-authを書き換えた後に、gauthuserとpauthuserでログインすると、それぞれ二段階認証と普通のパスワード認証でログインできる。

ログで見るPAMの挙動

gauthuserでログインした場合、/var/log/secureには以下のログが記載される。

gauthuserはpauthuser*の表記に合致しないためpam_succeed_ifは失敗し、次のpam_google_authenticatorに処理が移る。secret keyは設定済みなのでこの処理は成功し、/etc/pam.d/google-authの次の処理、つまりパスワード認証処理に移る。

pauthuserでログインした場合、/var/log/secureには以下のログが記載される。

pauthuserはpauthuser*の表記に合致するためpam_succeed_ifは成功する。sufficientが指定されているので、成功するとその他のモジュールを実行することなく/etc/pam.d/google-auth自体が成功し、次の処理に移る。
つまり、One-time Passwordを聞かれることなく、次のパスワード認証に処理が移行する。

-Linux
-