Weryfikacja sygnatur GPG pakietów rpm

Red Hat 6.x / Centos 6.x

GPG, czyli GNU Privacy Guard, to system pozwalający deweloperom/wydawcom podpisać cyfrowo wydawane przez siebie pakiety rpm. System ten pozwala zweryfikować, czy zawartością pakietu nie manipulowano przed dostarczeniem do użytkownika końcowego.
Domyślnie yum instaluje pakiety jedynie po pomyślnej weryfikacji klucza gpg, za co odpowiada opcja gpgcheck=1 w /etc/yum.conf.
Opcję można również zdefiniować z osobna dla każdego z repozytorium w odpowiednim pliku w /etc/yum.repos.d/

Nasz system nie zna oczywiście wszystkich kluczy dostawców, a i my, jako administratorzy, nie chcemy zezwalać na instalację pakietów od wszystkich dostawców, dlatego istotną sprawą jest umiejętność manipulowania bazą kluczy na naszych serwerach.

Klucze dostępne w naszym systemie

Klucze gpg, które mogą autoryzować pakiety są widoczne w naszym os-ie jako pakiety rpm. Każdy z takich pakietów udostępnia dodatkowe informacje o samym kluczu. Listę zaufanych kluczy otrzymamy poprzez:

[root@server1 ~]# rpm -qa | grep pubkey
gpg-pubkey-fd431d51-4ae0493b
gpg-pubkey-2fa658e0-45700c69

Detale poszczególnych kluczy możemy przejrzeć poprzez:

[root@server1 ~]# rpm -qi gpg-pubkey-fd431d51-4ae0493b
Name        : gpg-pubkey                   Relocations: (not relocatable)
Version     : fd431d51                          Vendor: (none)
Release     : 4ae0493b                      Build Date: Sun 12 Jul 2015 12:06:27 AM CEST
Install Date: Sun 12 Jul 2015 12:06:27 AM CEST      Build Host: localhost
Group       : Public Keys                   Source RPM: (none)
Size        : 0                                License: pubkey
Signature   : (none)
Summary     : gpg(Red Hat, Inc. (release key 2) <security@redhat.com>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.8.0 (NSS-3)

mQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF
0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF
0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c
u7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh
XGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H
5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW
9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj
/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1
PcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY
HVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF
buhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB
tDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0
LmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK
CRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC
2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf
C/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5
un3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E
0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE
IGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh
8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL
Ght5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki
JUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25
OFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq
dzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==
=zbHE
-----END PGP PUBLIC KEY BLOCK-----

Zawartość klucza i jego autentyczność możemy potwierdzić w większości przypadków na stronach ich właścicieli, i np. dla kluczy Red Hat możemy tego dokonać na stronie https://access.redhat.com/security/team/key, na której udostępnione są wszystkie aktualnie zaufane klucze dystrybutora.

Importowanie kluczy GPG

Import klucza GPG pozwala na weryfikację pakietów konkretnego dostawcy pod kątem ich integralności. Pomyślna walidacja pakietu pozwala ze 100% pewnością stwierdzić, że pakiet jest tym, który udostępnił nam deweloper i jeśli mamy do niego zaufanie, że nie wyrządzi nam szkód w systemie. Oczywiście pewność możemy mieć tak długo, jak długo klucz GPG nie zostanie "skompromitowany", czyli nie wycieknie poza dostawcę.

Importu klucza dokonać możemy po jego pobraniu. Ja skorzystam w tym przykładzie z klucza udostępnionego przez Red Hat już w naszej instalacji, ale domyślnie nie importowanego. Będzie to klucz, którym podpisywane są pakiety "beta" dla systemu. Klucz znajduje się w lokalizacji /etc/pki/rpm-gpg/:

[root@server1 ~]# cd /etc/pki/rpm-gpg/
[root@server1 rpm-gpg]# ll
total 20
-rw-r--r--. 1 root root 3375 Sep 15  2014 RPM-GPG-KEY-redhat-beta
-rw-r--r--. 1 root root 1990 Sep 15  2014 RPM-GPG-KEY-redhat-legacy-former
-rw-r--r--. 1 root root 1164 Sep 15  2014 RPM-GPG-KEY-redhat-legacy-release
-rw-r--r--. 1 root root  885 Sep 15  2014 RPM-GPG-KEY-redhat-legacy-rhx
-rw-r--r--. 1 root root 3211 Sep 15  2014 RPM-GPG-KEY-redhat-release

Samego importu dokonamy przez:

[root@server1 rpm-gpg]# rpm --import RPM-GPG-KEY-redhat-beta

Możemy teraz zweryfikować klucze w systemie:

[root@server1 rpm-gpg]# rpm -qa | grep pubkey
gpg-pubkey-fd431d51-4ae0493b
gpg-pubkey-2fa658e0-45700c69
gpg-pubkey-897da07a-3c979a7f
gpg-pubkey-f21541eb-4a5233e7

Jak widać w systemie przybyły dwa nowe klucze.

Weryfikacja pakietów rpm przy użyciu zaimportowanych kluczy

 Każdy pakiet z innego źródła niż oficjalne systemowe repozytorium, dla bezpieczeństwa naszego os-a powinien być zweryfikowany. Poza weryfikacją skryptów i triggerów (opisanych w poście Bezpieczna instalacja pakietów RPM) warto przeprowadzać weryfikację podpisy pakietu.
Weryfikacja taka, zależnie od potrzeb może mieć trzy warianty "gadatliwości". Dla przykładu zweryfikujemy pakiet zlib znajdujący się na płycie instalacjunej systemu w katalogu Packages:

[root@server1 Packages]# rpm -K zlib-1.2.3-29.el6.i686.rpm
zlib-1.2.3-29.el6.i686.rpm: rsa sha1 (md5) pgp md5 OK
[root@server1 Packages]# rpm -vK zlib-1.2.3-29.el6.i686.rpm
zlib-1.2.3-29.el6.i686.rpm:
    Header V3 RSA/SHA256 Signature, key ID fd431d51: OK
    Header SHA1 digest: OK (90e55202493675b25b3b93c55529238ac5d4f1ea)
    V3 RSA/SHA256 Signature, key ID fd431d51: OK
    MD5 digest: OK (e414d86727059c4f78e1848ed0d8134f)
[root@server1 Packages]# rpm -vvK zlib-1.2.3-29.el6.i686.rpm
D: loading keyring from pubkeys in /var/lib/rpm/pubkeys/*.key
D: couldn't find any keys in /var/lib/rpm/pubkeys/*.key
D: loading keyring from rpmdb
D: opening  db environment /var/lib/rpm cdb:mpool:joinenv
D: opening  db index       /var/lib/rpm/Packages rdonly mode=0x0
D: locked   db index       /var/lib/rpm/Packages
D: opening  db index       /var/lib/rpm/Name rdonly mode=0x0
D:  read h#     650 Header sanity check: OK
D: added key gpg-pubkey-fd431d51-4ae0493b to keyring
D:  read h#     651 Header sanity check: OK
D: added key gpg-pubkey-2fa658e0-45700c69 to keyring
D:  read h#     656 Header sanity check: OK
D: added key gpg-pubkey-f21541eb-4a5233e7 to keyring
D: Using legacy gpg-pubkey(s) from rpmdb
D: Expected size:        74336 = lead(96)+sigs(1284)+pad(4)+data(72952)
D:   Actual size:        74336
zlib-1.2.3-29.el6.i686.rpm:
    Header V3 RSA/SHA256 Signature, key ID fd431d51: OK
    Header SHA1 digest: OK (90e55202493675b25b3b93c55529238ac5d4f1ea)
    V3 RSA/SHA256 Signature, key ID fd431d51: OK
    MD5 digest: OK (e414d86727059c4f78e1848ed0d8134f)
D: closed   db index       /var/lib/rpm/Name
D: closed   db index       /var/lib/rpm/Packages
D: closed   db environment /var/lib/rpm

Jeśli pakiet jest "bezpieczny" wystarczająca jest weryfikacja zawierająca opcję -K. W przypadku, kiedy weryfikacja taka nie powiedzie się, można również sprawdzić przy użyciu pozostałych opcji co nie podoba się naszemy rpm-owi, ale w większości wypadków nie polecam instalacji takiego pakietu.

Usuwanie kluczy

Usuwanie zbędnych lub skompromitowanych kluczy jest zwykłą tranzakcją rpm, niczym nie różniącą się od usuwania innych pakietów:

[root@server1 rpm-gpg]# rpm -e gpg-pubkey-897da07a-3c979a7f


Brak komentarzy:

Prześlij komentarz