Beveilig SSH met Google Authenticator

Als u reeds een server met SSH heeft, bent u het waarschijnlijk al vaker tegengekomen: Gehackte webservers die proberen met brute-forcing (inbreken door middel van het uitproberen van verschillende wachtwoorden) in te loggen op uw SSH. Een hele reeks aan standaard users en wachtwoorden worden afgewerkt, in de hoop toegang tot uw server te verkrijgen.

Er zijn talloze oplossingen om dit tegen te gaan of moeilijker te maken. U kunt bijvoorbeeld alle IP's uitsluiten behalve degene waar u vandaan verbinding maakt, geen directe root-toegang toestaan, blokkeren na een x aantal mislukte pogingen, en SSH op een andere poort laten draaien. Hoewel wij deze oplossingen aanraden, gebruiken wij zelf sinds enige tijd een nog veiligere oplossing: twee factor authenticatie (two factor authentication).

Door gebruik te maken van Google Authenticator en uw smartphone, kunt u unieke codes genereren die slechts 30 seconden geldig zijn. Op die manier is er een extra code nodig naast uw username en wachtwoord, die bovendien elke 30 seconden wisselt. De kans dat de code van 6 cijfers geraden wordt binnen 30 seconden is zeer klein.

Door onderstaande handleiding te volgen kunt u uw server op deze manier beveiligen. De tutorial is geschreven met het oog op Redhat / Fedora / CentOS servers en vereist enige kennis van SSH. Uiteraard werkt dit ook op andere Linux distributies maar de commando's wijken in dat geval af. We gaan er vanuit dat nano geïnstalleerd is, echter kan het natuurlijk met elke willekeurige texteditor zoals vi.

Heeft u hier hulp bij nodig? Neem contact met ons op.
Genereer logincodes voor uw server met uw smartphone

Installatie

Zorg dat u bent ingelogd op uw server via SSH, als root.

Voer het volgende commando uit:
yum -y install ntp chkconfig ntpd on (CentOS 7: systemctl enable ntpd)
ntpdate pool.ntp.org
/etc/init.d/ntpd start (CentOS 7: systemctl start ntpd)

(Aangezien de codes op basis van tijd werken, is het nodig om te zorgen dat de ingestelde tijd van uw server correct is. ntp zorgt hiervoor).

Download en installeer de nieuwste EPEL repository:

CentOS 5:
rpm -Uvh http://ftp.astral.ro/mirrors/fedora/pub/epel/epel-release-latest-5.noarch.rpm
CentOS 6:
rpm -Uvh http://ftp.astral.ro/mirrors/fedora/pub/epel/epel-release-latest-6.noarch.rpm
CentOS 7:
rpm -Uvh http://ftp.astral.ro/mirrors/fedora/pub/epel/epel-release-latest-7.noarch.rpm
Installeer de vereiste onderdelen:
yum --enablerepo=epel install gcc gcc++ pam-devel subversion python-devel git
Kopieer de code van google-authenticator:
mkdir /root/google-authenticator; cd /root/google-authenticator
git clone https://code.google.com/p/google-authenticator/
cd google-authenticator/libpam/
make && make install

nano /etc/pam.d/sshd
Voeg toe, boven de eerste auth regel:
auth required pam_google_authenticator.so nullok
(nullok zorgt dat users waarbij google authenticator nog niet is opgezet, zonder code kunnen inloggen).
nano /etc/ssh/sshd_config
Stel in:
ChallengeResponseAuthentication yes

Controleer ook dat UsePAM op 'yes' staat.

Eventueel PubkeyAuthentication op 'no' zetten, in dat geval kan niet meer met 'vertrouwde PC's ingelogd worden).

Start op dit moment voor de zekerheid een 2e SSH venster, zodat u niet buitengesloten raakt indien er ergens iets fout is gegaan.

/etc/init.d/sshd restart (CentOS 7: systemctl restart sshd)

Controleer of het inloggen lukt.

Opzetten per gebruiker

Log in als de betreffende gebruiker. Voer uit: google-authenticator Antwoord op elke vraag yes (y) behalve de vraag over 'increase window time'. U krijgt het volgende te zien:
https://www.google.com/{linktogoogle}
Your new secret key is: {YOUR KEY}
Your verification code is: {YOUR CODE}
Your emergency scratch codes are: {EMERGENCY CODES}

Kopieer de bovenste link naar de adresbalk van uw browser om een QR-code te genereren. Deze kunt u inlezen op uw telefoon met de app 'Google Authenticator'.

Controleer of het inloggen lukt.