Microsoft Windows XP, начиная с Service Pack 1 (а лучше сразу поставить Service Pack2), при работе с беспроводными сетями позволяет использовать аутентификацию по логину/паролю (то есть PEAP) и аутентификацию по цифровому сертификату (EAP-TLS). В этой статье детально рассмотрим EAP-PEAP механизм, а сертификаты оставим на следующий раз.
1. Настройка FreeRADIUS.
Начнем с установки и настройки FreeRADIUS сервера.
В операционной системе Gentoo это делается довольно просто, достаточно ввести команду
=====================================================
root@s2 ~ # emerge -av freeradius
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild N ] net-dialup/freeradius-1.0.5-r1 -edirectory
-frascend -frnothreads -frxp -kerberos -ldap -mysql +pam
-postgres -snmp +ssl -udpfromto 2,240 kB
Total size of downloads: 2,240 kB
Do you want me to merge these packages? [Yes/No]
=====================================================
Если планируется хранить базу пользователей во внешних базах (например, ldap, mysql или postgre), то перед сборкой RADIUS сервера надо активировать соответствующие флаги, позволяющие собрать FreeRADIUS с поддержкой mysql/postgre и/или ldap:
=====================================================
# USE="mysql ldap" emerge -av freeradius
=====================================================
После проверки включенности нужных флагов, достаточно нажать клавишу Y и пакет будет собран и установлен в систему:
=====================================================
<....>
--- !targe sym /usr/lib/rlm_digest-1.0.5.la
--- !targe sym /usr/lib/rlm_detail.so
--- !targe sym /usr/lib/rlm_detail-1.0.5.la
--- !targe sym /usr/lib/rlm_counter.so
--- !targe sym /usr/lib/rlm_counter-1.0.5.la
--- !targe sym /usr/lib/rlm_checkval.so
--- !targe sym /usr/lib/rlm_checkval-1.0.5.la
--- !targe sym /usr/lib/rlm_chap.so
--- !targe sym /usr/lib/rlm_chap-1.0.5.la
--- !targe sym /usr/lib/rlm_attr_rewrite.so
--- !targe sym /usr/lib/rlm_attr_rewrite-1.0.5.la
--- !targe sym /usr/lib/rlm_attr_filter.so
--- !targe sym /usr/lib/rlm_attr_filter-1.0.5.la
--- !targe sym /usr/lib/rlm_always.so
--- !targe sym /usr/lib/rlm_always-1.0.5.la
--- !targe sym /usr/lib/rlm_acct_unique.so
--- !targe sym /usr/lib/rlm_acct_unique-1.0.5.la
--- !targe sym /usr/lib/libradius.so
--- !targe sym /usr/lib/libradius-1.0.5.la
--- !targe sym /usr/lib/libeap.so
--- !targe sym /usr/lib/libeap-1.0.5.la
>>> original instance of package unmerged safely.
>>> Regenerating /etc/ld.so.cache...
>>> net-dialup/freeradius-1.0.5-r1 merged.
=====================================================
Вышеприведенный лог сборки (его конец) показывает, что FreeRADIUS 1.0.5 успешно установлен в систему (о чем сообщает строка "
net-dialup/freeradius-1.0.5-r1 merged"). Можно приступать к его настройке.
1.1 файл /etc/raddb/clients.conf
Для начала пропишем клиентов (в данном случае - точку доступа) в файле /etc/raddb/clients.conf
#----------------------------------------------------
client 192.168.1.250/32 {
secret = test1234
shortname = test_ap
}
#----------------------------------------------------
Эта запись означает, что клиент с адресом 192.168.1.250 авторизируется на RADIUS-е с паролем test1234. Имя test_ap будет использована при логировании событий, связанных с этой точкой доступа.
Не забываем сменить стандартный пароль для localhost_клиентов:
#----------------------------------------------------
secret = very_strong_secret_password
#----------------------------------------------------
1.2 файл /etc/raddb/radiusd.conf
Теперь разберемся с основным файлом конфигурации Radius-а /etc/raddb/radiusd.conf
Секция Modules{ }, раздел mschap { }
Включаем
use_mppe = yes # использовать алгоритм mppe
require_encryption = yes # использовать шифрование
require_strong = yes # только сильное шифрование
with_ntdomain_hack = yes # исправление некорректной реализации алгоритма аутентификации у MS (посылка имени пользователя в виде DOMAIN\USER, а challange responce - в виде USER)
Кроме этого, можно поотключать в файле все алгоритмы (pap, passwd), не относящиеся к MS-CHAP, но это необязательно.
Необходимо также наличие следующих строк в modules{ }
#----------------------------------------------------
#
# 'domain\user'
#
realm ntdomain {
format = prefix
delimiter = "\\"
ignore_default = no
ignore_null = no
}
#----------------------------------------------------
и
#----------------------------------------------------
ntdomain
#----------------------------------------------------
в authorize{ } для того, чтобы корректно разделять имя домена (или имя компьютера, если этот компьютер не в домене) и имя пользователя. Ведь Windows при аутентификации посылает не просто логин пользователя, а конструкцию вида COMPUTERNAME\USERNAME или DOMAINNAME\USERNAME. Если у нас все компьютеры в домене, то можно, конечно, в общем хранилище аккаунтов прописывать логины пользователей вместе с именем домена, но это не всегда удобно. Если же никакого домена нет, то ситуация становится совсем мрачной - нужно прописывать аккаунты пользователей с учетом имен их компьютеров. Поэтому для простоты будем просто отрезать доменную часть аккаунта.
1.3 файл /etc/raddb/proxy.conf
Теперь открываем файл /etc/raddb/proxy.conf и добавляем в конец этого файла
#----------------------------------------------------
realm DEFAULT {
type = radius
authhost = LOCAL
accthost = LOCAL
}
#----------------------------------------------------
DEFAULT реалм, добавленный нами, позволяет всем аккаунтам, которые не попали ни в один вышезаданный реалм, проверяться на локальном радиусе. В нашем случае это означает, что все windows-аккаунты с отрезанной доменной частью будут проверяться локально.
1.4 файл /etc/raddb/eap.conf
Переходим к настройке протокола EAP. Его настройки располагаются в отдельном файле, который, в свою очередь, подключается к основному /etc/raddb/radiusd.conf вот такой конструкцией:
#----------------------------------------------------
$INCLUDE ${confdir}/eap.conf
#----------------------------------------------------
Открываем /etc/raddb/eap.conf
В секции eap{ }
#----------------------------------------------------
default_eap_type = peap # по-умолчанию, используем EAP-PEAP
#----------------------------------------------------
Раскомментируем секцию, относящуюся к peap:
#----------------------------------------------------
peap {
default_eap_type = mschapv2
}
#----------------------------------------------------
Но этого недостаточно для функционирования PEAP, нам также необходимо активировать (раскомментировать) секцию, отвечающую за EAP-TLS:
#----------------------------------------------------
tls {
private_key_password = whatever
private_key_file = ${raddbdir}/certs/cert-srv.pem
certificate_file = ${raddbdir}/certs/cert-srv.pem
CA_file = ${raddbdir}/certs/demoCA/cacert.pem
dh_file = ${raddbdir}/certs/dh
random_file = ${raddbdir}/certs/random
}
#----------------------------------------------------
В данном случае использованы цифровые сертификаты, сгенерированные автоматически, при установке пакета freeradius. Можно, конечно, создать собственные сертификаты, подписанные своим (или сторонним) сертификационным центром, но для простоты объяснения, этот этап опущен (он будет подробно расписан в следующей части статьи). Для работы RADIUS-сервера для обеспечения работы EAP-PEAP протокола, вышеприведенных настроек будет достаточно.
1.5 файл /etc/raddb/users
Последний шаг в настройке RADIUS-сервера - это конфигурирование пользовательской базы. Как уже упоминалось выше, FreeRadius умеет хранить базу пользователей (аккаунты) в различных хранилищах, будь то системные аккаунты, обычный текстовый файл, LDAP, MySQL, PostgreSQL или что-либо еще.
Мы в качестве базы хранилища будем использовать обычный текстовый файл /etc/raddb/users. Формат файла очень простой: одна строчка - одна запись:
#----------------------------------------------------
testuser1 User-Password == "password1"
testuser2 User-Password == "password2"
#----------------------------------------------------
В нашей базе прописано два пользователя: testuser1,testuser2 с соответствующими паролями. Файл /etc/raddb/users подключается в секции modules{ }, раздел files{ } основного конфигурационного файла FreeRadius (/etc/raddb/radiusd.conf) следующей строчкой:
#----------------------------------------------------
files {
# <....>
usersfile = ${confdir}/users
compat = no
}
#----------------------------------------------------
1.6 права доступа к /etc/raddb/
Пара слов о безопасности. При установке пакета freeradius создается пользователь radiusd и группа radiusd, которая является основной для этого пользователя. Права на директорию конфигурационных файлов RADIUS устанавливаются следующие:
=====================================================
# /bin/ls -l /etc | grep raddb
drwxr-x--- 3 root radiusd 4096 Oct 12 15:10 raddb
=====================================================
Таким образом, только root может модифицировать директорию, а читать из нее, кроме root, может только группа radiusd. Посмотрим права на файлы внутри этой директории:
=====================================================
# /bin/ls -l /etc/raddb
total 236
-rw-r--r-- 1 root radiusd 422 Oct 12 13:22 acct_users
-rw-r--r-- 1 root radiusd 4074 Oct 12 13:22 attrs
drwxr-xr-x 3 root radiusd 4096 Oct 12 17:43 certs
-rw-r----- 1 root radiusd 189 Oct 12 13:22 clients
-rw-r----- 1 root radiusd 2913 Nov 25 17:45 clients.conf
-rw-r--r-- 1 root radiusd 929 Oct 12 13:22 dictionary
-rw-r--r-- 1 root radiusd 9096 Nov 29 13:10 eap.conf
-rw-r--r-- 1 root radiusd 8266 Oct 12 13:22 experimental.conf
-rw-r--r-- 1 root radiusd 2396 Oct 12 13:22 hints
-rw-r--r-- 1 root radiusd 1604 Oct 12 13:22 huntgroups
-rw-r--r-- 1 root radiusd 2333 Oct 12 13:22 ldap.attrmap
-rw-r--r-- 1 root radiusd 9330 Oct 12 13:22 mssql.conf
-rw-r--r-- 1 root radiusd 1020 Oct 12 13:22 naslist
-rw-r----- 1 root radiusd 856 Oct 12 13:22 naspasswd
-rw-r--r-- 1 root radiusd 12267 Oct 12 13:22 oraclesql.conf
-rw-r--r-- 1 root radiusd 14467 Oct 12 13:22 postgresql.conf
-rw-r--r-- 1 root radiusd 1039 Oct 12 13:22 preproxy_users
-rw-r--r-- 1 root radiusd 8934 Nov 29 11:47 proxy.conf
-rw-r--r-- 1 root radiusd 58110 Nov 29 11:56 radiusd.conf
-rw-r--r-- 1 root radiusd 187 Oct 12 13:22 realms
-rw-r--r-- 1 root radiusd 1405 Oct 12 13:22 snmp.conf
-rw-r--r-- 1 root radiusd 14149 Oct 12 13:22 sql.conf
-rw-r--r-- 1 root radiusd 7110 Nov 30 17:37 users
-rw-r--r-- 1 root radiusd 7267 Oct 12 13:22 x99.conf
-rw-r--r-- 1 root radiusd 4165 Oct 12 13:22 x99passwd.sample
=====================================================
Группа radiusd может только читать файлы в этой директории, все файлы с паролями не доступны на чтения миру, кроме файла /etc/raddb/users. Его права 644, то есть всем разрешено читать информацию из этого файла. Это не страшно в связи с тем, что сама директория /etc/raddb не доступна на чтение всем, но все же лучше поправить права файла /etc/raddb/users:
=====================================================
# /bin/chmod o-r /etc/raddb/users
# /bin/ls -l /etc/raddb/users
-rw-r----- 1 root radiusd 7110 Nov 30 17:37 /etc/raddb/users
=====================================================
Теперь с правами доступа на файлы все в порядке.
1.7 запуск radiusd в режиме отладки
На этом настройка FreeRadius сервера завершена. Можно запустить его в режиме отладки командой
# /usr/sbin/radiusd -fX
Если ошибок в конфигурационных файлах допущено не было, на экране мы увидим примерно следующее:
=====================================================
s3 ~ # /usr/sbin/radiusd -fX
Starting - reading configuration files ...
reread_config: reading radiusd.conf
Config: including file: /etc/raddb/proxy.conf
Config: including file: /etc/raddb/clients.conf
Config: including file: /etc/raddb/snmp.conf
Config: including file: /etc/raddb/eap.conf
Config: including file: /etc/raddb/sql.conf
main: prefix = "/usr"
main: localstatedir = "/var"
main: logdir = "/var/log/radius"
main: libdir = "/usr/lib"
main: radacctdir = "/var/log/radius/radacct"
main: hostname_lookups = no
main: max_request_time = 30
main: cleanup_delay = 5
main: max_requests = 1024
<...>
Module: Instantiated detail (detail)
Module: Loaded radutmp
radutmp: filename = "/var/log/radius/radutmp"
radutmp: username = "%{User-Name}"
radutmp: case_sensitive = yes
radutmp: check_with_nas = yes
radutmp: perm = 384
radutmp: callerid = yes
Module: Instantiated radutmp (radutmp)
Listening on authentication *:1812
Listening on accounting *:1813
Ready to process requests.
=====================================================
Надпись "Listening on authentication *:1812" означает, что сервер ждет запросов на аутентификацию на 1812 порту, а "Ready to process requests" - что он готов к работе.
RADIUS сконфигурирован и запущен, переходим к настройкам точки доступа.
2. Настройка точки доступа.
Здесь описывается лишь настройка точки доступа в качестве Radius-клиента. Разумеется, интерфейсы точек доступа разных производителей будут выглядеть по-разному, но общие принципы настроек изменяться не будут.
Надо сделать следующее:
- включить WPA;
- выбрать тип шифрования (AES или TKIP)
- прописать адрес RADIUS-сервера
- прописать пароль доступа (shared secret) к RADIUS-серверу
Вводим SSID беспроводной сети (WPA-PEAP), активируем "Security" и жмем кнопку "Configure Security".
В появившемся окне выбрать WPA RADIUS в пункте "Security Mode". Далее алгоритм шифрования - установить AES (или TKIP, если клиентское оборудование AES не поддерживает). Далее вводим адрес машины, где установлен RADIUS сервер и порт, по которому оный принимает запросы (порт 1812 - является стандартным).
Осталось задать "Shared Secret" (пароль на подключение) и все - настройка точки доступа на этом завершена.
3. Настройка беспроводного клиента.
WiFi карта подключена к компьютеру под управлением Windows XP PRO SP2. Настройка производится в родной Windows Zero Config утилите.
Жмем на "изменить порядок предпочтения сетей".
В закладке "беспроводные сети" щелкаем на кнопку "Добавить".
Попадаем в окно свойств беспроводной сети.
Закладка "связи". Указываем нужное имя сети (в нашем случае WPA-PEAP) и выбираем тип шифрования данных (AES или TKIP). Разумеется, он должен совпадать с тем, что был указан в точке доступа.
Переходим на закладку "Проверка подлинности". В типе EAP ставим "Protected EAP (PEAP)". После чего жмем на кнопку "Свойства".
В следующем окошке снимаем галку с "проверять сертификат сервера". Так как сертификаты у нас самосгенеренные при установке FreeRadius, Windows не сможет проверить их валидность (это будет показано чуть ниже).
Далее, выбираем "Метод проверки подлинности", ставим там "Secured password (EAP-MSCHAP v2). Если тут же нажать кнопку "настроить", то
в появившемся окне можно выбрать способ ввода логина/пароля для доступа в беспроводную сеть. Если "автоматически использовать имя входа и пароль Windows", то при аутентификации беспроводного клиента будет использован тот же логин/пароль, что и на аутентификацию в самой операционной системе. Если галку снять, то логин/пароль придется вручную вводить при каждом подключении к беспроводной сети.
В последней закладке - "подключение" - установленная галка напротив "подключаться, если сеть находится в радиусе действия", позволяет клиенту автоматически подключаться к настраиваемой беспроводной сети, если она окажется поблизости.
После всех настроек, достаточно выбрать нужную беспроводную сеть в списке доступных (в окне Zero Config Utility) и начнется процесс подключения. Либо клиент автоматически начнет подключение к сети, если так было настроено (смотри предыдущий пункт).
Когда все стадии, расписанные в предыдущей статье, отработают, беспроводное соединение установится и клиент попадет в сеть.
Со стороны RADIUS-сервера (запущенного в дебаг-режиме), процесс установления выглядит так:
=====================================================
rad_recv: Access-Request packet from host 192.168.1.250:3072,
id=0, length=177
User-Name = "TESTCOMP1\\test"
NAS-IP-Address = 192.168.1.250
Called-Station-Id = "000e8e7a2dd1"
Calling-Station-Id = "0013d403ac86"
NAS-Identifier = "000e8e7a2dd1"
NAS-Port = 41
Framed-MTU = 1400
State = 0x0f0b8bdd06019c6bee7b88dabfb6735c
NAS-Port-Type = Wireless-802.11
EAP-Message = 0x020800261900170301001bcecf5baabb2134510af
f0a705ee2b6b45a8df2c1952d9a489622f5
Message-Authenticator = 0xdf8e304c880e72a1352c84446d463432
#
#
# получили запрос на аутентификацию от клиента
# (запрос от клиента передан точкой доступа)
#
#
Processing the authorize section of radiusd.conf
modcall: entering group authorize for request 11
modcall[authorize]: module "preprocess" returns ok for request 11
modcall[authorize]: module "chap" returns noop for request 11
modcall[authorize]: module "mschap" returns noop for request 11
rlm_realm: No '@' in User-Name = "TESTCOMP1\test", looking up realm NULL
rlm_realm: No such realm "NULL"
modcall[authorize]: module "suffix" returns noop for request 11
rlm_realm: Looking up realm "TESTCOMP1" for User-Name = "TESTCOMP1\test"
rlm_realm: Found realm "DEFAULT"
rlm_realm: Adding Stripped-User-Name = "test"
rlm_realm: Proxying request from user test to realm DEFAULT
rlm_realm: Adding Realm = "DEFAULT"
rlm_realm: Authentication realm is LOCAL.
#
#
# аутентифицируем клиента в локальном хранилище аккаунтов
#
#
modcall[authorize]: module "ntdomain" returns noop for request 11
rlm_eap: EAP packet type response id 8 length 38
rlm_eap: No EAP Start, assuming it's an on-going EAP conversation
modcall[authorize]: module "eap" returns updated for request 11
users: Matched entry test at line 12
State = 0x0f0b8bdd06019c6bee7b88dabfb6735c
modcall: group authorize returns updated for request 11
rad_check_password: Found Auth-Type EAP
auth: type "EAP"
Processing the authenticate section of radiusd.conf
modcall: entering group authenticate for request 11
rlm_eap: Request found, released from the list
rlm_eap: EAP/peap
rlm_eap: processing type peap
rlm_eap_peap: Authenticate
rlm_eap_tls: processing TLS
eaptls_verify returned 7
rlm_eap_tls: Done initial handshake
eaptls_process returned 7
rlm_eap_peap: EAPTLS_OK
rlm_eap_peap: Session established. Decoding tunneled attributes.
rlm_eap_peap: Received EAP-TLV response.
rlm_eap_peap: Tunneled data is valid.
rlm_eap_peap: Success
rlm_eap: Freeing handler
modcall[authenticate]: module "eap" returns ok for request 11
modcall: group authenticate returns ok for request 11
Login OK: [TESTCOMP1\\test/]
(from client test_ap port 41 cli 0013d403ac86)
Sending Access-Accept of id 0 to 192.168.1.250:3072
MS-MPPE-Recv-Key = 0xca2b5d707f091386f694a5319ca892
aabedeb8f92450de774911c22c9cbb8f03
MS-MPPE-Send-Key = 0x22d5a9280b80276b0a1e3308bfdacb
e3ad533af04d6813a989bcf077d08e0935
EAP-Message = 0x03080004
Message-Authenticator = 0x00000000000000000000000000000000
User-Name = "test"
#
#
# успешно аутентифицировали, выдали ключ сессии клиенту
#
#
Finished request 11
Going to the next request
Waking up in 6 seconds...
=====================================================
3.1 Частные случаи настройки клиента - "проверка сертификата сервера"
А теперь вернемся к двум, оставленным напоследок, вопросам.
Первое - насчет проверки сертификата серверу, которую мы отключали в защищенных свойствах EAP. В следующей статье будут подробно описаны процессы создания собственного сертификационного центра (CA) и клиентских сертификатов. Так как в данном случае никаких CA мы не создавали и корневой сертификат нашего CA на компьютере-клиенте не установлен, то включения проверки сертификата сервера, как показано на скриншоте
приведет к следующему (на стадии аутентификации клиента):
В трее выскочит сообщение, говорящее о том, что необходима ручная проверка учетных данных.
После щелчка на ней, выскочит окошко, сообщающее, что нам (клиентскому компьютеру) не известен сертификат, пришедший со стороны RADIUS-сервера. Нам предлагается вручную щелкнуть на "ОК" для продолжения подключения или "Отмена" для разрыва соединения. И так при каждом подключении к беспроводной сети. Разумеется, это не удобно, поэтому лучше совсем отключить проверку сертификата сервера.
Хотя еще более корректно будет создать собственный центр сертификации, установить корневой сертификат центра на клиентском компьютере. После чего выдать RADIUS-серверу его собственный сертификат, подписанный корневым. Тогда проверка сертификата сервера пройдет успешно. Но об этом в следующей части.
Кстати, если в предыдущем окошке щелкнуть по кнопке "просмотр сертификата сервера", то в появившемся интерфейсе
можно просмотреть самосгенеренный сертификат, который присылает нам RADIUS-сервер.
Хорошо видно, что это корневой (самоподписанный) сертификат.
3.2 Частные случаи настройки клиента - "автоматически использовать имя и пароль windows "
Второй не рассмотренный ваше аспект - это способ подстановки логина/пароля для аутентификации клиента в беспроводной сети.
Как уже говорилось выше, существуют два способа ввода логина/пароля:
- Автоматическая подстановка, при этом используется логин/пароль пользователя, работающего в системе.
- Ручной режим ввода логина/пароля/домена при каждой попытке коннекта.
Если снять галку напротив "автоматически использовать имя входа и пароль Windows" в свойствах EAP MSCHAPv2, то при каждом подключении к беспроводной сети, Windows будет выдавать следующее:
В трее вылезает окошко, приглашающее нас щелкнуть на него для ввода нужной информации в ручном режиме.
При щелчке по надписи в трее, вылезает форма, предлагающая ввести логин, пароль и имя домена (если это необходимо). После нажатия на "ОК", процесс соединения с беспроводной сетью продолжится...
... и успешно завершится подключением, если, конечно, учетные данные были введены без ошибок.
4. Добавление FreeRadius в автостарт
Осталось лишь остановить FreeRADIUS сервер, запущенный в режиме отладки, добавить его в автостарт...
=====================================================
# rc-update add radiusd default
* radiusd added to runlevel default
=====================================================
...для того, чтобы radiusd сервис запускался при старте системы, и запустить его (однократно) в нормальном режиме:
=====================================================
# /etc/init.d/radiusd start
* Starting radiusd ... [ ok ]
=====================================================
Все, настройка системы на этом завершена.
Заключение
На этом завершается вторая часть статьи. Мы научились настраивать беспроводную сеть для работы в режиме чистого WPA с аутентификацией клиентов через EAP-PEAP, с хранением базы аккаунтов во внешней базе (в данном случае - в текстовом файле). Если не хочется связываться с собственным центром сертификации, то информации, приведенной выше, более чем достаточно для построения защищенной беспроводной сети.
Но в вышеописанной схеме есть один минус. Дело в том, что подключение к беспроводной сети может происходить только после фактического логина пользователя в операционную систему. То есть для начала мы должны ввести свой логин/пароль на доступ в систему и уже только после этого сможем подключиться к беспроводной сети. А что делать, если у нас на руках ноутбук, включенный в домен, и кроме как по WiFi, подключить его к сети не представляется возможным (или это не удобно)? Ведь при нажатии ctrl-alt-del для ввода логина/пароля для доступа в доменную сеть, компьютер уже должен иметь доступ к сети (хотя бы для того, чтобы найти тот самый домен, куда он должен быть подключен). Тем самым, EAP-PEAP в этом случае не применим, а надо использовать EAP-TLS, то есть настраивать сертификаты и все остальное. Но об этом - в следующей части.
Навигация