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 

则你的.rpmacros为

%_gpg_name  Cara Wang 

则我们可以对该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文件中,有选择的使能以下选项
    gpgcheck=1 去使能每个RPM文件的GPG验证
    repo_gpgcheck=1 去使能YUM repo metadata的GPG验证
    
    而具体的GPG keys,我们可以直接指定文件或者URL。 如
    gpgkey=https://packagecloud.io/gpg.key
    
    或者
      gpgkey=https://packagecloud.io/gpg.key
           https://some-other-website.com/another_gpg.key
    
    当指定为URL时,YUM客户端会自动下载导入。

总结

生成和验证GPG签名对建立包本身和存储包的repo的认证是很重要的。
确认你要安装的包是供应商提供包,你获取包的仓库是供应商提供的仓库,是保证你安装的包是安全的唯一方法。
给RPM和YUM repo签发GPG和验证GPG不是特别简单,但也并不复杂。尝试签发和验证你的GPG吧。

你可能感兴趣的:(linux,usages)