Two-Factor Authentication (2FA) via Google Authenticator on Ubuntu Server
Procedure for adding two-factor authentication (2FA) to a server using Google Authenticator. 2FA is a method of securing server access (typically through SSH and local access) by combining a user password with a one-time password (OTP), which is generated by the Google Authenticator app on the user's mobile device. This process adds an additional layer of security to the authentication mechanism, as an attacker would need to know the password and have the current OTP to successfully log in.

Procedure for Adding and Activating 2FA via Google Authenticator on Ubuntu Server
- Install the "Google Authenticator" app from Google on your mobile phone. The app is available for both iOS and Android.
- On the server, install the Google Authenticator package
sudo apt install -y libpam-google-authenticator Depending on where we want to apply the 2FA requirement during login, we determine the PAM (pluggable authentication modules) configuration file into which the entry
auth required pam_google_authenticator.sois inserted, see the options below:2FA for both SSH and local login- Open the PAM configuration file
common-authsudo nano /etc/pam.d/common-authThe record
auth required pam_google_authenticator.somust be inserted into the configuration file. The position of insertion affects the order in which 2FA authorization is required.- If inserted at the beginning, as shown below, the 2FA code is required before the password.
... # pam-auth-update to manage selection of other modules. See # pam-auth-update(8) for details. <strong><mark># Enable Google Authenticator auth required pam_google_authenticator.so</mark></strong> # here are the per-package modules (the "Primary" block) ... - If inserted at the end of the file, 2FA will be required after entering the password.
- If inserted at the beginning, as shown below, the 2FA code is required before the password.
- Save and close the file with the keyboard shortcut
CTRL+X, thenYandENTER.
2FA for SSH login only- Open the PAM configuration file
sshdsudo nano /etc/pam.d/sshdThe record
auth required pam_google_authenticator.somust be inserted into the configuration file, as shown below:# PAM configuration for the Secure Shell service # Standard Un*x authentication. <strong>@include common-auth <mark># Enable Google Authenticator auth required pam_google_authenticator.so</mark></strong> # Disallow non-root logins when /etc/nologin exists. account required pam_nologin.soNotice the record
@include common-auth- this is updated in case of the previous method (2FA for both local and remote login). Therefore, the recordauth required pam_google_authenticator.sois already loaded (= 2FA from local login is automatically defined for remote login). - Save and close the file with the keyboard shortcut
CTRL+X, thenYandENTER.
Note: If you no longer want to require a password for remote login, you can comment out the record
@include common-auth(However, ensure that you have the 2FA record in the filesudo nano /etc/pam.d/sshd.Note: 2FA is automatically applied to
sudocommands and to all regular server users as well.- Open the PAM configuration file
- Open the configuration file
sshd_configsudo nano /etc/ssh/sshd_config- Ensure that
KbdInteractiveAuthenticationis set toyes - At the end of the file, insert the record:
AuthenticationMethods keyboard-interactive:pamIf public key is also activated, its requirement can be specified by the record:
AuthenticationMethods publickey,keyboard-interactive:pam - Save and close the file with the keyboard shortcut
CTRL+X, thenYandENTER.
- Ensure that
- On the server, invoke the command
google-authenticatorand choose the optionyfor "time based tokens". - Open the Google Authenticator app on your mobile phone and with the "+ (Add) → scan QR code" option, link your phone to the server.
- The QR code is defined by a security key (secret key), which is displayed under the said QR code. Write down this code.
- As prompted, type the code displayed in the Google Authenticator app into the terminal.
- Carefully keep the displayed five eight-digit backup codes along with the secret key (2 points above) for possible use in case of phone loss.
- When prompted about updating the file
/*username*/.google_authenticator, respond withy - When prompted about the prohibition of reuse of codes, respond with
y - When prompted about time skew, respond with
n - When prompted about rate-limiting, respond with
y - Restart ssh(d) serviceUbuntu 24.04
sudo systemctl restart sshUbuntu 22.04sudo systemctl restart sshd sudo systemctl restart ssh - 2FA is now activated for logging in and
sudocommands. - If there are multiple regular users on the server, a 2FA authentication setup via
google-authenticatormust be performed individually for each user. Each user always has their own 2FA codes.- Switch to a specific user:
$ sudo su - someuser - Start the 2FA configuration for a user:
$ google-authenticator - Return to the original user:
$ exit
- Switch to a specific user:


