web-dev-qa-db-ja.com

3段階認証?

私はUbuntuを使用しています。

Libpam-google-authenticator(携帯電話で生成されたコードを使用してログインできる)と証明書認証を連携させることができるかどうか、そして可能であれば、どうすればよいか疑問に思っています。それを設定します。したがって、私のアカウントにログインするには、私のパスワード、私の電話(およびそのパスコード)、および私の証明書/秘密鍵とそのパスワードが必要になります。

私は両方を独立して動作させることができましたが、一緒に動作させることはできませんでした。どういうわけかそれは可能だと確信しています。

ありがとう。

9
Jesse W

PAMモジュールをチェーン化することでこれを行うことができます。しかし、詳細に入る前に:

PAMを正しく構成しないと、システムにログインできなくなる可能性があります

ありがたいことに、いつでもシングルユーザーモードで起動して問題を修正できますが、PAMは必要以上に混乱させたいものではないことに注意してください。

とにかく、この背後にある考え方は、スタッキングPAMモジュールを利用して、pam-google-authenticatorpam_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-authenticatorpam_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。この構文は少しファンキーですが、上記のモジュールが成功した後、基本的に認証モジュールをスキップします。

もちろん、この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 にあります。

8
Xenopathic

私はこの投稿を読んで、それはクールに聞こえると思いました-これが私が3要素認証を機能させる方法です。私はそれについてブログ記事を書きました ここ

基本的に、私はPAMでGoogle認証システムとパスワードを設定し、その後OpenSSHで公開鍵認証を設定し(これは他の2つをバイパスします)、最後にOpenSSHでもPAMを介して認証する必要があります(最後の行)

/ etc/ssh/sshd_confから

PubkeyAuthentication yes
ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
2
Einar

/etc/pam.d/sshdの先頭に追加する必要があるのはPubkey + GoogleAuthのみです

#auth    requisite    pam_unix.so nullok_secure #if you want password, too :)
auth    requisite    pam_google_authenticator.so
auth    [success=2]  pam_permit.so

OpenSSH> = 6.2で、sshd_configが編集されていると思います

より妄想的なセキュリティのために、いくつかの追加の構成を追加します:D

1
x4k3p