当对 apt repo 条目使用“Signed-by”选项时,如果密钥不是所有人都可读的,apt 会抛出错误。
例子:
deb [arch=amd64 signed-by=/etc/apt/keyrings/hashicorp.gpg] https://apt.releases.hashicorp.com jammy main
sudo chmod 660 /etc/apt/keyrings/hashicorp.gpg
sudo apt-get update
https://apt.releases.hashicorp.com jammy InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY DA418C88A3219F7B
sudo chmod 664 /etc/apt/keyrings/hashicorp.gpg
sudo apt-get update
Hit:10 https://apt.releases.hashicorp.com jammy InRelease
为什么是这样?
答案1
它们不必是全世界可读的,但它们必须可被 apt 运行的用户读取。即使以 root 身份运行,Apt 通常会通过切换到用户来放弃不需要这些权限的操作的权限_apt
。例如:
# getent passwd _apt
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
# strace -f apt update |& grep si_uid
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=708, si_uid=0, si_status=0, si_utime=0, si_stime=0} ---
[pid 709] --- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=707, si_uid=0} ---
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=709, si_uid=0, si_status=100, si_utime=0, si_stime=0} ---
[pid 712] --- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=707, si_uid=0} ---
[pid 707] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=712, si_uid=0, si_status=SIGINT, si_utime=0, si_stime=0} ---
[pid 715] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=716, si_uid=100, si_status=0, si_utime=0, si_stime=0} ---
[pid 717] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=718, si_uid=100, si_status=0, si_utime=0, si_stime=0} ---
[pid 715] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=717, si_uid=100, si_status=0, si_utime=0, si_stime=0} ---
请注意,许多子进程的 UID 是 100,即用户的 UID _apt
。
话虽如此,但让密钥仅由 root 可读并没有任何好处。