image-20260115042500897

指南说明

1.1 适用场景

本指南适用于在 WSL 环境下的 Arch Linux 系统,手动完成 WSL-Hello-sudo 的部署,实现通过 Windows Hello(人脸/指纹/PIN)验证替代 sudo 密码输入的功能。

1.2 核心适配点(与 Ubuntu/Debian 差异)

  • PAM 模块目录固定为/lib/security(Ubuntu/Debian 为 /lib/x86_64-linux-gnu/security);
  • pam-auth-update 工具,需手动编辑 PAM 配置文件;
  • 依赖包通过 pacman 安装,而非 apt
  • 默认可能未启用 WSL Interop 功能,需手动配置以执行 Windows 可执行文件(.exe)。

1.3 前置环境要求

  • WSL 版本:推荐 WSL 2(WSL 1 对 Interop 支持较差,易出现执行 .exe 报错);
  • Windows 环境:已启用 Windows Hello(设置 > 账户 > 登录选项 中配置人脸/指纹/PIN);
  • Arch 权限:拥有普通用户 sudo 权限(禁止直接使用 root 用户操作)。

前置准备

2.1 确认 WSL 版本

在 Windows 终端(CMD/PowerShell)中执行以下命令,确认 Arch 对应的 WSL 版本为 2:

wsl -l -v

若版本为 1,执行以下命令转换(需替换Arch 为你的 Arch 分发版名称):

wsl --set-version Arch 2
wsl --set-default-version 2

2.2 安装依赖包

在 Arch WSL 终端中执行,安装编译/运行所需依赖(仅使用预编译包可跳过 Rust 相关):

# 更新系统包索引
sudo pacman -Syu

# 安装核心依赖
sudo pacman -S --needed openssl libpam base-devel wslu

# (可选)若需手动编译组件,安装 rust 环境
sudo pacman -S --needed rustup
rustup default stable
# 安装 Windows 交叉编译目标(仅编译 Windows 组件时需)
rustup target add x86_64-pc-windows-msvc

2.3 下载预编译包

# 下载最新 release 包
wget https://github.com/nullpo-head/WSL-Hello-sudo/releases/latest/download/release.tar.gz

# 解压并进入工作目录
tar xvf release.tar.gz && cd release

# 验证文件完整性(需包含以下关键文件)
ls -l build/  # 应显示 pam_wsl_hello.so(Linux PAM 模块)和 WindowsHelloBridge.exe(Windows 核心组件)

详细步骤

1:修复 WSL Interop 功能(核心,解决 .exe 执行报错)

Arch WSL 默认可能未启用 Interop(WSL 与 Windows 程序互调功能),执行以下命令启用并验证:

# 挂载 binfmt_misc 内核模块(Interop 依赖)
sudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc

# 注册 Windows 可执行文件格式(让 WSL 识别 .exe 并转发执行)
echo ':DOSWin:M::MZ::/init:' | sudo tee /proc/sys/fs/binfmt_misc/register

# 验证 Interop 是否生效(执行 Windows 的 cmd.exe)
/mnt/c/Windows/System32/cmd.exe /C echo "Interop OK"

若输出 Interop OK 则说明生效;若仍报错,执行 wsl --shutdown 重启 WSL 后重新尝试。

2:配置安装路径并复制 Windows 组件

定义 Windows 端组件的安装路径,复制 WindowsHelloBridge.exe 到指定目录:

# 1. 自动获取 Windows 用户名(避免手动输入错误)
WINUSER=$(/mnt/c/Windows/System32/cmd.exe /C "echo %username%" | tr -d '\r\n')

# 2. 定义核心路径(与官方 install.sh 默认路径一致)
MNT="/mnt/c"  # Windows C 盘在 WSL 中的挂载点(默认即为 /mnt/c)
PAM_WSL_HELLO_WINPATH="${MNT}/Users/${WINUSER}/AppData/Local/Programs/wsl-hello-sudo"

# 3. 创建目录并复制 Windows 核心组件
mkdir -p "${PAM_WSL_HELLO_WINPATH}"  # 路径不存在则创建
cp build/WindowsHelloBridge.exe "${PAM_WSL_HELLO_WINPATH}/"

# 4. 赋予可执行权限(WSL 中调用 Windows 程序需显式授权)
chmod +x "${PAM_WSL_HELLO_WINPATH}/WindowsHelloBridge.exe"

3:安装 Linux PAM 模块

将编译好的 PAM 模块复制到 Arch 系统的 PAM 模块目录,并配置正确权限:

# Arch 固定 PAM 模块目录:/lib/security
SECURITY_PATH="/lib/security"

# 备份原有模块(若存在,避免覆盖后无法恢复)
sudo mv "${SECURITY_PATH}/pam_wsl_hello.so" "${SECURITY_PATH}/pam_wsl_hello.so.bak" 2>/dev/null

# 复制新的 PAM 模块到系统目录
sudo cp build/pam_wsl_hello.so "${SECURITY_PATH}/"

# 配置权限(必须为 root 所有,权限 644,否则 PAM 无法加载)
sudo chown root:root "${SECURITY_PATH}/pam_wsl_hello.so"
sudo chmod 644 "${SECURITY_PATH}/pam_wsl_hello.so"

4:创建 WSL-Hello-sudo 核心配置文件

生成系统配置文件,记录 Windows 组件路径和 C 盘挂载点,供 PAM 模块调用:

# 1. 创建配置目录
sudo mkdir -p /etc/pam_wsl_hello/

# 2. 写入配置内容(自动填充路径,无需手动修改)
sudo tee /etc/pam_wsl_hello/config > /dev/null << EOF
authenticator_path = "${PAM_WSL_HELLO_WINPATH}/WindowsHelloBridge.exe"
win_mnt = "${MNT}"
EOF

5:生成 Windows Hello 凭证密钥(关键步骤)

通过 Windows 组件生成密钥对,用于 WSL 与 Windows Hello 的身份验证:

# 1. 进入 Windows 组件所在目录
cd "${PAM_WSL_HELLO_WINPATH}"

# 2. 生成凭证(${USER} 为当前 Arch 用户名,自动匹配)
./WindowsHelloBridge.exe creator "pam_wsl_hello_${USER}"

执行后会弹出 Windows Hello 认证窗口,选择已配置的人脸/指纹/PIN 完成验证。验证成功后,目录下会生成 pam_wsl_hello_${USER}.pem 公钥文件。

提示:若弹出窗口在后台,可先打开一个 Windows 窗口(如记事本),再重新执行上述命令。

6:同步公钥到 Arch 系统配置目录

将生成的公钥复制到 PAM 模块的密钥目录,供验证时读取:

# 创建公钥存储目录
sudo mkdir -p /etc/pam_wsl_hello/public_keys/

# 复制公钥(自动匹配当前用户)
sudo cp "pam_wsl_hello_${USER}.pem" /etc/pam_wsl_hello/public_keys/

7:手动配置 PAM(Arch 核心差异点)

Arch 无 pam-auth-update 工具,需直接编辑 sudo 的 PAM 配置文件,启用 WSL-Hello-sudo 验证:

# 1. 备份原有配置(关键!避免配置错误导致无法使用 sudo)
sudo cp /etc/pam.d/sudo /etc/pam.d/sudo.bak

# 2. 编辑 sudo PAM 配置文件
sudo nano /etc/pam.d/sudo

在文件 最顶部 新增以下内容(保留原有所有配置,仅添加此行):

auth       sufficient   pam_wsl_hello.so

配置说明:

  • sufficient:表示 Windows Hello 认证成功则直接通过,无需输入密码;认证失败则自动回退到密码验证,避免因配置错误锁死 sudo 权限。

编辑完成后,按 Ctrl+O 保存,Ctrl+X 退出 nano。

8:验证部署结果

执行以下命令测试是否生效:

sudo ls

若弹出 Windows Hello 认证窗口,验证通过后无需输入密码即可执行 ls 命令,说明部署成功。

常见问题排查

问题 1:执行 .exe 文件提示「Exec format error」

原因:WSL Interop 功能未启用或失效。

解决方案:重新执行步骤 1 的 Interop 配置命令,若仍无效,执行 wsl --shutdown 重启 WSL 后重试;确认 WSL 版本为 2(WSL 1 兼容性较差)。

问题 2:执行 sudo 仍要求输入密码,未弹出 Windows Hello 窗口

排查方向:

  • 检查 PAM 配置:执行 cat /etc/pam.d/sudo,确认 auth sufficient pam_wsl_hello.so 已添加在文件最顶部;
  • 检查公钥路径:确认 /etc/pam_wsl_hello/public_keys/ 下存在 pam_wsl_hello_${USER}.pem 文件;
  • 检查 PAM 模块权限:执行 ls -l /lib/security/pam_wsl_hello.so,确认权限为 -rw-r--r-- 且所有者为 root:root。

问题 3:Windows Hello 窗口弹出后验证失败

原因:Windows Hello 凭证未正确生成或公钥同步失败。

解决方案:重新执行步骤 5(生成凭证)和步骤 6(同步公钥),确保验证过程中无报错;检查 Windows 端 Windows Hello 是否正常可用(可通过 Windows 登录验证)。

问题 4:PAM 配置错误导致 sudo 无法使用

解决方案:通过备份文件恢复配置:

sudo cp /etc/pam.d/sudo.bak /etc/pam.d/sudo

注意事项

  • 全程禁止使用 root 用户直接操作,否则会导致文件权限异常,PAM 模块无法加载;
  • 修改 PAM 配置前必须备份 /etc/pam.d/sudo,避免配置错误导致 sudo 失效;
  • 若 WSL 重启后 Interop 失效,可将步骤 1 的两条命令添加到 /etc/profile 中,实现开机自动启用;
  • 仅支持 sudo 验证替换,其他依赖 PAM 的服务(如 su)需额外编辑对应 PAM 配置文件(如 /etc/pam.d/su)。