Qubes使用split GPG

这篇文章记录一下如何使用Qubes的Split功能去做gpg的安全隔离的操作还有那些坑。

Split GPG 实现了类似于使用智能卡管理私有 GPG 密钥的概念,唯一不同的是,“智能卡”的角色由另一个 Qubes 应用 qube 扮演。这样一来,一个不太受信任的域,比如运行 Thunderbird 的域,可以将所有加密/解密和签名等加密操作委托给另一个更可信、网络隔离的域。这样一来,使用的域(比如运行 Thunderbird 或其他客户端应用的域)被入侵的情况——尽管这种情况不太可能——也不会让攻击者自动窃取所有密钥。(在这里,我们应该明显地指出,私有密钥上经常使用的密码基本没有意义,因为攻击者可以轻松设置一个简单的后门,等待用户输入密码,然后窃取密钥。)

from:https://www.qubes-os.org/doc/split-gpg/

Qubes OS 4.2

首先要去安装 gpg-split

dom0

sudo qubes-dom0-update qubes-gpg-split-dom0

对应GPG的AppVM的Template是要安装:

sudo apt install qubes-gpg-split

将自己的gpg key导入到对应的qube之后可以通过这条命令去查看:

gpg -K

gpg qube上配置超时时间

echo "export QUBES_GPG_AUTOACCEPT=86400" >> ~/.profile

配置客户端qube使用:

export QUBES_GPG_DOMAIN=work-gpg
qubes-gpg-client -K

如:

../../images/qubes-gpg-client-k.png

修改自动化的配置,能够使得qube可以自动选择对应的gpg-split的qbe

echo "work-gpg" > /rw/config/gpg-split-domain

在dom0上修改qubes-rpc文件/etc/qubes-rpc/policy/qubes.Gpg

work-email  work-gpg  allow

这里是允许 work-email这个qube去访问work-gpg这个qube。

需要注意的是gpg要没有设置密码,不然 Split GPG 没办法进行加密和解密。

如果你设置了密码可以通过这条命令来修改:

gpg2 --edit-key <key_id>
passwd

设置一个空密码之后保存即可。

git可以通过配置gpg的program来去使用split gpg的client,可以修改~/.gitconfig配额文件如下所示

[user]
	email = [email protected]
	name = Chris Su
	signingkey = 0x45D10727855239D3
[gpg]
	program = qubes-gpg-client-wrapper
[commit]
	gpgSign = 1

这里的signingkey是需要可以qubes-gpg-client --list-keys命令能够看到的。

可以本地搞个仓库生成一个commit看看:

git init demo
cd demo
echo demo > readme.md
git add .
git commit -s -m "add readme.md"

在commit的时候会有提示:

../../images/qubes-split-gpg.png

查看对应的commit信息:

git log --show-signature

../../images/git-gpg-sing-log.png

首先要在dom0里面去创建一个rpc文件

vi /etc/qubes-rpc/policy/qubes.SshAgent

内容如下:

slchris-project slchris-gpg ask,default_target=slchris-gpg

在 slchris-gpg 这个AppVM里面去给gpg加上ssh的支持

vi ~/.gnupg/gpg-agent.conf

enable-ssh-support # 添加ssh的支持

拿到ssh的keygrip

gpg --with-keygrip -k

../../images/gpg-ssh-keygrip.png

将其添加到~/.gnupg/sshcontrol

9501B4272C70680B802F5F2F2D903AC2DE3C0525

在slchris-gpg的模板节点上创建/etc/qubes-rpc/qubes.SshAgentrpc文件内容如下:

#!/bin/sh
# Qubes App Split SSH Script

# Activate GPG Agent and set the correct SSH socket
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent

# safeguard - Qubes notification bubble for each ssh request
notify-send "[$(qubesdb-read /name)] SSH agent access from: $QREXEC_REMOTE_DOMAIN"

# SSH connection
socat - "UNIX-CONNECT:$SSH_AUTH_SOCK"

添加权限:

sudo chmod +x /etc/qubes-rpc/qubes.SshAgent

在slchris-project这个AppVM里面创建文件如下:

sudo vi /rw/config/rc.local

内容如下:

# SPLIT SSH CONFIGURATION >>>
# replace "slchris-gpg" with your AppVM name which stores the ssh private key(s)
SSH_VAULT_VM="slchris-gpg"

if [ "$SSH_VAULT_VM" != "" ]; then
  export SSH_SOCK="/home/user/.SSH_AGENT_$SSH_VAULT_VM"
  rm -f "$SSH_SOCK"
  sudo -u user /bin/sh -c "umask 177 && exec socat 'UNIX-LISTEN:$SSH_SOCK,fork' 'EXEC:qrexec-client-vm $SSH_VAULT_VM qubes.SshAgent'" &
fi
# <<< SPLIT SSH CONFIGURATION

添加内容到~/.bashrc,内容如下:

# SPLIT SSH CONFIGURATION >>>
# replace "vault" with your AppVM name which stores the ssh private key(s)
SSH_VAULT_VM="vault"

if [ "$SSH_VAULT_VM" != "" ]; then
  export SSH_AUTH_SOCK="/home/user/.SSH_AGENT_$SSH_VAULT_VM"
fi
# <<< SPLIT SSH CONFIGURATION

重启slchris-project 然后使用

ssh-add -L

在执行的时候会出现询问是否可以访问slchris-gpg:

../../images/gpg-split-ssh-ask.png

允许之后便可正常输出。

这里用的是雷鸟客户端,78之后就不用再去安装插件了内置了gpg。

../../images/th-mail-config.png
选择config edit 在这里去搜索mail.openpgp.allow_external_gnupg将其打开

再去搜索 mail.openpgp.alternative_gpg_path 设置其值为/usr/bin/qubes-gpg-client-wrapper 然后去重启雷鸟客户端。

重启之后在邮件账户配置中修改End To End加密这部分的配置

../../images/th-mail-add-key.png

这里要注意选择用smartcard设备:

../../images/th-mail-add-key-use-smartcard.png

这里要填写gpg的keyid,keyid可以使用这条命令来获得:

qubes-gpg-client-wrapper -K --keyid-format long

../../images/th-mail-add-key-use-smartcard-id.png

添加完成后如下所示:

../../images/th-mail-add-key-done.png

因为雷鸟客户端是没办法从/usr/bin/qubes-gpg-client-wrapper拿到公钥的我们还需要自己手动导入一下:

../../images/th-mail-add-pub-key.png

要选择信任的等级,这个必须要选择Yes, I’ve verified in person this key has the correct fingerprint. 信任自己的指纹:

../../images/th-mail-trust-pub-key.png

测试

可以给自己写一封邮件来测试:

../../images/th-mail-send-mail-test.png
这里可以看到加密的选项已经被打开了

发送的时候也会提示输入yubikey的pin:

../../images/th-mail-send-ask.png

收到查看的时候也会提示要输入pin,输入之后就可以查看到解密后的邮件内容:

../../images/th-mail-view-mail.png

默认pass是不支持split的,但是可以通过扩展功能使其支持gpg,有大佬已经写好这个插件可以直接用了下载这个qubes.bash文件。

首先创建插件的文件夹:

mkdir -p ~/.password-store/.extensions
mv ~Downloads/qubes.bash ~/.password-store/.extensions/
chmod +x ~/.password-store/.extensions/*.bash
export PASSWORD_STORE_ENABLE_EXTENSIONS=true

这样就可以使用了,比如说:

pass qubes generate -c -n test/t0 128
pass qubes show test/t0 --clip
pass qubes rm test/t0 

这个插件默认打开可以丢在~/.profile 里面:

echo "export PASSWORD_STORE_ENABLE_EXTENSIONS=true" >> ~/.profile
  • 使用自动化工具批量配置split

https://github.com/drduh/YubiKey-Guide?tab=readme-ov-file#using-yubikey https://privsec.dev/posts/qubes/using-split-gpg-and-split-ssh-on-qubes-os/