SSH、OpenVPNなどを介してサーバーにログインするための2要素認証を示すPAMモジュールの例…
このプロジェクトは、Google Authenticatorアプリを使用することをお勧めしても、Google、Facebook、またはその他のTOTP/HOTPセカンドファクターシステムにログインすることではありません。
HMACベースのワンタイムパスワード(HOTP)はRFC 4226で指定され、タイムベースのワンタイムパスワード(TOTP)はRFC 6238で指定されています。
./bootstrap.sh
./configure
make
sudo make install「sudo」にアクセスできない場合は、「インストール」を呼び出す前に「ルート」になる必要があります。
最高のセキュリティのために、パスワードおよび/またはOTPが正しくない場合でも、パスワードとOTPの両方が要求されていることを確認してください。これは、少なくともpam_unix.soの最初のもの(または他のモジュールがパスワードを検証するために使用されるもの)およびpam_google_authenticator.so requiredに応じて設定するrequisiteがあることを意味します。両方をrequiredとすることはおそらく害はありませんが、PAM構成の残りの部分に依存する可能性があります。
HOTP(時間ベースではなくカウンターベース)を使用する場合は、オプションno_increment_hotpを追加して、失敗した試行のためにカウンターが増加しないようにします。
この行をPAM構成ファイルに追加します。
auth required pam_google_authenticator.so no_increment_hotp
google-authenticatorバイナリを実行して、ホームディレクトリに新しい秘密キーを作成します。これらの設定は~/.google_authenticatorに保存されます。
システムが「libqrencode」ライブラリをサポートしている場合、Androidの「Google Authenticator」アプリケーションを使用してスキャンできるQRcodeが表示されます。
システムにこのライブラリがない場合は、 google-authenticator出力するURLに従うか、Androidの「Google Authenticator」アプリケーションに英数字の秘密鍵を手動で入力する必要があります。
どちらの場合でも、キーを追加したら、コンテキストメニューが表示されるまでクリックしてホールドします。次に、キーの検証値が一致することを確認します(この機能は、Androidアプリケーションのすべてのビルドで使用できない場合があります)。
システムにログインするたびに、通常のユーザーIDを入力した後、 google-authenticatorに与えられたオプションに応じて、TOTPコード(時間ベースの1回限りのパスワード)またはHOTP(カウンターベース)のプリンプを求められます。通常のUNIXアカウントパスワード。
最初のロールアウトプロセス中に、すべてのユーザーがまだ秘密の鍵を作成しているわけではないことがわかります。それでもログインできるようにしたい場合は、モジュールのコマンドラインで「nullok」オプションを渡すことができます。
auth required pam_google_authenticator.so nullok
ユーザーがパスワードを入力するまでシステムを暗号化する場合、OTPコードを要求する前に、PAM構成ファイルのエントリを再アレンジするためにホームディレクトリを解読する必要があります。標準以外の場所:
auth required pam_google_authenticator.so secret=/var/unencrypted-home/${USER}/.google_authenticator
可能な選択かもしれません。必ず適切なアクセス許可を設定してください。また、ユーザーに.google_authenticatorファイルをこの場所に移動するように指示する必要があります。
「$ {user}」に加えて、 secret=オプションは、ユーザーのホームディレクトリの短い手として「〜」と${HOME}の両方を認識します。
secret= Optionを使用する場合、 user=オプションを設定することもできます。後者は、ファイル操作を実行する前に、PAMモジュールに専用のハードコーディングユーザーIDに切り替えるように強制します。 user=オプションを使用する場合、ファイル名に「〜」または「$ {home}」を含めてはなりません。
user=オプションは、システムに従来のUNIXアカウントを持っていないユーザーを認証する場合にも便利です。
上記の「暗号化されたホームディレクトリ」を参照してください。
デフォルトのトークンプロンプトをオーバーライドします。プロンプトにスペースを含めたい場合は、引数全体を四角い括弧内に包みます。
auth required pam_google_authenticator.so [authtok_prompt=Your secret token: ]
ファイル操作を行う前に、PAMモジュールに強制的にコーディングされたユーザーIDに切り替えます。 secret=で一般的に使用されます。
危険なオプション!
デフォルトでは、PAMモジュールでは、Secretsファイルがユーザーのログインを所有する必要があります(または、 user=が指定されている場合)。このオプションはそのチェックを無効にします。
このオプションを使用して、DaemonsがRootとして実行されず、ユーザー自身が所有しているユーザーが所有していない構成ファイルを処理できるようにすることができます。
危険なオプション!
デフォルトでは、PAMモジュールでは、Secretファイルがファイルの所有者のみが読み取ることができます(デフォルトではモード0600)。モジュールが非デフォルト構成で使用される状況では、管理者がより寛大なファイルアクセス許可、またはユースケースの特定の設定を必要とする場合があります。
Syslogでより冗長なログメッセージを有効にします。
一部のPAMクライアントは、パスワードだけでなくユーザーに促すことができません。この問題を回避するために、このPAMモジュールはスタッキングをサポートします。 forward_passオプションを渡すと、 pam_google_authenticatorモジュールは、システムパスワードと検証コードの両方を単一のプロンプトでユーザーにクエリします。次に、システムパスワードを次のPAMモジュールに転送します。これは、 use_first_passオプションで構成する必要があります。
次に、 pam_google_authenticatorモジュールは、標準のuse_first_passとtry_first_passオプションの両方をサポートしています。しかし、ほとんどのユーザーは、それらをpam_google_authenticatorに設定する必要はありません。
TOTPコードが機能しないことがわかった場合、これは一般に、サーバーのクロックがAndroidデバイスのクロックとは異なる結果です。 PAMモジュールは、時間のスキューを補償しようとします。 3回連続でログを記録しようとすることで、経験しているスキューの量について教えることができます。 3つの異なるTOTPコードを取得するように、常に30秒(長くはない)を待つようにしてください。
一部の管理者は、時間スキューが自動的に調整されないことを好みます。無効にしたい場合は、モジュールコマンドラインでそれを行うことができます。
auth required pam_google_authenticator.so noskewadj
失敗したHOTPの試みのためにカウンターを増やさないでください。通常、これを設定する必要があります。トークンなしで攻撃者による失敗したパスワードの試行は、認定ユーザーをロックアウトしません。
OTPがまだ設定されていない場合、ユーザーがOTPなしでログインできるようにします。
PAMはモジュールから少なくとも1つのSUCCESS回答を必要とし、 nullokこのモジュールにIGNOREします。これは、このオプションが使用されている場合、少なくとも1つの他のモジュールがSUCCESS言ったに違いないことを意味します。これを行う1つの方法は、PAM構成の終わりにauth required pam_permit.soを追加することです。
デフォルトでは、PAMモジュールは、ユーザーが入力したときに検証コードをエコーしません。状況によっては、管理者は別の動作を好む場合があります。エコーを有効にするために、 echo_verification_codeオプションをモジュールに渡します。
タイムベースではなくカウンターベースの検証コードが必要な場合は、 google-authenticatorバイナリを使用して、適切なオプションを備えたホームディレクトリにシークレットキーを生成します。このモードでは、クロックスキューは無関係であり、ウィンドウサイズのオプションは、同期の問題を軽減するために、受け入れられる現在のコードを超えるコードの数に適用されます。
存在していない場合は、2番目の検証コードが要求されない恵み期間を提供します。リクエストコードの間の終日を許可するには、秒を86400に設定してみてください。または1時間3600。
これは、(IPアドレス、タイムスタンプ)ペアを1回限りのパスワードログインに成功した後、セキュリティファイルに追加することで機能します。最後の10個の異なるIPアドレスのみが追跡されます。
危険なオプション!
このオプションを使用すると、ファイルシステム(WebリクエストでFlood Server、またはアカウントがディスクを埋めるだけの場合)を埋める機能を備えた攻撃者は、1回限りのパスワードを再利用できる状況を強制し、その目的を打ち負かすことができます。一度"。
デフォルトでは、 grace_periodオプションが定義されている場合、PAMモジュールには、最後のログインのIPアドレスとタイムスタンプを保存するためにある程度の空きスペースが必要です。サーバーに空きスペースがない場合、または更新された構成ファイルエラーが発生した場合、アクセスを防ぐことができます。 allow_readonlyオプションを使用すると、構成ファイルの更新中に発生する可能性のあるエラーを無視できます。