Книга «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 у дії»
Дотримуючись цього підходу та присвоюючи відповідні імена кожної з машин, з якими ви працюєте, ви зможете легко відстежувати, де знаходитесь.

Після використання 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 у дії»
Коли ви встановлювали 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, тому через sudo su потрібно стати root.

Перший файл, з яким ви працюватимете, називається 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 на цьому комп'ютері, зазвичай будуть 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 (Копіювати)). Потім вставте це у новий файл з тим самим ім'ям, яке ви створюєте у другому терміналі, підключеному до вашого клієнта.

Але ж будь-хто може вирізати та вставити. Ви ж натомість думайте як адміністратор, тому що у вас не завжди буде доступ до 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, який ви створили раніше.
  • Рядок 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 у дії»
Тепер ви можете перейти до каталогу /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. Він написав книгу Learn Amazon Web Services in Month of Lunches (Manning, 2017). Багато його навчальних відеокурсів можна знайти на сайті Pluralsight.com, а посилання на інші його книги (з адміністрування Linux і віртуалізації серверів) доступні за адресою bootstrap-it.com.

» Докладніше з книгою можна ознайомитись на сайті видавництва
» Зміст
» уривок

Для Хаброжителів знижка 25% купона Linux
За фактом оплати паперової версії книги на e-mail надсилається електронна книга.

Джерело: habr.com

Додати коментар або відгук