通用第二因素 - Arch Linux 中文维基

跳至內容

# 通用第二因素

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Universal 2nd Factor，最近一次同步於 2025-01-28，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

通用第二因素（U2F）是一個開放標準，它基於類似智慧卡中的安全技術，使用專門的 USB 或 NFC 設備來加強和簡化雙因素身份驗證（2FA）。

該標準最早由谷歌和 Yubico 開發，並包含了來自 NXP 的貢獻，現在由 FIDO 聯盟進行維護。

所有與 U2F 和 U2F 設備相關的文章請參考分類:通用第二因素。

當前最新的標準是 WebAuthn。

## 用於網頁認證

谷歌、Facebook、Twitter 和 GitHub 等主流網站都支持使用 U2F，更多網站的清單和設置文檔請參考 2fa.directory 或 dongleauth.com。對於所有支持該功能的瀏覽器，很可能只需要安裝 libfido2包。Yubico 提供了一個測試頁用於進行測試。

### Firefox

Firefox/微調#Fido U2F 身份驗證

### Chromium/Chrome

Chromium#U2F 身份驗證

## 用於用戶會話認證

YubiKey 的製造商 Yubico 開發了一個 U2F PAM 模塊，可用於在登陸時進行二次驗證，也可以完全替代密碼。

注意：雖然本文提到了 Yubico/YubiKey，基本上所有 U2F 和/或 FIDO2 合規密鑰都受 pam-u2f包 支持。

### 安裝 PAM 模塊

該模塊是 pam-u2f包 的一部分。

### 添加密鑰

注意：下面使用的目錄是默認路徑。對於單用戶實現，可以將文件移動到你選擇的目錄下，然後在 pam_u2f.so 一行末添加 `authfile=/path/to/u2f_keys`，該操作可用於將 `u2f_keys` 移動到文件系統上的受保護位置。對於多用戶實現，可參考 pam-u2f 官方文檔使用中心化映射文件。

首先使用 `pamu2fcfg` 添加密鑰：

    $ mkdir ~/.config/Yubico
    $ pamu2fcfg -o pam://hostname -i pam://hostname > ~/.config/Yubico/u2f_keys

輸入 PIN 碼後，通過按下 U2F 密鑰上的按鈕進行確認。

注意：如果由於不同網絡下的 DHCP 等原因導致系統主機名被更改，你將無法進行登錄。為避免該情況發生，建議指定上述選項，並將 `hostname` 替換為正確的主機名。

如果你有多個密鑰，參考下方進行添加：

    $ pamu2fcfg -o pam://hostname -i pam://hostname -n >> ~/.config/Yubico/u2f_keys

注意：以上命令必須使用 `-n` 選項。對於同一用戶的後續條目，它將按照規範要求省略生成條目中的用戶名部分。多個相同用戶名的條目會導致 PAM 出現不可預測的行為。另外，不要手動進行分行，`u2f_keys` 文件中只能存在一行內容。[1]

### 無密碼 sudo

警告：在保存配置更改前，先單獨打開一個具有 root 權限的 shell 環境（如 `sudo -s`），這樣可以保證出問題後能夠撤回更改。

在文件中加入第一行：

    /etc/pam.d/sudo

    auth            sufficient      pam_u2f.so cue origin=pam://hostname appid=pam://hostname

別忘了替換掉 `hostname` 一項。接下來打開一個新的命令行窗口，執行 `sudo ls`。密鑰上的 LED 應該會開始閃爍，按下後命令就會開始執行。`cue` 選項用於提示用戶所需進行的操作（`Please touch the device`）。

要讓密鑰作為使用 sudo 的唯一方法（即不回退使用密碼），需要將其它認證方式注釋掉（默認一般只有 system-auth 一項）。

    /etc/pam.d/sudo

    #auth           include         system-auth

你還需要將 `pam_u2f.so` 一行的 `sufficient` 替換為 `required`。

警告：這會導致用戶在沒有配置 U2F 密鑰的情況下無法使用 sudo。

### GDM 登錄

在現有的 `auth` 行後添加以下內容：

    /etc/pam.d/gdm-password

    auth            required      pam_u2f.so nouserok origin=pam://hostname appid=pam://hostname

注意 `nouserok` 選項，該選項允許在用戶未配置密鑰時規則失效，適用於多用戶環境下其中只有部分用戶使用 U2F 密鑰的情況。

注意：該方法不適用於用戶主目錄（home）加密的情況，該目錄在登錄流程完成前尚未完全解密，導致無法使用 `u2f_keys` 文件。在這種情況下，可以參考 pam-u2f 官方文檔使用中心化映射文件。

有些多功能密鑰（例如 Trezor Model T）帶有 U2F/PAM 功能，但根據 CTAP 2.0 標準[2]，在系統啟動時其可能不會啟用該功能。在有多個 U2F 密鑰的情況下，pam-u2f 會依次查找並等待設備（Trezor）超時，之後才提示提供或觸碰其它 U2F 密鑰，導致 GDM 出現長達 2 分鐘的延時 [3]。You could try adding the `nodetect` option alongside `debug` and finish any device specific login (ex. screen PIN) before GDM loads.

### SDDM/KDE

SDDM 似乎在用戶初始登錄時不支持 pam_u2f。可以使用自動登錄，然後編輯 `/etc/pam.d/kde` 來控制屏幕鎖定。

如果你使用的是帶有生物識別驗證功能的 U2F 密鑰（如 Yubikey Bio），並希望使用 1FA 功能，請使用 `/etc/pam.d/kde-fingerprint`，注釋掉 pam_fprintd.so 行，並在其位置上進行修改。這樣可以避免在身份驗證後顯示解鎖按鈕，而不是立即解鎖 [4]。

以下為參考示例：

    /etc/pam.d/kde-fingerprint

    #%PAM-1.0

    auth       required                    pam_shells.so
    auth       requisite                   pam_nologin.so
    auth       requisite                   pam_faillock.so      preauth

    # take over fprintd for u2f since yubikey bio is a fingerprint reader and bypasses kscreenlocker's "unlock" button
    #-auth      required                    pam_fprintd.so
    auth required pam_u2f.so cue pinverification=0 userverification=1

    auth       optional                    pam_permit.so
    auth       required                    pam_env.so

    account    include                     system-local-login

    password   required                    pam_deny.so

    session    include                     system-local-login

警告：不要像其它 PAM 配置文件一樣在 `/etc/pam.d/kde-fingerprint` 中使用 `auth sufficient`，這會導致即使認證失敗也能繞過鎖屏界面。

### 其它認證方式

可以參考上文為其它服務啟用 PAM 模塊。以 Cinnamon 屏保為例，可以修改 `/etc/pam.d/cinnamon-screensaver`。

對於 Polkit，需要先將 `/usr/lib/pam.d/polkit-1` 複製到 `/etc/pam.d/polkit-1`，然後再進行修改。

### 排障

如果你把自己鎖在系統外了，需要先啟動到恢復模式或 U 盤，然後撤回 PAM 的配置並重啟。

如果 pam-u2f 模塊靜默失敗了，可以在 `/etc/pam.d/` 下文件對應的行中添加 debug 關鍵字。

## OpenSSH

8.2 以及上版本的 OpenSSH 原生支持 FIDO/U2F 密鑰，詳情請參考 SSH 密鑰#FIDO/U2F。

## 使用 LUKS 進行靜態數據加密

此頁面或章節適合移動到 systemd-cryptenroll。

附註： systemd-cryptenroll 不止支持 FIDO。（在 Talk:Trusted Platform Module#move systemd-cryptenroll to separate article 討論）

從 248版本開始，可以通過 systemd 使用 FIDO2 密鑰解鎖 LUKS 分區。

首先需要配置 `/etc/crypttab` 文件（具體參考下方），如果需要解鎖根分區，也可以配置 initramfs。配置步驟與使用 TPM 晶片解鎖類似，具體請參考 systemd-cryptenroll#Trusted Platform Module。

註冊密鑰需要使用 systemd-cryptenroll。首先使用以下命令列出檢測到的密鑰：

    $ systemd-cryptenroll --fido2-device=list

然後在 LUKS 槽中註冊密鑰，指定 `auto` 值（如果有多個設備，也可以 FIDO2 設備的路徑，例如 `/dev/hidrawX`）：

    $ systemd-cryptenroll --fido2-device=auto /dev/sdX

### 非根分區

對於非根分區，crypttab 如下：

    /etc/crypttab

    data /dev/sdX none fido2-device=auto

對於加密分區是由 LVM 管理的邏輯卷的情況同樣可用：

    /etc/crypttab

    data /dev/vg1/data none fido2-device=auto

分類：​

- 通用第二因素
- 使用「模板:Move」標記的頁面或章節

通用第二因素
新增話題