Skip to content

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

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码,之后仅需要点击密钥按钮即可。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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