Создание безопасной WiFi точки доступа, с помощью OpenBSD и OpenVPN

Discussion in 'Беспроводные технологии/Wi-Fi/Wardriving' started by ak[id], 11 Sep 2007.

  1. ak[id]

    ak[id] Elder - Старейшина

    Joined:
    22 Jun 2007
    Messages:
    143
    Likes Received:
    95
    Reputations:
    10
    Вы знаете, насколько беззащитны беспроводные сети стандартов 802.11x. В этой статье мы создадим безопасную точку доступа на базе OpenBSD, что позволит предотвратить несанкционированный доступ и шифровать трафик используя VPN туннель. OpenBSD - одна из самых безопасных операционных систем, она удобна и включает почти все, в чем вы нуждаетесь для реализации задуманного в поставке по умолчанию.

    Если Вы плохо знакомы с OpenBSD, то советую вам посмотреть обзор 3.8 и сайт проекта. Тоже самое относится к OpenVPN, также рекомендуюю просмотреть нашу прошлую статью.

    OpenBSD поддерживает широкий диапазон аппаратных платформ и для реализации этого проекта совсем не обязательно мощной машины - мне хватает 166MHz Pentium, также все хорошо работать на одноплатных компьютерах Soekris и PC Engines WRAP. Однако, если предполагается одновременная работа большого числа клиентов, то придется озаботиться установкой более мощного центрального процессора или платы crypto-акселератора, подобно используемой в Soekris.

    Для создания беспроводной сети можно использовать беспроводной адаптер из числа поддерживаемых OpenBSD или, я рекомендую, использовать аппаратную точку доступа, связанную с сервером кроссоверным кабелем. Если вы выбрали аппаратную точку доступа, то учтите, что большинство из них предоставляют незащищенный доступ к интерфейсу управления.

    Для конфигурирования беспроводного адаптера в OpenBSD просто создайте файл /etc/hostname.ral0 (замените ral0 на ваше устройство).

    # /etc/hostname.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
    Если вы никогда не устанавливали OpenBSD, то советуем прочитать 4 главу превосходного FAQ. Для нашей установки требуется минимальная инсталляция 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 в файлах конфигурации на имена интерфейсов вашей системы.

    Теперь мы приступаем к конфигурированию нашего пакетного фильтра, /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 persist
    # authpf table
    table persist

    # 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 flush 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 }

    # End of /etc/pf.conf
    Активируем пакетный фильтр командой:

    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
    Для того, чтобы создать пустой файл,необхо authpf, затем создаем /etc/authpf/authpf.rules:

    # /etc/authpf/authpf.rules: firewall rules for authenticated hosts.
    # 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 [email protected].*
    Если все работает должным образом, то соединившись с вашей точкой доступа с беспроводного клиента, использующего 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 следующего содержания:

    # /etc/openvpn/server.conf: OpenVPN server configuration

    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

    # End of /etc/openvpn/server.conf
    Теперь необходимо создать пользователя и группу _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:

    # /etc/openvpn/client1.conf: OpenVPN client configuration

    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

    # End of /etc/openvpn/client1.conf
    Снова, проверьте /var/log/messages, чтобы удостовериться, что все - OK. Попробуйте выполнить команду

    openvpn --config /etc/openvpn/client1.conf
    для того, чтобы соединиться с сервером. Воспользуйтесь утилитой ping для проверки работоспособности соединения.

    Необходимо убедиться в том, что весь беспроводной трафик шифруется, для этого воспользуемся утилитой tcpdump:

    # tcpdump -env -ttt -i ral0
    tcpdump: listening on ral0, link-type EN10MB
    Nov 15 21:01:28.865218 0:11:6b:34:91:59 0:e:35:e3:ff:51 0800 223: \
    192.168.2.254.1194 > 192.168.2.1.32875: udp 181 (ttl 64, id 20205, len 209)

    # tcpdump -env -ttt -i tun0
    tcpdump: WARNING: tun0: no IPv4 address assigned
    tcpdump: listening on tun0, link-type EN10MB
    Nov 15 21:05:46.569068 be:88:12:eb:0:4b 0:80:48:1d:e:28 0800 98: \
    192.168.1.100 > 192.168.1.254: icmp: echo request (id:0926 seq:1) (DF) (ttl 64, id 0, len 84)
    Nov 15 21:05:46.569375 0:80:48:1d:e:28 be:88:12:eb:0:4b 0800 98: \
    192.168.1.254 > 192.168.1.100: icmp: echo reply (id:0926 seq:1) (DF) (ttl 255, id 44123, len 84)
    Если клиентская машина работает под управлением OpenBSD, замените "dev tap" на "dev tun0 dev-type tap" в /etc/openvpn/client1.conf. Настройка Windows клиента аналогична настройке клиента Linux, но я рекомендую почитать соответствующий раздел OpenVPN HOWTO.

    ---------------------------------
    источник: newsforge.com
     
    #1 ak[id], 11 Sep 2007
    Last edited: 11 Sep 2007
    2 people like this.