RPM 包文件完整性

为了确保完整性,RPM 包包含一个摘要比如 MD5 或 SHA1),常常经过数字签名。数字签名的包需要用公共密钥进行检验。使用 rpm 的 --checksig简写为 -K)选项检查 RPM 包文件的完整性。添加 -v 选项以生成更详细的输出常常有帮助。清单 20 给出的示例检查 vim-enhanced RPM 的完整性。

清单 20. 检查 vim-enhanced 包文件的完整性


[root@echidna ~]# rpm -vK vim-enhanced-7.2.411-1.fc12.x86_64.rpm
vim-enhanced-7.2.411-1.fc12.x86_64.rpm:
    Header V3 RSA/SHA256 signature: OK, key ID 57bbccba
    Header SHA1 digest: OK (f9a199545a515f7ff0716729768b41eb68fe29a8)
    V3 RSA/SHA256 signature: OK, key ID 57bbccba
    MD5 digest: OK (d4045f1f72d48073e3f401ee9d1f71cf)

可能会产生下面的输出:

V3 DSA signature: NOKEY, key ID 16a61572

这意味着这个包是经过签名的,但是您的 RPM 数据库中没有所需的公共密钥。注意,以前版本的 RPM 可能以不同的方式提供检验。

如果包是经过签名的,您希望根据签名检验它,就需要找到适当的签名文件并把它导入 RPM 数据库。应该首先下载密钥,然后检查它的指纹,最后使用 rpm --import 命令导入它。更多信息参见 RPM 手册页。还可以在 RPM 主页上找到关于签名的二进制代码的更多信息见 参考资料 中的链接)。

检验安装的包

与检查 rpm 的完整性一样,还可以使用 rpm -V 检查已安装的文件的完整性。这个步骤确保从 rpm 安装文件之后文件没有修改过。如清单 21 所示,如果包仍然良好,这个命令没有输出;但是,可以添加 -v 选项以产生更详细的输出。

清单 21. 检验已安装的 vim-common 包


[ian@echidna ~]$ rpm -V vim-common

现在,我们作为根用户删除 /usr/bin/xxd 并把 /usr/share/vim/vim72/syntax/bindzone.vim 替换为 /bin/bash。然后再次检查。结果见清单 22。

清单 22. 篡改 vim-common 包


[root@echidna ~]# rpm -qf /usr/bin/xxd /usr/share/vim/vim72/syntax/bindzone.vim
vim-common-7.2.411-1.fc12.x86_64
vim-common-7.2.411-1.fc12.x86_64
[root@echidna ~]# rm /usr/bin/xxd
rm: remove regular file `/usr/bin/xxd'? y
[root@echidna ~]# cp /bin/bash /usr/share/vim/vim72/syntax/bindzone.vim
cp: overwrite `/usr/share/vim/vim72/syntax/bindzone.vim'? y
[root@echidna ~]# rpm -V vim-common
missing     /usr/bin/xxd
S.5....T.    /usr/share/vim/vim72/syntax/bindzone.vim

输出表明对 /usr/share/vim/vim72/syntax/bindzone.vim 文件的 MD5 和、文件大小和 mtime 检查失败了。解决这个问题的一种方法是删除这个包,然后重新安装,依赖于 vim-common 的其他已安装包仍然可以正常运行。这个解决方案使用 rpm 的 --force 选项或 yum 的 reinstall 功能强制重新安装。清单 23 演示如何用 yum 重新安装,然后检查包现在是否良好,检查删除的文件是否已经恢复了。

清单 23. 重新安装 vim-common 包


[root@echidna ~]# yum reinstall vim-common
Loaded plugins: presto, refresh-packagekit
Setting up Reinstall Process
Resolving Dependencies
--> Running transaction check
---> Package vim-common.x86_64 2:7.2.411-1.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================
 Package            Arch           Version                     Repository       Size
=====================================================================================
Reinstalling:
 vim-common         x86_64         2:7.2.411-1.fc12            updates         6.0 M

Transaction Summary
=====================================================================================
Remove        0 Package(s)
Reinstall     1 Package(s)
Downgrade     0 Package(s)

Total download size: 6.0 M
Installed size: 17 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
updates/prestodelta                                           | 969 kB     00:00     
Processing delta metadata
Package(s) data still to download: 6.0 M
vim-common-7.2.411-1.fc12.x86_64.rpm                          | 6.0 MB     00:01     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
  Installing     : 2:vim-common-7.2.411-1.fc12.x86_64                            1/1 

Installed:
  vim-common.x86_64 2:7.2.411-1.fc12                                                 

Complete!
[root@echidna ~]# rpm -V vim-common
[root@echidna ~]# ls /usr/bin/xxd
/usr/bin/xxd

如果需要更有力的措施

包管理系统通常可以恢复包。但是,如果删除了包中的重要文件,重新安装包但不删除无法解决问题,那么可能需要在重新安装之前删除包。对于这种情况,可能希望删除现有的拷贝并重新安装,但是不希望卸载和重新安装依赖它的所有包。为此,在删除包时,可以使用 rpm 命令的 --nodeps 选项绕过依赖关系检查。在清单 24 中,删除了 vim-common 中的 /usr/bin/xxd 文件,然后演示如何恢复这个包。

清单 24. 用 rpm 更新包


[root@echidna ~]# rm /usr/bin/xxd
rm: remove regular file `/usr/bin/xxd'? y
[root@echidna ~]# # Oops! we needed that file
[root@echidna ~]# rpm -Fvh vim-common-7.2.411-1.fc12.x86_64.rpm 
[root@echidna ~]# ls /usr/bin/xxd
ls: cannot access /usr/bin/xxd: No such file or directory
[root@echidna ~]# # Oh! Freshening the package didn't replace the missing file
[root@echidna ~]# rpm -e vim-common
error: Failed dependencies:
vim-common = 2:7.2.411-1.fc12 is needed by (installed) vim-enhanced-2:7.2.411-1.f
c12.x86_64
[root@echidna ~]# # Can't remove vim-common because vim-enhanced needs it
[root@echidna ~]# rpm -e --nodeps vim-common
[root@echidna ~]# # Bypassing the dependency check allowed removal
[root@echidna ~]# rpm -Uvh vim-common-7.2.411-1.fc12.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:vim-common             ########################################### [100%]
[root@echidna ~]# # Update (or install) vim-common again
[root@echidna ~]# ls /usr/bin/xxd
/usr/bin/xxd
[root@echidna ~]# # And /usr/bin/xxd is back

现在,如果发生意外或一般的更新失败,您可以以几种方法更新或修复。注意,在安装 RPM 时也可以绕过依赖关系检查,但是这通常不是好做法。


相关内容