Jednoduché unixové šifrování souborů s utilitou age

22. 12. 2022
Doba čtení: 4 minuty

Sdílet

 Autor: Depositphotos
Občas je potřeba chránit některá tajemství ukrytá v souborech, která se použijí jen ve správnou chvíli. Můžete k tomu použít třeba utilitu age, která podle unixové filosofie dělá jedinou věc a pořádně.

Na webu age-encryption.org píšou, že jde o jednoduchý, moderní a bezpečný nástroj pro šifrování souborů. Je to také souborový formát i knihovna v Go. Jeho použití je nápadně podobnéssh  – používají se veřejné a soukromé klíče a není potřeba použití centrální autority.

Co se dozvíte v článku
  1. Generujeme klíče
  2. Šifrujeme
  3. Dešifrujeme
  4. Použití bez klíčů
  5. Více klíčů!
  6. K čemu to používáme?

Nástroj nemá žádné možnosti konfigurace a pracuje podle nejlepších tradic unixových nástrojů – například je možné ho použít jako filtr v soustavě shellových kolon. Pouze šifruje a dešifruje a kromě toho vlastně neumí vůbec nic navíc, což může být pro někoho problém. Existují ale i uživatelé, kteří jednoduchost považují za výhodu.

Instalace je jednoduchá: stáhněme si binární soubor age a age-keygen pro náš operační systém ze stránky Releases a dáme ho do $PATH.

Pokud používáte nástroj binenv, můžete použít binenv install agebinenv install age-keygen.

Generujeme klíče

Vlastní zbrusu nový klíč vygenerujeme pomocí nástroje  age-keygen:

$ age-keygen
# created: 2022-12-20T11:17:06+01:00
# public key: age1yuh4tgu20mlas3mjdqxrwy8lzhder9csenrtqnxtx3xszu2pw5xsdf2sdu
AGE-SECRET-KEY-1QR4Y3DXQW0KVJXKCQ6KZS4UZ9K3HHEMX3ZAP7RETED32QSUYFNRSJ0YX0K

Na výstupu nám age ukázal soukromý klíč. Pokud chceme klíč uložit do souboru, použijeme přepínač -o ( --output):

$ age-keygen -o my-new-key.txt

Utilita age pak vygeneruje soukromý a veřejný klíč, soukromý klíč uloží ho do souboru my-new-key.txt a veřejný klíč vypíše na standardní výstup. Jak je vidět, klíč je jen malý soubor, takže si jich můžeme vygenerovat, kolik chceme.

Šifrujeme

Předpokládejme, že potřebujeme poslat soubor hello-world.py někomu, kdo používá klíč  age13rmhludq3cpfm9d2krcclc9vhwh4355xkgdaxldq35d3j3ljr97sm7jt69.

$ age -o hello-world.py.age \
  -r age13rmhludq3cpfm9d2krcclc9vhwh4355xkgdaxldq35d3j3ljr97sm7jt69 \
  hello-world.py

Nástroj age podle očekávání vytvoří suubor hello-world.py.age obsahující šifrovaný obsah souboru hello-world.py. Příjemce ho potom může rozšifrovat.

Soubor obsahuje hlavičku age-encryption.org/v1, symetrický klíč zašifrovaný veřejným klíčem příjemce a následně šifrovaný obsah v binární podobě.

Pokud potřebujeme, aby výstup byl čitelný (v tisknutelném ASCII), můžeme použít age --armor ( -a). Výstup bude vypadat následovně:

$ age --armor \
  -r age13rmhludq3cpfm9d2krcclc9vhwh4355xkgdaxldq35d3j3ljr97sm7jt69 \
  hello-world.py

-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBpRDV6dTZML2YyVm9rdi9O
eVhZQTNHMC9ISUZraVZWV2NZV0luR3BKNURjCm9TZFVPMFJQVHhzUXZWU0pWbWtN
...

Výhodou použití přepínače --armor je i to, že pak můžeme age použít jako unixový filtr.

Dešifrujeme

Příkazu age musíme říct, že právě teď budeme dešifrovat soubor, pokud neřekeme jinak, tak se age pokusí soubor šifrovat. Dešifrování zapneme použitím přepínače --decrypt ( -d).

Je potřeba zadat i identitu (souubor s privátním klíčem), která se má použít přo dešifrování, to provedeme pomocí přepínače --identity ( -i).

$ age -d -i ~/.../identity -o hello-world-2.py  hello-world.py.age

Pro práci v trubkách můžeme vynechat --output ( -o) a age vypíše dešifrovaný výstup na standardní výstup.

$ age -d -i ~/.../identity hello-world.py.age

print("Hello, world!")

Pokud máme více identit, můžeme je nabídnout všechny najednou pomocí vícenásobného použití přepínače --identity ( -i) a age je postupně vyzkouší a použije tu správnou.

Použití bez klíčů

Existuje i verze pro lenochy. Místo předgenerovaného klíče může age použít obyčejné heslo, nebo v lepším případě si můžeme nějakou tajnou frázi nechat vygenerovat.

Přepínač, který tohle chování zajistí, je --passphrase ( -p).

$ age -p -o hello-world.py.age hello-world.py
Enter passphrase (leave empty to autogenerate a secure one):
Using the autogenerated passphrase "project-pottery-lawsuit-foster-inflict-rug-ivory-crane-cattle-box".

Utilita age při dešifrování přijde na to, že je potřeba zadat heslo a ne identitu. Při dešifrování je potřeba zadat heslo znovu na standardním vstupu.

$ age -d hello-world.py.age

Více klíčů!

Pokud potřebujeme poslat soubor více příjemcům, můžeme při šifrování zadat více klíčů, kterýmu půjde soubor rozšifrovat. Stačí použít více parametrů --recipient ( -r), alternativně dodat parametr --recipients-file ( -R) a v něm soubor, který obsahuje seznam veřejných klíčů, jejimž majitelům chceme povolit rozšifrování souboru.

$ age -e \
      -r age13rmhludq3cpfm9d2krcclc9vhwh4355xkgdaxldq35d3j3ljr97sm7jt69 \
      -r age1dvhq4yhpxrv2p6vqgdll8gazll4zlgr0ktut5s26jlduuesztytq4k5sg0 \
      -o hello-world.py.age \
      hello-world.py

Nástroj age používá pro šifrování symetrický klíč, kterým soubor zašifruje a kopii klíče zašifrovanou požadovanými veřejnými klíči přiloží k souboru. Pro dešifrování stačí dodat jednu z identit, pro které byl soubor zašifrován.

Pro lenochy je možné pomocí parametru -R zadat veřejné SSH klíče uživatelů, kterým chceme dešifrování povolit. Při dešifrování pak použijí parametr -i a svůj soukromý SSH klíč.

Šifrování za pomoci SSH klíčů se dá docela pěkně využít třeba ve spojení s populárním nástrojem pro distribuci klíčů – GitHubem.

$ curl --silent https://github.com/verosk.keys | \
  age -e -R - -a /tmp/hello-world.py

Pozor, age umí jenom šifrovat a dešifrovat, narozdíl od GPG neřeší se nijak podepisování dat. Pokud obdržím soubor  age, který je zašifrovaný mým veřejným klíčem, můžu se spolehnout pouze na to, že je zašifrovaný mým klíčem. Zdali ho poslal Adam nebo Eva, to nezjistím. Je to vlastnost, ne chyba.

bitcoin_skoleni

K čemu to používáme?

Typické nasazení age u našich klientů je pro ukládání tajemství (hesla, klíče, apod.) do gitovských repozitářů. V repozitáři pak jsou uložené pouze šifrované soubory a v případě úniku repozitáře nejsou tajemství ohrožena. Data se pak rozšifrují až při nasazování aplikace klíčem, který má k dispozici pouze ten, kdo aplikaci nasazuje.

Pěkné řešení, které to umožňuje, je například nástroj SOPS od Mozilla Foundation. Výhodou sops  je i to, že pěkně spolupracuje s Kubernetes, Terraformem či AWS KMS.

Autor článku

Věroš Kaplan pracuje jako nájemný správce serverů na volné noze. Před několika lety objevil kouzlo automatizace a už ho to nepustilo. Zastává názor, že nudné úkoly mají dělat počítače – a měly by se tedy používat i pro správu dalších počítačů.