Страница 1 из 1

FreeRADIUS и авторизация пользователей

Добавлено: 17 окт 2016, 19:21
RomA
Введение:
С одной стороны есть контролер домена, где прописаны все пользователи, а с другой стороны есть Wi-Fi, к которому все страстно хотят получить доступ. заводить одного пользователя? Но это как только кто нить левый узнает пароль - прийдётся всех перестраивать... Гостевой доступ подразумевает хождение ко мне пользователей, а я не очень рад их видеть... Пришлось думать как свести наше общение до минимума.

Решение:
Было решено брать логины и пароли с контролера домена. Делать это будем через RADIUS. Использовать будем пакет FreeRADIUS v3 - так как там появились сертификаты.

Реализация:
Контролер домена у меня реализован на Samba 4.3, так как лицензий на винду нет. Ставить фрирадиус буду тоже на этой же машине. Поехали:

Код: Выделить всё

cd /usr/ports/net/freeradius3
make install clean
настройки оставил по умолчанию.
Когда всё установилось идём в /usr/local/etc/raddb и начинаем править кончики:
radiusd.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
name = radiusd
confdir = ${raddbdir}
modconfdir = ${confdir}/mods-config
certdir = ${confdir}/certs
cadir   = ${confdir}/certs
run_dir = ${localstatedir}/run/${name}
db_dir = ${raddbdir}
libdir = /usr/local/lib/freeradius-3.0.11
pidfile = ${run_dir}/${name}.pid
correct_escapes = true
max_request_time = 30
cleanup_delay = 5
max_requests = 16384
hostname_lookups = no
log {
	destination = files
	colourise = yes
	file = ${logdir}/radius.log
	syslog_facility = daemon
	stripped_names = no
	auth = yes
	auth_badpass = yes
	auth_goodpass = yes
	msg_denied = "You are already logged in - access denied"
}
checkrad = ${sbindir}/checkrad
security {
	allow_core_dumps = no
	max_attributes = 200
	reject_delay = 1
	status_server = yes
	allow_vulnerable_openssl = yes
}
proxy_requests  = yes
$INCLUDE proxy.conf
$INCLUDE clients.conf
thread pool {
	start_servers = 5
	max_servers = 32
	min_spare_servers = 3
	max_spare_servers = 10
	max_requests_per_server = 0
	auto_limit_acct = no
}
modules {
	$INCLUDE mods-enabled/
}
instantiate {
}
policy {
	$INCLUDE policy.d/
}
$INCLUDE sites-enabled/
clients.conf
Сюда надо прописать все наши Wi-Fi точки доступа, которые будут обращаться за авторизацией...

Код: Выделить всё

client localhost {
	ipaddr = 127.0.0.1
	proto = *
	secret = testing123
	require_message_authenticator = no
	limit {
		max_connections = 16
		lifetime = 0
		idle_timeout = 30
	}
}

client 192.168.6.5 {
	ipaddr		= 192.168.6.5
	secret		= testing123
}
client 192.168.6.10 {
	ipaddr		= 192.168.6.10
	secret		= testing123
}

Ну а теперь начинается самое интересное:
Правим файл sites-enabled/default
в секцию
authorize { добавляем

Код: Выделить всё

ntlm_auth
А вот pap в этой же секции надо закоментировать

в секцию authenticate { добавляем:

Код: Выделить всё

Auth-Type ntlm_auth {
		ntlm_auth
	}

ntlm_auth
Далее в директории policy.d создаём файл ntlm_auth следующего содержания

Код: Выделить всё

ntlm_auth.authorize {  
    if (!control:Auth-Type && User-Password) {
        update control {
            Auth-Type := ntlm_auth
        } 
    } 
} 
Далее в директории mods-available находим и правим файл ntlm_auth

Код: Выделить всё

exec ntlm_auth {
	wait = yes
	program = "/usr/local/bin/ntlm_auth --request-nt-key --domain=SCH2120 --username=%{mschap:User-Name} --password=%{User-Password}"
}
То есть прописываем путь до модуля и вписываем свой домен.
По аналогии правим файл mschap

Код: Выделить всё

mschap {
	ntlm_auth = "/usr/local/bin/ntlm_auth --request-nt-key --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}"
	pool {
		start = ${thread[pool].start_servers}
		min = ${thread[pool].min_spare_servers}
		max = ${thread[pool].max_servers}
		spare = ${thread[pool].max_spare_servers}
		uses = 0
		retry_delay = 30
		lifetime = 86400
		cleanup_interval = 300
		idle_timeout = 600
	}
	passchange {
	}
}
Ну и на последок файл eap нужно поменять значение переменной

Код: Выделить всё

default_eap_type = ttls
Теперь можно запустить ради и проверить его работу.

Код: Выделить всё

radtest -t mschap perepechaev_ra P@$$W0rd localhost 1218 testing123
Верный ответ выглядит как-то так:

Код: Выделить всё

Sent Access-Request Id 93 from 0.0.0.0:17495 to 127.0.0.1:1812 length 140
	User-Name = "perepechaev_ra"
	MS-CHAP-Password = "P@$$W0rd"
	NAS-IP-Address = 192.168.1.146
	NAS-Port = 1218
	Message-Authenticator = 0x00
	Cleartext-Password = "P@$$W0rd"
	MS-CHAP-Challenge = 0x48b1db16a481e8b6
	MS-CHAP-Response = 0x0001000000000000000000000000000000000000000000000000bb9868212820a0b8a68c32b8985172b0dd506ddd76fc294e
Received Access-Accept Id 93 from 127.0.0.1:1812 to 0.0.0.0:0 length 84
	MS-CHAP-MPPE-Keys = 0x0000000000000000d724e7a28053c81c7191c16c56af3fbd
	MS-MPPE-Encryption-Policy = Encryption-Allowed
	MS-MPPE-Encryption-Types = RC4-40or128-bit-Allowed
А неверный так:

Код: Выделить всё

Sent Access-Request Id 90 from 0.0.0.0:29865 to 127.0.0.1:1812 length 140
	User-Name = "perepechaev_ra"
	MS-CHAP-Password = "123"
	NAS-IP-Address = 192.168.1.146
	NAS-Port = 1218
	Message-Authenticator = 0x00
	Cleartext-Password = "123"
	MS-CHAP-Challenge = 0x6642bddc68e99b7c
	MS-CHAP-Response = 0x0001000000000000000000000000000000000000000000000000ec7f34f8e5499a5fbae8022a9d6640aac0024088f2370113
Received Access-Reject Id 90 from 127.0.0.1:1812 to 0.0.0.0:0 length 61
	MS-CHAP-Error = "\000E=691 R=1 C=21a7a893f33bfc48 V=2"
(0) -: Expected Access-Accept got Access-Reject