This entry shows how to install Google Authenticator and set it up to provide ssh with two-factor authentication. This was done on Ubuntu Server 14.10. This is software that runs on your server and mobile device. It does not require a Gmail account or any third party service.
Install On Server
Install libpam-google-authenticator package:
stupiderror@localhost:~$ sudo -i [sudo] password for stupiderror: root@localhost:~# apt-get install libpam-google-authenticator Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: libqrencode3 The following NEW packages will be installed: libpam-google-authenticator libqrencode3 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Need to get 59.3 kB of archives. After this operation, 206 kB of additional disk space will be used. Do you want to continue? [Y/n] y
Now we will setup Google Authenticator for user stupiderror:
root@localhost:~# exit logout stupiderror@localhost:~$ google-authenticator Do you want authentication tokens to be time-based (y/n) y Your new secret key is: BHBWGPOSWB6K19QY Your verification code is 674538 Your emergency scratch codes are: 16572244 40474860 4213D034 55121160 04767458 Do you want me to update your "/home/stupiderror/.google_authenticator" file (y/n) y Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y By default, tokens are good for 30 seconds and in order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of 1:30min to about 4min. Do you want to do so (y/n) n If the computer that you are logging into isn't hardened against brute-force login 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
We choose to make the one time tokens time based. By default they are displayed for 30 seconds and have a 60 second grace period. Next it shows a QR code which was omitted above. This assists with getting it setup on your phone which we will get to next. If you don’t want to use the QR code you can enter the secret key on your phone instead. It then provides 5 emergency scratch codes. Write these down and they can be used when you need to login and your phone isn’t available. They are not time sensitive and each code can only be used once.
We choose yes to disallow the authentication token from being used more than once. If you want to log in to the server and you look to open two ssh sessions this means you can use the verification code displayed on your mobile device and then must wait for the next verification code to be displayed to complete the second login. If an attacker is able to sniff your keystrokes this means they cannot use the verification code you just used to log in.
We also enable rate limiting to slow down brute force attacks. Sshguard is installed and works fine with this enabled.
On your phone search for Google Authenticator App in the app store and install it. It is made by Google, Inc. Open Google Authenticator on your phone and press the + in the top right to add an account. Choose Scan barcode or Manual entry. If you choose Scan barcode then point the camera on your phone at the QR code that was displayed when you ran google-authenticator on the server. Once it sees the code it adds it and names it after the user and hostname of the server google-authenticator was run as. In this example it named it: stupiderror@localhost. If you would like to rename the entry then click the pencil icon in the top right on your mobile device. Then the name will have a pencil icon next to it and you can click the name and edit it.
If you choose manual entry then fill in the information requested. Account is just a friendly name for you to identify the server. You can set this up on multiple servers and/or multiple users and add them all. The account name allows you to differentiate them. For key you need to enter the secret key that was displayed after the QR code when you ran google-authenticator. In the above example the key is BHBWGPOSWB6K19QY. Do not use this key, you need to use the one that was generated for your account. Then enable or disable the time restriction, we are leaving it enabled.
Enable Google Authenticator On Server
The time and date settings are important. If the time and date on the server is too far off from the phone the time based verification codes will fail. Make sure the time and date are set correctly. You may want to make a crontab entry to sync it daily:
0 0 * * * /usr/sbin/ntpdate -s pool.ntp.org
We need root to edit these files:
stupiderror@localhost:~$ sudo -i [sudo] password for stupiderror: root@localhost:~# vi /etc/ssh/sshd_config
Find this line:
and change the no to yes
root@localhost:~# vi /etc/pam.d/sshd
Add the following line and it should be before “@include common-auth”:
auth required pam_google_authenticator.so
To enable these changes restart SSHD:
root@localhost:~# service ssh restart
I would not disconnect your current session because if something goes wrong you will need to login as a different user or fix it from the console.
Using keyboard-interactive authentication. Verification code: Using keyboard-interactive authentication. Password: Last login: example.net stupiderror@localhost:~$
If it isn't working properly the best place to look for error messages is probably the auth.log
root@localhost:~# tail -f /var/log/auth.log