为什么 apt GPG 密钥必须是全世界可读的?

mar*_*ibs 4 apt

当对 apt 存储库条目使用“签名者”选项时,如果密钥不可读,则 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  
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

mur*_*uru 11

它们不必是世界可读的,但它们必须可供 apt 运行的用户读取。Apt,即使以 root 身份运行,通常也会通过切换到用户来放弃不需要的操作的权限_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} ---
Run Code Online (Sandbox Code Playgroud)

请注意,许多子进程的 UID 是 100,即_apt用户的 UID。

也就是说,将密钥设置为只能由 root 读取并没有任何优势。

  • 为了澄清最后一点,APT 使用的(公共)密钥是公开可用的信息,可以根据为系统配置的存储库列表轻松获得,而这些存储库又可以根据安装的内容轻松确定。 (5认同)