Leap 15.0 Beta testing: configuring 802.1x (auth with RADIUS)
В этом посте я попытаюсь рассказать как настроить IEEE 802.1x в openSUSE. Сейчас Leap 15.0 в активной стадии бета-тестирования, поэтому возьмем её и для клиента и для сервера, чтобы убедиться, что все работает как надо, и никаких неприятных сюрпризов в финально-официальном релизе нам ждать не придется.
Если в двух словах, 802.1x это стандарт сетевой аутентификации. Работает на втором OSI уровне и определяет механизм контроля доступа к сети на основе принадлежности к порту и проверки x509-сертификатов. Доступ к сети получают только клиенты прошедшие аутентификацию. В качестве “системы, проверяющей подлинность” или просто аутентификатора я буду использовать CISCO SG300-28 28-Port Gigabit Managed Switch. Для проверки он будет обмениваться сертификатами с authentication server, который мы попытаемся развернуть на отдельной машине и который будет колдовать для нас x509 TLS-сертификаты.
Authentication server
Когда я только задумывал этот пост, я представлял это себе как “пустяковое дело на 20 минут”. Сразу же после установки я понял, что “приключение начинается”. Инсталлер разучился отключать firewall и включать OpenSSH. Фича? Аха щас… BUG! Первый баг. Попался 🙂 Пытался сначала достучаться до людей в IRC, все бестолку. Три дня думал, что я что-то пропустил и искал информацию. Так ничего и не найдя, я заглянул в ML, где меня ждал успех.
Очень не приятно после установки заходить в систему и отключать firewalld и включать sshd… но на сейчашний момент это именно то, что мы имеем:
# systemctl stop firewalld # systemctl disable firewalld # systemctl start sshd # systemctl enable sshd
Напомню, что мы тут просто тестируем 802.1x. На практике отключать firewall конечно же не обязательно, достаточно открыть UDP/1812 и UDP/1813 порты.
Приступаем к установке authentication server. Мы будем использовать freeradius. Последняя стабильная версия – 3.0.16 – вышла два месяца назад. В openSUSE пакет называется freeradius-server. Устанавливаем его:
> sudo zypper in freeradius-server > rpm -qa freeradius-server freeradius-server-3.0.16-lp150.1.3.x86_64
После установки переходим в /etc/raddb/certs. Тут все будем делать от root.
# ll /etc/raddb/certs total 48 -rw-r----- 1 root radiusd 6155 Feb 20 06:18 Makefile -rw-r----- 1 root radiusd 8714 Feb 20 06:18 README -rwxr-x--- 1 root radiusd 2706 Feb 20 06:18 bootstrap -rw-r----- 1 root radiusd 1432 Feb 20 06:18 ca.cnf -rw-r----- 1 root radiusd 1103 Feb 20 06:18 client.cnf -rw-r----- 1 root radiusd 1131 Feb 20 06:18 inner-server.cnf -rw-r--r-- 1 root radiusd 166 Feb 20 06:18 passwords.mk -rw-r----- 1 root radiusd 1125 Feb 20 06:18 server.cnf -rw-r----- 1 root radiusd 708 Feb 20 06:18 xpextensions
Документация о том, как сгенерировать сертификаты (самый минимум) находится в файле README. 3 шага: генерация root-сертификата (ca.pem), генерация сертификата сервера (server.pem) и клиента (client.pem). Необходимые параметры нужно указать в конфиг файлах: ca.cnf, server.cnf и client.cnf соответственно.
Несмотря на то, что все кажется простым и логичным, генерация TLS/SSL сертификатов может быть оказаться достаточно запарным процессом. Особенно если вы нечасто этим занимаетесь. Дело в том, что сообщения об ошибках не всегда понятны. Давайте рассмотрим пару примеров.
Во-первых, нигде не сказано, что пароль в /etc/raddb/certs/server.cnf и /etc/raddb/mods-enabled/eap должен быть один и тот же. Вот в этом месте файла /etc/raddb/mods-enabled/eap надо быть осторожней:
tls-config tls-common { private_key_password = myTEST1eap private_key_file = ${certdir}/server.pem
Вот так выглядит часть /etc/raddb/certs/server.cnf файла, где нужно быть чуточку внимательней:
[ req ] prompt = no distinguished_name = certificate_authority default_bits = 2048 input_password = myTEST1eap output_password = myTEST1eap x509_extensions = v3_ca
Если пароли окажутся разными, то при запуске cервера мы получим в логах вот это:
Wed Mar 7 17:08:15 2018 : Info: Debugger not attached Wed Mar 7 17:08:15 2018 : Error: tls: Failed reading private key file "/etc/raddb/certs/server.pem" Wed Mar 7 17:08:15 2018 : Error: tls: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt Wed Mar 7 17:08:15 2018 : Error: tls: error:23077074:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 cipherfinal error Wed Mar 7 17:08:15 2018 : Error: tls: error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error Wed Mar 7 17:08:15 2018 : Error: tls: error:0907B00D:PEM routines:PEM_read_bio_PrivateKey:ASN1 lib Wed Mar 7 17:08:15 2018 : Error: tls: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib Wed Mar 7 17:08:15 2018 : Error: rlm_eap_tls: Failed initializing SSL context Wed Mar 7 17:08:15 2018 : Error: rlm_eap (EAP): Failed to initialise rlm_eap_tls Wed Mar 7 17:08:15 2018 : Error: /etc/raddb/mods-enabled/eap[14]: Instantiation failed for module "eap"
Согласитесь, с ходу не ясно в чем тут может быть проблема.
Остальные пароли могут быть (должны быть) разными.
Во-вторых, можно забыть про команду:
# openssl dhparam -out dh 2048
В bootstrap скрипте она есть, но если вы решите сгенерировать сертификаты дважды и отчистите все командой
# make destroycerts
то make удалит и файл /etc/raddb/certs/dh, а при make ca.pem или make server.pem файл dh снова создан не будет. При запуске сервера это приведет к следующему сообщению в логах:
Wed Mar 7 16:18:44 2018 : Info: Debugger not attached Wed Mar 7 16:18:44 2018 : Error: Unable to check file "/etc/raddb/certs/dh": No such file or directory Wed Mar 7 16:18:44 2018 : Error: rlm_eap_tls: Failed initializing SSL context Wed Mar 7 16:18:44 2018 : Error: rlm_eap (EAP): Failed to initialise rlm_eap_tls Wed Mar 7 16:18:44 2018 : Error: /etc/raddb/mods-enabled/eap[14]: Instantiation failed for module "eap"
Обратите внимание, что в README файле написано, что удалять старые сертификаты нужно вот так:
# rm -f *.pem *.der *.csr *.crt *.key *.p12 serial* index.txt*
т.е. без dh файла. Это, пожалуй, единственная проблема, суть которой ясна из сообщения об ошибке.
И вот еще одина проблема, с которой, я надеюсь, никому не придется столкнуться:
failed to update database TXT_DB error number 2
Она возникает по причине того, что CN (Common Name) для генерируемого сертификата такое же как и для CA-сертификата.
Последний шаг настройки RADIUS – прописываем имя, ip и secret клиента (остальное можно оставить как есть) в /etc/raddb/clients.conf. Клиент в данном случае – наш cisco-коммутатор. Шаг простой, но очень важный. Без него RADIUS не будет отвечать коммутатору. Secret тут должен быть как можно сложнее.
После того как все сертификаты созданы, для уверености их можно сверить:
# openssl verify -CAfile ca.pem client.crt client.pem client.crt: OK client.pem: OK
Если все в порядке, запускаем сервер, проверяем созданные им сокеты:
# systemctl start radiusd # lsof -i :1812 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME radiusd 4811 root 7u IPv4 179990 0t0 UDP *:radius radiusd 4811 root 9u IPv6 179994 0t0 UDP *:radius # lsof -i :1813 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME radiusd 4811 root 8u IPv4 179993 0t0 UDP *:radius-acct radiusd 4811 root 10u IPv6 179995 0t0 UDP *:radius-acct # tcpdump -vv -n -i eth0 -S port 1812 -l -A -X
Последняя команда может помочь при отладке. Вы видете, что именно ушло в сеть. Даже если вы подробно не знакомы с EAP, можно заметить отличие удачных попыток авторизации и не очень удачных 🙂 Если по той или иной причине возникли проблемы, log radius-сервера находится в /var/log/radius/radius.log.
Если все же возникнет какая-то новая проблема, которая тут не описана, и вы начнете искать информацию в инете и найдете примеры программы radtest(1) и попытаетесь ее запусить… в openSUSE она лежит в отдельном пакете:
> rpm -qf $(which radtest) freeradius-server-utils-3.0.16-lp150.1.3.x86_64
Я не стал описывать ВСЕ, что мне пришлось пережить за эти пару дней… и так этот пост разбух и стал походить на статью. Возможно я напишу еще что-то о самой openssl в отдельной статье. Тема PKI очень интересная и нужная. Ее понимание требуют многие работадатели.
Но вернемся к нашему тестированию. Переходим к настройке нашего коммутатора. Пока новых жуков не обнаружено 🙂
Authenticator
Настройка аутентификатора (или “системы, проверяющей подлинность”) сводится к простому добавлению в список RADIUS-серверов только что настроенной машины. Security => RADIUS => Add:
В появившемся окне просто добавляем IP-адрес и secret, который мы указывали /etc/raddb/clients.conf на RADIUS-сервере. Secret – это фактически единственный механизм аутентификации между cisco-коммутатором и сервером проверки подлинности (RADIUS). Эта часть сети в 802.1x-схеме подразумевает достаточно доверительные отношения между хостами, т.е. остается практически не защищенной. Поэтому повторюсь – secret должен быть как можно сложнее.
Client
Переходим к последнему шагу – настройке клиента.
Да, друзья мои, в качестве клиента openSUSE сейчас использовать увы, не получится. Для тестирования 802.1x мне пришлось взять какой-то другой GNU-дистрибутив. Но обо всем по порядку.
Сначала я поставил Leap 15.0 Beta с Plasma 5.12 LTS. networkmanagement отказался создавать соединение, и я сначала подумал, что проблема в созданных мной сертификатах. Я потратил несколько дней на проверку и перегенерацию сертификатов. Я устанавливал Leap с GNOME… с Xfce… и вообще без X. Паралельно я проверял все в Tumbleweed, и это меня и сбило с толку. Там соединение тоже не работало и я подумал, что проблема на 8 OSI уровне 🙂
Через несколько дней я попробовал другие GNU-дистрибутивы и оказалось, что, используя те же самые сертификаты и конфиги, там соеднинение удается создать одной командой…
BUUUUG! Да, черт побери, и сидит он так глубоко, что ни одним NM-апплетом его не достать. Он воспроизводится и через nmcli(1):
# cat /etc/NetworkManager/system-connections/LEAP_8021x [connection] id=LEAP_8021x uuid=de2f2a7c-33cc-4d92-ae3b-785575dffddc type=ethernet permissions=user:alex:; [ethernet] auto-negotiate=true mac-address-blacklist= [802-1x] ca-cert=/home/alex/ca.pem client-cert=/home/alex/client.crt eap=tls; identity=GNOME private-key=/home/alex/client.pem private-key-password=GNOME [ipv4] dns-search= method=auto [ipv6] addr-gen-mode=stable-privacy dns-search= method=auto # nmcli con reload # nmcli con up LEAP_8021x
Secrets are required to access the wired network 'LEAP_8021x' Warning: password for '802-1x.identity' not given in 'passwd-file' and nmcli cannot ask without '--ask' option. Error: Connection activation failed: Secrets were required, but not provided
Secret я использую и в конфиге и прописывал его и в апплетах GNOME и KDE. Не принимает ни в какую.
Пробовал испльзовать ‘–ask’, результат тот же: спашивает, вводишь пароль… снова спрашивает, снова вводишь… снова спрашивает…
# nmcli con up LEAP_8021x --ask Secrets are required to access the wired network 'LEAP_8021x' Identity (802-1x.identity): GNOME Secrets are required to access the wired network 'LEAP_8021x' Private key password (802-1x.private-key-password): *****
Secrets are required to access the wired network 'LEAP_8021x' Identity (802-1x.identity): GNOME Secrets are required to access the wired network 'LEAP_8021x' Private key password (802-1x.private-key-password): *****
Я использовал и wpa_supplicant(1). Результат такой же. Он просто повисает.
Чтобы довести дело до конца я взял Kubuntu 17.10. Выбор был не случайным, т.е. это не был “первый дистрибутив, который попался под руку”. Пока я искал инфу по поводу проблем с 802.1x, я нашел этот BUG. Я не уверен, что это именно то, но повеселил меня не тот факт, что проблема в upstream’е, а то, КАК это решили в Ubuntu 🙂 Ребятами из RedHat (хотя там ссылка на GNOME, а оттуда на Debian…) было предложено и другое решение. Следить за изменениями я уже не стал. Хотя разобраться до конца все же стоило бы.
В Kubuntu 17.10 просто кидаешь конфиг в /etc/NetworkManager/system-connections/802.1x и перезапускаешь сеть (без ‘–ask’), как я показал выше. Понадобятся 3 сертификата: клиентские сертификаты client.pem и client.crt (к ним надо знать secret) и root-сертификат CA.pem. При генерировании новых клиентских сертификатов нужно лишь обновить client.cnf (имя и secret) и сделать
# make client.pem
Помните, что в случае повторной генерации root-сертификата придется перенастраивать уже настроенные клиенты.
Итак, ситуация Leap 15.0 пока очень и очень не классная. BUG’ов в beta хватает. О них знают, и можете быть уверенными, друзья мои, их исправят.
Оставайтесь на светлой стороне. И да прибудет с вами удовольствие от работы с openSUSE 🙂
Добрый день! Автор молодец! Читаю все Ваши статьи, очень глубокие познания у Вас в OpenSuse. Сам я админ по SLES и очень много нашел для себя полезного в Ваших статьях. Спасибо Вам!!!
И Вам большое спасибо за feedback. Приятно осозновать, что материал тут действительно полезен кому-то. Безусловно это мотивирует к написанию более качественных статей 🙂