Uwierzytelnianie dwuskładnikowe w Webminie


Wiele punktów wejścia do systemu można sensownie zabezpieczyć: SSH na klucze zamiast haseł czy MySQL na certyfikaty clienckie, ale w przypadku Webmina albo trzeba się odizolować od sieci zewnętrznej, albo stosować bardzo silne hasła, albo spróbować uwierzytelniania dwukładnikowego. Ostatnio zdecydowałem się użyć takie oparte o Google Authenticator.

Drugi składnik

Webmin na chwilę obecna obsługuje dwie metody uwierzytelnienia dwuskładnikowego: Google Authenticator oraz Authy. Do odpowiednich ustawień dochodzi się poprzez Webmin Configuration a następnie Two-Factor Authentication.

Authy zdaje się być wygodniejsze dla użytkowników, bo można go używać na wielu urządzeniach jednocześnie, co sprawia, że można używać go na np. dwóch telefonach – gdy jeden się zgubi, bo możemy sięgnąć po zapasowy. Z drugiej strony trzeba teraz pilnować dwóch urządzeń a nie jednego… Nie to jednak jest problemem. Pierwotnie chciałem wdrożyć właśnie Authy, ale okazało się, że trzeba najpierw uzyskać Developer API Key i wprowadzić go do Webmina. Uzyskanie klucza to nic specjalnego, ale jak się okazuje, trzeba się zmierzyć z planem taryfowym i płatnościami – przynajmniej po przekroczeniu darmowych limitów. Nie zdecydowałem się więc na to rozwiązanie.

Google Authenticator można podobno mieć tylko na jednym urządzeniu – i mnie to pasuje. Gdybym je zgubił, to mogę zalogować się przez SSH i zapewne jakimiś sztuczkami rozłączyć moje konto użytkownika od uwierzytelniania drugim składnikiem.

W przypadku Webmina problem z użyciem GA jest taki, że Webmin dopomina się o rozmaite brakujące biblioteki PERLa, których na moim CentOSie nie było. Zainstalować ich się normalnie Webminem nie dało, bo nie mógł ich nigdzie znaleźć a kompilacja ze źródeł nie działała poprawnie – zresztą, był problem z pobraniem zależności. Jak się okazało, nie dało się tego wyklikać w panelu i trzeba było zejść na poziom shella i to shella PERLowskiego, czyli po zalogowaniu przez SSH trzeba było zrobić:

sudo perl -MCPAN -e shell

A następnie w nowym shellu wpisać:

install CPAN
reload cpan
install nazwa_brakujacego_modulu

Ściągania, kompilacji, testowania było mnóstwo, ale po pewnym czasie jednak wszystko zaczęło działać.

Użytkownicy chętni korzystać z tokenów muszą teraz sobie zainstalować odpowiednią aplikację na telefon, zalogować się do Webmina, odnaleźć sami siebie w Webmin Users, rozwinąć zakładkę „Security and Limits options” i następnie kliknąć przycisk „Enable Two-Factor Authotization”. Zostaną skierowani na stronę na której wyświetli się im QR code lub tekstowy token. Albo aplikacją zeskanujemy kod QR, albo trzeba wpisać token. Po chwili aplikacja powinna już zacząć serwować własne tokeny. Można spróbować się wylogować i zalogować.

Certyfikat kliencki

Na koniec dodam, że Webmin pozwala jeszcze na jedną metodę zabezpieczenia logowania: z użyciem certyfikatu klienckiego. Idea jest taka, że Webmin ustanawia u siebie centrum certyfikacji i generuje dla każdego użytkownika specjalny certyfikat, który wprowadza się do magazynu certyfikatów przeglądarki internetowej, i od tej pory wchodząc na stronę logowania użytkownik jest jakby automatycznie rozpoznawany. Fajnie to brzmi i nawet zabrałem się za to w pierwszej kolejności, ale okazało się, że ani Chrome ani Firefox nie chciały współpracować z Webminem, który swoją drogą miał chyba jakieś problemy z generowaniem certyfikatu. Oprócz tego pojawiał się komunikat, że ta funkcjonalność działa tylko z przeglądarką Mozilli.

Nie udało mi się tego uruchomić.

Jak wyłączyć uwierzytelnianie dwuskładnikowe?

Może się zdarzyć, że z przyczyn niejasnych nagle żaden token nie pomaga, nie można się zalogować. Warto spróbować zalogować się innym użytkownikiem – być może mieć takiego w zapasie, który tylko wymaga loginu i hasła a na co dzień jest zablokowany, aby odblokować go ręcznie przez SSH w chwili kryzysu. Natomiast jeżeli chodzi o całkowite wyłącznie uwierzytelniania dwuskładnikowego, to trzeba to zrobić tak (źródło):

sed -i 's/totp//g' /etc/webmin/miniserv.users
sed -i '/twofactor_provider=totp/d' /etc/webmin/miniserv.conf
/etc/init.d/webmin restart