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

    image Привет, Хаброжители! В книге Дэвид Клинтон описывает 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 — непростой процесс, поэтому, вероятно, стоит потратить несколько минут на то, чтобы представить себе общую картину.

    image

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


    Прежде чем начать, дам вам полезный совет. Если вы собираетесь сделать все самостоятельно (а я настоятельно рекомендую вам это), то, вероятно, обнаружите, что работаете с несколькими терминальными окнами, открытыми на Рабочем столе, каждое из которых подключено к своей машине. Есть риск, что в какой-то момент вы введете команду не то в окно. Во избежание этого можно использовать команду hostname, чтобы изменить имя машины, отображаемое в командной строке, на что-то, что будет четко говорить вам о том, где вы находитесь. Как только сделаете это, вам нужно будет выйти с сервера и зайти снова, чтобы новые настройки вступили в силу. Вот как это выглядит:

    image

    Придерживаясь этого подхода и присваивая соответствующие имена каждой из машин, с которыми вы работаете, вы сможете легко отслеживать, где находитесь.

    После использования 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.

    image

    Когда вы устанавливали 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 перечислены инструменты, которые вы будете использовать для создания ключей.

    image

    Перечисленные операции требуют полномочий 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="info@bootstrap-it.com"
    export KEY_OU="IT"

    Запуск файла vars позволит передать его значения в среду оболочки, откуда они будут включены в содержимое ваших новых ключей. Почему команда sudo сама по себе не работает? Потому что на первом этапе мы редактируем сценарий с именем vars, а затем применяем его. Применение и означает, что файл vars передает свои значения в среду оболочки, откуда они будут включены в содержимое ваших новых ключей.

    Обязательно запустите файл повторно, используя новую оболочку, чтобы завершить незаконченный процесс. Когда это будет сделано, сценарий предложит вам запустить другой сценарий, clean-all, для удаления любого содержимого в каталоге /etc/openvpn/easy-rsa/keys/:

    image

    Естественно, следующим шагом будет запуск сценария 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).

    image

    Пройдемся по некоторым из этих настроек.

    • По умолчанию 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).

    image

    Теперь вы можете перейти в каталог /etc/openvpn/ и извлечь ключи сертификации с сервера. Замените IP-адрес сервера или имя домена в примере своими значениями:

    image

    Ничего захватывающего, скорее всего, не произойдет, пока вы не запустите 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 высылается электронная книга.
    Издательский дом «Питер»
    Компания

    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое