跳至內容

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 這樣的沙盒中,以防止第三方應用程式潛在地訪問它們。

參見