Google authenticator na CentOS 7 pro openssh s autentizací veřejným klíčem

18.3.2015

Žádný rozumný administrátor pro přihlašování do systému serveru, který spravuje nepoužívá pouhou autentizaci heslem. Buď jí zakáže úplně a povolí pouze autentizaci veřejným klíčem, nebo heslo alespoň doplní na vícefaktorovou autentizaci, kdy použije externí výpočetní prostředek, který má dostupný při přihlašování.

Pro vícefaktorovou autentizaci můžeme v roli onoho dalšího prostředku použít nástroj od Google, který se nazývá Google authenticator. Někdo může namítat, že Google je Velkým Bratrem a tak citlivou věc, jako je přihlašování do systému přece nebudeme svěřovat jeho software. Nicméně uvědomme si, ze tento prostředek nám sám o sobě pro přihlášení nestačí. Musíme znát ještě heslo. Kromě toho software je otevřený a tedy auditovatelný a pracuje offline (nevyžaduje komunikaci po síti).

Celý nástroj je velmi lehký a jednoduchý a spočívá na principu časového OTP a sestává ze dvou základních komponent: PAM modulu, který je nainstalován na systému, do kterého se přihlašujeme a aplikace pro Android.

Pokud budeme chtít být ještě paranoidnější, můžeme si říci, že místo znalosti hesla a vypočítání OTP můžeme použít passphrasi pro privátní klíč, který musíme mít k dispozici v systému, ze kterého se přihlašujeme a OTP. Tedy passphrasi máme v hlavě, privátní klíč na systému, ze kterého se hlásíme a OTP nám realizuje sw na Androidu. Tedy tři zcela oddělené a pouze všechny dohromady fungující “komponenty”.

Jak použít Google autentizátor spolu s autentizací heslem je toho posáno dost, a proto si ukážeme tu zábavnější variantu s autentizací veřejným klíčem.

Strana serveru - příprava a instalace

Protože pro CentOS 7 není k dispozici balík s PAM modulem, tak si stáhneme zdrojový kód a přeložíme si jej sami. K tomu potřebujeme nainstalovat následující:

yum install autoconf gcc automake pam-devel m4 libtool

(provedeme jako root)

V tuto chvíli můžeme pracovat pod běžným uživatelem. Nejprve stáhneme a rozbalíme zdrojové kódy:

mkdir /tmp/google && cd /tmp/google &&
wget https://github.com/google/google-authenticator/archive/master.zip
unzip master.zip
cd google-authenticator-master/libpam/

Potom provedeme vlastní překlad:

./bootstrap.sh
./configure
make

a pod uživatelem root nainstalujeme:

make install

Protože nejsme dobytek a víme, že na provozním serveru nemají co dělat vývojové nástroje (ano, mohli jsme vytvořit vlastní rpm balíček nebo jsme mohli příslušné binárky přeložit na jiném stroji), je vhodné odinstalovat balíky, které jsme kvůli překladu nainstalovali:

yum remove m4 autoconf mpfr libmpc cpp kernel-headers glibc-headers glibc-devel perl-Test-Harness perl-Thread-Queue automake gcc pam-devel libtool

V konfiguraci pokračujeme pod uživatelem root. Nejprve upravíme konfiguraci PAM modulů pro službu sshd:

vi /etc/pam.d/sshd

tak, že na začátek upravovaného souboru vložíme první a zaremujeme jeden z dalších řádků:

auth       required     /usr/local/lib/security/pam_google_authenticator.so nullok secret=/home/${USER}/.ssh/.google_authenticator
#auth       substack     password-auth

Potom upravíme konfigurační soubor vlastní služby sshd:

vi /etc/ssh/sshd_config

tak, že následující řádky s direktivami, které existují, změníme tak, aby byly v níže popsaném tvaru a ty, které ne, vytvoříme:

ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
AuthenticationMethods "keyboard-interactive:pam,publickey"

To je skoro všechno; ještě musíme restartovat službu sshd:

systemctl restart sshd

V tuto chvíli máme plně připravený systém a nezbývá než si nastavit zkušebního uživatele (předpokládáme, že má správně vytvořený soubor authorized_keys v adresáři .ssh v domovském adresáři a ten má správná oprávnění.

Je velmi jednoduché. Pod konkrétním uživatelem, pro kterého chceme použít tento způsob autentizace, spustíme příkaz:

google-authenticator

a na otázky odpovíme “y”.

Než se nás však tento příkaz začne na cokoliv ptát, vypíše velmi důležitou sadu informací, které je vhodné uložit mimo server a uchovat je v bezpečí. Informace jsou zároveň uloženy spolu s dalšími v domovském adresáři v novém souboru .google_authenticator a ve výpisu při generování příkazem výše uvedeným mají následující tvar:

Your new secret key is: AB4V56XGJ7XOWD4S
Your verification code is 868177
Your emergency scratch codes are:
  66373349
  40489764
  79559185
  76851849
  14162636

Secret key je textový řetězec, který použijeme pro svázání tohoto účtu s konfigurací sw na Androidu a scratch codes se používají v případě problémů.

Před výpisem těchto informací je také vygenerován v textovém režimu QR kód, který můžeme - dokud jej máme na obrazovce - použít ke konfiguraci sw na Androidu místo opisování secret key. Touto cestou postupovat v tuto chvíli nebudeme.

Dále je ještě potřeba přesunout vzniklý soubor do adresáře .ssh v domovském adresáři:

mv .google_authenticator ~/.ssh/

protože v konfiguračním souboru PAM modulů pro sshd jsme uvedli, že se bude hledat zde.

Co se stane, pokud uživatel nemá tento soubor vytvořen, nebo jej nemá na správném místě? Použije se pro něj pouze autentizace veřejným klíčem, protože jsme v konfiguraci PAM modulů použili parametr nullok. Pokud bychom chtěli vynutit vícefaktorovou autentizaci, pak tento parametr vynecháme.

Strana Androidu

Instalaci provedeme z play.google.com standardní cestou, jak jsme zvyklí. Najdeme si aplikaci google authenticator a nainstalujeme jí. Nechce žádné zvláštní oprávnění kromě přístupu k uživatelským účtům, protože tento sw je možné (a je to jeho primární použití) využít pro vícefaktorovou autentizaci k různým webovým službám, např. službám Google.

Google authenticator na Androidu spustíme a v menu zvolíme položku “Nastavit účet” a poté “Zadat poskytnutý klíč”, kde si zadáme identifikátor, který nám rozliší jednotlivé účty pro jednotlivé služby/servery a secret key, který jsme získali při konfiguraci na serveru pro daného uživatele.

Například: pokus@ahimsa a secret key je z předchozího výpisu: AB4V56XGJ7XOWD4S.

Jakmile tyto informace zadáme, na hlavní obrazovce aplikace nám začnou být generovány ověřovací jednorázové kódy.

Použití

Na straně klientského počítače máme uložen privátní klíč (neuvádím žádný příklad, neb se může jednat o stroj s Windows, linuxem nebo jiným OS a formáty souborů s privátním klíčem se liší podle kssh klienta) a tato strana je tedy vybavena jako při obyčejné autentizaci s veřejným klíčem, jen budete nejprve vyzváni k zadání ověřovacího kódu, který vám sděluje neustále aplikace na Androidu.

  • obsah/bezpecnost/centos_google_authenticator.txt
  • Last modified: 2018/10/17 22:11
  • by profors