Защита беспроводных сетей, WPA: теория и практика (часть вторая)

В предыдущей статье были разобраны теоретические аспекты WPA аутентификации и шифрования в беспроводных сетях. В этой статье подробнее рассмотрим практику таких решений.

Microsoft Windows XP, начиная с Service Pack 1 (а лучше сразу поставить Service Pack2), при работе с беспроводными сетями позволяет использовать аутентификацию по логину/паролю (то есть PEAP) и аутентификацию по цифровому сертификату (EAP-TLS). В этой статье детально рассмотрим EAP-PEAP механизм, а сертификаты оставим на следующий раз.

Итак, для работы нам потребуется:

  • беспроводной клиент — в данном случае это USB беспроводной адаптер ASUS WL-167g, подключенный к компьютеру с операционной системой Windows XP pro + SP2
  • точка доступа с поддержкой WPA — ей являлась TRENDnet TEW-410APB+
  • RADIUS-сервер — был использован FreeRadius сервер версии 1.0.5, работающий под операционной системой Gentoo Linux.

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 (посылка имени пользователя в виде DOMAINUSER, а challange responce — в виде USER)

Кроме этого, можно поотключать в файле все алгоритмы (pap, passwd), не относящиеся к MS-CHAP, но это необязательно.

Необходимо также наличие следующих строк в modules{ } #---------------------------------------------------- # # 'domainuser' # realm ntdomain { format = prefix delimiter = "\" ignore_default = no ignore_null = no } #----------------------------------------------------

и #---------------------------------------------------- ntdomain #----------------------------------------------------

в authorize{ } для того, чтобы корректно разделять имя домена (или имя компьютера, если этот компьютер не в домене) и имя пользователя. Ведь Windows при аутентификации посылает не просто логин пользователя, а конструкцию вида COMPUTERNAMEUSERNAME или DOMAINNAMEUSERNAME. Если у нас все компьютеры в домене, то можно, конечно, в общем хранилище аккаунтов прописывать логины пользователей вместе с именем домена, но это не всегда удобно. Если же никакого домена нет, то ситуация становится совсем мрачной — нужно прописывать аккаунты пользователей с учетом имен их компьютеров. Поэтому для простоты будем просто отрезать доменную часть аккаунта. 

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 est", 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 est" 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, то есть настраивать сертификаты и все остальное. Но об этом — в следующей части.

 

Навигация

 




13 декабря 2005 Г.

, WPA: ( ).

, WPA: ( )

WPA . .

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, . — .