Сьогодні я хочу поділитися як налаштувати сервер двофакторної авторизації для захисту корпоративної мережі, сайтів, сервісів, 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 можна знайти в офіційній документації з
# 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 (описано вище)
за ідеєю все. (поки не протестовано)
Я залишу нижче кілька посилань щодо налаштування систем, які найчастіше потрібно захищати двофакторною авторизацією:
Налаштування двофакторної аутентифікації в
Налаштування
Також cms багатьох сайтів підтримують двофакторну аутентифікацію (Для WordPress у LinOTP навіть є свій спеціальний модуль на
ВАЖЛИВИЙ ФАКТ! НЕ ставте галочку «Google autenteficator» для використання Google автентифікатора! QR-код не читається тоді… (дивний факт)
Для написання статті використовувалася інформація з наступних статей:
Дякую авторам.
Джерело: habr.com