Kahetasemeline autentimine tarkvaraga OpenSSH

Allikas: Imre kasutab arvutit

Sissejuhatus

Üldiselt on mitmetasemelise autentimisega süsteemi tunnuseks

  • autentimiseks kasutatakse erinevaid saladusi (authentication factor)
  • autentimiseks vajalikud saladused on seotud erinevate füüsiliste seadmetega (authentication channel)
  • edukaks autentimiseks peab kõigi saladuste kontroll õnnestuma

Nt on üheks saladuseks unix kasutajanimi ja parool ning vastavaks kanaliks arvuti; teiseks saladuseks on ühekordse kehtivusega mingi kood ja kanaliks telefon. Käesolevas tekstis

  • tegeldakse OpenSSH kahetasemelise autentimisega
  • nutitelefoni kasutatakse teise kanalina (nö pin-kalkulaatorina)
  • teist saladust käsitletakse https://tools.ietf.org/html/rfc6238 alusel realiseeritud tarkvara Google Auhtenticator (esineb nutitelefoni app'ina ja arvuti pam moodulina) abil

Mõisted

Tööpõhimõte

Kahetasemeline (üldiselt mitmetasemeline) autentimise korraldus raskendab pahalase jaoks süsteemi sisselogimist. Tal on tarvis teada kasutaja nö tavalisele ligipääsule lisaks ajas muutuvat koodi (nt iga 30 sekundi järel). Nt kui kasutajal on sama kasutajanimi ja parool mitmes kohas kasutusel ja pahalasel on õnnestunud see teada saada, siis tal on lisaks vaja kasutaja telefoni, et saada kasutada õigeid koode. Või vastupidi, kui tal on kasutada kasutaja telefon, tal on lisaks vaja teada tema kasutajanime ja parooli.

2FA töötamisel osalevad kolm seadet, eesmärgiks on kasutajalt sisselogimisel küsida, ja toodud järjekorras

  • kasutajanime ja parooli
  • ajas muutuvat ühekordselt kasutatavat koodi
                     _____                                        ____
     klient arvuti  |     | ssh klient               nutitelefon |    | Google Authenticator App
                    |     |                                      |    |
                    |_____|                                      |____|
                       |
                       |

                    internet                        
 
                       |
                     __|__
         ssh server |     | Google Authenticator PAM moodul
                    |     |
                    |_____|

kus

  • serverisse on paigaldatud Google Auhtenticator pam teek, mis oskab genereerida koode
  • ssh serveris on seadistatud käima kaheosaline pam stack (unix parooli ja koodi küsimine)
  • nutitelefonis töötav Google Authenticator App genereerib ja esitab ekraanil 30 sekundi järel muutuvaid koode (6-kohelised arvud)
  • ssh klient oskab serverile öelda kasutajanime, parooli ja koodi
  • arvutites ja telefonis peab kellaaeg olema õige

Serveris töötav pam teek ja telefonis töötav app varustatakse süsteemi ettevalmistamisel ühesuguse nö shared alus-saladusega, mis võimaldab neil genereerida ajast sõltuvalt samasuguseid koode. Kui kasutaja pöördub ssh klientprogrammiga serveri poole, siis küsitakse talt kasutajanime ja parooli ning seejärel lisaks ajas muutuvat koodi. Taustal arvutab Google Authenticator pam teek samuti koodi ja võrdleb seda kasutajalt saadud koodiga, kontroll õnnestub kui koodid klapivad.

Väited

  • Google Authenticator kood on algselt tehtud Google poolt ja seda saab kasutada nt Android operatsioonisüsteemiga app kujul ning Linux operatsioonisüsteemiga PAM teegi kujul; kood on täna open source
  • Google Authenticator kasutamiseks ei pea olema ühelgi kolmest komponendist ühendust internetiga; ilmselt peab olema ssh kliendi ja ssh serveri vahel võrguühendus; telefon ei pea olema ei wifi ega nö telefonivõrgus
  • Google Authenticator app on pin-kalkulaatori sarnane ese
  • tegu ei ole ssh serverisse Google kontoga seotud andmeid kasutades sisse logimisega
  • kas õigem oleks küsida enne unixi kasutajanime ja parool ning seejärel koodi, või vastupidi
  • 2FA autentimine seadistatakse iga kaustaja jaoks eraldi (kodukataloogis on vastav ~/.google_authenticator fail)

OpenSSH kahetasemeline autentimine on selles mõttes pisut segane teema, et üldiselt saab valida kahe taseme rolli mitmeid komplekte faktoreid, nt

  • ssh võti ja ühekordse kasutusega kood
  • unixi kasutajanimi ja ühekordse kasutusega kood
  • ssh võti ja unixi kasutajanimi (kuigi see ei ole päris õige 2FA kuna kasutatakse sama kanalit kaks korda)

Osa faktorite kasutamise konfi tehakse SSH seadistusfailis ja osa PAM seadistusfailis. Kuidas see täpselt ühel või teisel juhul toimub on täpsustatud teksti sees.

Järneva teksti põhiosa esitab juhtumi, kus kasutajalt küsitakse esmalt unix'i kasutajanime ja parooli ning seejärel ühekordse kehtivusega koodi.

Tarkvara paigaldamine

Tarkvara paigaldamiseks sobib öelda

# apt-get install libpam-google-authenticator

tulemusena paigaldadatakse failisüsteemi

  • /lib/x86_64-linux-gnu/security/pam_google_authenticator.so - pam teek
  • /usr/bin/google-authenticator - utiliit
  • man pam_google_authenticator
  • man google-authenticator

SSH serveri SSH serveri seadistamine

SSH serveri seadistustes peavad olema sellised read

# cat /etc/ssh/sshd_config
..
ChallengeResponseAuthentication yes
...
UsePAM yes
....
Match User imre
  AuthenticationMethods keyboard-interactive

kus

  • AuthenticationMethods keyboard-interactive - autentimine delegeeritakse pam süsteemile, mis nö ühe ringiga sooritab kaks kontrolli (unix parool ja ühekordne kood)

Muudatuse kehtestamiseks tuleb sshd server restartida, seejuures maksab jälgida, et kogemata ennast süsteemist välja ei lukustata

# systemctl restart ssh

SSH server PAM seadistamine

SSH serveri /etc/pam.d/sshd faili lõppu tuleb lisada üks rida

# cat /etc/pam.d/sshd
@include common-auth
..

auth required pam_google_authenticator.so

Tulemusena moodustub kahe elemendiline pam stack

  • @include common-auth - nö tavaline unix parooli küsimine
  • auth required pam_google_authenticator.so - ühekordse kehtivusega kood

Muudatuse kehtestamiseks ei tule midagi restartida. Autentimise õnnestumiseks peavad mõlemad kontrollid õnnestuma ('required') kusjuures kontrollid tehakse nende sshd failis esinemise järjekorras. SSH serveri protsessi seisukohalt pöördutakse üks kord PAM süsteemi poole, mis sisemiselt teeb kaks kontrolli ja tagastab vastuse ssh serverile.

Märkused

  • selleks, et esmalt toimuks koodi küsimine ja seejärel kasutajanime ja parooli kontroll tuleb 'auth required pam_google_authenticator.so' kirjutada enne '@include common-auth' rida

SSH serveri kasutaja ettevalmistamine

SSH serveris peab kasutaja kodukataloogis olema sobiva sisuga fail, google authenticator'i pam teek kasutab seda

$ cat /home/imre/.google_authenticator 
AG47PNNREU66D6AMWEVHTGNGOM
" TIME_SKEW -12
" RESETTING_TIME_SKEW 
" DISALLOW_REUSE 49702471
" TOTP_AUTH
41573609
34743536
89725878
98704016
59494790

Selle genereerimiseks sobib öelda kasutajana

$ google-authenticator

misjärel küsitakse mõned küsimused ja esitatakse ekraanile qr kood. See kood on vaja kaameraga telefoni salvestada (või sisestada teksti kujul).

SSH kliendi arvuti ettevalmistamine

SSH kliendi juures ei ole vaja midagi ettevalmistada.

SSH kliendi telefoni ettevalmistamine

SSH kliendi telefoni tuleb paigaldada Google Authentication app. Seejärel sisetada app'i '$ google-authenticator' käsu väljundis esitatud saladus.

Vt https://matthill.eu/linux/ssh-two-factor-authentication-google/

Sama App abil toimub ka GMail jt avalike teenuste 2FA.

SSH kliendi kasutamine

SSH kliendi kasutamine näeb välja selline

# ssh imre@192.168.10.244
Password: 
Verification code:

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Sat Apr  1 22:21:12 2017 from 192.168.10.10
imre@tls-mrl:~$

kus

  • esmalt küsitakse unix kasutaja 'imre' parooli
  • seejärel küsitakse ühekordselt kasutatavat koodi

Misc

OpenSSH 2FA autentimine mitme saladuste komplekti vahel valikuga

Nt sellise reaga on kasutajal kaks võimalust sisselogida (PAM seadistused on tehtud nii nagu teksti põhiosas)

AuthenticationMethods publickey keyboard-interactive
  • kasutades ssh võtit, sel juhul piisab võtmest
  • ssh võtme puudumisel küsitakse unixi parooli ning koodi

Nt selliselt saab küsida kasutajalt võtit ja koodi, ja ei küsita unix parooli

  • kasutades pam seadistusi nagu teksti põhiosas, aga @common-auth rida välja kommenteerida
  • ssh seadistustes kaustada rida
AuthenticationMethods publickey,keyboard-interactive

AuthenticationMethods argumentideks on üldiselt autentimise variantide komplektid, mis on üksteisest tühikutega eraldatud; komplekti sees on elemendid eraldatud komaga. ssh proovib kasutaja pöördumisega sobivat komplekti. Kõik komplekti elementidele vastavad kontrollid peavad õnnestuma.

OpenSSH sisene 2FA autentimine

Märkus: Käesolev näide ei eelda Google Authenticator vms lahenduse kasutamist.

Selleks, et ssh server nõuaks, et kasutajal peavad olema kasutada ssh võti ja parool, tuleb vaikeväärtustest erinevaks muuta ning lisada lõppu

# cat /etc/ssh/sshd_config
..
ChallengeResponseAuthentication yes

...
Match User imre
  AuthenticationMethods publickey,keyboard-interactive

kus

  • TODO

Tulemusena sisselogimine paistab selline

$ ssh imre@192.168.10.244
Authenticated with partial success.
Password: 

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Sat Apr  1 12:40:23 2017 from 192.168.10.10
imre@tls-mrl:~$

google-authenticator kompileerimine

TODO

Kasulikud lisamaterjalid