Pam oath

出自 Arch Linux 中文维基

OATH Toolkit 為認證系統提供一次性密碼(OTP)組件。它包含一個 PAM 認證模塊,支持的技術包括基於消息的 HOTP 算法 (RFC 4226)和基於時間的 TOTP 算法 (RFC 6328)。OTP 生成器應用程式可用於 Android、iOS、Blackberry 和其他設備。與 Google Authenticator 類似,該認證機制整合在 Linux PAM 系統中。本指南展示該機制的安裝和配置。

安裝[編輯 | 編輯原始碼]

安裝 oath-toolkit

設置OATH[編輯 | 編輯原始碼]

OATH 種子是一個十六進位數字,每個用戶應該唯一。為了給一個用戶生成一個新的種子,可以使用下面的命令:

$ openssl rand -hex 10
12345678909876543210
注意: 本文中上述輸出種子是作為例子使用,不要直接使用。

每個用戶需要有一個 OATH,並在配置文件 /etc/users.oath 中連結到它。使用根用戶創建該文件並插入用戶種子:

提示:在一個終端登錄到具有root用戶權限的會話中,並在另一個終端中修改 PAM 配置。這樣,如果 PAM 設置出現問題,你仍然有一個帳戶登錄並修復,這在遠程連接時特別有用。
/etc/users.oath
# Option User Prefix Seed
HOTP/T30/6 user - 12345678909876543210
警告: 不要設置 T 大於60,否則會有報錯:(OATH_UNKNOWN_USER: 無法找到用戶的信息)。

如果需要 HOTP,請使用此配置:

/etc/users.oath
# Option User Prefix Seed
HOTP user - 12345678909876543210

確保該文件只能由 Root 用戶訪問:

# chmod 600 /etc/users.oath
# chown root /etc/users.oath

設置 PAM[編輯 | 編輯原始碼]

要想只為某個特定的服務啟用 OATH,比如 OpenSSH,可以編輯 /etc/pam.d/sshd 文件,並在文件開頭添加以下一行:

auth	  sufficient pam_oath.so usersfile=/etc/users.oath window=30 digits=6

如果只輸入正確的 OATH 代碼即可認證通過。如果使用下面這行,可以把 OATH 作為一個要求,並讓 PAM 堆棧的其他部分得到處理:

auth	  required pam_oath.so usersfile=/etc/users.oath window=30 digits=6

為了讓 SSH 登錄工作,確保這些選項在文件中啟用 /etc/ssh/sshd_config

ChallengeResponseAuthentication yes
UsePAM yes

重啟 sshd.service 來啟用這些更改。

如果想強制 OATH 請求-響應,即使有一個有效的公鑰認證和密碼認證,把以下內容加入到 /etc/ssh/sshd_config

AuthenticationMethods publickey,keyboard-interactive:pam
KbdInteractiveAuthentication yes
PasswordAuthentication yes
提示:用於本地登錄,編輯 /etc/pam.d/login 即可。

使用 OATH 密碼登錄[編輯 | 編輯原始碼]

對於用 TOTP 登錄的情況:

$ oathtool -v --totp -d 6 12345678909876543210
警告: 當 TOTP 模式設置為 SHA512 會有一處程序錯誤,但開發者沒有修復。參見 Gitlab 的公開問題

對於用 HOTP 登錄的情況:

$ oathtool -v -d 6 12345678909876543210

12345678909876543210替換為用戶對應的種子。將輸出類似如下內容:

Hex secret: 1ab4321412aebc
Base32 secret: DK2DEFASV26A====
Digits: 6
Window size: 0
Start counter: 0x0 (0)

820170

最後一串數字即可現在用於登錄的代碼,但 Base32 密鑰更加有趣,因為可轉換成 QR 碼方便轉移密鑰。安裝 qrencode 並運行以下命令轉換:

$ qrencode -o user.png 'otpauth://totp/user@machine?secret=DK2DEFASV26A====

相應改變用戶機器DK2DEFASV26A====。一旦完成,可以用你喜歡的圖像顯示程序來顯示 QR 碼。另外,也可以用以下方法在終端上直接生成 QR 碼:

$ qrencode -t UTF8 'otpauth://totp/user@machine?secret=DK2DEFASV26A===='

使用 Aegis AuthenticatorFreeOTP+,然後對該 user.png(或類似 ASCII-art 的圖像)截圖,並在需要時讓它顯示 OTP 密碼,這樣十分方便。

注意: 你的用戶密匙是這個系統中最重要的信息。一旦設置手機來提供 OTP,它就會有這個密鑰,user.png 文件中的 QR 碼也有這個密鑰。需要特別注意這個文件,它應該只存儲在加密的媒介上(你的手機需要使用加密,以達到任何合理的安全水平)。如果沒有,可以限制在像三星 Knox 這樣的沙盒中,以防止第三方應用程式潛在地訪問它們。

參見[編輯 | 編輯原始碼]