Сървър за двуфакторна автентикация LinOTP

Сървър за двуфакторна автентикация LinOTP

Днес искам да споделя как да настроим сървър за двуфакторна автентикация, за защита на корпоративната мрежа, сайтове, услуги, ssh. На сървъра ще работи комбинация: LinOTP + FreeRadius.

Защо ни е нужен?
Това е напълно безплатно, удобно решение, което работи в рамките на вашата мрежа, независимо от външни доставчици.

Този сервис е много удобен, визуално е очевиден, в сравнение с други опенсорс продукти, и също така поддържа огромен брой функции и политики (например login+password+(PIN+OTPToken)). Чрез API интегрира с услуги за изпращане на sms (LinOTP Config->Provider Config->SMS Provider), генерира кодове за мобилни приложения като Google Authenticator и много други. Считам, че е по-удобен от сервиза, разглеждан в статията.

Този сървър отлично работи с Cisco ASA, OpenVPN сървър, Apache2, и по принцип практически с всичко, което поддържа автентикация чрез RADIUS сървър (например за SSH в цод).

Изисква се:

1) Debian 8 (jessie) — Задължително! (тестова инсталация на debian 9 е описана в края на статията)

Начало:

Инсталираме Debian 8.

Добавяме репозитория LinOTP:

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

Добавяме ключовете:

# gpg --search-keys 913DFF12F86258E5

Понякога при "чиста" инсталация, след изпълнението на тази команда, Debian може да изведе:

gpg: създаден каталог `/root/.gnupg'
gpg: създаден нов файл с конфигурация `/root/.gnupg/gpg.conf'
gpg: ВНИМАНИЕ: параметрите в `/root/.gnupg/gpg.conf` все още не са активни при това стартиране
gpg: създадена таблица с ключове `/root/.gnupg/secring.gpg'
gpg: създадена таблица с ключове `/root/.gnupg/pubring.gpg'
gpg: не са зададени сървъри за ключове (използвайте --keyserver)
gpg: грешка при търсене на сървъра за ключове: лош URI

Това е първоначалната настройка на gnupg. Няма нищо страшно. Просто изпълнете командата отново.
На въпроса на Debian:

gpg: търсене на "913DFF12F86258E5" на hkp сървера keys.gnupg.net
(1)	LSE LinOTP2 Packaging 
	  2048 bit RSA ключ F86258E5, създаден: 2010-05-10
Ключове 1-1 от 1 за "913DFF12F86258E5". Въведете числа, N) Следващ или Q) Изход>

Отговаряме: 1

Далее:

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

# apt-get update

Инсталираме mysql. В теоретичен план, можете да използвате друг SQL сървър, но за опростяване ще го използвам, тъй като е препоръчителен за LinOTP.

(допълнителна информация, включително за преконфигуриране на базата данни LinOTP можете да намерите в официалната документация по връзка. Там можете да намерите командата: dpkg-reconfigure linotp за промяна на параметрите, ако вече сте инсталирали mysql).

# apt-get install mysql-server

# apt-get update

(проверка на обновленията отново няма да навреди)
Инсталираме LinOTP и допълнителни модули:

# apt-get install linotp

Отговаряме на въпросите на инсталатора:
Използвате ли Apache2: да
Създайте парола за admin Linotp: «ВашПароль»
Генерираме самоподписан сертификат?: да
Използвате ли MySQL?: да
Къде се намира базата данни: localhost
Създаваме база LinOTP (име на базата) на сървъра: LinOTP2
Създаваме отделен потребител за базата данни: LinOTP2
Задаваме парола на потребителя: «ВашПароль»
Да създадем ли базата сега? (нещо от рода на “Сигурни ли сте, че искате …”): да
Въведете root паролата за MySQL, която създадохте при инсталацията: «ВашПароль»
Готово.

(по избор, можете и да не задавате)

# apt-get install linotp-adminclient-cli 

(по избор, можете и да не задавате)

# apt-get install libpam-linotp  

И така нашият уеб интерфейс на Linotp е сега достъпен на адрес:

"<b>https<\/b>: \/\/IP_\u0441\u0435\u0440\u0432\u0435\u0440\u0430\/manage"

За настройките в уеб интерфейса ще говоря по-късно.

Сега, най-важното! Стартираме FreeRadius и го свързваме с Linotp.

Инсталираме FreeRadius и модула за работа с LinOTP

# apt-get install freeradius linotp-freeradius-perl

правим бекъп на конфигурациите client и Users на радиуса.

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

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

Създаваме празен файл за клиента:

# touch /etc/freeradius/clients.conf

Редактираме нашия нов конфигурационен файл (бекъпваният конфиг може да се използва като пример)

# nano /etc/freeradius/clients.conf

client 192.168.188.0/24 {
secret  = passwd # паролата за свързване на клиентите
}

Следваща стъпка е да създадем файла users:

# touch /etc/freeradius/users

Редактираме файла, казвайки на радиуса, че ще използваме perl за аутентификация.

# nano /etc/freeradius/users

DEFAULT Auth-type := perl

След това редактираме файла /etc/freeradius/modules/perl

# nano /etc/freeradius/modules/perl

Трябва да посочим пътя до perl скрипта linotp в параметър module:

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

…..
След това създаваме файл, в който казваме от кой (домейн, база или файл) да вземаме данни.

# touch /etc/linotp2/rlm_perl.ini

# nano /etc/linotp2/rlm_perl.ini

URL=https://IP_вашия_LinOTP_сървър(192.168.X.X)/validate/simplecheck
REALM=webusers1c
RESCONF=LocalUser
Debug=True
SSL_CHECK=False

Тук ще спра малко по-подробно, тъй като е важно:

Пълно описание на файла с коментари:
#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

След това ще създадем файл /etc/freeradius/sites-available/linotp

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

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

И ще копираме конфигурацията в него (не е нужно да променяте нищо):

authorize {
#нормализира неправилно форматираните клиентски заявки преди предаването на другите модули (виж '/etc/freeradius/modules/preprocess')
preprocess
#  Ако използвате множество видове области, вероятно
#  искате да зададете "ignore_null = yes" за всички тях.
#  В противен случай, когато първият стил на област не съвпада,
#  другите стилове няма да бъдат проверявани.
#позволява списък от области (виж '/etc/freeradius/modules/realm')
IPASS
#разбира нещо като USER@REALM и може да различи компонентите (виж '/etc/freeradius/modules/realm')
suffix
#разбира USERREALM и може да различи компонентите (виж '/etc/freeradius/modules/realm')
ntdomain
#  Чете файла 'users', за да научи за специална конфигурация, която трябва да се прилага за
# определени потребители (виж '/etc/freeradius/modules/files')
files
# позволява на аутентификацията да изтече (виж '/etc/freeradius/modules/expiration')
expiration
# позволява да се дефинират валидни часови диапазони за услуги (виж '/etc/freeradius/modules/logintime')
logintime
# Нямаме radius_shortname_map!
pap
}
#тук се извиква модулът на linotp perl за по-нататъшна обработка
authenticate {
perl
}

След това ще направим символен линк:

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

Лично аз убивам дефолтните радиус сайтов, но ако са ви нужни, можете или да редактирате конфигурацията им, или да ги деактивирате.

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

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

# service freeradius reload

Сега да се върнем към уеб интерфейса и да го разгледаме по-подробно:
В горния десен ъгъл натискаме LinOTP Config -> UserIdResolvers -> New
Избираме какво искаме: LDAP (AD win, LDAP samba), SQL, или локални потребители на системата Flatfile.

Попълваме необходимите полета.

След това създаваме REALMS:
В горния десен ъгъл натискаме LinOTP Config -> Realms -> New.
и даваме име на нашия REALMS, както и кликваме на създадения преди това UserIdResolvers.

Всички тези данни са нужни на freeRadius в файла /etc/linotp2/rlm_perl.ini, за което писах по-горе, затова, ако не сте го редактирали тогава, направете го сега.

Сървърът е настроен.

Допълнение:

Настройка на LinOTP на Debian 9:

Инсталация:

# 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

(по подразбиране, в Debian 9 mysql (mariaDB) не предлага да се зададе парола за root, въпреки че можете да оставите и празна, но често това води до "епични провали", затова ние все пак ще я зададем)

# mysql -u root -p
use mysql;
UPDATE user SET Password = PASSWORD('тут_пароль') 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

Вмъкваме кода (предоставен от JuriM, благодаря му за това!):

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
}
}

Редактираме /etc/freeradius/3.0/mods-enabled/perl

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

За съжаление, в debian 9 библиотеката radius_linotp.pm не се инсталира от репозиторите, затова ще я вземем от 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

Сега коригираме /etc/freeradius/3.0/clients.conf

client servers {
ipaddr = 192.168.188.0/24
secret = вашпароль
}

Сега правим промени в nano /etc/linotp2/rlm_perl.ini

Вмъкваме същия код, който бяхме използвали при инсталирането на debian 8 (описан по-горе)

По идея всичко. (приблизително не е тествано)

Оставям по-долу няколко линка за настройка на системи, които често изискват защита с двуфакторна автентификация:
Настройка на двуфакторна автентификация в Apache2

Настройка с Cisco ASA(там се използва друг сървър за генериране на токени, но настройките на самата ASA са същите).

VPN с двуфакторна автентификация

Настройка двуфакторна автентификация в ssh (там също се използва LinOTP) — благодаря на автора. Там също може да се намерят интересни неща относно настройките на политиките на LinOTP.

Също така много CMS поддръжат двуфакторна автентификация (за WordPress, LinOTP има свой специален модул на github), например, ако искате да създадете защитена секция за служителите на компанията на вашия корпоративен сайт.
ВАЖЕН ФАКТ! НЕ поставяйте отметка за "Google autenteficator" при използването на гугъл аутентификатор! QR-кодът не се чете тогава… (странен факт)

За написването на статията бяха използвани информация от следните статии:
itnan.ru/post.php?c=1&p=270571
www.digitalbears.net/?p=469

Благодаря на авторите.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster