小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
RPM 提供了对软件包的检测机制,用于检测文件是否完整(比如文件误删、是否修改了文件中的数据等)、文件内容是否被恶意篡改等。
RPM提供两种检测方式:
-
RPM 包校验:将已安装文件和 /var/lib/rpm/ 目录下的数据库内容进行比较,确定文件内容是否被修改/误删或数据丢失。
-
RPM 包数字证书校验:用来校验 RPM 包本身是否被修改。
RPM 包校验
包验证命令
RPM 包校验可用来判断已安装的软件包(或文件)是否被修改。
包校验常用的命令有如下几种。
-
rpm -Va
:校验系统中已安装的所有软件包。 -
rpm -V <package_name>
校验指定的已安装的某个包中的文件。 -
rpm -Vf <file_name>
校验某个文件是否被修改。 -
rpm -Vp <package_full_name>
校验指定的 rpm 包。
-V|--verify
表示校验/验证 RPM 包中的文件。
包验证示例
比如,以校验 mysql 软件包中所有的安装文件是否被篡改为例:
mysql对应的包名为 mysql-community-server。mysqld为服务名,不能用于验证
# rpm -V mysqld
package mysqld is not installed
# rpm -V mysql-community-server
#
复制代码
执行后无任何提示信息,表明所有 mysql-community-server 软件包安装的文件均未改动过,还和从原软件包安装的文件一样。
如果修改 my.cnf 配置文件,再次验证,则会显示出修改的文件:
# rpm -V mysql-community-server
S.5....T. c /etc/my.cnf
#
复制代码
这和直接验证 /etc/my.cnf 文件是否被篡改是一样的。
# rpm -Vf /etc/my.cnf
S.5....T. c /etc/my.cnf
复制代码
包验证信息的说明
包验证显示文件修改的信息可以分为3部分:
- 最前面的8个字符(
S.5....T
)都属于验证信息,即改变的因素,各个字符的含义如下:
- S:文件大小是否改变。—— (file Size differs)文件的容量大小
- M:文件的类型或文件的权限(rwx)是否改变。—— (Mode differs)文件的类型或属性,以及可执行参数
- 5:文件MD5校验和是否改变(即文件内容是否改变)。—— (MD5 sum differs)MD5这一加密防被黑的属性
- D:设备的主从代码是否改变。—— (Device major/minor number mis-match)设备名称
- L:文件路径是否改变。—— (readLink(2)path mis-match)Link属性
- U:文件的属主(所有者)是否改变。—— (User ownership differs)文件的拥有者
- G:文件的属组是否改变。—— (Group ownership differs)文件所属用户组
- T:文件的修改时间是否改变。—— (mTime differs)文件的建立时间
- P:caPabilities
- .:若相关项没发生改变,用 . 表示。
如果一个文件全部信息都改过,显示会是:
SM5DLUGT c filename
复制代码
- 文件类型,也就是示例中的c。文件类型分为以下几类:
- c:配置文件,config file / configuration file
- d:文档文件/普通文件,documentation
- g:ghost文件,通常该文件不包含在某个软件中,很少见,ghost file
- l:授权文件,license file
- r:自述文件/描述文件,read me
- 被修改文件所在绝对路径(包含文件名)。
S.5....T. c /etc/my.cnf
表达的完整含义是:配置文件 /etc/my.cnf 的大小、内容、修改时间被修改过。
通常对配置文件进行修改都是很正常的。也就是,并非所有对文件做修改的行为都是恶意的。但是如果提示对二进制文件做了修改,则要特别注意。
RPM数字证书验证(数字签名)
RPM包校验可以验证一个RPM包所安装的文件,但是,我们需要在安装前就能够验证,RPM包本身是否有问题,即.rpm包的验证,这就要用到PRM数字证书验证,也就是数字签名验证。
RPM 包校验本质就是将现有安装文件与最初使用 RPM 包安装时的初始文件进行对比,如果有改动则提示给用户,它验证的是已经安装的文件是否被修改,因此这种方式无法验证 RPM 包本身被修改的情况。
rpm可以使用数字签名来判断待安装的软件是否有问题。数字证书,又称数字签名,由软件开发商在发布软件时,进行加密签名。Linux系统安装该软件开发商的公钥(数字证书),在安装时就可以通过公钥进行签名验证(验签),若 RPM 包做了任何修改或篡改,数字签名验证都会失败,就会给出提示信息,软件无法安装。
linux下最常使用的是GPG加密的公钥。如果想要安装某个软阿金,则需要将该发布商的GPG公钥先安装在自己的系统上;在安装软件时,就会对软件的数字签名进行验证(私钥签名,公钥验签),验证通过就可以直接安装;不通过则显示提示信息。
使用数字证书验证 RPM 包的方法具有如下 2 个特点:
- 必须找到原厂的公钥文件,然后才能进行安装。【确定公钥(数字证书)的正确】
- 安装 RPM 包会提取 RPM 包中的签名信息,然后和本机安装的原厂数字证书进行验证。如果验证通过,则允许安装;如果验证不通过,则不允许安装并发出警告。
查看已安装的数字证书(公钥包)
查看已安装的gpg数字,可以使用如下的命令:
# rpm -qa|grep gpg-pubkey
gpg-pubkey-bexxxxcf-56xxxx8c
gpg-pubkey-35xxxxe5-52xxxx84
gpg-pubkey-1bxxxxdb-51xxxxa9
gpg-pubkey-7fxxxx91-46xxxx7f
gpg-pubkey-f4xxxxb5-53xxxx4b
gpg-pubkey-d3xxxx96-57xxxxd3
gpg-pubkey-50xxxxf5-5cxxxxfb
复制代码
导入一个数字证书(公钥)——安装数字证书
Centos在安装后,默认官方的数字证书会放在 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
中(不同版本可能会为 CentOS-6、CentOS-8)。
查看该目录下,还可以看到其他的证书文件,如下:
# ls -al /etc/pki/rpm-gpg/
total 56
drwxr-xr-x. 2 root root 4096 Oct 7 16:38 .
drwxr-xr-x. 12 root root 4096 Apr 11 2018 ..
-rw-r--r-- 1 root root 1690 Nov 23 2020 RPM-GPG-KEY-CentOS-7
-rw-r--r-- 1 root root 1004 Nov 23 2020 RPM-GPG-KEY-CentOS-Debug-7
-rw-r--r-- 1 root root 1690 Nov 23 2020 RPM-GPG-KEY-CentOS-Testing-7
-rw-r--r-- 1 root root 1662 Sep 5 01:37 RPM-GPG-KEY-EPEL-7
-rw-r--r-- 1 root root 983 Nov 15 2016 RPM-GPG-KEY-microsoft-prod
-rw-r--r-- 1 root root 27824 Apr 25 2019 RPM-GPG-KEY-mysql
复制代码
导入证书:rpm --import
是导入证书的命令。如:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
复制代码
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
证书默认已经安装。我们测试安装另外一个证书,然后通过对比查找安装前后的证书:
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7 # 安装证书
# rpm -qa|grep gpg-pubkey # 查找安装的证书
gpg-pubkey-bexxxxcf-56xxxx8c
gpg-pubkey-8fxxxxbd-53xxxx51 # 新安装的证书
gpg-pubkey-35xxxxe5-52xxxx84
gpg-pubkey-1bxxxxdb-51xxxxa9
gpg-pubkey-7fxxxx91-46xxxx7f
gpg-pubkey-f4xxxxb5-53xxxx4b
gpg-pubkey-d3xxxx96-57xxxxd3
gpg-pubkey-50xxxxf5-5cxxxxfb
复制代码
可以看到新的数字证书已经安装,当安装rpm包时,如果需要验证包的签名,就可以使用对应的证书进行验签,通过则安装,反之则不能安装rpm包(系统报错)
还可以通过 location 命令查找其他证书文件:
# locate GPG-KEY /etc/pki/fwupd/GPG-KEY-Hughski-Limited /etc/pki/fwupd/GPG-KEY-Linux-Foundation-Firmware /etc/pki/fwupd/GPG-KEY-Linux-Vendor-Firmware-Service /etc/pki/fwupd-metadata/GPG-KEY-Linux-Foundation-Metadata /etc/pki/fwupd-metadata/GPG-KEY-Linux-Vendor-Firmware-Service /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 /etc/pki/rpm-gpg/RPM-GPG-KEY-microsoft-prod /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 复制代码
验证软件包合法性
可以通过直接执行下面的命令,直接对软件包进行数字证书验证。
rpm {-K|--checksig} PACKAGE_FILE
复制代码
比如:
# rpm -K mysql-community-server-8.0.26-1.el7.x86_64.rpm
mysql-community-server-8.0.26-1.el7.x86_64.rpm: (sha1) dsa sha1 md5 gpg OK
复制代码
数字证书包
可以看到,对数字证书的管理也是通过rpm包(软件)的形式。
可以通过rpm命令查询数字证书的包的详细信息:
# rpm -qi gpg-pubkey-8fae34bd-538f1e51
Name : gpg-pubkey
Version : 8fae34bd
Release : 538f1e51
Architecture: (none)
Install Date: Thu 14 Oct 2021 04:13:24 PM CST
Group : Public Keys
Size : 0
License : pubkey
Signature : (none)
Source RPM : (none)
Build Date : Wed 04 Jun 2014 09:25:37 PM CST
Build Host : localhost
Relocations : (not relocatable)
Packager : CentOS-7 Testing (CentOS 7 Testing content) <[email protected]>
Summary : gpg(CentOS-7 Testing (CentOS 7 Testing content) <[email protected]>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.11.3 (NSS-3)
......省略,此处为公钥的内容
-----END PGP PUBLIC KEY BLOCK-----
复制代码
卸载数字证书包:
rpm -e gpg-pubkey-8fae34bd-538f1e51
复制代码