Есть 7 точек доступа Zyxel ap G-3000 и машина под freebsd 7.0 stable надо настроить безопасную WIFI сеть с WPA или WPA2 шифрованием, роумингом между точками и единым центром авторизации.
Для авторизации я буду использовать freeradius 1.1.7_3, для удобства администрирования я буду использовать апач 2.2.9 с поддержкой php и вэб-морду для радиуса ARA-0.6 http://download.asn.pl/ara/ara-0.6.tar.gz Для работы ара нам понадобиться еще HTML-Template-Sigma (/usr/ports/devel/pear-HTML_Template_Sigma/)
Сразу скажу, что у меня все заработало, за одним маленьким недочетом КПК не смогли подключиться к сети т.к. я протокол peap на КПК сильно урезан и не захотел авторизовать пользователя без сертификата, а настройка центра сертификации выходит за рамки этого мана. Поэтому будет рассматриваться только подключение ноутбуков к сети WIFI
Итак, приступим
Для начала давайте определимся где мы будем хранить учетки пользователей, я выбрал mysql т.к. у меня около 400 пользователей в сети + заезжие гастербайтеры из других компаний, но вы можете хранить пользователей в файле users, но об этом позднее.
Установку и настройку Freebsd я описывать не буду, скажу только что после установки рекомендуется обновить исходники ядра, порты и пересобрать мир, но это дело вкуса.
Начинаем ставить ПО
Сначала ставим Mysql 5 server & client
После установки выполняем команду (ставим mysql в автозагрузку)cd /usr/ports/databases/mysql50-server/
make; make install
Дальше ставим радиусecho mysql_enable=YES >> /etc/rc.conf
После установки выполняем команду (ставим радиус в автозагрузку)cd /usr/ports/net/freeradius-mysql/
make; make install
Запускаем Mysqlecho radiusd_enable=YES >> /etc/rc.conf
Создаем базу данных для нашего радиуса/usr/local/etc/rc.d/mysql-server start
теперь запаролим наш sql серверmysqladmin create radius
mysql radius < /usr/local/share/doc/freeradius/examples/mysql.sql
Приступаем к настройке радиуса, начнем с radius.confmysqladmin password radiuspass
Правим конфигvi /usr/local/etc/raddb/radius.conf
Вот собственно и весь основной конфиг радиуса если что непонятно читайте маннprefix = /usr/local //объявляем переменные
exec_prefix = ${prefix}
sysconfdir = ${prefix}/etc
localstatedir = /var
sbindir = ${exec_prefix}/sbin
logdir = /var/log
raddbdir = ${sysconfdir}/raddb
radacctdir = ${logdir}/radacct
confdir = ${raddbdir}
run_dir = ${localstatedir}/run/radiusd
log_file = ${logdir}/radius.log // файл в котором храним логи
libdir = ${exec_prefix}/lib
pidfile = ${run_dir}/radiusd.pid
max_request_time = 30 // время закоторое должен быть обработан запрос
delete_blocked_requests = no
cleanup_delay = 5
max_requests = 1024000 // максимольное количество запросов
bind_address = * // работаем на всех доступных адресах
port = 0 // используем стандартный порт
hostname_lookups = no // не распозновать имена хостов
allow_core_dumps = yes // разрешаем дамп ядра
regular_expressions = yes // разрешаем регулярные выражения
extended_expressions = yes
log_stripped_names = no
log_auth = yes // логировать аутентификации
log_auth_badpass = yes // записывать только плохие пароли
log_auth_goodpass = no
usercollide = no
lower_user = no
lower_pass = no
nospace_user = no
nospace_pass = no
checkrad = ${sbindir}/checkrad
security {
max_attributes = 200
reject_delay = 1
status_server = no
}
# PROXY CONFIGURATION // включаем список обсдуживаемых доменов
proxy_requests = yes
$INCLUDE ${confdir}/proxy.conf
# CLIENTS CONFIGURATION
$INCLUDE ${confdir}/clients.conf // включаем но не настраиваем список будем //брать из базы
Дальше у нас идет snmp, его полностью комментируем
# THREAD POOL CONFIGURATION
thread pool {
start_servers = 5
max_servers = 32
min_spare_servers = 3
max_spare_servers = 10
max_requests_per_server = 0
}
# MODULE CONFIGURATION
pap {
auto_header = yes
}
chap {
authtype = CHAP
}
pam {
pam_auth = radiusd
}
unix {
cache = no
cache_reload = 600
#
radwtmp = ${logdir}/radwtmp
}
$INCLUDE ${confdir}/eap.conf // включаем eap peap для виндовс
mschap {
use_mppe = yes
require_encryption = yes
require_strong = yes
with_ntdomain_hack = yes
}
Дальше у нас идет Ldap, его полностью комментируем
# Realm module, for proxying. // объявляем домены
realm IPASS {
format = prefix
delimiter = "/"
ignore_default = no
ignore_null = no
}
# 'username@realm'
#
realm suffix {
format = suffix
delimiter = "@"
ignore_default = no
ignore_null = no
}
# 'username%realm'
#
realm realmpercent {
format = suffix
delimiter = "%"
ignore_default = no
ignore_null = no
}
realm ntdomain {
format = prefix
delimiter = "\\"
ignore_default = no
ignore_null = no
}
# A simple value checking module
checkval {
item-name = Calling-Station-Id
check-name = Calling-Station-Id
data-type = string
notfound-reject = yes // включаем проверку дополнительных параметров
}
# Preprocess the incoming RADIUS request, before handing it off
# to other modules.
huntgroups = ${confdir}/huntgroups
hints = ${confdir}/hints
with_ascend_hack = no
ascend_channels_per_line = 23
with_ntdomain_hack = yes
with_specialix_jetstream_hack = no
with_cisco_vsa_hack = no
}
Опцию #files { банем полностью
# Write a detailed log of all accounting records received.
#
detail {
detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d
detailperm = 0600
suppress {
User-Password
}
}
detail auth_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d
detailperm = 0600
}
detail reply_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d
detailperm = 0600
}
detail pre_proxy_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/pre-proxy-detail-%Y%m%d
detailperm = 0600
}
acct_unique {
key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-
}
$INCLUDE ${confdir}/sql.conf // включаем использование базы данных mysql
radutmp {
filename = ${logdir}/radutmp
username = %{User-Name}
case_sensitive = yes
check_with_nas = yes
perm = 0600
callerid = "yes"
}
radutmp sradutmp {
filename = ${logdir}/sradutmp
perm = 0644
callerid = "yes"
}
attr_filter {
attrsfile = ${confdir}/attrs
}
counter daily {
filename = ${raddbdir}/db.daily
key = User-Name
count-attribute = Acct-Session-Time
reset = daily
counter-name = Daily-Session-Time
check-name = Max-Daily-Session
allowed-servicetype = Framed-User
cache-size = 5000
}
sqlcounter dailycounter {
counter-name = Daily-Session-Time
check-name = Max-Daily-Session
reply-name = Session-Timeout
sqlmod-inst = sql
key = User-Name
reset = daily
query = "SELECT SUM(AcctSessionTime - \
GREATEST((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) \
FROM radacct WHERE UserName='%{%k}' AND \
UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'"
query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE \
UserName='%{%k}' AND AcctStartTime > FROM_UNIXTIME('%b')"
query = "SELECT SUM(AcctSessionTime) FROM radacct \
WHERE UserName='%{%k}' AND AcctStartTime BETWEEN \
FROM_UNIXTIME('%b') AND FROM_UNIXTIME('%e')"
}
sqlcounter monthlycounter {
counter-name = Monthly-Session-Time
check-name = Max-Monthly-Session
reply-name = Session-Timeout
sqlmod-inst = sql
key = User-Name
reset = monthly
query = "SELECT SUM(AcctSessionTime - \
GREATEST((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) \
FROM radacct WHERE UserName='%{%k}' AND \
UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'"
}
always fail {
rcode = fail
}
always reject {
rcode = reject
}
always ok {
rcode = ok
simulcount = 0
mpp = no
}
expr {
}
digest {
}
exec {
wait = yes
input_pairs = request
}
exec echo {
wait = yes
program = "/bin/echo %{User-Name}"
input_pairs = request
output_pairs = reply
}
#ippool main_pool { // комментируем ип пул нам не нужен ip будем раздавать через dhcp
instantiate {
exec
expr
}
authorize {
preprocess
auth_log
suffix
ntdomain
eap
sql
checkval
pap
}
authenticate {
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
eap
}
preacct {
preprocess
acct_unique
suffix
ntdomain
}
accounting {
detail
daily
unix
radutmp
sql
}
session {
radutmp
sql
}
post-auth {
sql
}
pre-proxy {
}
post-proxy {
eap
}
Но этого файла мало как видно из конфига нам нужны еще 4 файла proxy.conf, clients.conf, eap.conf и конечно sql.conf. Начнем с SQL
Следующий файл, eap.conf, очень важен так как он скажет как радиусу работать с peap протоколом следует обратить внимание на то что, я публикую только раскомментированые строки то что не указано закоментированиоsql {
driver = "rlm_sql_mysql"
server = "localhost"
login = "root"
password = "radiuspass"
radius_db = "radius"
далее файл не изменялся за исключением последней строки
readclients = yes // no заменяем на yes чтобы клиенты тоже брались из базы данных
}
Следующий файл proxy.conf файл вообщем-то остается без изменений единственное нам надо добавить дефолт проки следующим образомeap {
default_eap_type = peap
timer_expire = 60
ignore_unknown_eap_types = no
cisco_accounting_username_bug = no
md5 {
}
gtc {
auth_type = PAP
}
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
}
peap {
default_eap_type = mschapv2
copy_request_to_tunnel = yes
use_tunneled_reply = yes
proxy_tunneled_request_as_eap = yes
}
mschapv2 {
}
}
Ну и последний файл это clients.conf там нам надо исправить только secret в секции 127.0.0.1realm DEFAULT {
type = radius
authhost = LOCAL
accthost = LOCAL
Собственно с радиусом все проверяем
В ответ должны получить много всего но в конце должно быть вот это/usr/local/sbin/radiusd -fX
Если этого нет то ищите ошибку в конфигахModule: Instantiated radutmp (radutmp)
Listening on authentication *:1812
Listening on accounting *:1813
Ready to process requests.
Если все прошло удачно то теперь озаботимся вэб-интерфейсом для нашего радиуса
Ставим апач+пхп+экстеншенсы
После установки сказы ставим апач в автозагрузкуcd /usr/ports/www/apache22
make; make install
Теперь ставим пхпecho apache22_enable=YES >> /etc/rc.conf
При установке php5-extensions вам нужно проставить следующие экстеншенсыcd /usr/ports/lang/php5
make; make install
cd /usr/ports/lang/php5-extensions/
make; make install
bcmath, bz2, calendar, ctype, pcre, simplexml, spl, dom, fileinfo, filter, ftp, gd, gettext, hash, iconv, json, ldap, mcrypt, mhash, ming, mysql, mysqli, openssl, pdf, pdo, pdo_sqlite, posix, session, snmp, sockets, sqlite, tokenizer, xml, xmlreader, xmlrpc, xmlwriter, zip, zlib. После этого нам понадобиться Template_Sigma
Теперь выкачиваем вэб интерфейсcd /usr/ports/devel/pear-HTML_Template_Sigma/
make; make install
Теперь нам надо поправить конфиг вэб-морды для этогоfetch http://download.asn.pl/ara/ara-0.6.tar.gz
gunzip –d ara-0.6.tar.gz
tar –xvf ara-0.6.tar
cd ara-0.6
cp –r src /usr/local/www/radius
Переходим к правке конфига нас там интересует SQL server setting и access_levelcd /usr/local/www/radius/config
cp config.php.dist config.php
vi config.php
Теперь переходим в каталог /usr/local/www/radius/ и создаем access.file/* SQL server setings */
$config["sql_driver"] = "mysql";
$config["sql_server_host"] = "localhost";
$config["sql_server_port"] = "3306";
$config["sql_username"] = "root";
$config["sql_passwd"] = "radiuspass";
$config["sql_db"] = "radius";
$config["sql_encoding"] = "utf8";
•••••••••••••••••••••••••••••••••••••••••••••••••
$config["access_level"] = ARA_ACCESS_ALL;
Дальше вводим пароль администратора радиуса который придумаем и подтверждаем егоcd /usr/local/www/radius/
htpasswd –c access.file admin
Теперь настраиваем апач для работы с нашей вебмордой
После строки LoadModule php5_module libexec/apache22/libphp5.so добавляемvi /usr/local/etc/apache22/httpd.conf
В строку DirectoryIndex index.html добавляем index.php, выглядеть это должно такAddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
И финальный штрих в конец файла httpd.conf перед строкой <IfModule ssl_module> вставляемDirectoryIndex index.html index.php
Перезапускаем апач, открываем браузер вбиваем линк http://yuors_radius_ip/radius<Directory /usr/local/www/radius/htdocs/>
Options None
AllowOverride AuthConfig
AuthName "Radius Access"
AuthType Basic
AuthUserFile /usr/local/www/radius/access.file
require valid-user
Order allow,deny
Allow from all
</Directory>
Alias /radius /usr/local/www/radius/htdocs/
и видим следующие
Переходим к разделу “nas” и добавляем туда наши точки доступа
Переходим по ссылке nas select, вбиваем название точки и нажимаем ок как показано на рисунке
Откроется список параметров из которых надо заполнить три это ip, secret (пусть secret будет 123456 т.к. он нам понадобиться в дальнейшем), description и нажать ок (как показано на рисунке)
Таким же образом заводим все остальные точки доступа
С Акцесс пойнтами разобрались, теперь заводим пользователей. Пока заводим двух, admin и testuser. Admin будет управлять точками доступа, а testuser будет тестовым пользователем которым мы будем коннектиться к wifi.
Итак приступим, переходим к вкладке users и нажимаем select в текстовом поле «choose (or create):» вбиваем имя пользователя “admin” и нажимаем ok
На открывшейся вкладке «login: admin» нажимаем ссылку edit и попадаем на страничку редактирования аккаунта пользователя, нас интересует секция «table: check» начинаем вбивать атрибуты пользователя и их значения. Первый и основной атрибут мы ставим «User-Password» оператор ставим «==» в поле value вбиваем значение (сам пароль), для ограничения использования этой учетки добавляем атрибут “ Calling-Station-Id” ставим оператор ставим «==» и в поле value вбиваем мак точки доступа. Поскольку точек доступа у нас по условию семь мы добавляем все мак адреса точек с тем же атрибутом (этим мы ограничиваем количество станций которые могут авторизоваться на нашем радиусе под логином admin любому другому маку будет послано оповещение Login incorrect). Аналогично настраиваем учетку testuser.
Переходим к настройке точек доступа. Как я сказал мы используем Zyxel ap G-3000 но вам подойдет любая точка с поддержкой радиуса и WPA. Поэтому без скринов расскажу что нам надо настроить
1. Имя и домен точки доступа
2. Прописать ip, dns, шлюз (причем ip должен быть тот который мы прописали в таблице nas на радиусе)
3. Сменить пароль пользователя admin на точке доступа (в идеале если поддерживается лучше зацепить эти точки к радиусу для проверке пароля администратора, но локальный пароль на точку доступа тоже лучше сменить)
4. Прописать настройки радиус сервера куда входит ip радиус сервера, порт (как правило 1812), и secret (тот что мы прописывали в таблице nas)
5. И наконец настраиваем WiFi. Прописываем SSID сети (идентификация при желании можно сделать скрытым, что бы никто не видел этой сети кроме тех у кого она настроена), выбираем тип сети WPA с шифрованием TKIP или AES, и включаем роуминг если он поддерживается вашими точками (мои поддерживают поэтому включил)
Вот собственно и все, оговорюсь, что при настройке wifi на компьютере во вкладке «Проверка подлинности»:
1. Выставить Тип EAP «Защищенные EAP (PEAP)»
2. Надо снять галку с чек бокса «Проверять подлинность как у компьютера при доступности сведений о компьютере».
3. Кликнуть «свойства» снять галку с «Проверять сертификат сервера»
4. В выборе метода проверки подлинности выбрать «Безопасный пароль (EAP-MSCHAP v2)»
5. Кликнуть кнопку «Настроить»
6. Снять галку «Автоматически использовать имя входа и пароль Windows (и имя домена если существует)»
Вот теперь точно все
