APT源的工作原理

引言

最近在折腾自己学校的镜像源,看到差不多 20T 的硬盘都被塞满了,我是很好奇系统是如何管理这些文件的,于是顺便就研究下 APT 源的工作原理

原理

在 Ubuntu/Debian 等系统下,常见的应用安装方式为 apt/apt-get
前者可以说是后者的升级版,提供了更友好的命令行界面,包含了 apt-get 和 apt-cache 等常用功能,本质上都是基于 dpkg 的高级包管理工具。
Ubuntu/Debian 采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。由于网络环境的问题,我们可能无法正常访问官方的软件仓库,所以许多镜像服务器被建立,并且时刻保持与官方服务器的同步。在使用 apt 之前,我们一般都会进行换源处理【脚本】Linux 换源汇总
换源主要是修改位于 /etc/apt/source.list 的源文件,这个文件记录了可获取软件包的镜像站的站点地址。
我们将在其中加入自己的镜像源地址,下列是一个案例

deb http://mirrors.szu.moe/ubuntu jammy main restricted
# deb-src http://mirrors.szu.moe/ubuntu jammy main restricted
deb http://mirrors.szu.moe/ubuntu jammy-updates main restricted
# deb-src http://mirrors.szu.moe/ubuntu jammy-updates main restricted
deb http://mirrors.szu.moe/ubuntu jammy universe
# deb-src http://mirrors.szu.moe/ubuntu jammy universe
deb http://mirrors.szu.moe/ubuntu jammy-updates universe
# deb-src http://mirrors.szu.moe/ubuntu jammy-updates universe
deb http://mirrors.szu.moe/ubuntu jammy multiverse
# deb-src http://mirrors.szu.moe/ubuntu jammy multiverse
deb http://mirrors.szu.moe/ubuntu jammy-updates multiverse
# deb-src http://mirrors.szu.moe/ubuntu jammy-updates multiverse
deb http://mirrors.szu.moe/ubuntu jammy-backports main restricted universe multiverse
# deb-src http://mirrors.szu.moe/ubuntu jammy-backports main restricted universe multiverse
deb http://mirrors.szu.moe/ubuntu jammy-security main restricted
# deb-src http://mirrors.szu.moe/ubuntu jammy-security main restricted
deb http://mirrors.szu.moe/ubuntu jammy-security universe
# deb-src http://mirrors.szu.moe/ubuntu jammy-security universe
deb http://mirrors.szu.moe/ubuntu jammy-security multiverse

镜像源地址遵循以下格式

DebType AddressType://Hostaddress/ubuntu Distribution Component1 Component2.....

其中各字段含义如下所示。
1. DebType 表示 Deb 软件包类型,使用 deb 表示二进制软件包,使用 deb-src 表示源码包;
对于大部分用户来说,二进制软件包即可完成安装,二进制软件包会被安装在系统的默认目录下(usr/share和usr/bin)。而源码包需要自己编译安装,但可以自己指定安装位置。
源码可以通过 apt-get source PackageName 获得,以下是源码安装的一个例子 (g2o)

cd g2o
mkdir build && cd build
cmake ..
make -j8 -DCMAKE_INSTALL_PREFIX=/usr/local/g2o/
sudo make install
  1. AddressType 表示访问地址类型,常用类型有:http、https、ftp、file、cdrom、ssh 等;
    目前一般镜像源支持前两个,ftp 少部分支持。
  2. Distribution 表示 Ubuntu 的各个发行版本,例如 dapper、feisty;
    本样例中 jammy 代表 Ubuntu 22.04 LTS 版本的代号
    其中 - security(安全相关)、-proposed(测试版)、-updates(更新相关)、-backports(向后移植 / 兼容)
  3. Component 表示软件包组件类别,是由技术支持程度不同而划分的类别,可选择 main、restricted、universe 和 multiverse 中的一种或多种。
    main: 完全的自由软件。
    restricted: 不完全的自由软件。
    universe:ubuntu 官方不提供支持与补丁,全靠社区支持。
    muitiverse:非自由软件,完全不提供支持和补丁。

软件源配置文件只是告知系统可以访问的镜像站点地址,但那些镜像站点具体都拥有什么软件资源并不清楚。若每安装一个软件包,就在服务器上寻找一遍,效率是很低的。因而镜像源提供了索引文件,以便本地主机查询 apt update 即更新索引文件

root@aurora-rsync:/home/aurora# apt update
Get:1 http://mirrors.szu.moe/ubuntu jammy InRelease [270 kB]
Hit:2 http://mirrors.szu.moe/ubuntu jammy-updates InRelease
Hit:3 http://mirrors.szu.moe/ubuntu jammy-backports InRelease
Hit:4 http://mirrors.szu.moe/ubuntu jammy-security InRelease
Fetched 270 kB in 1s (372 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
root@aurora-rsync:/home/aurora# cat /var/log/nginx/access.log
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy/InRelease HTTP/1.1" 200 270087 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-updates/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-backports/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-security/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"

对于 update,会根据源的相关设置访问 /ubuntu/dists/(设置的Distribution)/InRelease 的文件,这个也是一个索引,记录了有哪些相应平台的包存储在服务器上

b96c0cfe911414e1b7f2df5c88844369 1192665 main/binary-amd64/Packages.gz
84a735928def889314d9d28d0819425c 1068823 main/binary-arm64/Packages.gz
6a1ab8e4d5aa235c81e2e036e01e9926 775999 main/binary-armhf/Packages.gz
8d8471fdecfb661f6580df6096a53c6a 570121 main/binary-i386/Packages.gz
3a43d2dda28cf2e7e1d885484a1ce249 732797 main/binary-ppc64el/Packages.gz
8ac0edaecf66d4bd0631294a7908154b 690004 main/binary-riscv64/Packages.gz
fb78c7c1b05b2dba72b8ec6d99bb6462 717683 main/binary-s390x/Packages.gz

系统会根据自己的平台下载相应的包索引,本平台为 amd64,所以访问 main/binary-amd64/Packages.gz 下载
下列出的是其中的一部分,索引中包含如下信息
包名,优先级,类型,维护者,架构,源文件(source),版本号,依赖包,冲突性信息,包大小,文件的下载路径,MD5sum,SHA1,包描述,Xul-Appid— 应用程序 id,Bugs 信息,Origin,Supported

......
Package: accountsservice
Architecture: amd64
Version: 22.07.5-2ubuntu1.3
Priority: optional
Section: gnome
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian freedesktop.org maintainers <pkg-freedesktop-maintainers@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 500
Depends: dbus (>= 1.9.18), libaccountsservice0 (= 22.07.5-2ubuntu1.3), libc6 (>= 2.34), libglib2.0-0 (>= 2.63.5), libpolkit-gobject-1-0 (>= 0.99)
Recommends: default-logind | logind
Suggests: gnome-control-center
Filename: pool/main/a/accountsservice/accountsservice_22.07.5-2ubuntu1.3_amd64.deb
Size: 69728
MD5sum: a2acf0a225e2c30ccb985a66a4dfb848
SHA1: 1c2b73bc5c72bc44cade5ef6fa444dbea1ea69ec
SHA256: f8ed006eb680e9d8a9b55af88b3786f6892d6d2764586ec4853cf954da119596
SHA512: 9496d225169db5524f7bf9c0fb1cbdfac3ab6261b4725ed56c282d5865678881c8841c539a5b87182306ed66dcc9225a15986083dc72cf7433a30bf601507cc7
Homepage: https://www.freedesktop.org/wiki/Software/AccountsService/
Description: query and manipulate user account information
Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-core, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi
Description-md5: 8aeed0a03c7cd494f0c4b8d977483d7e
......

然后 apt 再将 Packages.gz 里面的信息以某种数据结构形式导入本地数据库以便快速查找,即完成了
“`apt update“` 的一系列操作
其后的 `apt install` 会借助上述 Depends 信息自动安装相关依赖,而源码安装则需要自己配置依赖了,所以现在十分不推荐使用

题外话

二进制安装好像是最近(2016 年)才开始流行的,可能是因为计算和存储能力有了阶段性提升。Python 也采用的是二进制安装与编译安装相结合的方式,二进制安装会从源上下载一个 whl 后缀的文件,whl 格式本质上是一个压缩包,里面包含了 py 文件,以及经过编译的 pyd 文件。使得可以在不具备编译环境的情况下,选择合适自己的 python 环境进行安装。
二进制安装更加简单和快速,不需要用户花费时间和精力去编译源代码,处理编译过程中出现的错误和问题,考虑不同的编译器和命令,也不需要用户管理不同的依赖库。与之相对应的会占用服务器资源(编译源代码),以及存储不同平台的二进制文件。

奇思妙想?

根据上述结论,我们可以通过修改 APT 源中的 Packages.gz 文件,在其中添加 / 修改某些包地址,使其变成恶意文件,如果没有相关签名 / 校验环节,理论上我们可以完成一次供应链攻击。
所以一般来说要使用足够信任的源,具体实现有待测试。
Todo:APT 源实现供应链攻击

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇