GPG 签发并验证rpm和yum repo
https://blog.packagecloud.io/eng/2014/11/24/howto-gpg-sign-verify-rpm-packages-yum-repositories/
本文将展示GPG的签名如何因应用于RPM为文件和YUM仓库的,以及我们如何生成和验证这些签名.
本文还将介绍python库pygpgme,以及我们如何利用它在RPM以及YUM的仓库中验证GPG签名。
问什么需要GPG签名
我们用GPG签名了我们发布的数据,消费者获取到我们的数据,也获取到我们的数据签名,可使用我们的签名验证我们的数据未经人篡改过,是我们提供的原始数据。
RPM包和YUM repo metadata 都可以通过GPG来签名。
Pygpgme
Pygpgme实际上就是打包了GPGME的功能的一个python库,该库可以更直接的使用GPG。
GPGME提供了一些非常便利的接口去获取到GPG key, 加密数据,解密数据等。
YUM是用python开发的,所以,YUM大量使用这个库去验证RPM和YUM repo Metabata中的数字信息。
RPM GPG 签名
RPM文件格式是一种二进制文件格式,其包含:
- 一个被称为‘lead’的数据结构,但是多数已经被‘header’数据结构所取代
- 一个包含GPG签名的签名部分,可用于验证这个从创建后并没有被篡改过。
- 一个头部,包含了一系列索引,用来存储关于RPM包和文件的内部信息
- CPI0压缩归档后的gzip,包含会被写到文件系统的真实的文件
一个RPM文件的GPG签名是基于header和CPIO计算生成的,然后存储在签名部分。
我们可以用rpmsign或者rpm --addsign去签名RPMs。 例如你的有一个rpm为filename.rpm,你的SIGN Key为
Cara Wang <[email protected]>
则你的.rpmacros为
%_gpg_name Cara Wang <[email protected]>
则我们可以对该rpm包签名
rpm --addsign filename.rpm
RPM Repo metadata GPG 签名
签署repo metadata的目的和我们签署RPM的目的是一样的。经过验证防止篡改。
createrepo在创建repo时,不会自动为repo metadata生成GPG签名,我们可以使用命令为其生成一个分开的GPG签名。
假设我们有一个repo metadata为repomd.xml,则我们可以运行以下指令
gpg --detach-sign --armor repodata/repomd.xml
这个命令会生成一个为‘repodata/repomd.xml.asc’的文件,该文件中包含了一个GPG签名的ASCII版本。
通过repo config的某些选项配置,YUM客户端会主动的请求这个文件并尝试去验证这个签名。
使能RPM和metadata的签名认证
为了能很好的验证GPG keys, 我们必须在客户端做以下几件事
- 必须安装pygpgme包,这样yum才能验证GPG签名。如果不装这个包,yum会跳过GPG签名的验证。安装这个包,我们需要安装EPEL repo.
在RHEL6/CentOS6及以后系统,默认pygpgme是和yum一起安装的。 - YUM repos必须以.repo的文件存在,并且在/etc/yum.repos.d/下,如
/etc/yum.repos.d/my_stuff.repo
- 在repo文件中,有选择的使能以下选项
而具体的GPG keys,我们可以直接指定文件或者URL。 如gpgcheck=1 去使能每个RPM文件的GPG验证 repo_gpgcheck=1 去使能YUM repo metadata的GPG验证
或者gpgkey=https://packagecloud.io/gpg.key
当指定为URL时,YUM客户端会自动下载导入。gpgkey=https://packagecloud.io/gpg.key https://some-other-website.com/another_gpg.key
总结
生成和验证GPG签名对建立包本身和存储包的repo的认证是很重要的。
确认你要安装的包是供应商提供包,你获取包的仓库是供应商提供的仓库,是保证你安装的包是安全的唯一方法。
给RPM和YUM repo签发GPG和验证GPG不是特别简单,但也并不复杂。尝试签发和验证你的GPG吧。
上一篇: GPG加密解密与实际应用
下一篇: GNU常用命令