NFsec Logo

Podwójne uwierzytelnienie w SSH (2FA) za pomocą FreeOTP

06/04/2016 w Bezpieczeństwo Brak komentarzy.  (artykuł nr 515, ilość słów: 501)

P

odówjne uwierzytelnianie polega na zabezpieczeniu dostępu do danej usługi (tutaj SSH) polegająca na dodatkowym uwierzytelnieniu oprócz wpisania standardowego loginu i hasła. Najczęściej występujące rodzaje zabezpieczeń to: sms z dodatkowym kodem; kody jednorazowe spisane na kartce lub wysyłane na adres e-mail; aplikacja z kodami jednorazowymi zainstalowana na komputerze lub urządzeniu mobilnym (tablet / telefon). W tym artykule skupimy się na kodach jednorazowych (OTP – One Time Passwords), które dodatkowo będą chronić naszą usługę SSH.

Istnieją dwa rodzaje OTP – oparte na zdarzeniu (wygasają, gdy zostały użyte do wybranego zdarzenia np. zalogowania się) oraz na podstawie czasu (wygasają po upływie określonej liczbie sekund np., co 30). Poniżej wykorzystamy OTP wygasające po określonym czasie podobnie, jak robi to GitHub, Evernote, czy Facebook. Zacznijmy od konfiguracji serwera SSH dla użytkownika agresor, aby później wykorzystać aplikację firmy Red Hat FreeOTP Authenticator w celu wprowadzania kodów jednorazowych. Instalujemy w systemie (Ubuntu 14.04 LTS) OATH Toolkit oraz bibliotekę do obsługi w PAM:

apt-get install -y oathtool libpam-oath

Generujemy sekretny ciąg hex, który posłuży nam do stworzenia kolejnego sekretu base32:

export HEX_SECRET=$(head -10 /dev/urandom | md5sum | cut -b 1-30)
echo $HEX_SECRET
ebd6fac686e27d905ce6d526783d03

Tworzymy dane wejściowe dla aplikacji FreeOTP za pomocą standardowych ustawień oathtool (6 cyfrowe kody / SHA1):

root@darkstar:~# oathtool --verbose --totp $HEX_SECRET
Hex secret: ebd6fac686e27d905ce6d526783d03
Base32 secret: 5PLPVRUG4J6ZAXHG2UTHQPID
Digits: 6
Window size: 0
Step size (seconds): 30
Start time: 1970-01-01 00:00:00 UTC (0)
Current time: 2016-04-05 21:15:35 UTC (1459890935)
Counter: 0x2E689F7 (48663031)

484909

Wartość sekcji Hex oraz Base32 secret wprowadzamy do aplikacji FreeOTP (Type: TOTP; Digits: 6; Algorithm: SHA1; Interval: 30). Następnym krokiem jest utworzenie pliku z danymi uwierzytelniającymi użytkownika agresor. Konfiguracja PAM wykorzystuje do tego /etc/users.oath w określonym formacie:

touch /etc/users.oath
chmod go-rw /etc/users.oath
echo "HOTP/T30 agresor - $HEX_SECRET" >> /etc/users.oath
unset HEX_SECRET

Do konfiguracji PAM dla daemona SSH (/etc/pam.d/sshd) dodajemy na samym początku obsługę kodów jednorazowych:

auth   requisite   pam_oath.so   usersfile=/etc/users.oath

Na końcu pozostaje włączenie “ChallengeResponseAuthentication“, aby daemon SSH był w stanie zadać użytkownikowi określoną liczbę pytań o kody jednorazowe:

sed -Ei -e 's/(ChallengeResponseAuthentication) no/\1 yes/' /etc/ssh/sshd_config
service ssh restart

Sprawdzamy działanie mechanizmu:

ssh 192.168.111.2 -l agresor
One-time password (OATH) for `agresor':
Password:
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.19.0-58-generic x86_64)
...

W tym przykładzie wykorzystaliśmy szyfrowanie SHA1 (podatne na atak kolizji) ze względu, że jest to jedyne dostępne w standardowej wersji (2.0.2) dostarczonej z tą wersją systemu Ubuntu. Nowsza wersja biblioteki (np. 2.6.1) oferuje już sha256 oraz sha512. Decydując się na użycie oathtool na systemach produkcyjnych warto też skonfigurować od razu używanie 8 znakowych kodów (-d 8 / digits=8 / HOTP/T30/8). Dodatkowo wykorzystanie biblioteki pam_oath umożliwia nam zabezpieczenie nie tylko serwera ssh, ale także programów takich, jak su, czy sudo.

Więcej informacji: Uwierzytelnianie wielopoziomowe, Two-factor time based (TOTP) SSH authentication with pam_oath and Google Authenticator, One-Time-Passwords using oathtool on Ubuntu 14.04(+)

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , , , ,

Komentowanie tego wpisu jest zablokowane.