语境:在 Debian 上,强化 PHP 时我禁用并删除了一些未使用的 PHP 模块:例如,对于 wddx,我删除了:
- /etc/php/7.3/*/conf.d/20-wddx.ini
- /etc/php/7.3/mods-available/wddx.ini
- /usr/share/php7.3-xml/xml/wddx.ini
- /usr/lib/php/*/wddx.so
当我升级时,PHP 模块重新出现在 /usr/share/php7.3-xml/xml/wddx.ini 和 /usr/lib/php/*/wddx.so 中,尽管 dpkg 没有在 /etc 中正确添加“启用”配置(感谢维护者或 dpkg 检查这一点!):
Not replacing deleted config file /etc/php/7.3/mods-available/wddx.ini
WARNING: Module wddx ini file doesn't exist under /etc/php/7.3/mods-available
问题:有没有办法,也许使用 dpkg-divert 或本地 dpkg 触发器,告诉 dpkg 不要再次写入某些文件或在写入后删除它们?
附言
- php7.3-xml 中打包了多个 PHP 模块,我需要其中一个,因此无法删除整个 Debian 包。
- 由于未启用 PHP 模块,攻击面已经大大降低,删除 .so 文件也是一种改进,可以阻碍人类攻击者,甚至可能击败愚蠢的自动恶意软件脚本,即使具有 root 权限 - 显然它应该只是全球防御的一部分。
- 可以在升级后手动删除这些文件或使用配置管理工具(Ansible,Puppet,Docker ......),问题是关于使用 dpkg 进行集成的方法。
答案1
我不知道有一个简单的方法可以告诉 APT 或 DPKG 或其他数据包管理器“不要在这里写入一些文件”,因为该管理器处理的是数据包而不是未压缩的文件。
如果模块被禁用,phpdismod
那么它们就不会在内存中充电,但我同意你的观点,最好避免将它们从文件系统中排除。
也许更好的方法是使用脚本或 ansible 作业来删除不必要的文件。无论如何,答案并不在数据包管理器端!
答案2
通常,apt 不会替换在更新过程中修改的配置文件。如果您不修改软件包的配置文件,它们将被新版本替换;如果您更改了配置文件,它们将保持不变,而较新的配置版本将与扩展一起放置.dpkg-dist
。
因此,如果您想绝对确保您的配置保持不变,只需更改服务的主配置,使其不使用 -available/-enabled 目录。提供这些目录是为了方便没有经验的用户,但不是必需的,其他发行版不使用此类目录。
答案3
您可以使用此--remove
选项删除之前设置的转移。例如:
sudo dpkg-divert --remove /usr/share/php7.3-xml/xml/wddx.ini
请记住,dpkg-divert 是一种全局机制,会影响系统上安装的所有软件包。如果您想控制特定软件包修改哪些文件,您可能需要使用其他方法,例如使用本地 dpkg 触发器。
通常,您可以使用 dpkg-divert 命令来防止 dpkg 在软件包安装或升级期间覆盖某些文件。如果您自定义了某些配置文件并且不希望它们被软件包更新覆盖,则此功能很有用。
要使用 dpkg-divert,您可以指定要转移的文件或目录,并指定应放置该文件的目标位置。例如,要将 /usr/share/php7.3-xml/xml/wddx.ini 文件转移到其他位置,您可以使用以下命令:
sudo dpkg-divert --divert /usr/share/php7.3-xml/xml/wddx.ini.dpkg-new --rename /usr/share/php7.3-xml/xml/wddx.ini
这将创建一个名为 wddx.ini.dpkg-new 的 wddx.ini 文件的副本,并且对 wddx.ini 文件的任何将来更新都将被写入 .dpkg-new 文件。