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

Книга Linux в действие Здравейте жители на Хабро! В книгата Дейвид Клинтън описва 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 в действие

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

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

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

След като използвате име на хост, може да срещнете досадни съобщения Невъзможно разрешаване на хост OpenVPN-сървър при изпълнение на последващи команди. Актуализирането на файла /etc/hosts със съответното ново име на хост трябва да разреши проблема.

Подготовка на вашия сървър за OpenVPN

За да инсталирате OpenVPN на вашия сървър, имате нужда от два пакета: openvpn и easy-rsa (за управление на процеса на генериране на ключ за криптиране). Потребителите на CentOS трябва първо да инсталират хранилището на epel-release, ако е необходимо, както направихте в Глава 2. За да можете да тествате достъпа до сървърното приложение, можете също да инсталирате уеб сървъра Apache (apache2 на Ubuntu и httpd на CentOS).

Докато настройвате вашия сървър, препоръчвам да активирате защитна стена, която блокира всички портове с изключение на 22 (SSH) и 1194 (портът по подразбиране на OpenVPN). Този пример илюстрира как ufw ще работи на Ubuntu, но съм сигурен, че все още помните програмата CentOS firewalld от глава 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 сървърът действа и като собствен сертифициращ орган (CA).
  2. Подгответе подходящи ключове за клиента
  3. Конфигурирайте файла server.conf за сървъра
  4. Настройте вашия OpenVPN клиент
  5. Проверете своя VPN

Генериране на ключове за криптиране

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

Книга Linux в действие
Когато инсталирахте 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 в действие

Горните операции изискват 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="[email protected]"
export KEY_OU="IT"

Изпълнението на файла vars ще предаде неговите стойности в средата на обвивката, където те ще бъдат включени в съдържанието на вашите нови ключове. Защо командата sudo не работи сама по себе си? Тъй като в първата стъпка редактираме скрипта с име vars и след това го прилагаме. Прилагането и означава, че файлът vars предава стойностите си на средата на обвивката, където те ще бъдат включени в съдържанието на вашите нови ключове.

Не забравяйте да стартирате отново файла, като използвате нова обвивка, за да завършите незавършения процес. Когато това стане, скриптът ще ви подкани да стартирате друг скрипт, clean-all, за да премахнете всяко съдържание в директорията /etc/openvpn/easy-rsa/keys/:

Книга Linux в действие
Естествено, следващата стъпка е да стартирате скрипта clean-all, последван от build-ca, който използва скрипта pkitool за създаване на основния сертификат. Ще бъдете помолени да потвърдите настройките за самоличност, предоставени от vars:

# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key

Следва скриптът build-key-server. Тъй като използва същия скрипт pkitool заедно с нов основен сертификат, ще видите същите въпроси, за да потвърдите създаването на двойката ключове. Ключовете ще бъдат именувани въз основа на аргументите, които предавате, които, освен ако не използвате няколко VPN на тази машина, обикновено ще бъдат сървърни, както в примера:

# ./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 използва параметри, генерирани от алгоритъма Diffie-Hellman (използвайки build-dh), за да договори удостоверяване за нови връзки. Създаденият тук файл не е необходимо да бъде таен, но трябва да бъде генериран с помощта на скрипта build-dh за RSA ключовете, които са активни в момента. Ако създадете нови RSA ключове в бъдеще, ще трябва също да актуализирате файла Diffie-Hellman:

# ./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.crt и client.key:

# ./pkitool client

Двата клиентски файла, заедно с оригиналния файл ca.crt, който все още е в директорията keys/, сега трябва да бъдат сигурно прехвърлени на вашия клиент. Поради тяхната собственост и права на достъп, това може да не е толкова лесно. Най-простият подход е ръчно да копирате съдържанието на изходния файл (и нищо друго освен това съдържание) в терминал, работещ на работния плот на вашия компютър (изберете текста, щракнете с десния бутон върху него и изберете Копиране от менюто). След това поставете това в нов файл със същото име, което създавате във втори терминал, свързан с вашия клиент.

Но всеки може да изреже и постави. Вместо това мислете като администратор, защото не винаги ще имате достъп до GUI, където са възможни операции за изрязване/поставяне. Копирайте файловете в домашната директория на вашия потребител (така че отдалечената 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 в действие
Нека да разгледаме някои от тези настройки.

  • По подразбиране OpenVPN работи на порт 1194. Можете да промените това, например, за да скриете допълнително вашите дейности или да избегнете конфликти с други активни тунели. Тъй като 1194 изисква минимална координация с клиентите, най-добре е да го направите по този начин.
  • OpenVPN използва или протокол за контрол на предаването (TCP), или протокол за потребителски дейтаграми (UDP) за предаване на данни. TCP може да е малко по-бавен, но е по-надежден и е по-вероятно да бъде разбран от приложения, работещи в двата края на тунела.
  • Можете да посочите dev tun, когато искате да създадете по-прост, по-ефективен IP тунел, който пренася съдържание на данни и нищо друго. Ако, от друга страна, трябва да свържете множество мрежови интерфейси (и мрежите, които представляват), създавайки Ethernet мост, ще трябва да изберете dev tap. Ако не разбирате какво означава всичко това, използвайте аргумента tun.
  • Следващите четири реда дават на OpenVPN имената на трите файла за удостоверяване на сървъра и файла с опции dh2048, който сте създали по-рано.
  • Сървърната линия задава диапазона и подмрежовата маска, които ще се използват за присвояване на IP адреси на клиенти при влизане.
  • Незадължителният параметър за насочване "route 10.0.3.0 255.255.255.0" позволява на отдалечени клиенти достъп до частни подмрежи зад сървъра. Осъществяването на тази работа също изисква настройка на мрежата на самия сървър, така че частната подмрежа да знае за подмрежата OpenVPN (10.8.0.0).
  • Редът за споделяне на порта localhost 80 ви позволява да пренасочите клиентския трафик, идващ на порт 1194, към локален уеб сървър, който слуша на порт 80. (Това ще бъде полезно, ако ще използвате уеб сървъра, за да тествате вашата VPN.) Това работи само след това, когато е избран tcp протокол.
  • Потребителските редове nobody и group nogroup трябва да бъдат разрешени чрез премахване на точката и запетая (;). Принуждаването на отдалечени клиенти да работят като nobody и nogroup гарантира, че сесиите на сървъра са непривилегировани.
  • log указва, че текущите записи в журнала ще презаписват старите записи при всяко стартиране на OpenVPN, докато log-append добавя нови записи към съществуващия файл с журнал. Самият файл openvpn.log се записва в директорията /etc/openvpn/.

Освен това към конфигурационния файл често се добавя стойност от клиент към клиент, така че множество клиенти да могат да се виждат един друг в допълнение към 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 ще бъдат доста ясни: те трябва да съответстват на стойностите на сървъра. Както можете да видите от следния примерен файл, уникалният параметър е отдалечен 192.168.1.23 1194, който казва на клиента IP адреса на сървъра. Отново се уверете, че това е адресът на вашия сървър. Трябва също така да принудите клиентския компютър да провери автентичността на сертификата на сървъра, за да предотвратите възможна атака "човек по средата". Един от начините да направите това е да добавите реда remote-cert-tls server (списък 10.3).

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

Книга Linux в действие
Вероятно няма да се случи нищо вълнуващо, докато не стартирате 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. Той написа книгата Научете уеб услугите на Amazon за един месец обеди (Manning, 2017). Много от неговите видео курсове за обучение могат да бъдат намерени на Pluralsight.com, а връзки към другите му книги (за администриране на Linux и виртуализация на сървъри) са достъпни на bootstrap-it.com.

» За повече информация относно книгата, моля посетете уебсайт на издателя
» Таблица на съдържанието
» Откъс

За Khabrozhiteli 25% отстъпка от купона - Linux
При заплащане на хартиената версия на книгата, на електронната поща се изпраща електронна книга.

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

Добавяне на нов коментар