Serwer dwuskładnikowego uwierzytelniania LinOTP

Serwer dwuskładnikowego uwierzytelniania LinOTP

Dziś chciałbym podzielić się tym, jak skonfigurować serwer dwuskładnikowego uwierzytelniania, aby chronić sieć korporacyjną, strony internetowe, usługi i SSH. Na serwerze będzie działać połączenie: LinOTP + FreeRadius.

Po co nam to?
To całkowicie darmowe, wygodne rozwiązanie w obrębie własnej sieci, niezależne od zewnętrznych dostawców.

Usługa ta jest bardzo wygodna i przejrzysta, w odróżnieniu od innych produktów open-source, a także obsługuje ogromną liczbę funkcji i polityk (na przykład login+hasło+(PIN+OTPToken)). Integruje się z usługami wysyłania SMS przez API (LinOTP Config->Provider Config->SMS Provider), generuje kody dla aplikacji mobilnych typu Google Authenticator i wiele więcej. Uważam, że jest bardziej wygodny niż rozważany serwis w artykuł.

Ten serwer doskonale współpracuje z Cisco ASA, serwerem OpenVPN, Apache2, a tak naprawdę praktycznie z wszystkim, co obsługuje uwierzytelnianie przez serwer RADIUS (na przykład dla SSH w data center).

Wymagane:

1) Debian 8 (jessie) — Obowiązkowo! (próbna instalacja na debianie 9 opisana jest na końcu artykułu)

Początek:

Instalujemy Debiana 8.

Dodajemy repozytorium LinOTP:

# echo 'deb http://www.linotp.org/apt/debian jessie linotp' > /etc/apt/sources.list.d/linotp.list

Dodajemy klucze:

# gpg --search-keys 913DFF12F86258E5

Czasami przy „czystej” instalacji, po wykonaniu tej komendy, Debian wydaje:

gpg: utworzono katalog `/root/.gnupg'
gpg: utworzono nowy plik konfiguracyjny `/root/.gnupg/gpg.conf'
gpg: UWAGA: parametry w `/root/.gnupg/gpg.conf' jeszcze nie są aktywne w tym uruchomieniu
gpg: utworzono tabelę kluczy `/root/.gnupg/secring.gpg'
gpg: utworzono tabelę kluczy `/root/.gnupg/pubring.gpg'
gpg: nie określono serwerów kluczy (użyj --keyserver)
gpg: błąd podczas wyszukiwania na serwerze kluczy: zły URI

To początkowa konfiguracja gnupg. Nic strasznego. Po prostu wykonaj polecenie jeszcze raz.
Na pytanie Debiana:

gpg: wyszukiwanie "913DFF12F86258E5" na serwerze hkp keys.gnupg.net
(1)	LSE LinOTP2 Packaging 
	  klucz RSA 2048 bit F86258E5, utworzony: 2010-05-10
Klucze 1-1 z 1 dla "913DFF12F86258E5". Wprowadź liczby, N) Następny lub Q) Wyjście>

Odpowiadamy: 1

Dalej:

# gpg --export 913DFF12F86258E5 | apt-key add -

# apt-get update

Instalujemy mysql. Teoretycznie można użyć innego serwera SQL, ale dla uproszczenia będę korzystać z niego, jako rekomendowanego dla LinOTP.

(dodatkowe informacje, w tym o rekonfiguracji bazy LinOTP można znaleźć w oficjalnej dokumentacji na linkiem. Tam można znaleźć polecenie: dpkg-reconfigure linotp, aby zmienić parametry, jeśli już zainstalowałeś mysql).

# apt-get install mysql-server

# apt-get update

(jeszcze raz sprawdzenie aktualizacji nie zaszkodzi)
Instalujemy LinOTP i dodatkowe moduły:

# apt-get install linotp

Odpowiadamy na pytania instalatora:
Używać Apache2: tak
Wymyśl hasło dla admina Linotp: „TwojeHasło”
Czy wygenerować certyfikat samopodpisany?: tak
Czy używać MySQL?: tak
Gdzie znajduje się baza danych: localhost
Tworzymy bazę LinOTP (nazwa bazy) na serwerze: LinOTP2
Tworzymy osobnego użytkownika dla bazy danych: LinOTP2
Ustalamy hasło użytkownikowi: „TwojeHasło”
Czy stworzyć bazę teraz? (coś w rodzaju „Czy na pewno chcesz ...”): tak
Wprowadzamy hasło root do MySQL, które utworzyliśmy podczas instalacji: „TwojeHasło”
Gotowe.

(opcjonalnie, można tego nie robić)

# apt-get install linotp-adminclient-cli 

(opcjonalnie, można tego nie robić)

# apt-get install libpam-linotp  

A więc nasz interfejs webowy Linotp jest teraz dostępny pod adresem:

"<b>https<\/b>: \\\/\\\/IP_serwera\\\/manage"

O ustawieniach w interfejsie webowym opowiem nieco później.

Teraz, najważniejsze! Uruchamiamy FreeRadius i łączymy go z Linotp.

Instalujemy FreeRadius i moduł pracy z LinOTP

# apt-get install freeradius linotp-freeradius-perl

tworzymy kopię zapasową konfiguracji klienta i użytkowników.

# mv /etc/freeradius/clients.conf  /etc/freeradius/clients.old

# mv /etc/freeradius/users  /etc/freeradius/users.old

Tworzymy pusty plik klienta:

# touch /etc/freeradius/clients.conf

Edytujemy nasz nowy plik konfiguracyjny (zabezpieczoną konfigurację można wykorzystać jako przykład)

# nano /etc/freeradius/clients.conf

client 192.168.188.0/24 {
secret  = passwd # hasło do połączenia klientów
}

Następnie tworzymy plik użytkowników:

# touch /etc/freeradius/users

Edytujemy plik, mówiąc radiusowi, że będziemy używać perl do uwierzytelniania.

# nano /etc/freeradius/users

DEFAULT Auth-type := perl

Następnie edytujemy plik /etc/freeradius/modules/perl

# nano /etc/freeradius/modules/perl

Musimy podać ścieżkę do skryptu perl linotp w parametrze module:

Perl { .......
.........
module = /usr/lib/linotp/radius_linotp.pm

…..
Następnie tworzymy plik, w którym wskazujemy, z jakiego (domeny, bazy lub pliku) czerpać dane.

# touch /etc/linotp2/rlm_perl.ini

# nano /etc/linotp2/rlm_perl.ini

URL=https://IP_twojego_serwera_LinOTP(192.168.X.X)/validate/simplecheck
REALM=webusers1c
RESCONF=LocalUser
Debug=True
SSL_CHECK=False

Tutaj zatrzymam się nieco dłużej, ponieważ to ważne:

Pełny opis pliku z komentarzami:
#IP of the linotp server (IP адрес нашего LinOTP сервера)
URL=https://172.17.14.103/validate/simplecheck
#Наша область которую мы создадим в веб интерфейсе LinOTP.)
REALM=rearm1
#Имя группы юзверей которая создается в вебморде LinOTP.
RESCONF=flat_file
#optional: comment out if everything seems to work fine
Debug=True
#optional: use this, if you have selfsigned certificates, otherwise comment out (SSL если мы создаем свой сертификат и хотим его проверять)
SSL_CHECK=False

Następnie stworzymy plik /etc/freeradius/sites-available/linotp

# touch /etc/freeradius/sites-available/linotp

# nano /etc/freeradius/sites-available/linotp

I skopiujemy do niego konfigurację (nie trzeba nic zmieniać):

authorize {
#normalizuje nieprawidłowe zapytania klienta przed przekazaniem ich do innych modułów (patrz '/etc/freeradius/modules/preprocess')
preprocess
#  Jeśli używasz wielu rodzajów realmów, prawdopodobnie
#  chcesz ustawić "ignore_null = yes" dla wszystkich z nich.
#  W przeciwnym razie, gdy pierwszy styl realm nie pasuje,
#  inne style nie będą sprawdzane.
#pozwala na listę realmów (patrz '/etc/freeradius/modules/realm')
IPASS
#rozumie coś takiego jak USER@REALM i potrafi odróżnić komponenty (patrz '/etc/freeradius/modules/realm')
suffix
#rozumie USERREALM i potrafi odróżnić komponenty (patrz '/etc/freeradius/modules/realm')
ntdomain
#  Przeczytaj plik 'users', aby dowiedzieć się o specjalnej konfiguracji, która powinna być stosowana dla
# określonych użytkowników (patrz '/etc/freeradius/modules/files')
files
# pozwala na wygasanie uwierzytelnienia (patrz '/etc/freeradius/modules/expiration')
expiration
# pozwala na określenie ważnych czasów obsługi (patrz '/etc/freeradius/modules/logintime')
logintime
# Nie mamy radius_shortname_map!
pap
}
#tutaj wywoływany jest moduł perl linotp do dalszego przetwarzania
authenticate {
perl
}

Następnie zrobimy symboliczny link:

# ln -s ../sites-available/linotp /etc/freeradius/sites-enabled

Osobiście zabijam domyślne strony radius, ale jeśli ich potrzebujesz, możesz albo edytować ich konfigurację, albo je wyłączyć.

# rm /etc/freeradius/sites-enabled/default

# rm /etc/freeradius/sites-enabled/inner-tunnel

# service freeradius reload

Wracamy teraz do interfejsu webowego i przyjrzymy się mu nieco bliżej:
W prawym górnym rogu klikamy LinOTP Config -> UserIdResolvers -> New
Wybieramy, czego chcemy: LDAP (AD win, LDAP samba), SQL lub lokalnych użytkowników systemu Flatfile.

Wypełniamy wymagane pola.

Następnie tworzymy REALMS:
W prawym górnym rogu klikamy LinOTP Config -> Realms -> New.
Nadamy naszemu REALMS nazwę i klikamy na wcześniej utworzony UserIdResolvers.

Wszystkie te dane są potrzebne freeRadius w pliku /etc/linotp2/rlm_perl.ini, o czym pisałem wcześniej, więc jeśli go nie edytowałeś, zrób to teraz.

Serwer jest skonfigurowany.

Uzupełnienie:

Konfiguracja LinOTP na Debianie 9:

Instalacja:

# echo 'deb http://linotp.org/apt/debian stretch linotp' > /etc/apt/sources.list.d/linotp.list 
# apt-get install dirmngr

# apt-key adv --recv-keys 913DFF12F86258E5
# apt-get update

# apt-get install mysql-server

(domyślnie, w Debianie 9 mysql (mariaDB) nie prosi o ustawienie hasła dla roota, oczywiście możesz go zostawić pustym, ale jeśli śledzisz wiadomości, często prowadzi to do „epickich porażek”, więc tym razem go ustawimy)

# mysql -u root -p
use mysql;
UPDATE user SET Password = PASSWORD('tutaj_hasło') WHERE User = 'root';
exit
# apt-get install linotp
# apt-get install linotp-adminclient-cli
# apt-get install python-ldap
# apt install freeradius
# nano /etc/freeradius/3.0/sites-enabled/linotp

Wklejamy kod (przesłany przez JuriM, za co mu dziękuję!):

server linotp {
listen {
ipaddr = *
port = 1812
type = auth
}
listen {
ipaddr = *
port = 1813
type = acct
}
authorize {
preprocess
update {
&control:Auth-Type := Perl
}
}
authenticate {
Auth-Type Perl {
perl
}
}
accounting {
unix
}
}

Edytujemy /etc/freeradius/3.0/mods-enabled/perl

perl {
filename = /usr/share/linotp/radius_linotp.pm
func_authenticate = authenticate
func_authorize = authorize
}

Niestety w debianie 9 biblioteka radius_linotp.pm nie jest dostępna w repozytoriach, więc weźmiemy ją z github.

# apt install git
# git clone https://github.com/LinOTP/linotp-auth-freeradius-perl
# cd linotp-auth-freeradius-perl/
# cp radius_linotp.pm /usr/share/linotp/radius_linotp.pm

teraz poprawiamy /etc/freeradius/3.0/clients.conf

client servers {
ipaddr = 192.168.188.0/24
secret = twójhasło
}

teraz poprawiamy nano /etc/linotp2/rlm_perl.ini

Wklejamy tam ten sam kod, co podczas instalacji na debianie 8 (opisane powyżej)

generalnie wszystko. (jeszcze nie przetestowane)

Zostawię poniżej kilka linków dotyczących konfiguracji systemów, które najczęściej wymagają zabezpieczenia dwuetapowym uwierzytelnianiem:
Konfiguracja dwuetapowej autoryzacji w Apache2

Konfiguracja z Cisco ASA(tam używany jest inny serwer generacji tokenów, ale same ustawienia ASA są takie same).

VPN z dwuetapową autoryzacją

Konfiguracja dwuetapowa autoryzacja w ssh (tam również używany jest LinOTP) — dziękuję autorowi. Tam również można znaleźć ciekawe rzeczy dotyczące konfigurowania polityk LiOTP.

Ponadto wiele systemów CMS obsługuje dwuetapową autoryzację (dla WordPressa LinOTP ma nawet swój specjalny moduł na github), na przykład, jeśli chcesz utworzyć zabezpieczoną sekcję dla pracowników swojej firmy na stronie internetowej.
WAŻNY FAKT! NIE zaznaczaj opcji „Google autenteficator” do użycia googlowego uwierzytelniania! W przeciwnym razie QR-kod nie będzie czytelny… (dziwny fakt)

Do napisania artykułu wykorzystano informacje z następujących artykułów:
itnan.ru/post.php?c=1&p=270571
www.digitalbears.net/?p=469

Dziękuję autorom.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster