среда, 16 января 2008 г.

Интеграция VPN-сервера mpd4 с доменом на базе Samba 3 при посредничестве freeradius

Последовательность действий:

  1. Пропатчить исходники и собрать новое ядро FreeBSD.
  2. Установить и настроить в отдельной клетке (jail) samba как члена домена.
  3. Установить в той же клетке freeradius и настроить на взаимодействие с локальным samba.
  4. Установить в основной системе mpd4 и настроить авторизацию посредством ранее установленного freeradius.
  5. Проверка работоспособности.
  6. Бонус.

1. Сборка ядра FreeBSD.
1.1. В моем случае ядро было собрано с приведенными ниже опциями
options         NETGRAPH
options NETGRAPH_ETHER
options NETGRAPH_NETFLOW
options NETGRAPH_SOCKET
options NETGRAPH_TEE
options NETGRAPH_MPPC_ENCRYPTION
options NETGRAPH_MPPC_COMPRESSION
options NETGRAPH_BPF
options NETGRAPH_IFACE
options NETGRAPH_KSOCKET
options NETGRAPH_PPP
options NETGRAPH_PPTPGRE
options NETGRAPH_TCPMSS
options NETGRAPH_VJC
options NETGRAPH_ONE2MANY
options NETGRAPH_RFC1490
options NETGRAPH_TTY
options NETGRAPH_UI

1.2. Перед сборкой ядро следует пропатчить, чтобы задействовать сжатие данных (опция NETGRAPH_MPPC_COMPRESSION).
Патч без проблем ложится на исходники ядра версий 6.x и 7.0-RC3 (патч лежит тут: http://www.mavhome.dp.ua/MPPC/).
Краткая инструкция по сборке:
1.2.1. Скачать архив и распаковать его содержимое в /usr/src/sys/net.
1.2.2. Изменить директорию на /usr/src/sys/modules/netgraph/mppc.
1.2.3. В Makefile изменить линию
    NETGRAPH_MPPC_COMPRESSION?=     0

на
    NETGRAPH_MPPC_COMPRESSION?=     1

1.2.4. Перейти в директорию /usr/src и запустить компиляцию ядра
# make kernel KERNCONF=YOUR-KERNEL

1.2.5. После успешной компиляции и установки перезагрузить систему
# shutdown -r now

2. Установка Samba 3 (на момент установки версия: samba-3.0.26a_1,1).
2.2. Создаем отдельную клетку и устанавливаем туда Samba 3 из портов.
2.3. Конфигурационный файл smb.conf
[global]
dos charset = cp866
unix charset = koi8-r
display charset = koi8-r
workgroup = CMYK
server string = Samba Server
interfaces = SELF-INTERFACE-IP/24
bind interfaces only = Yes
security = DOMAIN
auth methods = winbind
password server = PDC-SERVER-NAME
log file = /var/log/samba/log.%m
max log size = 50000
load printers = No
show add printer wizard = No
dns proxy = No
wins proxy = Yes
wins server = PDC-SERVER-IP
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = Yes
winbind enum groups = Yes
winbind use default domain = Yes
winbind refresh tickets = Yes
hosts allow = 192.168.0.
case sensitive = No
hide unreadable = Yes

2.4. Редактируем файл /etc/nsswitch.conf
passwd: files winbind
group: files winbind

2.5. Вводим samba в домен.
# net rpc join -S PDC-SERVER-NAME -I PDC-SERVER-IP -U Administrator%password

2.6. В файл /etc/rc.conf добавляем: winbindd_enable="YES"

3. Устанавливаем freeradius из портов (версия: freeradius-1.1.7_2).
3.1. Настраиваем freeradius. В /usr/local/etc/raddb редактируем конфиги:
3.1.1. 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
confdir = ${raddbdir}
run_dir = ${localstatedir}/run/radiusd
log_file = ${logdir}/radius.log
libdir = ${exec_prefix}/lib
pidfile = ${run_dir}/radiusd.pid
# user = nobody
# group = nobody
max_request_time = 30
delete_blocked_requests = no
cleanup_delay = 5
max_requests = 1024

listen {
ipaddr = SELF-INTERFACE-IP
port = 0
type = auth
}

hostname_lookups = no
allow_core_dumps = no
regular_expressions = yes
extended_expressions = yes
log_stripped_names = no
log_auth = yes
log_auth_badpass = yes
log_auth_goodpass = yes
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_requests = no
$INCLUDE ${confdir}/clients.conf
snmp = no
$INCLUDE ${confdir}/snmp.conf

thread pool {
start_servers = 5
max_servers = 32
min_spare_servers = 3
max_spare_servers = 10
max_requests_per_server = 0
}

modules {
pap {
encryption_scheme = crypt
}

chap {
authtype = CHAP
}

pam {
pam_auth = radiusd
}

unix {
cache = no
cache_reload = 600
radwtmp = ${logdir}/radwtmp
}

$INCLUDE ${confdir}/eap.conf

mschap {
authtype = MS-CHAP
use_mppe = yes
require_encryption = yes
require_strong = yes
with_ntdomain_hack = yes
# Так как требовалось предоставлять доступ
# только отдельным пользователям домена, я
# создал группу "Remote Access Users" и ука-
# зал SID созданной группы в параметре
# --require-membership-of=SID-or-Name
ntlm_auth = "/usr/local/bin/ntlm_auth --require-membership-of=S-1-5-21-952150225-1155300134-1448941184-21001 --request-nt-key --username=%{Stripped-User-Name:-%{User-Name:-None}} --challenge=%{mschap:Challenge:-00} --nt-response=%{mschap:NT-Response:-00}"
}

preprocess {
huntgroups = ${confdir}/huntgroups
hints = ${confdir}/hints
with_ascend_hack = no
ascend_channels_per_line = 23
with_ntdomain_hack = no
with_specialix_jetstream_hack = no
with_cisco_vsa_hack = no
}

files {
usersfile = ${confdir}/users
acctusersfile = ${confdir}/acct_users
preproxy_usersfile = ${confdir}/preproxy_users
compat = no
}

detail {
detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d
detailperm = 0600
}

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
}

detail post_proxy_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/post-proxy-detail-%Y%m%d
detailperm = 0600
}

acct_unique {
key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port"
}

# $INCLUDE ${confdir}/sql.conf

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 = "no"
}

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
}

always fail {
rcode = fail
}

always reject {
rcode = reject
}

always ok {
rcode = ok
simulcount = 0
mpp = no
}

expr {
}

digest {
}

exec {
wait = yes
input_pairs = request
}

ippool main_pool {
# указанные ниже параметры фиктивны, т.к. выдаваемые
# IP адреса прописаны в настройках mpd4
range-start = 192.168.1.230
range-stop = 192.168.1.250
netmask = 255.255.255.0

cache-size = 800
session-db = ${raddbdir}/db.ippool
ip-index = ${raddbdir}/db.ipindex
override = no
maximum-timeout = 0
}
}

instantiate {
}

authorize {
preprocess
auth_log
attr_filter
mschap
eap
}

authenticate {
Auth-Type PAP {
pap
}

Auth-Type CHAP {
chap
}

Auth-Type MS-CHAP {
mschap
}
pam
eap
}

preacct {
preprocess
acct_unique
files
}

accounting {
detail
main_pool
}

session {
radutmp
}

post-auth {
main_pool
reply_log
}

pre-proxy {
}

post-proxy {
eap
}

3.1.2. clients.conf
client SELF-INTERFACE-IP {
secret = password-change-me
shortname = localhost
nastype = other
}

3.1.3. users
# Добавить в конец файла
DEFAULT Auth-Type := MS-CHAP
Service-Type = Framed-User,
Framed-Protocol = PPP,
Framed-IP-Address = 192.168.0.161+,
Framed-IP-Netmask = 255.255.255.255

3.1.4. acct_users
DEFAULT
Service-Type == Framed-User,
Service-Type == Login-User,
Login-Service == Telnet,
Login-Service == Rlogin,
Login-Service == TCP-Clear,
Login-TCP-Port <= 65536,
Framed-IP-Address == 255.255.255.254,
Framed-IP-Netmask == 255.255.255.255,
Framed-Protocol == PPP,
Framed-Protocol == SLIP,
Framed-Compression == Van-Jacobson-TCP-IP,
Framed-MTU >= 576,
Framed-Filter-ID =* ANY,
Reply-Message =* ANY,
Proxy-State =* ANY,
Session-Timeout <= 28800,
Idle-Timeout <= 600,
Port-Limit <= 2

3.1.5. naslist
localhost               local           portslave
SELF-INTERFACE-IP local portslave

Остальные файлы остаются без изменений.

3.2. В /etc/rc.conf прописать
radiusd_enable="YES"

4. Настройка mpd4 (версия: mpd-4.4)
4.1. В основной системе из портов устанавливаем mpd4.
4.2. Правим mpd.conf
default:
load pptp0
load pptp1
load pptp2

pptp0:
new -i ng0 pptp0 pptp0
set ipcp ranges GW-IP-ADDR/32 NG0-IP-ADDR/32
load pptp_standart

pptp1:
new -i ng1 pptp1 pptp1
set ipcp ranges GW-IP-ADDR/32 NG1-IP-ADDR/32
load pptp_standart

pptp2:
new -i ng2 pptp2 pptp2
set ipcp ranges GW-IP-ADDR/32 NG2-IP-ADDR/32
load pptp_standart

pptp_standart:
set iface disable on-demand
set bundle enable multilink
set bundle yes crypt-reqd
set bundle enable compression
set link yes acfcomp protocomp
set link no pap chap
set link enable chap
set link keep-alive 60 180
set ipcp yes vjcomp
set ipcp dns DNS-IP
set ipcp nbns PDC-SERVER-IP
set iface enable proxy-arp
set ccp yes mppc
set ccp yes mpp-e40
set ccp yes mpp-e56
set ccp yes mpp-e128
set ccp yes mpp-stateless
set ccp yes mppe-policy
set pptp self 0.0.0.0
set pptp enable incoming
set pptp disable originate
set pptp enable always-ack
set pptp disable windowing

set iface mtu 1460
set link mtu 1460

set radius server FREERADIUS-JAIL-IP password-change-me 1812 1813
set radius timeout 10
set radius retries 3
set auth enable radius-auth

4.3. mpd.links
pptp0:
set link type pptp
pptp1:
set link type pptp
pptp2:
set link type pptp

4.4. Создаем пустой файл mpd.secret
# touch mpd.secret

4.5. В /etc/rc.conf основной системы вписываем
mpd_enable="YES"

5. Проверка работы.
5.1. Запускаем в клетке:
# /usr/local/etc/rc.d/samba start
# /usr/local/etc/rc.d/radiusd start
5.2. Запускаем mpd4 в основной системе:
# /usr/local/etc/rc.d/mpd4 start

5.3. Пробуем соединиться с впн-сервером.
5.4. Для выявления проблем с mpd4 требуется запустить mpd4 без параметров
# mpd4

5.5. freeradius ведет лог в файле /var/log/radius.log. Так же его можно запустить с отладочном режиме
# radiusd -A -X


6. С виндовых клиентов (с Windows XP например), после соединения с сервером VPN, можно шариться в рабочих компьютерах домена. Для этого требуется назначить домен рабочей группой компьютера и указать его на форме соединения как домен входа.

1 комментарий:

rubo комментирует...

Воспользуюсь твоим блогом, как записной книжкой, ничего?
Чтобы mpd писал логи добавим
в /etc/rc.conf:
mpd_flags="-s mpd -b"

и в /etc/syslog.conf:
!mpd
*.* /var/log/mpd.log