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
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 age
a binenv 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.
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.