Podwójne uwierzytelnienie w SSH (2FA) za pomocą FreeOTP
Napisał: Patryk Krawaczyński
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(+)