Podpisywanie pakietów w Arch Linuksie, cz. 4

19 styczeń 2012

Wpis jest swobodnym tłumaczeniem Pacman Package Signing – 4: Arch Linux autorstwa Allana McRae, zajmującego się rozwijaniem pacmana i toolchainem w Arch Linuksie.

W poprzednich wpisach opisałem bardziej techniczne szczegóły implementacji podpisywania pakietów i baz danych repozytorium w pacmanie. Można przeczytać je tutaj:

Od tamtego czasu, pacman-4.0 został wydany i dodany do repozytorium [testing]. To znaczy, że nasza implementacja zaczyna mieć większą ilość użytkowników. Przez ten czas, nie znaleziono poważnych błędów, chociaż są pewne miejsca, które mogłyby być poprawione (n.p. instalacja niepodpisanych pakietów za pomocą -U - FS#26520 i FS#26729). Nowy pacman poprawnie wykrył "zły pakiet" w moim repozytorium… (cóż, nie dosłownie zły, ze złym podpisem. Wniosek: nie tworzyć podpisów dla wielu plików jednocześnie, gnupg to śmieć…).

Repozytoria w Arch Linuksie powoli przygotowują się do sprawdzania podpisów w pacmanie-4.0. Możliwość wysyłania podpisów z pakietami została dodana w kwietniu, a stało się to obowiązkowe z początkiem listopada. Na dzisiaj, wszystkie pakiety w [core] zostały podpisane, około 71% pakietów w [extra] oraz 45% w [community].

Więc wszystkie elementy ze sobą współdziałają poprawnie. Ale jak to działa od strony praktycznej? Zacznę od ustawiania bazy kluczy PGP pacmana i pacman.conf.

Po instalacji nowego pacmana, powinieneś stworzyć bazę kluczy przy użyciu pacman-key --init. To polecenie tworzy niezbędne pliki (pubring.gpg, secring.gpg) z odpowiednimi uprawnieniami dostępu, aktualizuje bazę z zaufanymi kluczami (oczywiście pustą) i tworzy podstawowy plik konfiguracyjny. Generuje także główny klucz bazy pacmana. Możesz zmienić domyślny serwer kluczy w /etc/pacman.d/gnupg/gpg.conf - część użytkowników miała problemy z podłączeniem się do domyślnego.

Ustawienia w pacman.conf są bardziej kwestią osobistych preferencji, ale uważam swoje za całkiem rozsądne. Ustawiłem globalnie sprawdzanie podpisów (Optional TrustedOnly). Ustawienie to nie wymaga obecności podpisu, jeżeli jednak takowy jest, to musi pochodzić z zaufanego źródła. W manie dot. pacman.conf można znaleźć więcej szczegółów. Dla repozytoriów z podpisanymi wszystkimi pakietami ustawiłem PackageRequired, które wymaga podpisanej paczki, ale nie podpisanej bazy. (Dla swojego repozytorium używam Required; zarówno pakiety jak i baza są podpisane.)

Zobaczmy jak wygląda output podczas instalacji podpisanego pakietu:

# pacman -S gcc-libs
warning: gcc-libs-4.6.2-3 is up to date – reinstalling
resolving dependencies...
looking for inter-conflicts...

Targets (1): gcc-libs-4.6.2-3

Total Installed Size: 2.96 MiB
Net Upgrade Size: 0.00 MiB

Proceed with installation? [Y/n]

(1/1) checking package integrity [######################] 100%
error: gcc-libs: key "F99FFE0FEAE999BD" is unknown
:: Import PGP key EAE999BD, "Allan McRae ", created 2011-06-03? [Y/n] y
(1/1) checking package integrity [######################] 100%
error: gcc-libs: signature from "Allan McRae " is unknown trust
error: failed to commit transaction (invalid or corrupted package (PGP signature))
Errors occurred, no packages were upgraded.

Jak widać, pacman przerwał instalację pakietu, który został podpisany nieznanym kluczem i zapytał użytkownika, czy chce zaimportować go do bazy. Wyświetlony fingerprint zgadza się z tym opublikowanym w kilku miejscach, więc z czystym sumieniem użytkownik może dodać go do swojej bazy. Wtedy pacman przerywa instalację przez to, że klucz jest niezaufany. Cóż, ten Allan wygląda na godnego zaufania, więc można zmienić poziom zaufania jego klucza za pomocą pacman-key --lsign EAE999BD i pakiety podpisane przez Allana będą instalowane bez problemu.

Sprawdzanie wiarygodności każdego developera i zaufanego użytkownika może być dosyć uciążliwe (35 devów oraz 30 TU). Aby to ułatwić (chociaż trochę), 5 głównych kluczy jest używanych w repozytoriach. Cały pomysł polega na tym, że klucze developerów i zaufanych użytkowników muszą być podpisane wcześniej wspomnianymi głównymi kluczami, więc w bazie kluczy potrzebujesz tylko ich, aby zaufać pozostałym. Odciski kluczy zostaną udostępnione w wielu miejscach, aby można im zaufać (na dole wpisu można znaleźć listę kluczy niezależną od tej ze stron Archa).

Aby skonfigurować bazę z głównymi kluczami, możesz skorzystać z poniższego skryptu:

for key in FFF979E7 CDFD6BB0 4C7EA887 6AC6A4C2 824B18E8; do
  pacman-key --recv-keys $key
  pacman-key --lsign-key $key
  printf 'trustn3nquitn' | gpg --homedir /etc/pacman.d/gnupg/  \
    --no-permission-warning --command-fd 0 --edit-key $key
done

W efekcie odpowiednie klucze powinny znaleźć się w bazie i zostać podpisane lokalnym kluczem pacmana. To jednak nie wystarczy - przecież pakiety nie są podpisywane tymi kluczami. Należy jeszcze zmienić poziom zaufania - skrypt ustawia go na marginalny. Warto zauważyć, że robi to za pomocą gpg, nie pacman-key, który nie obsługuje parametru --command-fd. Można użyć pacman-key --edit-key, do ustawienia zaufania ręcznie. Domyślnie, nasza sieć zaufania uznaje klucz za zaufany, gdy jest podpisany co najmniej 3 głównymi kluczami. (Jest ich 5, więc nawet jeśli unieważnimy 2 z nich, wtedy pakiety dalej będą uznane za bezpieczne.) Niski poziom zaufania głównych kluczy jest zarazem zabezpieczeniem - kilka kluczy musi być skompromitowanych, aby wprowadzić zaufany pakiet do repozytorium z zewnątrz.

Teraz, gdy klucze są już w bazie pacmana, za każdym razem gdy pacman będzie pobierał pakiet z nieznanym podpisem, będzie automatycznie oznaczany jako zaufany. Przynajmniej taki jest pomysł. W dalszym ciągu nie wszyscy developerzy/TU mają klucze podpisane głównymi, ale już niewiele brakuje. W przyszłości może pojawi się pakiet pacman-keyring, który usprawni proces konfiguracji, albo chociaż uchroni użytkownika przed pobieraniem każdego klucza samodzielnie.

Jedyne, co pozostaje do zrobienia, to kwestia podpisywania bazy danych repozytorium, ale to historia na inną okazję.

–\ Allan McRae – AB19 265E 5D7D 2068 7D30 3246 BA1D FB64 FFF9 79E7\ Dan McGee – 27FF C476 9E19 F096 D41D 9265 A04F 9397 CDFD 6BB0\ Ionuț Mircea Bîru – 44D4 A033 AC14 0143 9273 97D4 7EFD 567D 4C7E A887\ Pierre Schmitz – 0E8B 6440 79F5 99DF C1DD C397 3348 882F 6AC6 A4C2\ Thomas Bächler – 6841 48BB 25B4 9E98 6A49 44C5 5184 252D 824B 18E8