2FA w terminalu

https://xpil.eu/VNraa

Jakiś czas temu dowiedziałem się, że aplikacja Authy przestaje działać na komputerach z Windows i pozostaje wyłącznie wersja mobilna. W moim przypadku jest to dość istotne, bo łączę się z Internetem głównie na domowym pececie, więc potrzebuję jakiegoś sensownego 2FA.

Całkiem solidną alternatywą okazała się być aplikacja 2FAS (zasugerowana zresztą przez jednego z Czytelników blogu). 2FAS działa całkiem sprytnie: wtyczka w przeglądarce komunikuje się z instancją na smartfonie, gdzie trzeba się tylko zidentyfikować palcem albo innym hasłem i potwierdzić puknięciem w ekran, że chodzi nam o ten właśnie kod - dalej wszystko leci z automatu, wtyczka wypełnia właściwe pole w przeglądarce na pececie, wciska wirtualny Enter, et voila.

Jednak takie rozwiązanie, choć wygodne (nie muszę przepisywać cyferek z ekranu smartfona), ma jedną zasadniczą wadę: w dalszym ciągu wymaga interakcji ze smartfonem. A w Authy było tak, że instancja na smartfonie była całkiem niezależna od tej na pececie. Obydwie generowały identyczne kody dla tych samych kont, ale działały niezależnie.

Posiedziałem, pokombinowałem i wykombinowałem: mogę przecież użyć linuksowej aplikacji oathtool! Co prawda siedzę na Windows, nie na Linuksie, ale od czego mam WSL2?

Minęło kilka strzałów znikąd...

Okazało się, że zagadnienie jest całkiem proste: wystarczy zainstalować oathtool (ja używam apt na Ubuntu, ale pakiet jest dostępny we wszystkich popularnych dystrybucjach) i potem już z górki: uruchamiamy na naszym koncie kreatora 2FA, dochodzimy do kroku, w którym prezentowany jest kod QR, klikamy opcję "pokaż klucz", dostajemy na ekranie ciąg szesnastu cyfr i liter (a może litr i cyfer?), zapisujemy ten kod i od tej pory możemy dostać nasz sześciocyfrowy kod czasowy za pomocą komendy:

oathtool --base32 --totp "ABCDEFGH12345678"

(przy czym rzecz jasna zamieniamy "ABCDEFGH12345678" na nasz faktyczny klucz)

W efekcie program wypluje sześć cyferek, które możemy wklepać (albo skopiować i wkleić) gdzie trzeba.

Proste?

Niby tak, ale jak sobie człowiek pomyśli, że dla każdego loginu trzeba trzymać osobny klucz, zaczyna się robić bałaganiarsko. Dlatego napisałem sobie niewielki skrypt, który umożliwia wygenerowanie klucza przy użyciu nazwy konta (którą sami sobie wymyślamy).

Najpierw tworzymy plik secrets.txt i ograniczamy dostęp do niego, żeby się jakieś złodupce nie dobrały:

chmod 600 secrets.txt

W pliku tym będziemy przechowywać pary nazwa:klucz, dokładnie w takim formacie (czyli z dwukropkiem):

gmail:abcdefgh12345678
nas:zxcvbnmasd123456
office:asdfghjklp654321

Następnie tworzymy sobie skrypt w Bash, nazywamy go, dajmy na to, generate-2fa.sh, a w środku:

#!/bin/bash

SECRETS_FILE="secrets.txt"

list_accounts() {
    echo "Available accounts:"
    cut -d ':' -f1 $SECRETS_FILE
}

if [ "$#" -ne 1 ]; then
    list_accounts
    exit 0
fi

SECRET_KEY=$(grep "^$1:" $SECRETS_FILE | cut -d ':' -f2)

if [ -z "$SECRET_KEY" ]; then
    echo "Account not found."
    exit 1
fi

oathtool --base32 --totp "$SECRET_KEY"

Na koniec upewniamy się, że skrypt można uruchomić (czyli: chmod a+x ./generate2fa.sh) i od tej pory możemy generować kody jednorazowe z wiersza poleceń:

./generate2fa.sh gmail
152636

./generate2fa.sh nas
948372

./generate2fa.sh coś-innego
Account not found.

./generate2fa.sh
Available accounts:
gmail
nas
office

Jak widać uruchomienie skryptu bez parametru wyświetla listę dostępnych kont (opcja dla zapominalskich).

Warto oczywiście wykonać kopię pliku secrets.txt na wszelki wypadek (i tu pojawia się klasyczne jajko i kura: gdzie tę kopię trzymać żeby było bezpiecznie?)

Można też zamiast tych wszystkich hopsztosów po prostu skorzystać z generatora 2FA wbudowanego w menedżer haseł (ja od lat używam Bitwarden), ale wersja z wierszem poleceń i Linuksem wygląda bardziej chakiersko, więc zostawiam jak jest 🙂

https://xpil.eu/VNraa

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.