- 网络安全
- 渗透测试
【免费下载链接】metasploitable3
Metasploitable3 is a VM that is built from the ground up with a large amount of security vulnerabilities.
导读:本文以 Metasploitable3 仓库内 apt Cookbook 的 CHANGELOG 为骨架,系统梳理该 cookbook 从 v1.4 到 v7.2 近十年间的能力演进:涵盖apt_update/apt_repository/apt_preference资源逐步迁入 chef-client 的过程、unattended-upgrades自动化安全更新的配置能力扩展、apt-cacher-ng 缓存体系的构建与简化,以及 dpkg 行为与 apt.conf.d 的精细化管理。读完本文,你将能够对照版本号快速定位某一功能的引入时机,并借助仓库内实际的属性定义与 ERB 模板理解其底层实现。
一、CHANGELOG 定位与版本概览
aptcookbook 是 Chef 生态中管理 Debian/Ubuntu 系 APT 包管理器的经典社区 cookbook。仓库内 CHANGELOG.md 记录了 7.2.0(2019-08-05)回溯至 v1.4.0 的全部版本变更;metadata.rb 显示当前版本为7.2.0,维护方为 Chef Software, Inc.,支持 Ubuntu 与 Debian,并声明chef_version '>= 13.3'。
从时间线可清晰地看到三个阶段的演进方向:
| 阶段 | 版本区间 | 主题 |
|---|---|---|
| 起步期 | v1.4.x – v2.x | 资源(LWRP)雏形、APT 缓存、密钥管理、Chef 10/11 兼容 |
| 重构期 | v3.0 – v6.x | 移除旧兼容代码、资源迁入 chef-client、依赖收缩 |
| 成熟期 | 7.0 – 7.2 | 面向 Chef 13.3+、unattended-upgrades 能力持续扩展 |
值得注意的是,该 cookbook 是 Metasploitable3 项目的基础设施依赖之一:在 metasploitable 的 metadata.rb 中声明了depends 'apt', '~> 7.2',而在 开发环境 Vagrantfile 中apt::default被置于 run_list 首位,用于确保任何package资源执行前本地 APT 缓存已是最新。
二、重大变更主线:资源内迁与 Chef 版本门槛
CHANGELOG 中反复出现的「Breaking Change」正是理解该 cookbook 版本迭代的关键:
- 7.0.0(2018-04-06):不再包含
apt_preference资源,因为它已随 Chef Client 13.3 内置;同时 cookbook 要求 Chef 13.3+。若需兼容更老版本,必须固定到 6.X。 - 6.0.0(2017-02-08):
apt_update与apt_repository资源从 cookbook 中移除,二者已随 chef-client 12.9 内置;cookbook 因而要求 Chef 12.9+,兼容老版本需固定到 5.X。 - 4.0.0(2016-06-02):要求 Chef 12,Chef 11 用户需固定到 3.X。
- 3.0.0(2016-03-01):移除 Chef 10 兼容代码,要求 Chef 11+。
这一系列变更体现的工程思路是:通用资源能力沉淀到 chef-client 内核,cookbook 只保留平台相关的编排逻辑。从 default recipe 可以看到 7.2.0 时代apt_update的实际用法——它作为普通资源声明,通过frequency node['apt']['periodic_update_min_delay']控制周期:
apt_update 'periodic' do frequency node['apt']['periodic_update_min_delay'] end同时 recipe 还保留了供其他 recipe 通知使用的execute 'apt-get update'、execute 'apt-get autoremove'与execute 'apt-get autoclean'资源(均为action :nothing惰性声明),这与 README 中「在 template 资源里notifies :run, 'execute[apt-get update]'」的用法互相印证。
关于 Chef 版本门槛的演进,6.1.4 中还修复了name_property与name_attribute的用法,6.1.1 移除了action_class.class_eval用法——这些都是向新版 Chef DSL 收敛的细节佐证。
三、unattended-upgrades 的演进:自动化安全更新的能力地图
无人值守升级是本 cookbook 功能增长最快的区域,CHANGELOG 记录的能力引入顺序如下:
- v2.5.0(2014-08-12):首次加入
unattended-upgradesrecipe。 - 4.0.0(2016-06-02):新增
RandomSleep与Unattended-Upgrade::Origins-Pattern配置支持。 - 7.1.0(2018-09-05):新增
SyslogEnable与SyslogFacility配置支持。 - 7.1.1(2018-10-11):允许自定义无人值守升级通知邮件的发送者(sender)。
- 7.2.0(2019-08-05):允许仅为 unattended upgrades 单独指定 dpkg 选项,并补齐文档与测试。
3.1 配置模板与属性映射
50unattended-upgrades.erb 是能力的最终落地载体,模板将属性逐一渲染为Unattended-Upgrade::*配置节。结合 attributes/default.rb 可得到完整的属性-配置对照:
属性(node['apt']['unattended_upgrades']) | 默认值 | 渲染到的配置项 |
|---|---|---|
allowed_origins | 按node['platform']+ lsb codename 猜测的主源 | Unattended-Upgrade::Allowed-Origins |
origins_patterns | [] | Unattended-Upgrade::Origins-Pattern |
package_blacklist | [] | Unattended-Upgrade::Package-Blacklist |
auto_fix_interrupted_dpkg | false | AutoFixInterruptedDpkg |
minimal_steps | false | MinimalSteps |
install_on_shutdown | false | InstallOnShutdown |
mail/sender | nil/nil | Mail/Sender |
mail_only_on_error | true | MailOnlyOnError |
remove_unused_dependencies | false | Remove-Unused-Dependencies |
automatic_reboot/automatic_reboot_time | false/'now' | Automatic-Reboot/Automatic-Reboot-Time |
dl_limit | nil | Acquire::http::Dl-Limit |
syslog_enable/syslog_facility | false/'daemon' | SyslogEnable/SyslogFacility |
dpkg_options | [] | Dpkg::Options(7.2.0 新增) |
其中 7.2.0 引入的dpkg_options与默认 recipe 管理的 10dpkg-options.erb 形成两层 dpkg 策略:全局 dpkg 行为由node['apt']['confd']['force_conf*']系列控制,而 unattended-upgrades 专属的 dpkg 选项则只作用于自动升级流程,二者互不干扰。这在模板中体现为unless ... empty?的保护条件——属性为空数组时整段Dpkg::Options {}不渲染。
3.2 周期调度层
20auto-upgrades.erb 负责渲染APT::Periodic调度参数:
APT::Periodic::Update-Package-Lists "<%= update_package_lists ? 1 : 0 %>"; APT::Periodic::Unattended-Upgrade "<%= enable ? 1 : 0 %>"; APT::Periodic::RandomSleep "<%= random_sleep %>"; # 仅在设置时输出其中random_sleep(随机休眠秒数,系统默认 1800 秒)用于打散同一时刻的批量升级请求,属于 4.0.0 引入的能力。
3.3 recipe 侧的实现细节
unattended-upgrades.rb 会安装unattended-upgrades包(使用response_file 'unattended-upgrades.seed.erb'预置 debconf 应答),并在配置了mail时额外安装bsd-mailx(通过not_if { node['apt']['unattended_upgrades']['mail'].nil? }做条件判断)。7.2.0 提到的「仅针对 unattended upgrades 指定 dpkg 选项」即由该 recipe 生成的 50unattended-upgrades.erb 末尾的Dpkg::Options段承载,其内嵌注释给出了典型用例:
// Dpkg::Options { // "--force-confdef"; // "--force-confold"; // };即:升级时若配置文件冲突,优先保留已安装版本。README 同时提示:只需安全更新时,可设置origins_patterns为["origin=Ubuntu,archive=trusty-security"](Ubuntu)或["origin=Debian,label=Debian-Security"](Debian)。
四、APT 缓存体系:cacher-ng 与 cacher-client 的演进
缓存代理是 cookbook 的另一条主线,CHANGELOG 记录了其完整演化:
- v1.8.0(2013):允许自定义 cacher-ng 端口,
cacher_port属性被用于 acng.conf。 - v1.10.0:改进 cacher 缓存服务器搜索逻辑。
- v2.1.0(2012):修复
cacher-ng在restrict_environment=true下的失败、cacher-client执行顺序错乱、GPG 长密钥每次运行重复下载等问题。 - v2.2.0:修复多网卡环境混淆
apt::cacher-client的问题。 - 5.0.0(2016-10-14):移除 cacher-client 中的 search 逻辑并重构属性结构——CHANGELOG 明确说明「在 wrapper cookbook 中自行定义搜索语法更好」。这是缓存体系走向简洁化的关键转折。
- 6.0.1(2017-02-27):修复 cacher recipe 并更新测试。
- 6.1.1:修复 cacher-client recipe 中的错误告警日志。
4.1 服务端 recipe
cacher-ng.rb 的职责非常收敛:安装apt-cacher-ng包 → 创建 attributes 中定义的缓存目录(默认/var/cache/apt-cacher-ng,属主apt-cacher-ng)→ 渲染 acng.conf.erb → 通知重启service[apt-cacher-ng]。
acng.conf.erb 将属性映射到两个关键指令:
CacheDir: <%= node['apt']['cacher_dir'] %> Port:<%= node['apt']['cacher_port'] %>其余大量指令(Remap-*仓库映射、ExTreshold过期天数、ReportPage统计页、VfilePattern/PfilePattern文件匹配规则等)以模板内注释形式保留,便于按需启用。README 提示可通过http://{hostname}:3142/acng-report.html查看使用统计报告。
4.2 客户端 recipe
cacher-client.rb 实现了 5.0.0 之后的「显式声明」模型:不再自动搜索缓存服务器,而是读取node['apt']['cacher_client']['cacher_server']哈希。若哈希为空,则删除/etc/apt/apt.conf.d/01proxy并给出Chef::Log.warn告警;否则渲染 01proxy.erb:
Acquire::http::Proxy "http://<%= @server['host'] %>:<%= @server['port'] %>"; Acquire::https::Proxy "DIRECT"; # 或指向代理,取决于 proxy_ssl Acquire::<type>::Proxy::<bypass> "DIRECT"; # cache_bypass 逐个直连README 给出的完整哈希示例为host、port、proxy_ssl、cache_bypass四个键,其中cache_bypass用于绕过那些与缓存代理不兼容的仓库(如download.oracle.com走 http 直连、nginx.org走 https 直连)。compiletime属性(默认false)可强制 cacher-client 在编译期先行生效,适合对外网仓库访问受限的节点;6.1.4 恢复的ignore_failure true亦与编译期更新场景相关。
此外,v2.1.0 修复的「GPG 长密钥每次运行都下载」与 v2.8.x 系列对 keyserver(含 URL 与裸主机名、端口 80、key_proxy属性)的支持,共同勾勒出 apt_repository 时代密钥管理的完整能力面。
五、dpkg 行为与 apt.conf.d 的精细化管理
CHANGELOG 展示了 APT 全局行为从「写死」到「属性化」的过程:
- v1.5.0(2013):设置 apt 代理时应保持 https 直连。
- 5.1.0(2017-02-01):新增
/etc/apt/apt.conf.d/10dpkg-options文件管理,可通过属性调节 dpkg 处理包安装时的提示;并提示 Chef 12.19+ 会自动抑制包提示。 - 6.1.3(2017-07-19):修复 10dpkg-options 文件中的配置命名空间。
对应实现集中在 default recipe 与两个模板中:
- 10dpkg-options.erb 渲染
DPkg::Options {}块,由node['apt']['confd']['force_confask'|'force_confdef'|'force_confmiss'|'force_confnew'|'force_confold']五个布尔属性(默认均false)决定是否注入对应的--force-*参数。典型组合是force_confdef+force_confold:冲突时采用已安装配置且不询问。 - 10recommends.erb 渲染
APT::Install-Recommends与APT::Install-Suggests,分别由install_recommends(默认true)与install_suggests(默认false)控制——对应 v2.9.0 的「Enable installation of recommended or suggested packages」条目。
另外 v2.9.1 在 default.rb 中加入apt-transport-https包,7.1.0 又加入gnupg与dirmngr——后者在 default recipe 中体现为package %w(apt-transport-https gnupg dirmngr)一行,为「安全仓库(HTTPS 与签名验证)」提供底座。
六、平台适配、幂等性与工程化演进
CHANGELOG 同时记录了大量的健壮性修复,可作为排查历史问题的索引:
- 平台与存在性检查:v2.2.1 按平台检查后再执行 apt 专属命令;v2.3.0 提供绕过 apt 存在性检查的途径;v2.5.3 改进默认设置并兼容非 Linux 平台;3.0.0 起 default recipe 不再在非 Debian 系系统上创建
/etc/apt/目录;4.0.1 修复向非 Debian/Ubuntu 节点添加 cookbook 时的 chef run 失败。底层支撑是 helpers.rb 中的apt_installed?(which('apt-get')非空判断)与which方法——后者在 PATH 为 nil 时置为空串(对应 v2.3.10 的 COOK-4512 修复)。 - 幂等性:v1.4.6 使 apt_repository 感知
update-success-stamp;v1.4.8 修复 http 密钥场景下 repository LWRP 的幂等性;v1.5.2 修复 apt key 检查的幂等性;v2.1.0 修复长 GPG 密钥重复下载;6.0.0 要求apt_preference必须提供pin_priority以防写出需手动删除的坏 preference 文件。 - 测试与 CI:从 v1.4.8 的 test-kitchen 支持、v2.1.0 的 ChefSpec 覆盖扩展,到 5.1.0 将集成测试转为 InSpec、7.2.0 移除已内置资源的测试并在 Chef 15 + Chef Workstation 上测试——测试策略始终跟随资源内迁同步收缩。平台测试矩阵在 7.2.0 中移除 Ubuntu 14.04 / Debian 8、新增 Debian 10,恰好与 Metasploitable3 主目标 Ubuntu 14.04 的「老平台 + 新 cookbook」组合形成对照。
- 文件与目录细节:v2.6.1 清理无
.pref扩展名的旧 preference 文件;v1.6.0 修正/etc/apt/preferences.d/目录权限;v1.5.0 创建该目录。default recipe 中还创建/var/cache/local与/var/cache/local/preseeding目录(对应 README 中「本地预置缓存目录」的说明)。
七、在 Metasploitable3 中的落地方式
在 Metasploitable3 中,apt cookbook 虽不直接制造漏洞,却是构建易受攻击 VM 的「地基」。从源码可见三处关键集成:
- 依赖声明:metasploitable 的 metadata.rb 中
depends 'apt', '~> 7.2',与 cookbook 当前版本 7.2.0 精确对齐。 - 运行顺序:开发环境 Vagrantfile 将
apt::default排在iptables、metasploitable::*等所有 recipe 之前,确保后续package资源(如php_545.rb中大量的apt-get install编译依赖)执行时缓存已更新。 - 收敛清理:run_list 末尾的
metasploitable::clear_cache(见 clear_cache.rb)删除/var/chef目录,避免 VM 内残留敏感信息——这与 CHANGELOG 中反复出现的「幂等性」「清理」主题一脉相承。
结语
透过 CHANGELOG.md 这面镜子,可以提炼出该 cookbook 的三条演进法则:能力上移(资源迁入 chef-client)、配置外置(一切行为皆属性)、测试同步(每个新功能都伴随 InSpec/ChefSpec 覆盖)。对于使用 Metasploitable3 的读者,理解apt的版本与属性体系,既是排查 VM 构建问题的基础,也是阅读metasploitable各 recipe 中大量apt-get操作的前置知识。如需查阅完整属性清单,可直接深入 attributes/default.rb;需要自定义缓存代理或自动升级策略时,则以上述各 recipe 与 ERB 模板为起点进行覆盖即可。
- 网络安全
- 渗透测试
【免费下载链接】metasploitable3
Metasploitable3 is a VM that is built from the ground up with a large amount of security vulnerabilities.
相关推荐
Logrus CHANGELOG 解读:从 v0.7 到 v1.8 的演进脉络与核心 API 变迁
Logrus CHANGELOG 解读:从 v0.7 到 v1.8 的演进脉络与核心 API 变迁 Logrus 是 Go 生态中最具影响力的结构化日志库之一,
开发工具云原生微服务JAX CHANGELOG 深度解读:从 0.4.31 版本回看 jax 与 jaxlib 的演进脉络
JAX CHANGELOG 深度解读:从 0.4.31 版本回看 jax 与 jaxlib 的演进脉络 导读 本文以仓库根目录的 CHANGELOG.md ht
机器学习深度学习Dokku Debian 包安装完全指南:apt 仓库配置、debconf 无人值守安装与源码级原理
Dokku Debian 包安装完全指南:apt 仓库配置、debconf 无人值守安装与源码级原理 导读 本文聚焦 Dokku(Docker powered
云原生DevOps后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考