вторник, 20 июля 2010 г.

Настройка многопользовательского сервера OpenVPN

Давеча меня тут попросили настроить один. Да еще так чтобы клиентов было много и авторизовались они по пользователю/паролю.
Устанавливать мы его будем на Centos 5.5, потому что это очень популярная система для серверов. Она перебьет по популярности на серверах что угодно, потому что это собранная из исходных кодов RHEL 5 свободная система, полностью совместимая с ним бинарно, и она стабильна, как ископаемые экскременты мамонтов. Поэтому даже openvpn в ее стандартных репозиториях нет. Поэтому вам нужно подключить себе EPEL или RPMForge.
Для нашей конфигурации нужны два пакета:

# yum install openvpn pam-devel

Первый это и есть openvpn, второй позволит работать плагину авторизации openvpn через PAM.
Создадим конфигурационный файл /etc/openvpn/openvpn.conf:

# OpenVPN server configuration file (/etc/openvpn/openvpn.conf) 
port 1194
# Я предпочитаю UDP для OpenVPN, потому что он больше похож на
# IP в надежности доставки и не будет вызывать странные эффекты,
# как это делает tcp. Зато udp не даст пользоваться http-proxy
#  для туннеля OpenVPN, так что думайте сами.
proto udp
dev tun
# Здесь будем хранить список тех, кто подключен
status /tmp/openvpn-status.log
# Подсеть для клиентов
server 192.168.128.0 255.255.255.0
user nobody
group nobody
# А сюда будет писаться лог. Добавьте это в ваш logrotate.
log /var/log/openvpn.log
comp-lzo
# Путь к ключам сервера - их мы будем генерировать чуть позже
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh dh1024.pem
persist-key
persist-tun
keepalive 10 30
# Скажем, чтобы openvpn авторизовался через pam с именем сервиса openvpn
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so openvpn
#END


Теперь для сервиса openvpn в pam нужна хотя-бы какая-то конфигурация. Копирую ее из дефолтной системной, но это можно менять, как захочется.

# cp /etc/pam.d/system-auth-ac /etc/pam.d/openvpn


А вот так можно добавлять пользователей

# useradd -d /dev/null -s /sbin/nologin username

И менять им пароли

# passwd username


Далее нам требуется создать (хотя у кого-то он уже есть) собственный Certificate authority. Для этого можно просто взять готовые скрипты в /usr/share/doc/openvpn/easy-rsa. Их лучше скопировать в другое местечко (каталог целиком), а потом отредактировать несколько файлов. Во-первых, это файлик vars, в котором в конце есть некоторые умолчательные поля для сертификатов, их лучше подменить на что-то более близкое к реальности сразу. Также стоит заметить, что organizationName у всех сертификатов должен быть одинаков, а commonName, напротив, различаться. Все сертификаты клиентов и сервера должны быть подписаны нашим CA.
Итак, начнем.
Перейдем в каталог easy-rsa

# cd /root/easy-rsa

Загрузим конфигурацию easy-rsa

# . vars

Теперь мы готовы. Нам нужен файлик DH, ключ и сертификат CA.

# sh clean-all
# sh build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
(много точек и плюсиков)
# sh build-ca
Generating a 1024 bit RSA private key
writing new private key to 'ca.key'
Country Name (2 letter code) [UA]:
State or Province Name (full name) [DP]:
Locality Name (eg, city) [Dnipropetrovs'k]:
Organization Name (eg, company) [OpenVPN-TEST]:
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:OpenVPN CA
Email Address [admin@example.com]:

Теперь сгенерируем RSA-сертификат для сервера

# sh build-req server
Country Name (2 letter code) [UA]:
State or Province Name (full name) [DP]:
Locality Name (eg, city) [Dnipropetrovs'k]:
Organization Name (eg, company) [OpenVPN-TEST]:
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:OpenVPN server
Email Address [admin@example.com]:

Подписываем сертификат сервера:

# sh sign-req server

отвечаем y.

Сертификаты клиентов генерируются точно так же как и сертификат для сервера. Главное не забыть находиться в каталоге easy-rsa и загружать переменные из vars. Каждому клиенту нужен свой сертификат со своим Common name. Можно даже указывать в common name имя пользователя.

Полученные файлы нужно положить в /etc/openvpn/keys/ , как это указано в openvpn.conf:

# cp keys/dh1024.pem /etc/openvpn
# mkdir /etc/openvpn/keys
# cp keys/server.{crt,key} /etc/openvpn/keys
# cp keys/ca.crt /etc/openvpn/keys

Заметим, что все файлы, кроме .key файлов, можно не держать в огромном секрете.

Конфигурационный файл для Windows-клиента не очень сложен :)

# OpenVPN client configuration file (c:\Program Files\OpenVPN\conf\client1.ovpn)
# May vary for each client, as they required to use different RSA certs for better security
port 1194
proto udp
dev tun
comp-lzo
remote 
pull
tls-client
# Эти файлы нужно поместить в тот же каталог что и конфигурационный файл
ca ca.crt
# Сгенерированный и подписанный easy-rsa ключ и сертификат клиента
key client1.key
cert client1.crt
# Это заставит пользователя вводить имя и пароль
auth-user-pass
# Опция, которая решает проблемы с mtu
mssfix 1400
#END

2 комментария:

  1. Очень не советую rpmforge. Вот EPEL практически musthave, и фиксы безопасности выходят очень быстро.
    RHEL, например, даже не смнимают с саппорта, если ставить пакеты из EPEL, так как они никогда не заменяют базовые, даже без настроенных приоритетов репозиториев.

    Есди подключается rpmforge, это уже какая-то Fedora получается :)

    [shaggycat@gw03u ~]$ rpm -qi openvpn
    Name : openvpn Relocations: (not relocatable)
    Version : 2.1.1 Vendor: Fedora Project
    Release : 2.el5 Build Date: Tue 26 Jan 2010 05:30:57 PM MSK
    Install Date: Fri 11 Jun 2010 03:57:35 AM MSD Build Host: x86-02.phx2.fedoraproject.org
    Group : Applications/Internet Source RPM: openvpn-2.1.1-2.el5.src.rpm
    Size : 791296 License: GPLv2
    Signature : DSA/SHA1, Tue 26 Jan 2010 08:45:55 PM MSK, Key ID 119cc036217521f6
    Packager : Fedora Project
    URL : http://openvpn.net/
    Summary : A full-featured SSL VPN solution
    Description :
    OpenVPN is a robust and highly flexible tunneling application that uses all
    of the encryption, authentication, and certification features of the
    OpenSSL library to securely tunnel IP networks over a single UDP or TCP
    port. It can use the Marcus Franz Xaver Johannes Oberhumer's LZO library
    for compression.
    [shaggycat@gw03u ~]$

    ОтветитьУдалить
  2. Странно, что я его в EPEL5 не заметил

    ОтветитьУдалить