Сервер двофакторної авторизації LinOTP

Сервер двофакторної авторизації LinOTP

Сьогодні я хочу поділитися як налаштувати сервер двофакторної авторизації для захисту корпоративної мережі, сайтів, сервісів, ssh. На сервері працюватиме зв'язка: LinOTP + FreeRadius.

Для чого він нам?
Це повністю безкоштовне, зручне рішення, всередині своєї мережі, яке не залежить від сторонніх провайдерів.

Даний сервіс дуже зручний, досить наочний, на відміну від інших опенсорс продуктів, а також підтримує величезну кількість функцій і політик (Наприклад, login+password+(PIN+OTPToken)). Через API інтегрується з сервісами відправки SMS (LinOTP Config->Provider Config->SMS Provider), генерує коди для мобільних додатків типу Google Autentificator та багато іншого. Я вважаю він більш зручний ніж сервіс розглядається у статті.

Цей сервер добре працює з 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. Нічого страшного. Просто виконайте команду ще раз.
На запитання Debiana:

gpg: поиск "913DFF12F86258E5" на hkp сервере keys.gnupg.net
(1)	LSE LinOTP2 Packaging <[email protected]>
	  2048 bit RSA key F86258E5, создан: 2010-05-10
Keys 1-1 of 1 for "913DFF12F86258E5".  Введите числа, N) Следующий или Q) Выход>

Відповідаємо: 1

Далі:

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

# apt-get update

Встановлюємо MySQL. Теоретично, можна використовувати інший SQL Server, але я для простоти буду використовувати його, як рекомендований для 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_сервера/manage"

Про налаштування в веб-інтерфейсі я розповім трохи пізніше.

Тепер, найважливіше! Піднімаємо FreeRadius і пов'язуємо його з Linotp.

Встановлюємо FreeRadius та модуль роботи з LinOTP

# apt-get install freeradius linotp-freeradius-perl

бекапім конфігентів клієнта та 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 { .......
.........
<source lang="bash">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: повідомити про те, що все, що працює на робочому місці
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 {
#normalizes maleformed client request before handed on to other modules (see '/etc/freeradius/modules/preprocess')
preprocess
#  If you are using multiple kinds of realms, you probably
#  want to set "ignore_null = yes" for all of them.
#  Otherwise, when the first style of realm doesn't match,
#  the other styles won't be checked.
#allows a list of realm (see '/etc/freeradius/modules/realm')
IPASS
#understands something like USER@REALM and can tell the components apart (see '/etc/freeradius/modules/realm')
suffix
#understands USERREALM and can tell the components apart (see '/etc/freeradius/modules/realm')
ntdomain
#  Read the 'users' file to learn about special configuration which should be applied for
# certain users (see '/etc/freeradius/modules/files')
files
# allows to let authentification to expire (see '/etc/freeradius/modules/expiration')
expiration
# allows to define valid service-times (see '/etc/freeradius/modules/logintime')
logintime
# We got no radius_shortname_map!
pap
}
#here the linotp perl module is called for further processing
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:

<hc class="hc_select_index" id="hc_select_index101"></hc>Встановлення:

# 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) не пропонує встановлювати пароль рута, звичайно ви можете залишити його і порожнім, але якщо ви читаєте новини, то дуже часто це призводить до «епік фейлів», тому ми його таки встановимо)

# 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 = *
порт = 1812
type = auth
}
listen {
ipaddr = *
порт = 1813
type = acct
}
authorize {
попередній процес
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) — дякую автору. Там же можна знайти цікаві речі з налаштування політик LiOTP.

Також cms багатьох сайтів підтримують двофакторну аутентифікацію (Для WordPress у LinOTP навіть є свій спеціальний модуль на GitHub), наприклад, якщо ви хочете на своєму корпоративному сайті зробити захищений розділ для співробітників компанії.
ВАЖЛИВИЙ ФАКТ! НЕ ставте галочку «Google autenteficator» для використання Google автентифікатора! QR-код не читається тоді… (дивний факт)

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

Дякую авторам.

Джерело: habr.com

Додати коментар або відгук