linux极简小知识:19、关于RPM包验证和数字证书(数字签名),你应该了解的内容

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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部分:

  1. 最前面的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
复制代码
  1. 文件类型,也就是示例中的c。文件类型分为以下几类:
  • c:配置文件,config file / configuration file
  • d:文档文件/普通文件,documentation
  • g:ghost文件,通常该文件不包含在某个软件中,很少见,ghost file
  • l:授权文件,license file
  • r:自述文件/描述文件,read me
  1. 被修改文件所在绝对路径(包含文件名)。

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 个特点:

  1. 必须找到原厂的公钥文件,然后才能进行安装。【确定公钥(数字证书)的正确】
  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
复制代码

参考

主要参考自Linux RPM包验证和数字证书(数字签名)RPM简介与基本使用

猜你喜欢

转载自juejin.im/post/7018852590871920647