阅读:0

Linux RPM包验证和数字证书(数字签名)

系统中安装的 RPM 包数量众多,而每个 RPM 包中都包含大量的文件,万一某个文件被误删,或误修改某个文件中的数据,又或者有人恶意修改了某个文件,我们是否有监控和检测手段发现这些问题呢?

这时候,必须使用 RPM 包校验来确认文件是否被动过手脚。校验其实就是把已经安装的文件和 /var/lib/rpm/ 目录下的数据库内容进行比较,以确定是否有文件被修改。校验的格式如下:

[root@localhost ~]# rpm -Va

选项:
  • -Va:校验本机已经安装的所有软件包

[root@localhost ~]# rpm -V 已安装的包名

选项:
  • -V:校验指定RPM包中的文件(verity)

[root@localhost ~]# rpm -Vf 系统文件名

选项:
  • -Vf:校验某个系统文件是否被修改

我们来查询一下 apache 服务是否被人做过手脚,命令如下:

[root@localhost -]# rpm -V httpd

没有任何提示信息,恭喜,你的 apache 服务没有做过任何修改,是"原包装"的。

如果 apache 包中的文件被修改过了,则是什么样的?我们修改一下 apache 的配置文件 /etc/httpd/conf/httpd.conf。其实对这个文件做任何更改验证都会变化,但是我们还没有学习 apache 配置,为了防止 apache 崩溃,我们只修改 apache 的默认网页文件。按照如下格式修改:

[root@localhost ~]#vim /etc/httpd/conf/httpd.conf
...省略部分内容...
Directorylndex index.html index.html.var index.php
#这句话是定义apache可以识别的默认网页文件名。在后面加入了index.php
#这句话大概有400行左右
…省略部分内容...

保存退出后,我们再来验证一下。

[root@localhost ~]# rpm -V httpd
S.5....T. c /etc/httpd/conf/httpd.conf
验证内容 文件类型 文件名

出现了提示信息,我们来解释一下:最前面共有 8 个信息,它们是表示验证内容的;文件名前面的 c 表示这是一个配置文件(configuration file);最后是文件名。

验证内容中的 8 个信息的具体含义如下。
  • S:文件大小是否改变。
  • M:文件的类型或文件的权限(rwx)是否改变。
  • 5:文件MD5校验和是否改变(可以看成文件内容是否改变)。
  • D:设备的主从代码是否改变。
  • L:文件路径是否改变。
  • U:文件的属主(所有者)是否改变。
  • G:文件的属组是否改变。
  • T:文件的修改时间是否改变。

apache 配置文件的文件类型是 c,那么,还有哪些文件类型呢?
  • c:配置文件(configuration file)。
  • d:普通文档(documentation)。
  • g:"鬼"文件(ghost file),很少见,就是该文件不应该被这个RPM包包含。
  • l:授权文件(license file)。
  • r:描述文件(read me)。

刚刚 apache 配置文件的验证结果如下:

[root@localhost ~]# rpm -V httpd
S.5....T.c /etc/httpd/conf/httpd.conf

文件大小改变了,文件的内容改变了,文件的修改时间也改变了。也就是说,如果出现了相应的字母,则代表相关项被修改;如果只出现了".",则代表相关项没被修改。

是不是所有的文件在验证的时候都不能被修改?当然不是,一般情况下,配置文件被修改都是正常修改;但如果是二进制文件被修改,大家就要小心了。当然,如果能确定是自己修改的,则另当别论。

数字证书

刚刚的校验方法只能对已经安装的 RPM 包中的文件进行校验,但如果 RPM 包本身就被动过手脚,那么 RPM 包校验就不能解决问题了,必须使用数字证书验证。

数字证书,也叫数字签名,它由软件开发商直接发布。只要安装了这个数字证书,如果 RPM 包被进行了修改,那么数字证书验证就不能匹配,软件也就不能安装。

数字签名,可以想象成人的签名,每个人的签名都是不能模仿的(厂商的数字证书是唯一的),只有我认可的文件才会签名(只要是厂商发布的软件,都符合数字证书验证);如果我的文件被人修改了,那么我的签名就会变得不同(如果软件改变,数字证书就会改变,从而通不过验证。当然,现实中人的手工签名不会直接改变,所以数字证书比手工签名还要可靠)。

数字证书有如下特点:
  • 首先必须找到原厂的公钥文件,然后才能进行安装。
  • 再安装 RPM 包,会去提取 RPM 包中的证书信息,然后和本机安装的原厂证书进行验证。
  • 如果验证通过,则允许安装;如果验证不通过,则不允许安装并发出警告。

数字证书在 CentOS 6.3 的第一张光盘中,它默认也会放在系统中。

[root@localhost ~]# ll /mnt/cdrom/RPM-GPG-KEY-CentOS-6
-r--r--r-- 2 root root 1706 7月2 04:21 /mnt/cdrom/RPM-GPG-KEY-CentOS-6
#光盘中的数字证书位置
[root@localhost ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
-rw-r--r--.1 root root 1706 6 月 26 17:29 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#系统中的数字证书位置

安装数字证书的命令如下:

[root@localhost ~]# rpm --import/efc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

选项:
  • --import:导入数字证书

查询系统中安装好的数字证书的命令如下:

[root@localhost ~]# rpm -qa|grep gpg-pubkey
gpg-pubkey-c105b9de-4e0fd3a3

可以看到系统中已经有一个装好的数字证书了。我安装的所有 RPM 包都会和这个数字证书进行验证,如果验证不能通过就会报错,当然也就不能安装了。这些验证过程是系统自动进行的,大家只需安装好原厂的数字证书即可。

当然,这个数字证书也是一个 RPM 包,所以既可以查询数字证书的详细信息,也可以卸载这个数字证书,命令如下:

[root@localhost ~]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3
#查询数字证书包的详细信息
Name : gpg-pubkey
Relocations: (not relocatable)
Version : c105b9de Vendor: (none)
Release : 4e0fd3a3 Build Date: 2012年11月12日 星期一 23时05分20秒
Install Date: 2012年11月12日星期一23时05分20秒 Build Host: local host
Group : Public Keys
Source RPM: (none)
Size : 0
License: pubkey
…省略部分输出…
-----END PGP PUBLIC KEY BLOCK----

要想卸载数字证书,可以使用 -e 选项。当然,我们并不推荐卸载。

[root@localhost ~]# rpm -e gpg-pubkey-c105b9de-4ead3a3