Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #103, ИЮЛЬ 2007 г.

Виртуальная сеть для Windows-клиента

Сергей «grinder» Яремчук

Хакер, номер #103, стр. 130

(grinder@ua.fm)

Настраиваем серверы PPTP и RADIUS на базе Linux и FreeBSD

Сегодня перед системными администраторами все острее встает проблема обеспечения мобильных и удаленных пользователей полноценным и защищенным доступом к корпоративной сети. Благодаря встроенной поддержке туннельного протокола «точка-точка» в операционных системах Windows, одним из самых популярных решений является построение защищенных туннелей на основе PPTP. Настройкой такого сервера мы сегодня и займемся.

Протокол PPTP

Протокол PPTP (Point-to-Point Tunneling Protocol) позволяет создавать защищенные каналы для обмена данными по различным сетевым протоколам: IP, IPX или NetBEUI. Их данные инкапсулируются с помощью протокола PPTP в пакеты протокола IP, с помощью которого переносятся в зашифрованном виде через любую сеть TCP/IP. PPTP работает, устанавливая обычную PPP-сессию с противоположной стороной с помощью протокола туннелирования сетевых пакетов GRE (Generic Routing Encapsulation - общая инкапсуляция маршрутов). Для шифрования трафика применяется протокол MPPE (Microsoft Point-to-Point Encryption), использующий потоковый шифр RSA, RC4-ключи которого меняются в течение сессии.

Cisco первой реализовала PPTP в своих продуктах, она и лицензировала эту технологию корпорации Microsoft. Из-за опасений по поводу патентных претензий протокола MPPE до недавнего времени в дистрибутивах Linux отсутствовала полноценная поддержка PPTP. Однако, начиная с версии 2.6.13, появилась полная поддержка PPTP.

Но не все так гладко. Несмотря на популярность, специалисты недолюбливают PPTP по причине слабых алгоритмов парольной аутентификации и возможности получения сессионных ключей на основе пользовательского пароля. Об этом можно почитать на сайте Брюса Шнаера (Bruce Schneier): www.schneier.com. Этот специалист занимается анализом реализации PPTP с 1998 года.

Если бы не встроенная поддержка в Windows, о PPTP, вероятно, уже давно бы все забыли. Хотя, с другой стороны, в Windows XP и более поздних версиях Windows присутствует возможность заменить пароли пользовательскими сертификатами, для этого с PPTP применяется протокол Extensible Authentication Protocol-Transport Layer Security (EAP-TLS).

Установка сервера PoPToP в Linux

Одной из популярных реализаций PPTP является сервер PoPToP (www.poptop.org). Изначально он написан для Linux, но без проблем работает в Solaris 2.6, OpenBSD, FreeBSD и других. Это первый проект, предоставивший возможность строить PPTP-серверы в Linux. Он стартовал под руководством Matthew Ramsay и контролировался Moreton Bay Ventures (www.moretonbay.com). В марте 1999 года PoPToP был опубликован под лицензией GNU. Он совместим со всеми версиями Windows и никсовым PPTP-клиентом (pptpclient.sf.net). Поддерживает аутентификацию MSCHAPv2 и шифрование MPPE 40 с 128-битным RC4. При использовании RADIUS легко интегрируется в сети Windows.

После включения поддержки PPTP в ядро, установка PoPToP очень упростилась. Она заключается в распаковке полученного архива и стандартных:

$ ./configure -–prefix=/usr

$ make

$ sudo make install

Если нужна поддержка TCP wrappers, следует добавить ключ '--with-libwrap' (man tcpd(5)). Также стоит поискать пакеты в репозитарии. В дистрибутивах, использующих apt, как, например, в Ubuntu, вводим:

$ sudo apt-cache search pptp

$ sudo apt-get install pptpd

Все, установка закончена, можно переходить к настройке.

Конфигурационные файлы PoPToP

По умолчанию сервер PoPToP использует конфигурационный файл /etc/pptpd.conf. Если установка производилась из исходных текстов, готовый шаблон лежит в подкаталоге samples архива с исходными текстами. Можно, конечно, все параметры задавать в командной строке, но это неудобно. Редактируем:

$ sudo vi /etc/pptpd.conf

# По умолчанию клиентские соединения будут ожидаться на всех интерфейсах; можно указать конкретный адрес для PPTP-соединений

# listen 217.165.34.2

# Путь к исполняемому файлу pppd

# ppp /usr/sbin/pppd

# Путь к файлу с параметрами PPP

option /etc/ppp/pptpd-options

# Включает отладочный вывод в syslog

# debug

# Задержка перед открытием соединения (по умолчанию 10 секунд); параметр предназначен для защиты от DoS-атак

# stimeout 10

# Сняв комментарий, мы запретим передачу клиенту его IP-адреса

# noipparam

# Использование wtmp(5) для записи о подключениях клиентов

logwtmp

# Включение перенаправления broadcast-пакетов, требует конфигурирования с параметром '--enable-bcrelay'

# bcrelay eth0

# Ограничения скорости клиентов (бит/сек)

# speed 115200

# Внутренний IP-адрес

localip 192.168.2.1

# Клиентские IP-адреса. При описании не должно быть пробелов, можно указывать диапазон адресов или отдельный адрес

remoteip 192.168.2.100-150,192.168.2.200-245

Простейшее правило для iptables выглядит так:

$ sudo iptables --append INPUT --protocol 47 --jump ACCEPT

$ sudo iptables --append INPUT --protocol tcp --match tcp --destination-port 1723 --jump ACCEPT

Теперь редактируем файл pptpd-options:

$ sudo vi /etc/ppp/pptpd-options

# Имя (должно соответствовать второму полю в /etc/ppp/chap-secrets)

name pptpd

# Удаление домена из имени пользователя

chapms-strip-domain

# Авторизация

refuse-pap

refuse-chap

refuse-mschap

require-mschap-v2

require-mppe-128

# Если pppd является основным сервером для Windows-клиентов, то клиентам можно задать адреса DNS- и WINS-серверов

# ms-dns 10.0.0.1

# ms-wins 10.0.0.2

# Добавляем IP- и MAC-адреса клиента в таблицу ARP. Таким образом, клиент как бы находится в локальной сети и может подключаться к ее ресурсам

proxyarp

# Не изменять маршрут по умолчанию

nodefaultroute

# Выполняем блокировку соединения и отключаем компрессию

lock

nobsdcomp

novj

novjccomp

При таких установках аутентификация пользователя возможна только с помощью средств CHAPv2, поэтому открываем файл /etc/ppp/chap-secrets и добавляем пользователей, которые смогут подключаться по VPN. В простейшем случае в файл заносится логин и пароль:

sergej pptpd password *

На этом настройки закончены, перезапускаем демон:

$ sudo /etc/init.d/pptpd restart

И пробуем подключиться к серверу.

Прикручиваем RADIUS

Для небольших компаний такой настройки PoPToP, вероятно, будет достаточно. Если VPN-пользователей много, следует применять более удобные методы их авторизации. Поэтому, когда PPTP-конфигурация будет должным образом протестирована, можно приступать к настройке RADIUS (Remote Access Dial-Up User Service). Если говорить коротко, то его задача сводится к аутентификации, а также к хранению логинов и паролей пользователей. Сервер RADIUS определяет, может ли пользователь подключаться к запрашиваемому им сервису. При необходимости производится учет времени, трафика и других параметров сессии пользователя. Кроме всего прочего, так мы сможем использовать TLS-EAP. На сегодняшний день наиболее популярным открытым решением является FreeRADIUS, его и будем ставить.

$ sudo apt-get install freeraduis

В файл /etc/ppp/pptpd-options добавляем строку, описывающую плагин:

plugin radius.so

О настройках RADIUS можно рассказывать долго, я остановлюсь лишь на самых необходимых. Все конфигурационные файлы находятся в каталоге /etc/freeradius. Так как клиент у нас один и находится на том же узле, что и сервер, файл clients.conf исправляем следующим образом:

client 127.0.0.1 {

secret = super_PassWOrd

shortname = localhost

nastype = other

}

Файл users содержит конфигурационную информацию о пользователях и другие данные, необходимые для аутентификации. Для проверки работы заведем тестового пользователя:

test Auth-Type:=MS-CHAP, User-Password == "test"

Пользователи, зарегистрированные в /etc/passwd, подключаются тоже просто:

DEFAULT Auth-Type = System

Fall-Through = 1

Теперь редактируем главный файл сервера radiusd.conf (для экономии журнального пространства конфиг дается в сильно сжатом виде, полную версию radiusd.conf ты найдешь на прилагаемом к журналу диске):

# vi radiusd.conf

# Имя пользователя и группа, используемые для запуска FreeRADIUS

user = freerad

group = freerad

# Максимальное количество запросов, хранимых сервером

max_requests = 512

# Слушаем на localhost

bind_address = 127.0.0.1

# Использовать указанный конкретный port, если 0; его значение берется из /etc/services

port = 0

# Не разрешать преобразование адресов

hostname_lookups = no

# Записывать в лог попытки авторизации

log_auth = yes

# Записывать в лог некорректные и корректные пароли при авторизации

log_auth_badpass = yes

log_auth_goodpass = no

# Включить/выключить коллизию пользователей

usercollide = no

# Настройки безопасности для противодействия возможным DoS-атакам

security {

# Максимально допустимое количество атрибутов в RADIUS-пакете

max_attributes = 200

# Задержка (в секундах) перед отправкой пакета Access-Reject

reject_delay = 1

# Не отвечать на запросы Status-Server

status_server = no

}

Сохраняем, пробуем запустить FreeRADIUS в отладочном режиме:

$ sudo freeradius -X

И подключаемся, используя тестовую запись. Если все прошло успешно, схему можно наращивать дальше, подключая LDAP, Active Directory, базу данных. Кроме того, можно интегрировать EAP и прочие приложения, позволяющие сделать работу с учетными записями проще, а соединения безопаснее. Мы же идем дальше.

Установка сервера MPD в FreeBSD

Сервер MPD (Multi-link PPP Daemon, sf.net/projects/mpd) работает только в FreeBSD. В феврале 2007 года вышла новая версия сервера 4.1, которую и рекомендуют использовать разработчики. Поддерживается аутентификации PAP, CHAP, MS-CHAP и EAP, сжатие и шифрование PPP-соединений, имеется поддержка L2TP, NetFlow и NAT, веб-интерфейс и еще много полезного. Установка из коллекции портов стандартна для FreeBSD:

# cd /usr/port/net/mpd

# make install clean

Добавляем запуск MPD при загрузке системы:

# echo `mpd_enable="YES"' >> /etc/rc.conf

Работа MPD настраивается с помощью нескольких файлов. Переходим в каталог /usr/local/etc/mpd и убираем префикс sample.

# cd /usr/local/etc/mpd

# mv mpd.conf.sample mpd.conf

# mv mpd.links.sample mpd.links

# mv mpd.secret.sample mpd.secret

Четвертый файл mpd.script предназначен для настройки модема, мы его трогать не будем. В mpd.conf задается одна или несколько конфигураций, каждая из которых представляет собой последовательность команд mpd. Все строки должны начинаться либо сразу с команды, либо со знака табуляции. Использование пробелов может привести к неправильному считыванию параметров. Открываем файл и приступаем к настройке:

# vi mpd.conf

default:

# Подключаем разделы файла; сколько туннелей, столько и разделов

load client0

load client1

client0:

# Создаем и настраиваем интерфейс

new -i ng0 client0 client0

# Первый адрес сервера, второй - клиента

set ipcp ranges 192.168.2.1/32 10.0.0.0/24

set ipcp dns 192.168.2.3

set ipcp nbns 192.168.2.4 # WINS

# Загружаем раздел client_standart

load client_standart

client1:

new -i ng01 client1 client1

set ipcp ranges 192.168.2.1/32 10.0.1.30/32

load client_standart

client_standard:

# Отключаем режим «по требованию»

set iface disable on-demand

set iface enable proxy-arp

# Устанавливаем тип pptp, описание смотри в mpd.links

set link type pptp

# Позаботимся об MTU

set link mtu 1420

set link mru 1420

set iface enable tcpmssfix

# Шифрование и сжатие

set bundle enable compression

set bundle enable crypt-reqd

set bundle disable multilink

set ccp yes mppc

# set ccp yes mpp-e40

set ccp yes mpp-e128

set ccp yes mpp-stateless

set ccp yes mppe-policy

# Контроль протокола и адреса

set link yes acfcomp protocomp

# Аутентификация

set link no pap chap

# CHAP является синонимом md5-chap ms-chapv1 ms-chapv2, протокол можно указать в явном виде

set link enable chap

set link keep-alive 10 60

# Включение TCP-компрессии

set ipcp yes vjcomp

# Отключаем windowing

set pptp disable windowing

В файл mpd.links заносим:

# vi mpd.links

client0:

set link type pptp

client1:

set link type pptp

pptp:

set link type pptp

# IP-адрес сервера, на котором должен работать FreeBSD

set pptp self 11.22.33.44

# Разрешаем входящие, отключаем исходящие соединения по PPTP

set pptp enable incoming

set pptp disable originate

В файл mpd.secret заносится пара «логин/пароль». Дополнительным аргументом является IP-адрес, с которого может зайти клиент с таким именем:

# vi mpd.secret

sergej "password"

grinder "foobar" 192.168.1.1

vasja "p@sSw0rd" 192.168.1.0/24

Альтернативным вариантом является использование в нужном разделе файла mpd.conf параметров:

set auth authname "VpnLogin"

set auth password "VpnPassword"

Если планируется использовать системную базу пользователей, то в файле mpd.conf можно указать параметр «set auth enable system», а в /etc/login.conf заносим строку «:passwd_format=nth:». Для отслеживания работы MPD с помощью syslog, запишем в файл /etc/syslog.conf следующие строки (не забывая его затем перезапустить):

!mpd

*.* /var/log/mpd.log

Чтобы обратные пакеты доходили до сети VPN, необходимо указать маршрут:

# route add 192.168.2.1/32 10.0.1.30/32

# route add 192.168.2.1/32 10.0.0.0/24

И теперь стартуем MPD:

# mpd -b

Такой командой будут запущены все туннели, прописанные в секции default. Если нужно запустить конкретный туннель, указываем его последним параметром:

# mpd –b client0

Если подключение прошло без проблем, можно добавить FreeRADIUS, настройки которого аналогичны, а чтобы MPD узнал о его использовании, в файл mpd.conf заносим следующие строки:

set auth enable radius-auth

set auth enable radius-acct

set radius enable message-authentic

set radius config /etc/local/etc/mpd4/radius.conf

set radius retries 3

set radius timeout 3

set radius server localhost password123 1812 1813

И в файл radius.conf прописываем:

acct 127.0.0.1 password123

auth 127.0.0.1 password123

На этом основные настройки закончены. Представленные схемы можно развивать практически до любой степени сложности, построив в итоге гибкую в управлении и защищенную систему, обеспечивающую безопасное подключение удаленных пользователей.

INFO

О том, как подключить *nix-клиента к PPTP-серверу, мы планируем рассказать в одном из ближайших выпусков Unixoid'а.

Включение поддержки PPTP в ядре Linux

Если вывод lsmod не показывает наличие строк «ppp*», следует пересобрать ядро. Вводим make menuconfig и включаем для всех ядер:

Networking Support -->

Networking options -->

<M> IP: GRE tunnels over IP

И для 2.6.15+:

Device Drivers --->

Network device support --->

<M> PPP (point-to-point protocol) support

<M> PPP support for async serial ports

<M> PPP support for sync tty ports

<M> PPP Deflate compression

<M> PPP BSD-Compress compression

<M> PPP MPPE compression (encryption)

Cryptographic options --->

[*] Cryptographic API

[*] HMAC support

<M> MD5 digest algorithm

<M> SHA1 digest algorithm

<M> SHA256 digest algorithm

<M> SHA384 and SHA512 digest algorithms

<M> DES and Triple DES EDE cipher algorithms

<M> ARC4 cipher algorithm

Для более ранних версий параметры будут отличаться, но не сильно. Также для таких ядер следует сначала наложить патч, взяв нужную версию с сайта mppe-mppc.alphacron.de. Например, для версии ядра 2.6.11 команда будет выглядеть так:

$ cd /usr/src

$ wget -c http://mppe-mppc.alphacron.de/linux-2.6.11-mppe-mppc-1.3.patch.gz

$ gunzip linux-2.6.11-mppe-mppc-1.3.patch.gz

$ cd linux

$ patch -p1 < ../linux-2.6.11-mppe-mppc-1.3.patch

После конфигурирования компилируем ядро как обычно.

Настройка клиентского соединения в Windows

Настройка PPTP-соединения практически ничем не отличается от подключения к провайдеру. Вызываем «Сетевые подключения», выбираем «Создание нового подключения» и следуем указаниям мастера. Во втором окне отмечаем пункт «Подключить к сети на рабочем месте» и в следующем – «Подключение к виртуальной частной сети», затем вводим название подключения и указываем, необходимо ли набирать номер для предварительного подключения. Если соединение осуществляется напрямую, то выбираем «Не набирать номер для предварительного подключения» и вводим IP-адрес или имя сервера, к которому необходимо подключиться. После нажатия кнопки «Готово» можно пробовать подключиться к серверу, введя логин и пароль. В зависимости от версии и настроек сервера, а также версии клиентской операционной системы, возможно, потребуется уточнить некоторые параметры подключения (протокол, обязательность шифрования, сжатие и другие), для чего необходимо выбрать «Свойства» созданного соединения.

Содержание