Dvou-faktorové ověření (2FA) přes Google Authenticator na Ubuntu Server

Postup pro přidání dvoufaktorového ověření (2FA) na server s využitím Google Authenticator. 2FA představuje způsob, jak zabezpečit přístup k serveru (typicky přes SSH a lokální přístup) pomocí kombinace uživatelského hesla + jednorázového hesla (OTP), které generuje aplikace Google Authenticator na mobilním zařízení uživatele. Tento proces přidává další vrstvu bezpečnosti k autentizačnímu mechanismu, protože útočník by potřeboval jak znát heslo, tak mít aktuální OTP, aby se úspěšně přihlásil.

Postup přidání a aktivace 2FA prostřednictvím Google Authenticator na Ubuntu server

  1. Do mobilního telefonu si nainstalujte aplikaci "Google Authenticator" od vydavatele Google. Aplikace je dostupná pro iOS i Android.
  2. Na serveru nainstalujte balíček Google authentizátoru
    sudo apt install -y libpam-google-authenticator
  3. Dle toho, kde všude cheme požadavek 2FA při přihlašování aplikovat, určíme konfigurační soubor PAM (pluggable authentication modules), do kterého záznam auth required pam_google_authenticator.so vložíme, viz varianty níže:

    • Otevřete konfigurační PAM soubor common-auth
      sudo nano /etc/pam.d/common-auth

      Do konfiguračného souboru je nutné vložit záznam auth required pam_google_authenticator.so. Pozice vložení ovlivňuje pořadí, ve kterém je 2FA autorizace požadována.

      • Jestliže je vložen na začátek, viz vyznačená část níže, 2FA kód je vyžadován před heslem.
        ...
        # pam-auth-update to manage selection of other modules.  See
        # pam-auth-update(8) for details.
        
        # Enable Google Authenticator
        auth required pam_google_authenticator.so
        
        # here are the per-package modules (the "Primary" block)
        ...
        
      • Jestliže je vložen na konec souboru, 2FA bude vyžadováno až po zadání hesla.
    • Klávesovou zkrátkou CTRL+X a následně klávesami Y a ENTER soubor uložte a zavřete.
    • Otevřete konfigurační PAM soubor sshd
      sudo nano /etc/pam.d/sshd

      Do konfiguračného souboru je nutné vložit záznam auth required pam_google_authenticator.so, viz vyznačená část níže:

      # PAM configuration for the Secure Shell service
      
      # Standard Un*x authentication.
      @include common-auth
      
      # Enable Google Authenticator
      auth required pam_google_authenticator.so
      
      # Disallow non-root logins when /etc/nologin exists.
      account    required     pam_nologin.so
      

      V souboru si povšimněme i záznamu @include common-auth - ten se aktualizuje v případě předchozí metody (2FA i u lokálního přihlašování). Tedy, záznam auth required pam_google_authenticator.so je v takovém případě již načítán (= 2FA z lokálního přihlašování je automaticky definováno i u vzdáleného přihlašování).

    • Klávesovou zkrátkou CTRL+X a následně klávesami Y a ENTER soubor uložte a zavřete.

    Poznámka: Nechceme-li dále vyžadovat heslo při vzdáleném přihlašování, záznam @include common-auth můžeme zakomentovat (Pohlídejte si však, že záznam pro 2FA máte i v souboru sudo nano /etc/pam.d/sshd.

    Poznámka: 2FA je automaticky aplikováno i pro sudo příkazy. Stejně tak pro přihlášení veškerých uživatelů.

  4. Otevřete konfigurační soubor sshd_config
    sudo nano /etc/ssh/sshd_config
    • Ujistěte se, že KbdInteractiveAuthentication je nastaven na možnost yes
    • Na konec souboru vložte záznam:
      AuthenticationMethods keyboard-interactive:pam

      Jestliže máme aktivován i public key, můžeme jeho vyžadování vyžadovat záznamem:

      AuthenticationMethods publickey,keyboard-interactive:pam
  5. Klávesovou zkrátkou CTRL+X a následně klávesami Y a ENTER soubor uložte a zavřete.
  6. Na serveru zavolejte příkaz google-authenticator a zvolte možnost y pro "time based tokens".
  7. Otevřete Google Authenticator aplikaci na mobilním telefonu a možností "+ (Přidat) → naskenovat QR kód" si vložte do telefonu propojení se serverem.
  8. QR kód je difinován bezpečnostním klíčem (secret key), který je zobrazen pod daným QR kódem. Tento kód si opište.
  9. Na základě vyzvání přepiště kód zobrazený v Google Authenticátor aplikace do terminálu.
  10. Zobrazených záchranných 5 osmímístných kódů si spolu s secret key (2 body výše) pečlivě uschovejte pro možnost použití v případě ztráty telefonu.
  11. na výzvu ohledně aktualizace souboru /*username*/.google_authenticator odpovězte y
  12. Na výzvu ohledně zákazu opětovného použití kódů odpovězte y
  13. Na výzvu ohledně časového posunu (time skew) odpovězte n
  14. Na výzvu ohledně rate-limitingu odpovězte y
  15. Restartujte ssh(d) service
    sudo systemctl restart ssh
    sudo systemctl restart sshd
    sudo systemctl restart ssh
  16. Nyní je aktivováno 2FA při přihlašování a sudo příkazech.
  17. Jestliže je na serveru více běžných uživatelů, 2FA autentizační soubor prostřednictvím google-authenticator je nutné provést pro každého uživatele zvlášť. Každý uživatel má vždy vlastní 2FA kódy.
    • Přepnutí se na konkrétního uživatele: $ sudo su - someuser
    • Spuštění 2FA konfigurace pro uživatele $ google-authenticator
    • Návrat na původního uživatele: $ exit