image

Сегодня я хочу поделиться, как настроить сервер двухфакторной авторизации, для защиты корпоративной сети, сайтов, сервисов,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 <linotp2@lsexperts.de>
	  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 сервер, но я для простоты буду использовать его, как рекомендованный для 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

бэкапим конфиги 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 { .......
.........
<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: 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 {
#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 USER\REALM 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:

Установка:

# 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 = *
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 c двухфакторной аутентификации

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

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

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

Спасибо авторам.

Комментарии (13)


  1. ice2heart
    05.08.2019 12:30

    Использовать 8 дебиан когда зарелизился 10… Ну такое. У них же есть в Репо для Stretch.


    1. HOPMAHdELL Автор
      05.08.2019 12:35

      Да, у них есть репозиторий для Debian 9, но в 9ке используется FreeRadius 3, адекватной документации как подружить freeRadius-3 и LinOTP я не нашел… Я согласен что Debian 8 устарел, но как я и сказал, аналогов системы, которая давала бы такой же функционал бесплатно, и при этом была наглядна даже для новичков, по сути нет, если вы приведете примеры я с удовольствием их изучу.


      1. JuriM
        06.08.2019 06:18

        Буквально на днях настраивал linotp и третий радиус на стретче, никакой магии там нет


        1. HOPMAHdELL Автор
          06.08.2019 10:16

          Поделитесь пожалуйста настройками для 3 радиуса, можно в личку мне будет интересно…

          Я в статье описывал 100% рабочее решение, которое можно легко и без шаманства настроить, этот ман, скорее как, напоминалка, для тех кто настраивает и использует подобное решение.


          1. JuriM
            06.08.2019 12:41

            /etc/freeradius/3.0/sites-enabled/linotp

            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
            }
            


            1. HOPMAHdELL Автор
              06.08.2019 12:43

              Спасибо большое за ответ, если вы не против я добавлю это в статью.


              1. JuriM
                06.08.2019 12:50

                Не против, добавляйте.


  1. amarao
    05.08.2019 12:32

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


    … Не пишите такие тексты, пожалуйста. В лучшем случае это плохой getting started.


    1. HOPMAHdELL Автор
      05.08.2019 12:37

      статья и так была большой, я не хотел перегружать ее большим количеством скриншотов, тем более что там очень интуитивный интерфейс… я постараюсь исправить моменты на которые вы указали…


      1. amarao
        05.08.2019 12:39
        +1

        Э… Я не указал ни на какие моменты, которые можно было бы исправить.


        Если серьёзно, то:


        • о чём вообще речь? Где этот сервер может использоваться? С каким софтом?
        • какой там внутри протокол? Интеграция с pam? Секция "зачем" должна быть первой, а не ближе к концу.


        1. HOPMAHdELL Автор
          05.08.2019 12:53

          Внизу статьи приведены ссылки на то, с чем лично я, чаще всего, ее использовал, например для Anyconnect от Cisco. Но помимо циски, я знаю, что очень многие программные и аппаратные gateway-и поддерживают возможность добавления двухфакторной аутентификации, особенно актуально например для Wi-Fi.


        1. HOPMAHdELL Автор
          05.08.2019 12:56

          По поводу секции «зачем», я пожалуй соглашусь и перенесу ее повыше…


  1. HOPMAHdELL Автор
    07.08.2019 14:10

    После всех экспериментов с Debian 9, у меня если честно freeradius 3 так и не взлетел… если кто-то хочет помочь и подсказать я с удовольствием выслушаю и дополню статью вашими комментариями на эту тему… пока 100% работает только на debian 8 + Linotp + freradius 2