示例PAM模塊演示了兩因素身份驗證,以通過SSH,OpenVPN等登錄服務器,等等。
該項目並不是要登錄Google,Facebook或其他TOTP/HOTP第二因素系統,即使他們建議使用Google Authenticator應用程序。
RFC 4226中指定了基於HMAC的一次性密碼(HOTP),RFC 6238中指定了基於時間的一次性密碼(TOTP)。
./bootstrap.sh
./configure
make
sudo make install如果您無法訪問“ sudo”,則必須在調用“ make install”之前手動成為“根”。
為了獲得最高的安全性,請確保即使密碼和/或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代碼(基於時間的password)或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=選項時,您可能還需要設置user=選項。後者強迫PAM模塊在執行任何文件操作之前切換到專用的硬編碼用戶ID。使用user=選項時,您不得在文件名中包含“〜”或“ $ {home}”。
如果您想對系統上沒有傳統的UNIX帳戶的用戶進行身份驗證,則user=選項也很有用。
請參閱上面的“加密主目錄”。
覆蓋默認令牌提示。如果要在提示中包含空格,請將整個參數包裹在方括號中:
auth required pam_google_authenticator.so [authtok_prompt=Your secret token: ]
在執行任何文件操作之前,請強迫PAM模塊切換到硬編碼的用戶ID。通常用於secret= 。
危險選擇!
默認情況下,PAM模塊要求必須擁有Secrets File,用戶登錄(或指定了user= ,由該用戶擁有)。此選項禁用檢查。
此選項可用於允許守護程序未作為根而運行,以處理該用戶不擁有的配置文件,例如用戶本身擁有的配置文件。
危險選擇!
默認情況下,PAM模塊需要僅由文件的所有者(默認情況下模式0600)才能讀取秘密文件。在非默認配置中使用該模塊的情況下,管理員可能需要更寬鬆的文件權限或用於其用例的特定設置。
在系統日誌中啟用更多的詳細日誌消息。
一些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次來教它有關您所經歷的偏斜量。確保您始終等待30秒(但不會更長),以便獲得三個不同的TOTP代碼。
一些管理員更喜歡自動調整時間偏斜,因為這樣做會導致系統配置略有安全。如果要禁用它,則可以在模塊命令行上這樣做:
auth required pam_google_authenticator.so noskewadj
不要為失敗的HOTP嘗試增加計數器。通常,您應該設置此攻擊者而沒有令牌的攻擊者嘗試失敗的密碼嘗試,不要鎖定授權用戶。
如果尚未設置OTP,則允許用戶在沒有OTP的情況下登錄。
PAM需要至少一個SUCCESS答案,而nullok使該模塊IGNORE 。這意味著,如果使用此選項至少一個其他模塊必須說SUCCESS 。一種方法是auth required pam_permit.so添加到PAM配置的末尾。
默認情況下,PAM模塊在用戶輸入時不會迴盪驗證代碼。在某些情況下,管理員可能更喜歡不同的行為。將echo_verification_code選項傳遞到模塊以啟用迴聲。
如果您想要基於計數器而不是基於時間表的驗證代碼,請使用google-authenticator二進制代碼在主目錄中以適當的選項生成秘密鍵。在此模式下,時鐘偏差是無關緊要的,窗口尺寸選項現在適用於當前被接受的代碼以外的代碼,以減少同步問題。
如果存在和非零,則提供寬限期,在此期間不會要求第二個驗證代碼。嘗試將秒設置為86400,以允許在請求代碼之間進行全日;或一個小時3600。
成功的一次性通信登錄後,通過將(IP地址,時間戳)對添加到安全文件中來起作用;僅跟踪最後十個不同的IP地址。
危險選擇!
有了此選項,一個具有填充文件系統(帶有Web請求的洪水服務器,或者只有帳戶填充磁盤的洪水服務器)的攻擊者可以強制可以重複使用一次性通信的情況,從而擊敗其目的”一度”。
默認情況下,如果定義了grace_period選項,則PAM模塊需要一些可用空間來存儲最後登錄的IP地址和時間戳。如果服務器沒有自由空間或更新配置文件錯誤,它可以防止訪問。使用allow_readonly選項,您可以忽略在配置文件更新期間可能發生的任何錯誤。