Jak nastavit vícefaktorové ověřování pro SSH v systému CentOS 7

Úvod

Ověřovací faktor je jedna informace, která slouží k prokázání práv k provedení určité akce, například přihlášení do systému. Ověřovací kanál je způsob, jakým ověřovací systém doručuje faktor uživateli nebo vyžaduje, aby uživatel odpověděl. Hesla a bezpečnostní tokeny jsou příklady ověřovacích faktorů; počítače a telefony jsou příklady kanálů.

SSH ve výchozím nastavení používá pro ověřování hesla a většina návodů na zpevnění SSH doporučuje používat místo nich klíč SSH. Stále se však jedná pouze o jediný faktor. Pokud zlý činitel kompromitoval váš počítač, může váš klíč použít i ke kompromitaci vašich serverů.

V tomto návodu nastavíme vícefaktorové ověřování, abychom proti tomu bojovali. Vícefaktorové ověřování (MFA) vyžaduje pro ověření neboli přihlášení více než jeden faktor. To znamená, že špatný útočník by musel kompromitovat více věcí, například váš počítač i telefon, aby se dostal dovnitř. Různé typy faktorů se často shrnují takto:

  1. Něco, co znáte, jako je heslo nebo bezpečnostní otázka
  2. Něco, co máte, jako je autentizační aplikace nebo bezpečnostní token
  3. Něco, co jste, jako je otisk prstu nebo hlas

Jedním společným faktorem je aplikace OATH-TOTP, například Google Authenticator. OATH-TOTP (Open Authentication Time-Based One-Time Password) je otevřený protokol, který generuje jednorázové heslo, obvykle šestimístné číslo, které se každých 30 sekund recykluje.

V tomto článku se budeme zabývat tím, jak kromě klíče SSH zapnout ověřování SSH pomocí aplikace OATH-TOTP. Přihlašování k serveru prostřednictvím SSH pak bude vyžadovat dva faktory ve dvou kanálech, čímž bude bezpečnější než samotné heslo nebo klíč SSH. Kromě toho si projdeme další případy použití MFA a několik užitečných tipů a triků.

Předpoklady

Pro tento návod budete potřebovat:

  • Jeden server CentOS 7 s uživatelem sudo, který není root, a klíčem SSH, který můžete nastavit podle tohoto návodu Počáteční nastavení serveru.
  • Chytrý telefon nebo tablet s nainstalovanou aplikací OATH-TOTP, například Google Authenticator (iOS, Android).

Krok 1 – Instalace PAM společnosti Google

V tomto kroku nainstalujeme a nakonfigurujeme PAM společnosti Google.

PAM, což je zkratka pro Pluggable Authentication Module, je autentizační infrastruktura používaná v systémech Linux k ověřování uživatele. Protože společnost Google vytvořila aplikaci OATH-TOTP, vytvořila také PAM, který generuje TOTP a je plně kompatibilní s jakoukoli aplikací OATH-TOTP, jako je Google Authenticator nebo Authy.

Nejprve musíme přidat repozitář EPEL (Extra Packages for Enterprise Linux).

  • sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

Dále nainstalujeme PAM. Pokud repo používáte poprvé, můžete být vyzváni k přijetí klíče EPEL. Po přijetí nebudete znovu vyzváni k přijetí klíče.

  • sudo yum install google-authenticator

Po instalaci PAM použijeme pomocnou aplikaci, která je dodávána s PAM, k vygenerování TOTP klíče pro uživatele, kterému chcete přidat druhý faktor. Tento klíč se generuje pro každého uživatele zvlášť, nikoli pro celý systém. To znamená, že každý uživatel, který chce používat autentizační aplikaci TOTP, se bude muset přihlásit a spustit pomocnou aplikaci, aby získal svůj vlastní klíč; nelze ji spustit pouze jednou a povolit ji všem (na konci tohoto návodu je však několik tipů, jak nastavit nebo vyžadovat MFA pro mnoho uživatelů).

Spustit inicializační aplikaci.

  • google-authenticator

Po spuštění příkazu budete dotázáni na několik otázek. První z nich se ptá, zda mají být ověřovací tokeny založeny na čase.

Output
Do you want authentication tokens to be time-based (y/n) y

Tento PAM umožňuje používat tokeny založené na čase nebo sekvenční tokeny. Použití tokenů založených na sekvenci znamená, že kód začíná v určitém bodě a po každém použití se kód zvýší. Použití tokenů založených na čase znamená, že se kód mění náhodně po uplynutí určitého času. Zůstaneme u časově založených, protože to předpokládají aplikace jako Google Authenticator, takže odpovězte y na ano.

Po zodpovězení této otázky proběhne spousta výstupů, včetně velkého QR kódu. V tomto okamžiku použijte aplikaci Authenticator v telefonu a naskenujte kód QR nebo ručně zadejte tajný klíč. Pokud je kód QR příliš velký na skenování, můžete použít adresu URL nad kódem QR a získat jeho menší verzi. Po přidání se v aplikaci zobrazí šestimístný kód, který se každých 30 sekund změní.

Poznámka: Ujistěte se, že jste si tajný klíč, ověřovací kód a kódy pro obnovení nahráli na bezpečné místo, například do správce hesel. Kódy pro obnovení jsou jediným způsobem, jak znovu získat přístup, pokud například ztratíte přístup k aplikaci TOTP.

Zbývající otázky informují PAM, jak má fungovat. Projdeme je jednu po druhé.

Output
Do you want me to update your "/home/sammy/.google_authenticator" file (y/n) y

Tímto se klíč a možnosti zapíší do souboru .google_authenticator. Pokud odpovíte ne, program se ukončí a nic se nezapíše, což znamená, že autentizátor nebude fungovat.

Output
Do you want to disallow multiple uses of the same authenticationtoken? This restricts you to one login about every 30s, but it increasesyour chances to notice or even prevent man-in-the-middle attacks (y/n) y

Odpovědí ano zde zabráníte opakovanému útoku tím, že každý kód vyprší ihned po použití. To zabrání útočníkovi zachytit právě použitý kód a přihlásit se s ním.

Output
By default, tokens are good for 30 seconds. In order to compensate forpossible time-skew between the client and the server, we allow an extratoken before and after the current time. If you experience problems withpoor time synchronization, you can increase the window from its defaultsize of +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens). Do you want to do so? (y/n) n

Odpovědí ano zde povolíte až 8 platných kódů v pohyblivém čtyřminutovém okně. Odpovědí ne to omezíte na 3 platné kódy v pohyblivém okně 1:30 minut. Pokud nenajdete problémy s 1:30 minutovým oknem, je odpověď ne bezpečnější volbou.

Output
If the computer that you are logging into isn't hardened against brute-forcelogin attempts, you can enable rate-limiting for the authentication module.By default, this limits attackers to no more than 3 login attempts every 30s.Do you want to enable rate-limiting (y/n) y

Omezení rychlosti znamená, že se vzdálený útočník může pokusit pouze o určitý počet hádání, než bude zablokován. Pokud jste dříve nenakonfigurovali omezení rychlosti přímo v SSH, je jeho provedení nyní skvělou technikou zpřísnění.

Poznámka: Po dokončení tohoto nastavení, pokud chcete zálohovat svůj tajný klíč, můžete soubor ~/.google-authenticator zkopírovat na důvěryhodné místo. Odtud jej můžete nasadit na další systémy nebo jej po zálohování znovu nasadit.

Teď, když je PAM Google nainstalován a nakonfigurován, je dalším krokem konfigurace SSH pro použití vašeho klíče TOTP. Budeme muset sdělit SSH o PAM a poté nakonfigurovat SSH tak, aby jej používalo.

Krok 2 – Konfigurace OpenSSH

Protože budeme provádět změny SSH přes SSH, je důležité nikdy neuzavírat počáteční připojení SSH. Místo toho otevřete druhou relaci SSH a proveďte testování. To proto, abyste se vyhnuli zablokování serveru, pokud by došlo k chybě v konfiguraci SSH. Jakmile vše funguje, můžete bezpečně uzavřít všechny relace.

Na začátek upravíme konfigurační soubor sshd. Zde použijeme nano, který není ve výchozím nastavení systému CentOS nainstalován. Můžete jej nainstalovat pomocí sudo yum install nano nebo použít svůj oblíbený alternativní textový editor.

  • sudo nano /etc/pam.d/sshd

Na konec souboru přidejte následující řádek.

/etc/pam.d/sshd
. . .# Used with polkit to reauthorize users in remote sessions-session optional pam_reauthorize.so prepareauth required pam_google_authenticator.so nullok

Slovo nullok na konci posledního řádku říká PAM, že tato metoda ověřování je volitelná. To umožňuje uživatelům bez tokenu OATH-TOTP se stále přihlašovat pomocí svého klíče SSH. Jakmile budou mít všichni uživatelé token OATH-TOTP, můžete z tohoto řádku odstranit nullok, aby byla metoda MFA povinná.

Uložení a zavření souboru.

Příště budeme konfigurovat SSH tak, aby podporovalo tento druh ověřování. Otevřete konfigurační soubor SSH k úpravám.

  • sudo nano /etc/ssh/sshd_config

Vyhledejte řádky ChallengeResponseAuthentication. Zakomentujte řádek no a odkomentujte řádek no.

/etc/ssh/sshd_config
. . .# Change to no to disable s/key passwordsChallengeResponseAuthentication yes#ChallengeResponseAuthentication no. . .

Soubor uložte a zavřete, poté restartujte SSH, aby se znovu načetly konfigurační soubory. Restartování služby sshd neuzavře otevřená připojení, takže neriskujete, že se tímto příkazem zablokujete.

  • sudo systemctl restart sshd.service

Chcete-li otestovat, zda vše zatím funguje, otevřete další terminál a zkuste se přihlásit přes SSH. Pokud jste si předtím vytvořili klíč SSH a používáte jej, všimnete si, že jste nemuseli zadávat heslo uživatele ani ověřovací kód MFA. Je to proto, že klíč SSH má ve výchozím nastavení přednost před všemi ostatními možnostmi ověřování. Jinak by se vám měla zobrazit výzva k zadání hesla a ověřovacího kódu.

Pokud se chcete ujistit, že to, co jste dosud provedli, funguje, přejděte v otevřené relaci SSH na ~/.ssh/ a dočasně přejmenujte soubor authorized_keys a otevřete novou relaci a přihlaste se pomocí našeho hesla a ověřovacího kódu.

  • cd ~/.ssh
  • mv authorized_keys authorized_keys.bak

Jakmile ověříte, že váš token TOTP funguje, přejmenujte soubor ‚authorized_keys.bak‘ zpět na původní podobu.

  • mv authorized_keys.bak authorized_keys

Dále musíme povolit klíč SSH jako jeden faktor a ověřovací kód jako druhý a říct SSH, které faktory má použít, a zabránit tomu, aby klíč SSH přepsal všechny ostatní typy.

Krok 3 – Uvědomění SSH o MFA

Otevřete znovu konfigurační soubor sshd.

  • sudo nano /etc/ssh/sshd_config

Na konec souboru přidejte následující řádek. Tím sdělíte SSH, které metody ověřování jsou vyžadovány. Tento řádek říká SSH, že potřebujeme klíč SSH a buď heslo, nebo ověřovací kód (nebo všechny tři).

/etc/ssh/sshd_config
. . .# Added by DigitalOcean build processClientAliveInterval 120ClientAliveCountMax 2AuthenticationMethods publickey,password publickey,keyboard-interactive

Uložení a zavření souboru.

Dále otevřete konfigurační soubor PAM sshd.

  • sudo nano /etc/pam.d/sshd

Najděte řádek auth substack password-auth směrem nahoru souboru. Zakomentujte jej přidáním znaku # jako prvního znaku na řádku. Tím řeknete systému PAM, aby se neptal na heslo.

/etc/pam.d/sshd
. . .#auth substack password-auth. . .

Uložte a zavřete soubor a restartujte SSH.

  • sudo systemctl restart sshd.service

Nyní se zkuste znovu přihlásit k serveru pomocí jiné relace. Na rozdíl od minula by vás SSH mělo požádat o ověřovací kód. Po jeho zadání budete přihlášeni. I když se nezobrazí žádný údaj o tom, že byl použit váš klíč SSH, váš pokus o přihlášení použil dva faktory. Pokud si to chcete ověřit, můžete za příkaz SSH přidat -v (pro verbose):

Example SSH output\
. . .debug1: Authentications that can continue: publickeydebug1: Next authentication method: publickeydebug1: Offering RSA public key: /Users/sammy/.ssh/id_rsadebug1: Server accepts key: pkalg ssh-rsa blen 279Authenticated with partial success.debug1: Authentications that can continue: keyboard-interactivedebug1: Next authentication method: keyboard-interactiveVerification code:

Koncem výstupu uvidíte místo, kde SSH použije váš klíč SSH a pak se zeptá na ověřovací kód. Nyní se můžete přihlásit přes SSH pomocí klíče SSH a jednorázového hesla. Pokud chcete vynutit všechny tři typy ověřování, můžete postupovat podle dalšího kroku.

Krok 4 – Přidání třetího faktoru (volitelné)

V kroku 3 jsme uvedli schválené typy ověřování v souboru sshd_config:

  1. publickey (klíč SSH)
  2. password publickey (heslo)
  3. keyboard-interactive (ověřovací kód)

Ačkoli jsme uvedli tři různé faktory, s dosud zvolenými možnostmi umožňují pouze klíč SSH a ověřovací kód. Pokud byste chtěli mít k dispozici všechny tři faktory (klíč SSH, heslo a ověřovací kód), jednou rychlou změnou povolíte všechny tři.

Otevřete konfigurační soubor PAM sshd.

  • sudo nano /etc/pam.d/sshd

Najděte dříve zakomentovaný řádek #auth substack password-auth a odkomentujte jej odstraněním znaku #. Soubor uložte a zavřete. Nyní ještě jednou restartujte SSH.

  • sudo systemctl restart sshd.service

Povolením volby auth substack password-auth se nyní bude PAM kromě kontroly klíče SSH a dotazu na ověřovací kód, které nám fungovaly dříve, ptát i na heslo. Nyní můžeme použít něco, co známe (heslo), a dva různé typy věcí, které máme (klíč SSH a ověřovací kód), prostřednictvím dvou různých kanálů.

V tomto článku jsme zatím nastínili, jak povolit MFA pomocí klíče SSH a časového jednorázového hesla. Pokud vám to stačí, můžete zde skončit. Není to však jediný způsob, jak vícefaktorové ověřování provést. Níže uvádíme několik dalších způsobů použití tohoto modulu PAM pro vícefaktorové ověřování a několik tipů a triků pro obnovení, automatizované použití a další.

Tip 1 – Obnovení přístupu

Stejně jako u každého systému, který zpevníte a zabezpečíte, se stáváte odpovědnými za správu tohoto zabezpečení. V tomto případě to znamená neztratit klíč SSH nebo tajný klíč TOTP a zajistit si přístup k aplikaci TOTP. Někdy se však stane, že ztratíte kontrolu nad klíči nebo aplikacemi, do kterých se potřebujete dostat.

Ztráta klíče SSH nebo tajného klíče TOTP

Pokud ztratíte klíč SSH nebo tajný klíč TOTP, lze obnovu rozdělit do několika kroků. Prvním je dostat se zpět bez znalosti ověřovacího kódu a druhým je nalezení tajného klíče nebo jeho regenerace pro běžné přihlášení MFA.

Chcete-li se dostat dovnitř po ztrátě tajného klíče, který generuje ověřovací kód na Dropletu DigitalOcean, můžete jednoduše použít virtuální konzoli z ovládacího panelu a přihlásit se pomocí uživatelského jména a hesla.

V opačném případě budete potřebovat administrátorského uživatele, který má přístup sudo; ujistěte se, že pro tohoto uživatele není povoleno MFA, ale že používá pouze klíč SSH. Pokud vy nebo jiný uživatel ztratíte svůj tajný klíč a nebudete se moci přihlásit, pak se může administrátorský uživatel přihlásit a pomoci obnovit nebo regenerovat klíč pro kteréhokoli uživatele pomocí sudo.

Jakmile jste přihlášeni, existují dva způsoby, jak pomoci získat tajný klíč TOTP:

  1. Obnovit stávající klíč
  2. Vygenerovat nový klíč

V domovském adresáři každého uživatele je tajný klíč a nastavení Google Authenticator uloženo v ~/.google-authenticator. Úplně první řádek tohoto souboru je tajný klíč. Rychlým způsobem, jak tento klíč získat, je provedení následujícího příkazu, který zobrazí první řádek souboru google-authenticator (tj. tajný klíč). Poté vezměte tento tajný klíč a ručně jej zadejte do aplikace TOTP.

  • head -n 1 /home/sammy/.google_authenticator

Pokud existuje důvod, proč nepoužít stávající klíč (například nemožnost snadno bezpečně sdílet tajný klíč s ovlivněným uživatelem nebo byl stávající klíč kompromitován), můžete soubor ~/.google-authenticator rovnou odstranit. To umožní uživateli znovu se přihlásit pouze pomocí jediného faktoru za předpokladu, že jste nevynutili MFA odstraněním ‚nullok‘ v souboru ‚/etc/pam.d/sshd‘. Poté může spustit google-authenticator a vygenerovat nový klíč.

Ztráta přístupu k aplikaci TOTP

Pokud se potřebujete přihlásit k serveru, ale nemáte přístup k aplikaci TOTP, abyste získali ověřovací kód, můžete se stále přihlásit pomocí kódů pro obnovení, které se zobrazily při prvním vytvoření tajného klíče. Upozorňujeme, že tyto kódy pro obnovení jsou jednorázové. Jakmile je jeden z nich použit k přihlášení, nelze jej znovu použít jako ověřovací kód.

Tip 2 – Změna nastavení ověřování

Pokud chcete změnit nastavení MFA po počáteční konfiguraci, můžete místo generování nové konfigurace s aktualizovaným nastavením pouze upravit soubor ~/.google-authenticator. Tento soubor je uspořádán následujícím způsobem:

.google-authenticator layout
<secret key><options><recovery codes>

Možnosti, které jsou nastaveny v tomto souboru, mají řádek v sekci možností; pokud jste při počátečním nastavení odpověděli na určitou možnost „ne“, je příslušný řádek ze souboru vyloučen.

Tady jsou změny, které můžete v tomto souboru provést:

  • Chcete-li povolit sekvenční kódy místo časových, změňte řádek " TOTP_AUTH na " HOTP_COUNTER 1.
  • Chcete-li povolit vícenásobné použití jednoho kódu, odstraňte řádek " DISALLOW_REUSE.
  • Chcete-li prodloužit okno platnosti kódu na 4 minuty, přidejte řádek " WINDOW_SIZE 17.
  • Chcete-li zakázat vícenásobné neúspěšné přihlášení (omezení rychlosti), odstraňte řádek " RATE_LIMIT 3 30.
  • Chcete-li změnit práh omezení rychlosti, najděte řádek " RATE_LIMIT 3 30 a upravte čísla. Číslo 3 v originále označuje počet pokusů za určitý časový úsek a 30 označuje časový úsek v sekundách.
  • Chcete-li zakázat používání kódů pro obnovení, odstraňte pět osmimístných kódů ve spodní části souboru.

Tip 3 – Vyhnutí se MFA pro některé účty

Může nastat situace, kdy jeden uživatel nebo několik servisních účtů (tj. účtů používaných aplikacemi, nikoli lidmi) potřebuje přístup SSH bez zapnutého MFA. Například některé aplikace, které používají SSH, jako například někteří klienti FTP, nemusí podporovat MFA. Pokud aplikace nemá možnost vyžádat si ověřovací kód, může se požadavek zaseknout, dokud spojení SSH nevyprší.

Pokud je správně nastaveno několik možností v položce /etc/pam.d/sshd, můžete řídit, které faktory se použijí pro jednotlivé uživatele.

Chcete-li pro některé účty povolit MFA a pro jiné pouze klíč SSH, ujistěte se, že jsou aktivní následující nastavení v /etc/pam.d/sshd.

/etc/pam.d/sshd
#%PAM-1.0auth required pam_sepermit.so#auth substack password-auth. . .# Used with polkit to reauthorize users in remote sessions-session optional pam_reauthorize.so prepareauth required pam_google_authenticator.so nullok

Zde je auth substack password-auth zakomentováno, protože hesla musí být zakázána. MFA nelze vynutit, pokud mají mít některé účty MFA zakázané, proto ponechte volbu nullok na posledním řádku.

Po nastavení této konfigurace jednoduše spusťte google-authenticator jako všichni uživatelé, kteří potřebují MFA, a nespouštějte ji pro uživatele, u kterých se budou používat pouze klíče SSH.

Tip 4 – Automatizace nastavení pomocí správy konfigurace

Mnoho správců systémů používá ke správě svých systémů nástroje pro správu konfigurace, jako je Puppet, Chef nebo Ansible. Pokud chcete takový systém použít k instalaci nastavení tajného klíče při vytváření účtu nového uživatele, existuje k tomu metoda.

google-authenticator Podporuje přepínače příkazového řádku pro nastavení všech možností v jediném neinteraktivním příkazu. Chcete-li zobrazit všechny možnosti, můžete zadat příkaz google-authenticator --help. Níže je uveden příkaz, který by vše nastavil tak, jak je uvedeno v kroku 1:

  • google-authenticator -t -d -f -r 3 -R 30 -W

Tento příkaz odpoví na všechny otázky, které jsme zodpověděli ručně, uloží je do souboru a poté vypíše tajný klíč, QR kód a kódy pro obnovení. (Pokud přidáte příznak -q, nebude výstup žádný.) Pokud tento příkaz použijete automatizovaně, nezapomeňte zachytit tajný klíč a/nebo kódy pro obnovení a zpřístupnit je uživateli.

Tip 5 – Vynucení MFA pro všechny uživatele

Pokud chcete vynutit MFA pro všechny uživatele i při prvním přihlášení nebo pokud byste raději nespoléhali na to, že si uživatelé budou generovat vlastní klíče, existuje snadný způsob, jak to vyřešit. Pro každého uživatele můžete jednoduše použít stejný soubor .google-authenticator, protože v něm nejsou uložena žádná data specifická pro daného uživatele.

K tomu je třeba, aby po prvotním vytvoření konfiguračního souboru privilegovaný uživatel zkopíroval soubor do kořenového adresáře každého domovského adresáře a změnil jeho oprávnění na příslušného uživatele. Soubor můžete také zkopírovat do adresáře /etc/skel/, aby se po vytvoření automaticky zkopíroval do domovského adresáře nového uživatele.

Upozornění: To může představovat bezpečnostní riziko, protože všichni sdílejí stejný druhý faktor. To znamená, že pokud dojde k jeho úniku, je to stejné, jako by každý uživatel měl pouze jeden faktor. Vezměte to v úvahu, pokud chcete tento přístup použít.

Jinou metodou, jak vynutit vytvoření tajného klíče uživatele, je použití skriptu bash, který:

  1. Vytvoří token TOTP,
  2. vyzve je, aby si stáhli aplikaci Google Authenticator a naskenovali QR kód, který se zobrazí, a
  3. spustí pro ně aplikaci google-authenticator po kontrole, zda soubor .google-authenticator již existuje.

Chcete-li mít jistotu, že se skript spustí, když se uživatel přihlásí, můžete jej pojmenovat .bash_login a umístit do kořenového adresáře jeho domovského adresáře.

Závěr

Tím, že máte dva faktory (klíč SSH + token MFA) ve dvou kanálech (počítač + telefon), jste velmi ztížili vnějšímu agentovi, aby se do vašeho počítače dostal hrubou silou přes SSH, a výrazně jste zvýšili zabezpečení vašeho počítače.

Pokud se vám podařilo zajistit, aby se uživatelé přihlásili do počítače přes SSH, budete mít jistotu, že se skript spustí.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.