Здравейте, Хаброжители! В книгата Дейвид Клинтън описва 12 реални проекта, включително автоматизация на системата за архивиране и възстановяване, настройка на личен файлов облак в стил Dropbox и създаване на собствен сървър MediaWiki. Чрез интересни примери ще изучите виртуализация, аварийно възстановяване, осигуряване на сигурност, архивиране, внедряване на DevOps и отстраняване на проблеми в системата. Всяка глава завършва с обзор на практически препоръки, глосар на нови термини и упражнения.
Откъс «10.1. Създаване на тунел OpenVPN»
В тази книга вече много говорих за криптиране. SSH и SCP могат да защитят данните, предавани през отдалечени връзки (глава 3), криптирането на файлове позволява да се защитят данните при съхранение на сървъра (глава 8), а сертификатите TLS/SSL могат да защитят данните при предаване между сайтове и клиентски браузъри (глава 9). Но понякога вашите данни изискват защита в по-широк спектър от връзки. Например, е възможно някои членове на екипа ви да работят по време на пътувания, свързвайки се с мрежата чрез Wi-Fi през публични хотспотове. Определено не трябва да се предполага, че всички такива хотспотове са безопасни, но вашите хора наистина се нуждаят от начин да се свързват с ресурсите на компанията — и в този случай ще помогне VPN.
Правилно проектираният VPN-тунел осигурява директна връзка между отдалечени клиенти и сървъра по начин, който скрива данните при тяхното предаване по небезопасна мрежа. И какво от това? Вие вече сте видели много инструменти, които могат да направят това с помощта на криптиране. Реалната стойност на VPN е, че, отваряйки тунел, можете да свързвате отдалечени мрежи, сякаш те са всички локални. В известен смисъл вие използвате обход.
Използвайки такава разширена мрежа, администраторите могат да изпълняват своята работа на своите сървъри от всяко място. Но, което е по-важно, компания с ресурси, разпределени по няколко филиала, може да направи всичките им видими и достъпни за всички групи, които се нуждаят от тях, независимо къде се намират (рис. 10.1).
Сам по себе тунелът не гарантира сигурност. Но един от стандартите за криптиране може да бъде включен в структурата на мрежата, което значително повишава нивото на сигурност. Тунелите, създадени с помощта на пакета OpenVPN с отворен код, използват същото криптиране TLS/SSL, за което вече сте чели. OpenVPN не е единственият достъпен вариант за тунелиране, но е един от най-известните. Смята се, че е малко по-бърз и по-сигурен от алтернативния тунел протокол на ниво 2, използващ криптиране IPsec.
Искате ли всички в екипа ви да комуникират безопасно помежду си, докато са на път или работят в различни сгради? За това е необходимо да създадете сървър OpenVPN, за да разрешите споделянето на приложения и достъп до локалната мрежова среда на сървъра. За да проработи, е достатъчно да стартирате две виртуални машини или два контейнера: една за изпълнение на ролята на сървър/хост и другата – за клиент. Създаването на VPN е сложен процес, затова вероятно ще си струва да отделите няколко минути, за да предствите общата картина.

10.1.1. Конфигуриране на сървър OpenVPN
Преди да започнете, ще ви дам полезен съвет. Ако планирате да направите всичко сами (а настоятелно ви препоръчвам да го направите), вероятно ще откриете, че работите с няколко терминални прозорци, отворени на работния плот, всеки от които свързан с тяхната машина. Има риск в某и момент да въведете команда в грешния прозорец. За да избегнете това, можете да използвате командата hostname, за да промените името на машината, отображаемо в командния ред, на нещо, което ясно ще ви казва къде се намирате. След като направите това, ще трябва да излезете от сървъра и да влезете отново, за да влязат в сила новите настройки. Ето как изглежда:

Следвайки този подход и присвоявайки подходящи имена на всяка от машините, с които работите, ще можете лесно да проследявате къде се намирате.
След използването на hostname може да се сблъскате с досадни съобщения Unable to Resolve Host OpenVPN-Server при изпълнението на последващи команди. Актуализирането на файла /etc/hosts с подходящото ново име на хоста трябва да реши проблема.
Подготовка на вашия сървър за OpenVPN
За да инсталирате OpenVPN на сървъра си, са необходими два пакета: openvpn и easy-rsa (за управление на процеса по генериране на криптографски ключ). Потребителите на CentOS трябва, ако е необходимо, първо да инсталират репозитория epel-release, както направихте в глава 2. За да можете да проверите достъпа до сървърното приложение, можете също да инсталирате уеб сървър Apache (apache2 за Ubuntu и httpd за CentOS).
Докато настройвате сървъра, препоръчвам да активирате защитната стена, която блокира всички портове с изключение на 22 (SSH) и 1194 (порта по подразбиране за OpenVPN). Този пример илюстрира как ще работи ufw в Ubuntu, но съм сигурен, че все още помните програмата firewalld на CentOS от глава 9:
# ufw enable
# ufw allow 22
# ufw allow 1194За да разрешите вътрешната маршрутизация между мрежовите интерфейси на сървъра, трябва да разкоментирате една ред (net.ipv4.ip_forward = 1) в файла /etc/sysctl.conf. Това ще позволи пренасочване на отдалечените клиенти при необходимост след свързването им. За да заработи новият параметър, стартирайте sysctl -p:
# nano /etc/sysctl.conf
# sysctl -pСега сървърната среда е напълно настроена, но трябва да направите още нещо, преди да сте готови: ще трябва да изпълните следните стъпки (по-подробно ще обсъдим по-късно).
- Създайте на сървъра пакет от ключове за криптиране на инфраструктурата с открит ключ (PKI) с помощта на скриптовете, предоставени с пакета easy-rsa. Всъщност, сървърът OpenVPN също действа като собствен център за сертификация (ЦС).
- Подгответе съответните ключове за клиента
- Конфигурирайте файла server.conf за сървъра
- Настройте вашия клиент OpenVPN
- Проведете тест на вашия VPN
Генериране на криптографски ключове
За да не усложнявате живота, можете да настроите своята ключова инфраструктура на същата машина, където работи сървърът OpenVPN. Въпреки това, в препоръките за сигурност обикновено се предлага да се използва отделен сървър за ЦС за внедрявания в производствена среда. Процесът на генериране и разпределение на ресурсите за криптографските ключове за употреба в OpenVPN е илюстриран на фиг. 10.2.

Когато инсталирахте OpenVPN, автоматично беше създадена директория /etc/openvpn/, но в нея все още няма нищо. Пакетите openvpn и easy-rsa идват с примери за файлове шаблони, които можете да използвате като основа за вашата конфигурация. За да стартирате процеса на сертификация, копирайте директорията с шаблона easy-rsa от /usr/share/ в /etc/openvpn и преминете в директорията easy-rsa/:
# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsaКаталог easy-rsa вече ще съдържа доста сценарии. В таблица 10.1 са изброени инструментите, които ще използвате за създаване на ключове.

Изброените операции изискват права на root, затова трябва да станете root чрез sudo su.
Първият файл, с който ще работите, се нарича vars и съдържа променливи на средата, които easy-rsa използва при генерирането на ключове. Трябва да редактирате файла, за да използвате ваши собствени стойности вместо стойностите по подразбиране, които вече са налични. Ето как ще изглежда моят файл (извадка 10.1).
Извадка 10.1. Основни фрагменти на файла /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY="CA"
export KEY_PROVINCE="ON"
export KEY_CITY="Toronto"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="info@bootstrap-it.com"
export KEY_OU="IT"Стартирането на файла vars ще предаде неговите стойности в средата на шел, откъдето те ще бъдат включени в съдържанието на новите ви ключове. Защо команда sudo сама по себе си не работи? Защото на първия етап редактираме сценария с име vars, а след това го прилагаме. Прилагането означава, че файлът vars предава своите стойности в средата на шел, откъдето те ще бъдат включени в съдържанието на новите ви ключове.
Задължително стартирайте файла отново, използвайки нова оболка, за да завършите незавършения процес. Когато това е направено, сценарият ще ви подскаже да стартирате друг сценарий, clean-all, за да премахнете всяко съдържание в каталога /etc/openvpn/easy-rsa/keys/:

Естествено, следващата стъпка ще бъде стартиране на сценария clean-all, последван от build-ca, който използва сценария pkitool за създаване на коренов сертификат. Ще бъдете помолени да потвърдите идентификационните настройки, предоставени от vars:
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private keyСледва сценарият build-key-server. Тъй като той използва същия сценарий pkitool заедно с новия коренов сертификат, ще видите същите въпроси за потвърждение при създаването на двойка ключове. На ключовете ще бъдат присвоени имена на базата на предаваните от вас аргументи, които, освен ако не стартирате няколко VPN на този компютър, обикновено ще бъдат server, както в примера:
# ./build-key-server server
[...]
Certificate is to be certified until Aug 15 23:52:34 2027 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 UpdatedOpenVPN използва параметри, генерирани с алгоритъма Дифи — Хелман (с прилагане на build-dh), за да се съгласува автентикацията за нови връзки. Създаденият тук файл не трябва да бъде секретен, но трябва да бъде генериран с помощта на скрипта build-dh за активните в момента RSA ключове. Ако в бъдеще създадете нови RSA ключове, ще трябва да актуализирате файла на базата на алгоритъма Дифи — Хелман:
# ./build-dhВашите ключове на страната на сървъра сега ще попаднат в каталога /etc/openvpn/easy-rsa/keys/, но OpenVPN не знае това. По подразбиране OpenVPN ще търси ключовете в /etc/openvpn/, така че ги копирайте:
# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpnПодготовка на клиентските шифрови ключове
Както вече видяхте, в TLS шифроването се използват двойки съответстващи ключове: един е зададен на сървъра, а другият — на отдалечения клиент. Това означава, че ще ви трябват клиентски ключове. Нашият стар приятел pkitool е точно това, от което се нуждаете за това. В този пример, стартивайки програмата в каталога /etc/openvpn/easy-rsa/, предаваме й аргумента client за генериране на файлове с имена client.crt и client.key:
# ./pkitool clientДвата клиентски файла заедно с изходния файл ca.crt, който все още се намира в каталога keys/, сега трябва да бъдат безопасно предадени на вашия клиент. Поради техния собственост и права за достъп, това може да се окаже не толкова лесна задача. Най-простият подход е ръчно да копирате съдържанието на изходния файл (и нищо, освен това съдържание) в терминала, работещ на Работния плот на вашия ПК (означете текста, щракнете с десния бутон върху него и изберете в менюто Copy (Копиране)). След това поставете това в нов файл със същото име, което създавате в втория терминал, свързан с вашия клиент.
Но всеки може да изреже и постави. Вместо това мислете като администратор, защото не винаги ще имате достъп до графичния интерфейс, където е възможно действието изрязване/поставяне. Копирайте файловете в домашния каталог на вашия потребител (за да може отдалечената операция scp да има достъп до тях), а след това с помощта на chown променете собственика на файловете от root на обикновен потребител без права на root, за да можете да извършите отдалеченото действие scp. Уверете се, че всичките ви файлове в момента са установени и достъпни. На клиента ще ги преместите малко по-късно:
# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/client.key
# chown ubuntu:ubuntu /home/ubuntu/client.crt
# chown ubuntu:ubuntu /home/ubuntu/ca.crtС пълен комплект ключове за шифроване, готови за действие, трябва да информирате сървъра как искате да създадете VPN. Това се прави с помощта на файла server.conf.
Намаляваме броя на натисканията на клавиши
Трябва ли да пишете твърде много? Разширението със скобки ще помогне да се намалят тези шест команди до две. Уверен съм, че ще можете да усвоите тези два примера и да разберете какво се случва. Какво е още по-важно, ще можете да разберете как да прилагате тези принципи към операции с десетки или дори стотици елементи:
# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}
Настройка на файла server.conf
Как можете да знаете как трябва да изглежда файлът server.conf? Спомнете си шаблона на директорията easy-rsa, който копирахте от /usr/share/? По време на инсталацията на OpenVPN остана компресиран файл на конфигурационния шаблон, който можете да копирате в /etc/openvpn/. Ще се основавам на факта, че шаблонът е архивиран и ще ви запозная с полезен инструмент: zcat.
Вие вече знаете как да изведете текстовото съдържание на файла на екрана с команда cat, но какво, ако файлът е компресиран с gzip? Винаги можете да разархивирате файла и след това cat с удоволствие ще го изведе, но това е с една или две стъпки повече, отколкото е нужно. Вместо това, както вече вероятно сте се досетили, можете да въведете командата zcat, за да заредите разархивирания текст в паметта с една стъпка. В следващия пример вместо да отпечатате текста на екрана, ще го пренасочите в нов файл с име server.conf:
# zcat
/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
> /etc/openvpn/server.conf
$ cd /etc/openvpnНека оставим настрана обширната и полезна документация, приложена към файла, и да видим как може да изглежда, когато приключите с редактиране. Обърнете внимание, че точката и запетаята (;) указва на OpenVPN да не чете и не изпълнява следващия ред (листинг 10.2).

Нека разгледаме някои от тези настройки.
- По подразбиране OpenVPN работи през порт 1194. Можете да промените това, например, за да прикриете допълнително действията си или да избегнете конфликти с други активни тунели. Тъй като 1194 изисква минимална координация с клиентите, най-добре е да направите точно така.
- OpenVPN използва за предаване на данни или протокол за управление на предаване (TCP), или протокол за потребителски датаграми (UDP). TCP може да бъде малко по-бавен, но е по-надежден и е с по-голяма вероятност да бъде разбран от приложения, работещи на двата края на тунела.
- Можете да зададете dev tun, когато искате да създадете по-прост и ефективен IP тунел, който предава съдържание на данни и нищо повече. Ако, от друга страна, ви е необходимо да свържете няколко мрежови интерфейси (и мрежите, които те представляват), създавайки Ethernet мост, трябва да изберете dev tap. Ако не разбирате какво означава всичко това, използвайте аргумента tun.
- Следващите четири реда предават на OpenVPN имената на трите файла за автентикация на сървъра и файла с параметрите dh2048, който създадохте по-рано.
- Редът server задава диапазон и маска на подмрежата, които ще се използват за присвояване на IP адреси на клиентите при вход в системата.
- Неподаваният параметър push „route 10.0.3.0 255.255.255.0“ позволява на отдалечените клиенти да получават достъп до частни подмрежи зад сървъра. За да работи това, е необходима и конфигурация на мрежата на самия сървър, така че частната подмрежа да бъде наясно с OpenVPN подмрежата (10.8.0.0).
- Редът port-share localhost 80 позволява пренасочването на клиентския трафик, идващ през порт 1194, към локален уеб сървър, слушащ на порт 80. (Това ще бъде полезно, ако възнамерявате да използвате уеб сървър за тестване на вашата VPN.) Работи само когато е избран TCP протокол.
- Редовете user nobody и group nogroup трябва да бъдат активни — за това трябва да премахнете точките с запетая (;). Задължаването на отдалечените клиенти да работят като nobody и nogroup гарантира, че сесии на сървъра ще бъдат непривилегировани.
- log указва, че текущите записи в журнала ще презаписват стари записи при всеки старт на OpenVPN, докато log-append добавя нови записи към съществуващия файл на журнала. Файлът openvpn.log се записва в директорията /etc/openvpn/.
Освен това, в конфигурационния файл често се добавя настройката client-to-client, за да могат няколко клиенти да се виждат помежду си в допълнение към OpenVPN сървъра. Ако сте удовлетворени от конфигурацията си, можете да стартирате OpenVPN сървъра:
# systemctl start openvpnПоради променящата се природа на взаимоотношенията между OpenVPN и systemd, за стартиране на услугата понякога може да е необходима тази синтаксис: systemctl start openvpn@server.
Стартирането на ip addr за показване на списък на мрежовите интерфейси на вашия сървър сега трябва да изведе препратка към новия интерфейс с име tun0. OpenVPN ще го създаде, за да поддържа входящите клиенти:
$ ip addr
[...]
4: tun0: mtu 1500 qdisc [...]
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft foreverМоже да се наложи да рестартирате сървъра, преди всичко да започне да работи напълно. Следващата спирка е клиентският компютър.
10.1.2. Конфигуриране на клиента на OpenVPN
Традиционно тунелите се изграждат с най-малко два изхода (иначе щяхме да ги наричаме пещери). Правилно конфигуриран OpenVPN на сървъра насочва трафика в тунела и от него от едната страна. Но също така ще ви е необходимо някакъв софтуер, работещ от страната на клиента, тоест от другата страна на тунела.
В тази секция ще се фокусирам върху ръчната настройка на компютър с Linux от какъвто и да е тип да работи като клиент на OpenVPN. Но това не е единственият начин, по който е налична такава възможност. OpenVPN поддържа клиентски приложения, които могат да бъдат инсталирани и използвани на настолни компютри и лаптопи с Windows или macOS, както и на смартфони и таблици с Android и iOS. Повече информация можете да намерите на openvpn.net.
Пакетът OpenVPN трябва да бъде инсталиран на клиентския компютър, както беше инсталиран на сървъра, въпреки че тук няма нужда от easy-rsa, тъй като използваните от вас ключове вече съществуват. Трябва да копирате файла шаблон client.conf в директорията /etc/openvpn/, която току-що беше създадена. Този път файлът няма да бъде архивиран, така че обичайната команда cp ще свърши отлична работа:
# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf
/etc/openvpn/Повечето настройки във вашия файл client.conf ще бъдат доста разбираеми: те трябва да съвпадат с стойностите на сървъра. Както може да се види от следващия пример на файла, уникалният параметър е remote 192.168.1.23 1194, който указва на клиента IP адреса на сървъра. Отново се уверете, че това е адресът на вашия сървър. Също така трябва да накарате клиентския компютър да проверява автентичността на сертификата на сървъра, за да предотвратите евентуална атака „човек в средата“. Един от начините да го направите е да добавите реда remote-cert-tls server (листинг 10.3).

Сега можете да отидете в директорията /etc/openvpn/ и да извлечете ключовете за сертификати от сървъра. Заменете IP адреса на сървъра или името на домейна в примера с вашите стойности:

Няма вероятност за нищо вълнуващо, докато не стартирате OpenVPN на клиента. Тъй като трябва да предадете няколко аргумента, ще го направите от командния ред. Аргументът —tls-client казва на OpenVPN, че ще действате като клиент и ще се свържете чрез TLS криптиране, а —config указва вашия конфигурационен файл:
# openvpn --tls-client --config /etc/openvpn/client.confВнимателно прочетете извода от командата, за да се уверите, че сте свързани правилно. Ако нещо не е наред при първия опит, това може да е причинено от несъответствие в настройките между конфигурационните файлове на сървъра и клиента или от проблем с мрежовото свързване/фаервол. Ето няколко съвета за отстраняване на проблеми.
- Внимателно прочетете извода от операцията OpenVPN на клиента. Той често съдържа ценни съвети относно това какво именно не може да бъде изпълнено и защо.
- Проверете съобщенията за грешки в файловете openvpn.log и openvpn-status.log в директорията /etc/openvpn/ на сървъра.
- Проверете свързаните с OpenVPN и подходящи по време съобщения в системните журнали на сървъра и клиента. (journalctl -ce ще изведе най-новите записи.)
- Уверете се, че имате активно мрежово свързване между сървъра и клиента (повече - в глава 14).
За автора
Дейвид Клинтън — системен администратор, учител и писател. Той администрира, пише по темата и създава учебни материали за множество важни технически дисциплини, включително системи Linux, облачни изчисления (в частност AWS) и контейнерни технологии като Docker. Той е написал книгата Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Много от неговите учебни видеокурсове могат да бъдат намерени на сайта Pluralsight.com, а линковете към останалите му книги (по администриране на Linux и виртуализация на сървъри) са налични на .
» По-подробно с книгата може да се запознаете на
»
»
За Хаброжителите отстъпка от 25% с ваучера — Linux
След извършване на плащането за печатната версия на книгата, електронната книга ще бъде изпратена на имейла ви.
Източник: habr.com
