apt-key
Utilita apt-key
slouží mnoho let ke správě klíčů, kterými tvůrci balíčků podepisují distribuovaný software. Tento mechanismus je velmi užitečný a dovoluje přenášet balíčky napříč různými zrcadly, aniž bychom riskovali jejich kompromitaci. Každý balíček je podepsaný samostatně, důvěřujeme danému veřejnému klíči a umíme tedy podpis ověřit.
Klíče tvůrců distribucí jsou součástí automaticky instalovaného balíčku debian-keyring
a nemusíme je tedy nikde shánět. Pokud ovšem přidáváme do systému nový repozitář, musíme někde získat veřejné klíče a naimportovat je. Jistě jste někdy v návodu viděli podobný příkaz:
$ wget -qO - http://deb.example.com/archive.key | sudo apt-key add -
Vývojové verze distribucí Debian a Ubuntu však při použití tohoto příkazu informují uživatele, že zmíněná utilita končí a je čas přestat ji postupně používat.
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
Proč?
Pochopitelně vás teď zajímá, proč je tahle populární a užitečná utilita označována za zastaralou. Odpověď je jednoduchá: kvůli bezpečnosti. Přidáním klíče do jednotného úložiště v souboru /etc/apt/trusted.gpg
či adresáři /etc/apt/trusted.gpg.d/
jej totiž činíte pro APT bezvýhradně důvěryhodným.
Klíče tedy mají univerzální platnost a mohou podepsat cokoliv. V běžném režimu neexistuje vazba mezi repozitáři a jejich klíči. Držitel soukromého klíče pak může ve svém repozitáři vystavit libovolný balíček a váš systém mu bude bezpodmínečně důvěřovat. Může tedy nahradit libovolný balíček v systému, protože k tomu od vás dostal oprávnění.
Aktuální manuálová stránka hovoří o tom, že apt-key
bude naposled k dispozici v Debianu 11 a Ubuntu 22.04. Není zatím úplně jasné, co se stane příští rok. Podle popisu v manuálu to vypadá, že utilita z distribucí prostě zmizí. Může ale také nakonec zůstat jako volitelně doinstalovatelný doplněk kvůli zpětné kompatibilitě (jako třeba staré net-tools
).
Znovu a lépe
Doporučovaný způsob správy klíčů třetí strany je jejich ukládání mimo prostor v /etc/apt/
. Takové klíče pak nebudou univerzálně důvěryhodné a musíme si jejich použití explicitně vyžádat parametrem signed-by
, který si ukážeme dále.
Soubory v něm by měly mít nějaký rozumně popisný název a příponu .gpg
nebo .asc
. Výše uvedený příklad pro přidání nového klíče by tedy měl být upraven do nové podoby:
$ sudo wget -qO /usr/share/keyrings/archive.gpg http://deb.example.com/archive.key
Pokud si chcete obsah souboru prohlédnout, použijte utilitu gpg
:
$ gpg --list-keys --keyring /usr/share/keyrings/archive.gpg
Poznámka: Soubory se liší jen formátem. Zatímco klasický .gpg
je binární, varianta armored .asc
je textová. Lze mezi nimi konvertovat pomocí utility gpg
a parametrů --enarmor
a --dearmor
. Pokud si nejste jisti, kterou verzi nabízet a stahovat, pak vězte, že formát .gpg
je obecně více podporován, zejména ve starších verzích systémů.
Použití klíčů
Popsaný postup vede k tomu, že jsou jednotlivé klíče rozděleny do samostatných souborů podle repozitářů. Nyní tedy můžeme přiřadit konkrétní klíče k určité cestě, ze které budeme stahovat balíčky.
Uděláme to v příslušném souboru v /etc/apt/sources.list.d/
, ve kterém definujeme cestu ke konkrétnímu repozitáři. K původnímu záznamu jednoduše přidáme parametr signed-by
, ve kterém definujeme cestu k souboru s klíči. Výsledek bude vypadat nějak takto:
deb [signed-by=/usr/share/keyrings/archive.gpg] https://repository.example.com/debian/ stable main
Pokud tuto volbu u repozitáře neuvedeme, balíčkovací systém pro tento konkrétní repozitář použije všechny klíče dostupné v souboru /etc/apt/trusted.gpg
a adresáři /etc/apt/trusted.gpg.d/
. My tam ovšem už klíče z nového repozitáře nemáme, takže balíčky jsou podepsané nedůvěryhodnými klíči. Pokud ovšem použijeme výše uvedenou úpravu, budeme od daného repozitáře vyžadovat použití klíčů v konkrétním souboru a vše bude fungovat.
Odstranění starých klíčů
Pokud jste do systému přidali klíče výše uvedeným postupem, budete je chtít odstranit z původního místa, abyste je neměli v systému dvakrát. Pak by oddělení do samostatných souborů postrádalo smysl, protože by klíč byl i na původním místě a byl by stále důvěryhodný.
Budete tedy nejprve muset vypsat známé klíče:
sudo apt-key list
Nejprve jsou vypsány klíče z původního úložiště v souboru, poté následuje obsah adresáře. Pokud se rozhodnete některý klíč odstranit, stačí si opsat posledních osm znaků jeho otisku (key ID) a poté jej nechat smazat.
sudo apt-key del 2980AECF