cоздание безопасной точки доступа беспроводной сети с помощью OpenBSD и OpenVPN
Вы знаете, насколько беззащитны беспроводные сети стандартов 802.11x. В этой статье мы создадим безопасную точку доступа на базе OpenBSD, что позволит предотвратить несанкционированный доступ и шифровать трафик используя VPN-туннель.
OpenBSD - одна из самых безопасных операционных систем, она удобна и включает почти все, в чем вы нуждаетесь для реализации задуманного, в поставке по умолчанию.
OpenBSD поддерживает широкий диапазон аппаратных платформ и для реализации этого проекта совсем не обязательно наличие мощной машины - мне хватает 166MHz Pentium, также все хорошо работает на одноплатных компьютерах Soekris и PC Engines WRAP. Однако, если предполагается одновременная работа большого числа клиентов, то придется озаботиться установкой более мощного центрального процессора или платы
криптоакселератора, подобно используемой в Soekris.
Для создания беспроводной сети можно использовать беспроводной адаптер из числа поддерживаемых OpenBSD, но я рекомендую использовать аппаратную точку доступа, связанную с сервером кроссоверным кабелем. Если вы выбрали аппаратную точку доступа, то учтите, что большинство из них предоставляют незащищенный доступ к интерфейсу управления.
Для конфигурирования беспроводного адаптера в OpenBSD просто создайте файл /etc/hostname.ral0 (замените ral0 на ваше устройство).
Содержимое файла:
inet 192.168.2.254 255.255.255.0 NONE media autoselect mediaopt hostap mode 11g nwid my_secure_wlan chan 11
Затем выполните с правами пользователя root следующую команду:
sh /etc/netstart ral0
Для нашей установки требуется минимальная инсталляция bsd: base38.tgz и etc38.tgz будет вполне достаточно, но не стесняйтесь устанавливать что- нибудь еще, если оно вам нужно.
Для нашего VPN мы могли использовать реализацию OpenBSD IPsec (включенную в основную систему), но мы будем использовать OpenVPN, так как эта схема легко реализуется и на сервере, и на большом числе клиентских ОС, таких как *BSD, Linux, Windows и Mac OS X. Программное обеспечение уже включено в порты OpenBSD, поэтому берем прекомпилированный пакет и устанавливаем его.
аутентификация и конфигурация пакетного фильтра
Для аутентификации беспроводных клиентов, соединяющихся с нашей точкой доступа, мы будем использовать OpenSSH и пакетный фильтр OpenBSD, pf(4), объединенный с authpf(8). Добавим в файл /etc/ssh/sshd_config конфигурации демона SSH следущие строки:
Protocol 2
ClientAliveInterval 15
ClientAliveCountMax 3
PermitRootLogin no
StrictModes yes
MaxAuthTries 6
AllowUsers YOUR_USERNAMES_SPACE_SEPARATED
Прежде чем прописать запуск sshd при начальной загрузке, убедитесь, что в файле /etc/rc.conf.local существует строка "sshd_flags =". При необходимости запустите sshd с правами пользователя root.
Наш сервер точки доступа имеет три интерфейса: ext_if, подключенный к Internet (например к ADSL-модему), int_if, соединенный с локальной сетью, и wlan_if - беспроводный интерфейс. Также есть виртуальный интерфейс tun0, необходимый для работы VPN. Удостоверьтесь, что вы заменили rl0, pppoe0 и ral0 в файлах конфигурации на имена интерфейсов вашей системы.
Рис. 1. Схема сети.
Теперь мы приступаем к конфигурированию нашего пакетного фильтра, /etc/pf.conf. В нашей установке мы разрешаем беспроводной трафик, VPN и loopback, ограничивая доступ по SSH. Так же у нас работает NAT на внешнем интерфейсе.
# /etc/pf.conf: pf configuration file.
# macros
ext_if = "pppoe0"
int_if = "rl0"
wlan_if = "ral0"
vpn_if = "tun0"
tcp_flags = "flags S/SA keep state"
# abusers table
tablepersist
# authpf table
tablepersist
# traffic normalization
scrub in all
# nat
nat on $ext_if from !($ext_if) ->($ext_if:0)
# authpf
nat-anchor "authpf/*"
rdr-anchor "authpf/*"
binat-anchor "authpf/*"
anchor "authpf/*"
# block everything by default
block log all
# block everything from abusers table
block log quick from
# allow outgoing packets to the internet
pass out on $ext_if proto tcp all flags S/SA modulate state
pass out on $ext_if proto { udp, icmp } all keep state
# wireless interface (allow limited ssh to avoid brute-force attacks)
pass in quick on $wlan_if proto tcp to ($wlan_if) port ssh $tcp_flags (max-src-conn 10, max-src-conn-rate 15/5, overloadflush global) # allow everything from wired lan, vpn and loopback
pass quick on { lo, $int_if, $vpn_if }
# antispoof protection for all interfaces
antispoof quick for { lo, $int_if, $wlan_if, $vpn_if }
Активируем пакетный фильтр командой
pfctl -e -f /etc/pf.conf
Для запуска фильтра на этапе начальной загрузки необходимо добавить следущие строки в файл /etc/rc.conf.local:
pf=YES
pf_rules=/etc/pf.conf
Для получения дополнительной информации по pf, обратитесь к страницам руководства man pf(4), pf.conf(5) и pfctl(4), PF User Guide и Firewalling with OpenBSD's PF packet filter, включающее в себя руководство по authpf.
Выполните команду
touch /etc/authpf/authpf.conf
для того, чтобы создать пустой файл, затем создаем /etc/authpf/authpf.rules:
# macros
wlan_if = ral0
# allow authenticated hosts to connect to openvpn daemon
pass in quick on $wlan_if proto udp from $user_ip to ($wlan_if) port 1194 keep state
# End of /etc/authpf/authpf.rules
Чтобы добавить класс входа в систему для authpf, добавьте эти строки в /etc/login.conf:
authpf:\
:shell=/usr/sbin/authpf:\
:tc=default:
Также необходимо добавить строку "/usr/sbin/authpf" в файл /etc/shells. Для получения дополнительной информации обратитесь к страницам руководства login.conf(5) и chpass(1).
Теперь необходимо создать пользователей командой adduser, удостоверясь, что вы установили authpf в качестве оболочки и класс входа в систему. Также необходимо добавить имя пользователя в строку AllowUsers файла /etc/ssh/sshd_config. Если вы разрешили SSH-подключения из Internet, то добавьте их в формате USER@WIRELESS_SUBNET:
AllowUsers roadwarrior@192.168.2.*
Если все работает должным образом, то соединившись с вашей точкой доступа с беспроводного клиента, использующего OpenSSH или PuTTY, вы получите доступ к OpenVPN, который мы сейчас настроим.
конфигурация VPN
Прежде, чем вы начнете, рекомендую прочесть OpenVPN HOWTO. Мы будем использовать OpenVPN в bridged mode, соединяя беспроводной интерфейс с VPN таким образом, чтобы для таких сервисов, как Samba или CUPS, шифрование трафика проходило незаметно.
После установки OpenVPN из портов или пакетов OpenBSD, необходимо создать сертификаты для сервера и клиентов. Выполните следующие команды с правами пользователя root:
# mkdir -p /etc/openvpn/keys
# cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn
# chown -R root:wheel /etc/openvpn
# chmod 700 /etc/openvpn/keys
# cd /etc/openvpn/easy-rsa
# . ./vars
# ./clean-all
# ./build-ca
# ./build-key-server server
# ./build-key client1
# ./build-key client2 etc.
# ./build-dh
# /usr/local/sbin/openvpn --genkey --secret ta.key
# cd keys
# mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys
# chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}
# chmod 600 /etc/openvpn/keys/{server.key,ta.key}
Распространите среди клиентов на безопасных носителях файлы ca.crt, clientXX.crt, clientXX.key и ta.key.
Создайте файл /etc/openvpn/server.conf следующего содержания:
daemon openvpn
writepid /var/openvpn/pid
status /var/openvpn/status 10
local 192.168.2.254 # change to your wlan if's IP
port 1194
proto udp
dev tun0
dev-type tap
client-to-client
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
server-bridge 192.168.1.254 255.255.255.0 192.168.1.100 192.168.1.120 # change to your setup
ifconfig-pool-persist /var/openvpn/ipp.txt
push "redirect-gateway local def1"
keepalive 10 120
tls-auth /etc/openvpn/keys/ta.key 0
cipher BF-CBC # Blowfish (default)
max-clients 5
user _openvpn
group _openvpn
persist-key
persist-tun
verb 3
mute 20
chroot /var/empty
Теперь необходимо создать пользователя и группу _openvpn (с этими правами будет запускаться демон), каталог /var/openvpn и интерфейс tun0, служащий мостом между ним и беспроводной сетью.
# groupadd -g 500 _openvpn
# useradd -u 500 -g 500 -c 'OpenVPN Server' -s /sbin/nologin -d /var/openvpn -m _openvpn
# echo 'link0 up' >/etc/hostname.tun0
# echo -e 'add rl0\nadd tun0\nup' >/etc/bridgename.bridge0
# sh /etc/netstart tun0
# sh /etc/netstart bridge0
Запустите OpenVPN командой
/usr/local/sbin/openvpn --config /etc/openvpn/server.conf
и добавьте следующие строки в /etc/rc.local:
if [ -x /usr/local/sbin/openvpn ]; then
/usr/local/sbin/openvpn --config /etc/openvpn/server.conf
fi
Проверьте файл /var/log/daemon на наличие ошибок. Их быть не должно! :-)
настройка клиента
Теперь сконфигурируем нашего первого клиента (на базе Linux).
Необходимо создать каталог /etc/openvpn/keys, установить права пользователя и группы для OpenVPN, скопировать туда сгенерированные ключи и создать /etc/openvpn/client1.conf:
client
dev tap
proto udp
remote 192.168.2.254 1194 # replace with your access point's IP
resolv-retry infinite
nobind
user openvpn
group openvpn
persist-key
persist-tun
mute-replay-warnings
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key
ns-cert-type server
tls-auth /etc/openvpn/keys/ta.key 1
cipher BF-CBC
verb 3
mute 20
chroot /var/empty
Снова проверьте /var/log/messages, чтобы удостовериться, что все OK. Попробуйте выполнить команду
openvpn --config /etc/openvpn/client1.conf
для того, чтобы соединиться с сервером. Воспользуйтесь утилитой ping для проверки работоспособности соединения.
Необходимо убедиться в том, что весь беспроводной трафик шифруется, для этого воспользуемся утилитой tcpdump или любым другим сниффером. Настройка Windows-клиента аналогична настройке клиента Linux, но я рекомендую почитать соответствующий раздел OpenVPN HOWTO.
Удачи!
Перевод Сгибнева Михаила.
OpenBSD - одна из самых безопасных операционных систем, она удобна и включает почти все, в чем вы нуждаетесь для реализации задуманного, в поставке по умолчанию.
OpenBSD поддерживает широкий диапазон аппаратных платформ и для реализации этого проекта совсем не обязательно наличие мощной машины - мне хватает 166MHz Pentium, также все хорошо работает на одноплатных компьютерах Soekris и PC Engines WRAP. Однако, если предполагается одновременная работа большого числа клиентов, то придется озаботиться установкой более мощного центрального процессора или платы
криптоакселератора, подобно используемой в Soekris.
Для создания беспроводной сети можно использовать беспроводной адаптер из числа поддерживаемых OpenBSD, но я рекомендую использовать аппаратную точку доступа, связанную с сервером кроссоверным кабелем. Если вы выбрали аппаратную точку доступа, то учтите, что большинство из них предоставляют незащищенный доступ к интерфейсу управления.
Для конфигурирования беспроводного адаптера в OpenBSD просто создайте файл /etc/hostname.ral0 (замените ral0 на ваше устройство).
Содержимое файла:
inet 192.168.2.254 255.255.255.0 NONE media autoselect mediaopt hostap mode 11g nwid my_secure_wlan chan 11
Затем выполните с правами пользователя root следующую команду:
sh /etc/netstart ral0
Для нашей установки требуется минимальная инсталляция bsd: base38.tgz и etc38.tgz будет вполне достаточно, но не стесняйтесь устанавливать что- нибудь еще, если оно вам нужно.
Для нашего VPN мы могли использовать реализацию OpenBSD IPsec (включенную в основную систему), но мы будем использовать OpenVPN, так как эта схема легко реализуется и на сервере, и на большом числе клиентских ОС, таких как *BSD, Linux, Windows и Mac OS X. Программное обеспечение уже включено в порты OpenBSD, поэтому берем прекомпилированный пакет и устанавливаем его.
аутентификация и конфигурация пакетного фильтра
Для аутентификации беспроводных клиентов, соединяющихся с нашей точкой доступа, мы будем использовать OpenSSH и пакетный фильтр OpenBSD, pf(4), объединенный с authpf(8). Добавим в файл /etc/ssh/sshd_config конфигурации демона SSH следущие строки:
Protocol 2
ClientAliveInterval 15
ClientAliveCountMax 3
PermitRootLogin no
StrictModes yes
MaxAuthTries 6
AllowUsers YOUR_USERNAMES_SPACE_SEPARATED
Прежде чем прописать запуск sshd при начальной загрузке, убедитесь, что в файле /etc/rc.conf.local существует строка "sshd_flags =". При необходимости запустите sshd с правами пользователя root.
Наш сервер точки доступа имеет три интерфейса: ext_if, подключенный к Internet (например к ADSL-модему), int_if, соединенный с локальной сетью, и wlan_if - беспроводный интерфейс. Также есть виртуальный интерфейс tun0, необходимый для работы VPN. Удостоверьтесь, что вы заменили rl0, pppoe0 и ral0 в файлах конфигурации на имена интерфейсов вашей системы.
Рис. 1. Схема сети.
Теперь мы приступаем к конфигурированию нашего пакетного фильтра, /etc/pf.conf. В нашей установке мы разрешаем беспроводной трафик, VPN и loopback, ограничивая доступ по SSH. Так же у нас работает NAT на внешнем интерфейсе.
# /etc/pf.conf: pf configuration file.
# macros
ext_if = "pppoe0"
int_if = "rl0"
wlan_if = "ral0"
vpn_if = "tun0"
tcp_flags = "flags S/SA keep state"
# abusers table
table
# authpf table
table
# traffic normalization
scrub in all
# nat
nat on $ext_if from !($ext_if) ->($ext_if:0)
# authpf
nat-anchor "authpf/*"
rdr-anchor "authpf/*"
binat-anchor "authpf/*"
anchor "authpf/*"
# block everything by default
block log all
# block everything from abusers table
block log quick from
# allow outgoing packets to the internet
pass out on $ext_if proto tcp all flags S/SA modulate state
pass out on $ext_if proto { udp, icmp } all keep state
# wireless interface (allow limited ssh to avoid brute-force attacks)
pass in quick on $wlan_if proto tcp to ($wlan_if) port ssh $tcp_flags (max-src-conn 10, max-src-conn-rate 15/5, overload
pass quick on { lo, $int_if, $vpn_if }
# antispoof protection for all interfaces
antispoof quick for { lo, $int_if, $wlan_if, $vpn_if }
Активируем пакетный фильтр командой
pfctl -e -f /etc/pf.conf
Для запуска фильтра на этапе начальной загрузки необходимо добавить следущие строки в файл /etc/rc.conf.local:
pf=YES
pf_rules=/etc/pf.conf
Для получения дополнительной информации по pf, обратитесь к страницам руководства man pf(4), pf.conf(5) и pfctl(4), PF User Guide и Firewalling with OpenBSD's PF packet filter, включающее в себя руководство по authpf.
Выполните команду
touch /etc/authpf/authpf.conf
для того, чтобы создать пустой файл, затем создаем /etc/authpf/authpf.rules:
# macros
wlan_if = ral0
# allow authenticated hosts to connect to openvpn daemon
pass in quick on $wlan_if proto udp from $user_ip to ($wlan_if) port 1194 keep state
# End of /etc/authpf/authpf.rules
Чтобы добавить класс входа в систему для authpf, добавьте эти строки в /etc/login.conf:
authpf:\
:shell=/usr/sbin/authpf:\
:tc=default:
Также необходимо добавить строку "/usr/sbin/authpf" в файл /etc/shells. Для получения дополнительной информации обратитесь к страницам руководства login.conf(5) и chpass(1).
Теперь необходимо создать пользователей командой adduser, удостоверясь, что вы установили authpf в качестве оболочки и класс входа в систему. Также необходимо добавить имя пользователя в строку AllowUsers файла /etc/ssh/sshd_config. Если вы разрешили SSH-подключения из Internet, то добавьте их в формате USER@WIRELESS_SUBNET:
AllowUsers roadwarrior@192.168.2.*
Если все работает должным образом, то соединившись с вашей точкой доступа с беспроводного клиента, использующего OpenSSH или PuTTY, вы получите доступ к OpenVPN, который мы сейчас настроим.
конфигурация VPN
Прежде, чем вы начнете, рекомендую прочесть OpenVPN HOWTO. Мы будем использовать OpenVPN в bridged mode, соединяя беспроводной интерфейс с VPN таким образом, чтобы для таких сервисов, как Samba или CUPS, шифрование трафика проходило незаметно.
После установки OpenVPN из портов или пакетов OpenBSD, необходимо создать сертификаты для сервера и клиентов. Выполните следующие команды с правами пользователя root:
# mkdir -p /etc/openvpn/keys
# cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn
# chown -R root:wheel /etc/openvpn
# chmod 700 /etc/openvpn/keys
# cd /etc/openvpn/easy-rsa
# . ./vars
# ./clean-all
# ./build-ca
# ./build-key-server server
# ./build-key client1
# ./build-key client2 etc.
# ./build-dh
# /usr/local/sbin/openvpn --genkey --secret ta.key
# cd keys
# mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys
# chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}
# chmod 600 /etc/openvpn/keys/{server.key,ta.key}
Распространите среди клиентов на безопасных носителях файлы ca.crt, clientXX.crt, clientXX.key и ta.key.
Создайте файл /etc/openvpn/server.conf следующего содержания:
daemon openvpn
writepid /var/openvpn/pid
status /var/openvpn/status 10
local 192.168.2.254 # change to your wlan if's IP
port 1194
proto udp
dev tun0
dev-type tap
client-to-client
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
server-bridge 192.168.1.254 255.255.255.0 192.168.1.100 192.168.1.120 # change to your setup
ifconfig-pool-persist /var/openvpn/ipp.txt
push "redirect-gateway local def1"
keepalive 10 120
tls-auth /etc/openvpn/keys/ta.key 0
cipher BF-CBC # Blowfish (default)
max-clients 5
user _openvpn
group _openvpn
persist-key
persist-tun
verb 3
mute 20
chroot /var/empty
Теперь необходимо создать пользователя и группу _openvpn (с этими правами будет запускаться демон), каталог /var/openvpn и интерфейс tun0, служащий мостом между ним и беспроводной сетью.
# groupadd -g 500 _openvpn
# useradd -u 500 -g 500 -c 'OpenVPN Server' -s /sbin/nologin -d /var/openvpn -m _openvpn
# echo 'link0 up' >/etc/hostname.tun0
# echo -e 'add rl0\nadd tun0\nup' >/etc/bridgename.bridge0
# sh /etc/netstart tun0
# sh /etc/netstart bridge0
Запустите OpenVPN командой
/usr/local/sbin/openvpn --config /etc/openvpn/server.conf
и добавьте следующие строки в /etc/rc.local:
if [ -x /usr/local/sbin/openvpn ]; then
/usr/local/sbin/openvpn --config /etc/openvpn/server.conf
fi
Проверьте файл /var/log/daemon на наличие ошибок. Их быть не должно! :-)
настройка клиента
Теперь сконфигурируем нашего первого клиента (на базе Linux).
Необходимо создать каталог /etc/openvpn/keys, установить права пользователя и группы для OpenVPN, скопировать туда сгенерированные ключи и создать /etc/openvpn/client1.conf:
client
dev tap
proto udp
remote 192.168.2.254 1194 # replace with your access point's IP
resolv-retry infinite
nobind
user openvpn
group openvpn
persist-key
persist-tun
mute-replay-warnings
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key
ns-cert-type server
tls-auth /etc/openvpn/keys/ta.key 1
cipher BF-CBC
verb 3
mute 20
chroot /var/empty
Снова проверьте /var/log/messages, чтобы удостовериться, что все OK. Попробуйте выполнить команду
openvpn --config /etc/openvpn/client1.conf
для того, чтобы соединиться с сервером. Воспользуйтесь утилитой ping для проверки работоспособности соединения.
Необходимо убедиться в том, что весь беспроводной трафик шифруется, для этого воспользуемся утилитой tcpdump или любым другим сниффером. Настройка Windows-клиента аналогична настройке клиента Linux, но я рекомендую почитать соответствующий раздел OpenVPN HOWTO.
Удачи!
Перевод Сгибнева Михаила.
Сетевые решения. Статья была опубликована в номере 12 за 2005 год в рубрике sysadmin