Книга «Linux в действиe»

Книга «Linux в действиe» Здравейте, Хаброводители! В книгата Дейвид Клинтън описва 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 не е прост процес, така че вероятно си струва да отделите няколко минути, за да си представите общата картина.

Книга «Linux в действиe»

10.1.1. Конфигуриране на OpenVPN сървър

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

Книга «Linux в действиe»
Следвайки този подход и присвоявайки подходящи имена на всяка от машините, с които работите, ще можете лесно да проследявате къде се намирате.

След използването на 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

Сега средата на сървъра е напълно настроена, но трябва да направите нещо повече, преди да сте готови: ще трябва да извършите следните стъпки (ще ги разгледаме подробно по-късно).

  1. Създайте на сървъра набор от ключове за инфраструктурата с открити ключове (PKI) с помощта на скриптовете, предоставени с пакета easy-rsa. По същество, сървърът OpenVPN също действа като собствен център за сертификация (ЦС).
  2. Подгответе съответните ключове за клиента
  3. Конфигурирайте файла server.conf за сървъра
  4. Настройте вашия клиент OpenVPN
  5. Проверете вашия VPN

Генериране на ключове за шифроване

За да не усложнявате живота, можете да настроите вашата ключова инфраструктура на същата машина, на която работи сървърът OpenVPN. Въпреки това, в препоръките за сигурност обикновено се предлага да се използва отделен сървър ЦС за внедрения в производствена среда. Процесът на генериране и разпределение на ресурсите на ключа за шифроване за използване в OpenVPN е илюстриран на фиг. 10.2.

Книга «Linux в действиe»
Когато сте инсталирали 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 са изброени инструментите, които ще използвате за създаване на ключове.

Книга «Linux в действиe»

Изброените операции изискват права на 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/:

Книга «Linux в действиe»
Естествено, следващата стъпка ще бъде стартирането на скрипта 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 Updated

OpenVPN използва параметри, генерирани с алгоритъма на Дифи — Хелман (с прилагането на 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).

Книга «Linux в действиe»
Нека разгледаме някои от тези настройки.

  • По подразбиране 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).

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

Книга «Linux в действиe»
Няма да се случи нищо вълнуващо, докато не стартирате 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 и виртуализация на сървъри) са достъпни на адрес bootstrap-it.com.

» Можете да се запознаете по-подробно с книгата на сайта на издателството
» Съдържание
» Извадка

За Хаброжителите отстъпка 25% с купона — Linux
След извършване на плащането за хартиената версия на книгата, електронната книга ще бъде изпратена на e-mail.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster