PAMモジュールを一緒にチェーンすることでこれを行うことができます。しかし、詳細に入る前に:
PAMを誤って設定すると、システムにログインできなくなる可能性があります。
ありがたいことに、シングルユーザーモードでいつでも起動して問題を修正できますが、PAMは必要以上に混乱させたいものではないことを警告してください。
とにかく、これの背後にある考え方は、スタッキングPAMモジュールを利用してpam-google-authenticator
、pam_unix
(これがパスワードをチェックする)と証明書モジュールがすべてアクセスを許可する必要があることを確認することです。デフォルトでは、PAMは認証モジュールがユーザーを認証できるように構成されており、他のモジュールはスキップされます。
/etc/pam.d/common-authでは、上部に次のような行が表示されます。
auth [success=2 default=ignore] pam_unix.so nullok_secure try_first_pass
これはpam_unix.so
、成功する必要があることをPAMに伝えます。次の2つのルール(通常は別の認証モジュールで、次にpam_deny.so
)をスキップして、オプションのモジュールに進みます。ただし、モジュールに障害が発生した場合、そのモジュールは無視され、制御はチェーン内の次のモジュールに渡されます。これは、コントロールがオプションのブロックにスキップするか、PAMがpam_deny.soにヒットしてそこで失敗するまで、各認証モジュールを続けます。
これを活用してpam-google-authenticator
、pam_unix.so
および証明書PAMモジュールがすべてアクセスに成功する必要があります。使用しているGoogle認証モジュールまたは証明書モジュールの名前はわかりませんが、common-authファイルで見つけることができるはずです。したがって、このようなものを上に置くことによって:
auth requisite pam_unix.so nullok_secure
auth requisite pam_google_authenticator.so
auth requisite pam_certificate_auth.so
auth [success=<n>] pam_permit.so
<n>
ここのpam_permit.soモジュールと次のモジュールの間のモジュール数に置き換えるpam_permit.so
-つまり、これは最上位の認証モジュールの[success = n default = ignore]コード+ 1に設定する必要があります。この構文は少しファンキーです、ただし、上記のモジュールが成功した後は、authモジュールをスキップします。
もちろん、この3段階認証を自分のユーザーアカウントだけに制限する方法について疑問に思うかもしれません。これはpam_succeed_if.so
モジュールで行うことができ、上記の3ステップの認証ブロックの上に挿入する必要があります。
auth [success=ignore default=4] pam_succeed_if.so user = <username>
どこに<username>
あなたのユーザ名に置き換えられます。この行は単にpam_succeed_if.soが成功する(別名ユーザー名がその行のユーザー名と一致する)ことを示し、PAMは次のモジュール(3ステップの認証モジュール)に進みます。そうでない場合、PAMは実際のモジュール(このモジュールから4モジュール離れている)にジャンプする必要があります。
グループのメンバーシップや特定のユーザー名など、複数のものを一致させるには、複数の行を使用する必要があります。次に例を示します。
auth [success=1 default=ignore] pam_succeed_if.so user = <username>
auth [success=ignore default=4] pam_succeed_if.so user ingroup <group>
これを実行する前に、common-authファイルをバックアップし、シングルユーザーモードと、緊急時に古いファイルを復元する方法についても理解します。この構成は私によってテストされていませんが、動作するはずです。
これを初めてテストする場合は、1つまたは2つのルートシェルを開いて、そのままにしておきます。common-authをバックアップで簡単に置き換えることができるため、問題が発生した場合のフォールバックとして機能します。次に、これらの変更を行います。次に、を使用su
してユーザーアカウントにログインします。3段階の認証プロセスを実行する必要があります。
pam_succeed_if.so
モジュールの完全なドキュメントはhttp://linux.die.net/man/8/pam_succeed_ifにあります。