Qubes使用split GPG
这篇文章记录一下如何使用Qubes的Split功能去做gpg的安全隔离的操作还有那些坑。
Split GPG 实现了类似于使用智能卡管理私有 GPG 密钥的概念,唯一不同的是,“智能卡”的角色由另一个 Qubes 应用 qube 扮演。这样一来,一个不太受信任的域,比如运行 Thunderbird 的域,可以将所有加密/解密和签名等加密操作委托给另一个更可信、网络隔离的域。这样一来,使用的域(比如运行 Thunderbird 或其他客户端应用的域)被入侵的情况——尽管这种情况不太可能——也不会让攻击者自动窃取所有密钥。(在这里,我们应该明显地指出,私有密钥上经常使用的密码基本没有意义,因为攻击者可以轻松设置一个简单的后门,等待用户输入密码,然后窃取密钥。)
from:https://www.qubes-os.org/doc/split-gpg/
环境配置
首先要去安装 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
如:
修改自动化的配置,能够使得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
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的时候会有提示:
查看对应的commit信息:
git log --show-signature
Split SSH
首先要在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
将其添加到~/.gnupg/sshcontrol
9501B4272C70680B802F5F2F2D903AC2DE3C0525
在slchris-gpg的模板节点上创建/etc/qubes-rpc/qubes.SshAgent
rpc文件内容如下:
#!/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:
允许之后便可正常输出。
邮件加密
这里用的是雷鸟客户端,78之后就不用再去安装插件了内置了gpg。
选择config edit
在这里去搜索mail.openpgp.allow_external_gnupg
将其打开
再去搜索 mail.openpgp.alternative_gpg_path
设置其值为/usr/bin/qubes-gpg-client-wrapper
然后去重启雷鸟客户端。
重启之后在邮件账户配置中修改End To End加密这部分的配置
这里要注意选择用smartcard设备:
这里要填写gpg的keyid,keyid可以使用这条命令来获得:
qubes-gpg-client-wrapper -K --keyid-format long
添加完成后如下所示:
因为雷鸟客户端是没办法从/usr/bin/qubes-gpg-client-wrapper
拿到公钥的我们还需要自己手动导入一下:
要选择信任的等级,这个必须要选择Yes, I’ve verified in person this key has the correct fingerprint.
信任自己的指纹:
测试
可以给自己写一封邮件来测试:
这里可以看到加密的选项已经被打开了
发送的时候也会提示输入yubikey的pin:
收到查看的时候也会提示要输入pin,输入之后就可以查看到解密后的邮件内容:
pass with split gpg
默认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
TODO
- 使用自动化工具批量配置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/