Skip to content

使用Pi Pico实现安全密钥 #48

@myml

Description

@myml

Pico Keys是一个开源的硬件安全密钥项目,可以让Pi Pico成为一个硬件安全密钥。Pico 2支持硬件加密,使项目不再依赖于软件加密,不再是玩具而是真正的安全密钥。

写入固件

Pi Pico很容易刷固件,只需要:

  1. 按住BOOT按钮
  2. 连接电脑
  3. 电脑会出现一个移动硬盘的盘符
  4. 把固件文件复制到这个盘符中
  5. 固件就刷好了

兼容YubiKey

PicoKey项目提供了一个Commissioner工具,可以用来配置PicoKey:

  1. 打开网站后,Vendor选择 YubiKey 4/5
  2. VID:PID填写 1050:0407
  3. Product Name填写 yubico yubikey
  4. 勾选 Secure BootSecure Lock 实现硬件加密锁
  5. 使用 Commission via WebUSB 按钮将配置写入到PicoKey中
  6. 如果无法写入,可以试试 Commission via WebAuthn

这些配置可以实现PicoKey兼容YubiKey,使用YubiKey Manager可以管理PicoKey。

网站免密登录

目前有一些网站支持Passkey登录,例如GitHub、Google等。还有一些网站支持硬件密钥作为2FA。

我平常使用Bitwarden,它的浏览器插件支持2FA和Passkey,所以我没怎么用这个功能,仅给Bitwarden的2FA配置了PicoKey。

操作系统免密登录

yubikey 支持设置静态密码,使用模拟键盘输入,无需任何软件配合,所以可用于登录系统。

安全事项

由于静态密码不需要验证pin,并且会明文输入,设备被别人捡到后能获取到这个密码,所以静态密码应该使用随机生成而不能是自己常用密码。静态密码使用时应该是 自定义短密码+随机静态密码。这样就算捡到硬件设备也无法直接登陆系统。

Linux 配置

我个人使用发现 windows 上无需任何配置就能在系统登录界面使用静态密码,但在 Linux 上tty可直接使用,图形界面却需要使用ykman命令之后静态密码才能用。所以配置了一个services服务和一个udev规则插入硬件后自动执行ykman list。

/etc/systemd/system/yubikey.service

[Service]
Type=oneshot
ExecStart=ykman list

/etc/udev/rules.d/99-yubikey-input.rules

ACTION=="add", SUBSYSTEM=="input", ATTRS{idVendor}=="1050", TAG+="systemd", ENV{SYSTEMD_WANTS}="yubikey.service"

sudo免密

安装和配置

# 安装libpam-u2f
sudo apt install libpam-u2f

# 创建目录
sudo mkdir -p ~/.config/Yubico

# 创建密钥
sudo u2f_register ~/.config/Yubico/u2f_keys

# 注册硬件密钥
pamu2fcfg > ~/.config/Yubico/u2f_keys

配置PAM

/etc/pam.d/sudo文件中添加以下内容(为避免出问题,先在另一个终端sudo bash保持会话):

+auth sufficient pam_u2f.so cue [cue_prompt=Tap YubiKey]
@include common-auth

这样配置后,执行sudo时会优先验证硬件密钥,如果失败会提示输入密码。

问题解决

我自己使用时发现如果密钥被拔掉再插上,会直接跳过验证失败,提示输入密码,应该是因为没有PIN码解锁导致。

所以我又修改了/etc/pam.d/sudo文件,添加了以下内容:

+auth sufficient pam_u2f.so cue [cue_prompt=Tap YubiKey] pinverification=1
@include common-auth

但是这样配置后,每次使用sudo都提示输入PIN码,很不方便,最后修改为:

+auth sufficient pam_u2f.so cue [cue_prompt=Tap YubiKey]
+auth sufficient pam_u2f.so cue pinverification=1 timeout=30 
@include common-auth

这样配置后,首次使用会提示输入PIN码,之后仅需要点击密钥按钮即可。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions