Нам треба з'єднати віддаленого співробітника до робочої мережі. Це робиться в тому числі за допомогою VPN, в нашому випадку, OpenVPN. Це безкоштовний, досить надійний і не дуже складний в налаштуванні сервер і клієнт VPN.
Структура нашої мережі така:
Початкова установка проста для будь-якої популярної операційної системи:
Мабуть, не скажу нічого про Mac OS, тому що не стикався особисто.
Установка OpenVPN в Linux
Я використовую CentOS, тому можу описати установку саме для цього Linux.
Як і всюди, скачати пакет і встановити не є гуд, тому що його буде важче оновлювати. А тому "Yum install openvpn" видасть фіг, треба нам підключити репозиторій.
Варіант 1 - спробувати поставити репозиторій з самого openvpn.net:
Швидше за все, це у вас не пройде :)
Варіант 2 - репозиторій RPMForge
Перевіримо, чого наставили:
Особливо не захоплюйтеся всякими репозиторіями :) Чим менше їх, тим краще.
Отже, щоб ви не робили, ви повинні успішно виконати команду:
# Yum install openvpn
Installed:
openvpn.i386 0: 2.3-3
Dependency Installed:
pkcs11-helper.i686 0: 1.08-1.el6.rf
Первинна настройка OpenVPN
Незалежно від того, на FreeBSD, Linux або Windows, загальні кроки по створенню необхідної інфраструктури для OpenVPN практично однакові.
Копіюємо файл конфігурації:
# Cp /usr/share/doc/openvpn-*/sample-config-files/server.conf / etc / openvpn /
Копіюємо пакет управління RSA ключами з поставки OpenVPN в / etc / openvpn / easy-rsa:
# Cp /usr/share/doc/openvpn-*/easy-rsa/2.0/ / etc / openvpn /
# Cd / etc / openvpn / easy-rsa
# Cp openssl-1.0.0.cnf openssl.cnf
# Mkdir keys
Редагуємо файл / etc / openvpn / rsa-keys / vars:
export KEY_COUNTRY = "RU"
export KEY_PROVINCE = "RU"
export KEY_CITY = "Moscow"
export KEY_ORG = "Company"
export KEY_EMAIL = "[email protected]"
export [email protected]
export KEY_CN = changeme
export KEY_NAME = changeme
export KEY_OU = Office
export PKCS11_MODULE_PATH = changeme
export PKCS11_PIN = 1234
Далі слід експортувати змінні KEY_ *, вони необхідні для роботи скриптів build- *, що генерують сертифікати. На цьому кроці можу відзначити, що у мене не відразу вийшло експортувати змінні з файлу / etc / openvpn / easy-rsa / keys. довелося робити скрипт з експортом системної змінної $ PATH, але, як мені здається, це чисто у мене така проблема була (в Windows-версії C: Program FilesOpenVPNeasy-rsavars.bat змінні експортувалися без проблем):
# Cd / etc / openvpn / easy-rsa
# ./vars
У Windows відкрийте командний рядок "cmd":
cd "C: Program FilesOpenVPNeasy-rsa
vars.bat
Зазначу про всяк випадок, що якщо ви не можете виконати будь-якої скрипт, найімовірніше у нього просто немає прав на запуск, наприклад, при запуску ./build-ca я спочатку отримав таке повідомлення:
Please edit the vars script to reflect your configuration,
then source it with "source ./vars".
Next, to start with a fresh PKI configuration and to delete any
previous certificates and keys, run "./clean-all".
Finally, you can run this tool (pkitool) to build certificates / keys.
Про що це? А просто-напросто змінні з файлу vars НЕ екпортіровалісь, тому що vars не виконав, тому що йому потрібні права на запуск, тобто "Chmod + x vars". Мені довелося дати права на запуск декількох файлів, в тому числі:
build-ca, clean-all, pkitool, vars, whichopensslcnf.
Видаляємо всі попередні файли ключів і сертіфкатов з директорії / etc / openvpn / easy-rsa / keys (ця директорія вказана у змінній KEY_DIR файлу vars):
# Chmod + x clean-all
# ./clean-all
Створюємо сертифікат справжності (Certificate Authority) сервера:
# Chmod + x build-ca
# Chmod + x pkitool
# ./build-ca
++++++
. ++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', The field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [RU]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [Company]:
Organizational Unit Name (eg, section) [Office]:
Common Name (eg, your name or your server's hostname) [changeme]: VPNServer
Name [changeme]: Name
Email Address [[email protected]]:
Ок, ми начебто все зробили.
Будьте уважні при заповненні даних сертифікатів, поле Common Name обов'язково до заповнення, причому для сервера воно повинно бути одне, а для клієнта інше. Наприклад в поле Common Name при генерації сертифіката X.509 для сервера можна написати "server", а для клієнта соотвественно "client".
Створюємо сертифікат X.509 для сервера.
# Chmod + x build-key-server
# ./build-key-server server
Generating a 1 024 bit RSA private key
.++++++
. ++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', The field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [RU]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [Company]:
Organizational Unit Name (eg, section) [Office]:
Common Name (eg, your name or your server's hostname) [server]:
Name [changeme]: IAmServer
Email Address [[email protected]]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName: PRINTABLE: 'RU'
stateOrProvinceName: PRINTABLE: 'RU'
localityName: PRINTABLE: 'Moscow'
organizationName: PRINTABLE: 'Company'
organizationalUnitName: PRINTABLE: 'Office'
commonName: PRINTABLE: 'server'
name: PRINTABLE: 'IAmServer'
emailAddress: IA5STRING:'[email protected] '
Certificate is to be certified until Apr 7 12:15:29 2 022 GMT (3650 days)
Sign the certificate? [Y / n]: y
1 out of 1 certificate requests certified, commit? [Y / n] y
Write out database with 1 new entries
Data Base Updated
Для створення файлу параметрів Діффі-Хелмана, призначеного для забезпечення більш надійного захисту даних під час активного з'єднання клієнта з сервером, виконуємо:
# Chmod + x build-dh
# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
Створюємо сертифікати для віддаленого клієнта:
# ./build-key-pass Client1
Generating a 1 024 bit RSA private key
. ++++++
. ++++++
writing new private key to 'Client1.key'
.
1 out of 1 certificate requests certified, commit? [Y / n] y
Write out database with 1 new entries
Data Base Updated
На останок генеруємо загальний для клієнта і сервера TLS-ключ, службовець додатковим захистом. TLS надає можливості аутентифікації і безпечної передачі даних через Інтернет з використанням криптографічних засобів. Часто відбувається лише аутентифікація сервера, в той час як клієнт залишається нерозпізнаних. Для взаємної аутентифікації кожна зі сторін повинна підтримувати інфраструктуру відкритого ключа (PKI), яка дозволяє захистити клієнт-серверні додатки від перехоплення повідомлень, редагування існуючих повідомлень і створення підроблених (джерело: wikipedia).
openvpn --genkey --secret ta.key
В результаті в папці / etc / openvpn / easy-rsa / keys ми маємо такі файли:
ca.crt - головний сертифікат справжності (Certificate Authority), цей файл потрібен і клієнту і серверу
dh1024.pem - ключ Діффі Хельмана, цей файл потрібен тільки серверу
server.crt - сертифікат X.509 сервера (стандарт X.509 ITU-T є фундаментальним стандартом, що лежить в основі всіх інших, які використовуються в Інфраструктурі Відкритих Ключів (ІВК). Основне його призначення - визначення формату електронного сертифіката та списків відкликаних сертифікатів), потрібен тільки серверу
server.key - ключ сервера, потрібен тільки сервера (СЕКРЕТНИЙ файл)
client1.crt - сертифікат X.509 клієнта, потрібен тільки клієнту
client1.key - ключ клієнта, потрібен тільки клієнтові (СЕКРЕТНИЙ файл)
ta.key - TLS-ключ, потрібен і клієнту і серверу
Сервера - одне, клієнту - інше
Тепер в папку / etc / openvpn / keys на майбутньому сервері OpenVPN скопіюємо файли ca.crt, dh1024.pem, server.crt, server.key і ta.key:
# Mkdir / etc / openvpn / keys
# Cp /etc/openvpn/easy-rsa/keys/ca.crt dh1024.pem server.crt server.key ta.key / etc / openvpn / keys
В папку майбутнього клієнта / etc / openvpn / client1 скопіюємо файли ca.crt, client1.crt, client1.key і ta.key:
# Mkdir / etc / openvpn / client1
# Cp /etc/openvpn/easy-rsa/keys/ca.crt client1.crt client1.key ta.key / etc / openvpn / client1
Тепер підкаталог "client1" можна скопіювати в папку конфігурації майбутнього віддаленого клієнта Windows.
В принципі, в папці / etc / openvpn / easy-rsa / keys / всі файли можна залишити, на всякий випадок :) Права на доступ до папки openvpn краще оновити до правильних:
# Chown -R root: wheel / etc / openvpn
Конфиг сервера OpenVPN
Розташування файлу конфігурації сервера: "/etc/openvpn/config/server.conf" (для Windows: "C: Program FilesOpenVPNconfigserver.ovpn").
Приклад файлу конфігурації сервера OpenVPN (підходить для Windows, Linux, FreeBSD з мінімальними змінами):
# На сайті розробників рекомендується використовувати udp в тому числі
# З міркувань безпеки
proto udp
ca "/etc/openvpn/keys/ca.crt"
cert "/etc/openvpn/keys/server.crt"
key "/etc/openvpn/keys/server.key" # Цей файл зберігати в секреті!
# Включаємо TLS аутіфікацію
tls-server
# Вказуємо tls-ключ, і вказуємо 0 для сервера, а 1 для клієнта
tls-auth "/etc/openvpn/keys/ta.key" 0
# Таймаут до реконекту
tls-timeout 120
auth MD5
# Задаємо МАРШРУТ який передаємо клієнту
# І маску підмережі для того щоб він "бачив"
# Мережу за OpenVPN сервером (мережа 192.168.10.0/24)
push "route 192.168.10.0 255.255.255.0"
route 192.168.10.0 255.255.255.0
# Утримувати з'єднання (корисно при роботі через nat, proxy і т.п.)
keepalive 10 120
# Включаємо шифрацию пакетів
cipher BF-CBC
# Включити стиск (якщо є проблеми при з'єднанні - вимкніть цю опцію на клієнті і сервері)
comp-lzo
# Максимум клієнтів
max-clients 5
; User nobody
; Group nobody
# Чи не перечитувати ключі після отримання
# SIGUSR1 або ping-restart
persist-key
# Тримати і перевідкривати TUNTAP
# Пристрій, після отримання
# SIGUSR1 або ping-restart
persist-tun
# Клієнти можуть "бачити" один одного
client-to-client
log "/etc/openvpn/log/openvpn.log"
log-append "/etc/openvpn/log/openvpn.log"
# Рівень деталізації звітів
verb 3
Примітки до конфігураційного файлу сервера OpenVPN
В даному конфіги будуть тільки дві відмінності у версіях сервера для Unix або для Windows.
1. Шляхи розташування файлів конфігурації, сертифікатів тощо. В конфіги для Windows повинні прописуватися так:
dh "C: Program FilesOpenvpnconfigdh1024.pem"
а в Linux / FreeBSD так:
; User nobody
; Group nobody
user nobody
group nobody
З конфіг для сервера, в принципі, все. Для початку роботи цілком достатньо того конфіга, який вказаний вище.
Автозапуск сервера OpenVPN в Linux / FreeBSD
#! / Bin / sh
dir = / etc / openvpn / config
modprobe tun
echo 1> / proc / sys / net / ipv4 / ip_forward
openvpn --cd $ dir --daemon --config /etc/openvpn/config/server.conf
# Речі, тут можна запускати кілька серверів OpenVPN одночасно:
# Openvpn --cd $ dir --daemon --config /etc/openvpn/config/server2.conf
або такий (наприклад, під FreeBSD):
openvpn_enable = "YES"
openvpn_if = "tun" #
openvpn_configfile = "/ etc / openvpn / config / server.conf"
openvpn_dir = "/ etc / openvpn" # --cd directory
Конфиг клієнта OpenVPN на Windows XP
Файли клієнта беремо з папки / etc / openvpn / client1 на сервері і копіюємо їх в папку "C: Program FilesOpenVPNconfig" на клієнті.
Розташування файлу конфігурації клієнта: "C: Program FilesOpenVPNconfigclient1.ovpn" (для Linux / FreeBSD розташування, вважаю, будь-де в домашній папці користувача, наприклад, "/home/vpn/client1.ovpn").
Приклад файлу конфігурації клієнта OpenVPN:
ca "C: Program FilesOpenVPNconfigca.crt"
cert "C: Program FilesOpenVPNconfigclient1.crt"
key "C: Program FilesOpenVPNconfigclient1.key"
tls-client
tls-auth "C: Program FilesOpenVPNconfigta.key" 1
auth MD5
# Це ще одна захист, на цей раз від "man in the middle" атаки
ns-cert-type server
Також треба налаштувати брандмауер для того, щоб зовнішні клієнти OpenVPN могли "бачити" мережу "за NAT". Я приведу частина конфіга iptables працює шлюзу CentOS / Squid (внутрішня мережа 192.168.10.0/24):
З цими конфіга клієнт VPN може працювати з комп'ютерами локальної мережі. Якщо у вас є свої міркування з приводу налаштувань iptables і маршрутизації - буду дуже вдячний. Та й читачі також. Адже якщо ви читаєте цю статтю, ви напевно знаєте, що на цю тему вже давно точаться суперечки.
Відгук клієнтського сертифіката
Щоб відкликати сертифікат будь-якого клієнта (наприклад, при втраті планшета з налаштованим OpenVPN), тобто зробити так, щоб клієнт більше не зміг підключитися до сервера, використовуючи свій сертифікат, треба зробити кілька простих дій.
# Cd /etc/openvpn/easy-rsa/2.0/
#. /etc/openvpn/easy-rsa/2.0/vars
# ./revoke-full client25
error 23 at 0 depth lookup: certificate revoked
Після успішного виконання останньої команди (ви повинні побачити останній рядок) в директорії /etc/openvpn/easy-rsa/2.0/keys буде створений файл файл crl.pem (CRL - certificate revocation list - список відкликаних сертифікатів). Скопіюйте його в директорію, де у вас знаходяться інші файли, що мають відношення до працюючого сервера OpenVPN. За ідеєю, це директорія / etc / openvpn. Про всяк випадок, перевірте наявність в цій директорії старого файлу crl.pem (є хороша практика - спочатку зробити резервну копію). Врахуйте, що в команді маються на увазі відносні шляхи, а не абсолютні:
# Cp keys / crl.pem / etc / openvpn /
А тепер зазначимо нашого сервера перевіряти список відкликаних сертифікатів кожен раз при підключенні нового клієнта. Для цього треба додати в конфіг сервера (можливо, /etc/openvpn/server.conf) одну сходинку:
Перезавантажити сервер OpenVPN:
# Service openvpn restart
Тепер навіть якщо ви не видалили з сервера ключі користувача client25, він не зможе підключитися.