One place for hosting & domains

      для

      Установка и настройка Zabbix для безопасного мониторинга удаленных серверов в Ubuntu 20.04


      Автор выбрал Computer History Museum для получения пожертвования в рамках программы Write for DOnations.

      Введение

      Zabbix — это программное обеспечение с открытым исходным кодом для мониторинга сетей и приложений. С его помощью можно выполнять мониторинг в режиме реального времени нескольких тысяч метрических показателей, собранных с серверов, виртуальных машин, сетевых устройств и веб-приложений. Эти параметры могут помочь вам определить текущее состояние инфраструктуры ИТ и выявить проблемы, связанные с компонентами аппаратного или программного обеспечения, до того, как на них пожалуется клиент. Полезная информация хранится в базе данных для возможности анализировать данные с течением времени и повышать качество предоставляемых услуг или планировать модернизацию оборудования.

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

      Сервер Zabbix хранит свои данные в реляционной базе данных, работающей на базе MySQL или PostgreSQL. Также вы можете хранить исторические данные в таких базах данных, как Elasticsearch и TimescaleDB. Zabbix предоставляет веб-интерфейс для возможности просмотра данных и настройки системы.

      В этом обучающем модуле мы настроим Zabbix на двух компьютерах Ubuntu 20.04. Один из них будет настроен в качестве сервера Zabbix, а второй — в качестве клиента, который будет отслеживаться. Сервер Zabbix будет использовать базу данных MySQL для записи данных мониторинга и использовать Nginx для обслуживания веб-интерфейса.

      Предварительные требования

      Для данного обучающего модуля вам потребуется следующее:

      • Два сервера Ubuntu 20.04, настроенных в соответствии с указаниями обучающего модуля Начальная настройка сервера для Ubuntu 20.04, включая пользователя без привилегий root с привилегиями sudo и настроенный брандмауэр ufw. На одном сервере вы установите Zabbix. В этом обучающем модуле он будет называться сервер Zabbix. Он будет отслеживать ваш второй сервер, этот второй сервер будет называться второй сервер Ubuntu.

      • Для сервера, на базе которого будет работать сервер Zabbix, требуется установка Nginx, MySQL и PHP. Следуйте шагам 1–3 нашего обучающего руководства по набору LEMP Ubuntu 20.04 для их настройки на вашем сервере Zabbix.

      • Зарегистрированное доменное имя. В этом обучающем руководстве мы будем использовать your_domain. Вы можете купить доменное имя на Namecheap, получить его бесплатно на Freenom или воспользоваться услугами любого предпочитаемого регистратора доменных имен.

      • На вашем сервере Zabbix должны быть настроены обе нижеследующие записи DNS. Если вы используете DigitalOcean, ознакомьтесь с нашей документацией по DNS для получения подробной информации по их добавлению.

        • Запись A, где your_domain указывает на публичный IP-адрес вашего сервера Zabbix.
        • Запись A, где www.your_domain указывает на публичный IP-адрес вашего сервера Zabbix.

      Кроме того, поскольку сервер Zabbix используется для доступа к ценной информации о вашей инфраструктуре, которую вам нужно защищать от несанкционированного доступа, очень важно обеспечить защиту сервера сертификатом TLS/SSL. Это необязательно, но настоятельно рекомендуется. Если вы хотите защитить ваш сервер, следуйте указаниям руководства Let’s Encrypt в Ubuntu 20.04 после шага 3 этого обучающего модуля.

      Шаг 1 — Установка сервера Zabbix

      Во-первых, нужно установить Zabbix на сервере, на котором вы установили MySQL, Nginx и PHP. Выполните вход на эту машину в качестве пользователя без прав root:

      • ssh sammy@zabbix_server_ip_address

      Zabbix доступен в диспетчере пакетов Ubuntu, но он уже устарел, поэтому используйте официальный репозиторий Zabbix для установки последней стабильной версии. Загрузите и установите пакет конфигурации репозитория:

      • wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+focal_all.deb
      • sudo dpkg -i zabbix-release_5.0-1+focal_all.deb

      Результат будет выглядеть следующим образом:

      Output

      Selecting previously unselected package zabbix-release. (Reading database ... 64058 files and directories currently installed.) Preparing to unpack zabbix-release_5.0-1+focal_all.deb ... Unpacking zabbix-release (1:5.0-1+focal) ... Setting up zabbix-release (1:5.0-1+focal) ...

      Обновите индекс пакета, чтобы новый репозиторий включал:

      Затем установите сервер Zabbix и пользовательский веб-интерфейс с поддержкой базы данных MySQL:

      • sudo apt install zabbix-server-mysql zabbix-frontend-php

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

      • sudo apt install zabbix-agent

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

      Шаг 2 — Настройка базы данных MySQL для Zabbix

      Вам нужно создать новую базу данных MySQL и заполнить ее определенной базовой информацией, чтобы она была пригодна для Zabbix. Также вы создадите конкретного пользователя для этой базы данных, чтобы Zabbix не входил в MySQL с помощью учетной записи root.

      Войдите в MySQL в качестве пользователя root:

      Создайте базу данных Zabbix с поддержкой символов UTF-8:

      • create database zabbix character set utf8 collate utf8_bin;

      Затем создайте пользователя, которого будет использовать сервер Zabbix, предоставьте ему доступ к новой базе данных и установите пароль для пользователя:

      • create user zabbix@localhost identified by 'your_zabbix_mysql_password';
      • grant all privileges on zabbix.* to zabbix@localhost;

      Он защитит пользователя и базу данных. Выйдите из консоли базы данных.

      Далее вам потребуется импортировать начальную схему и данные. При установке Zabbix вам был предоставлен файл, который сделает это.

      Запустите следующую команду для настройки схемы и импорта данных в базу данных zabbix. Используйте zcat, так как данные в файле сжаты:

      • zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

      Введите пароль пользователя MySQL zabbix, который вы настроил при получении соответствующей инструкции.

      Выполнение этой команды может занять одну или две минуты. Если вы видите ошибку ERROR 1045 (28000): Access denied for userzabbix@'localhost' (using password: YES), убедитесь, что используете правильный пароль для пользователя zabbix.

      Чтобы сервер Zabbix использовал эту базу данных, вам нужно задать пароль базы данных в файле конфигурации сервера Zabbix. Откройте файл конфигурации в предпочитаемом текстовом редакторе. В этом обучающем руководстве мы будем использовать nano:

      • sudo nano /etc/zabbix/zabbix_server.conf

      Найдите следующую часть файла:

      /etc/zabbix/zabbix_server.conf

      ...
      ### Option: DBPassword                           
      #       Database password. Ignored for SQLite.   
      #       Comment this line if no password is used.
      #                                                
      # Mandatory: no                                  
      # Default:                                       
      # DBPassword=
      ...
      

      Эти комментарии в файле объясняют, как подключаться к базе данных. Вам необходимо задать значение DBPassword в файле для пароля для вашего пользователя базы данных. Добавьте эту строку после этих комментариев для настройки базы данных:

      /etc/zabbix/zabbix_server.conf

      ...
      DBPassword=your_zabbix_mysql_password
      ...
      

      Сохраните и закройте zabbix_server.conf​​​, нажав CTRL+X, а затем Y и ENTER, если вы используете nano.

      Теперь вы настроили сервер Zabbix для подключения к базе данных. Затем вы настроите веб-сервер Nginx для обслуживания пользовательского интерфейса Zabbix.

      Шаг 3 — Настройка Nginx для Zabbix

      Для автоматической настройки Nginx установите пакет автоматической настройки:

      • sudo apt install zabbix-nginx-conf

      В результате вы получите файл конфигурации /etc/zabbix/nginx.conf, а также ссылку на него в каталоге конфигурации Nginx /etc/zabbix/nginx.conf.

      Затем вам нужно внести изменения в этот файл. Откройте файл конфигурации:

      • sudo nano /etc/zabbix/nginx.conf

      Файл содержит автоматически сгенерированную конфигурацию серверного блока Nginx. Он содержит две строки, определяющие имя сервера и порт, который он прослушивает:

      /etc/zabbix/nginx.conf

      server {
      #        listen          80;
      #        server_name     example.com;
      ...
      

      Раскомментируйте две строки и замените example.com на свое доменное имя. Ваши настройки будут выглядеть следующим образом:

      /etc/zabbix/nginx.conf

      server {
              listen          80;
              server_name     your_domain;
      ...
      

      Сохраните и закройте файл. Проведите тестирования, чтобы убедиться в отсутствии ошибок синтаксиса в файлах Nginx, и повторно загрузите конфигурацию:

      • sudo nginx -t
      • sudo nginx -s reload

      Теперь, после настройки Nginx для обслуживания пользовательского интерфейса Zabbix, вы внесете некоторые изменения в настройку PHP, чтобы обеспечить правильность работы пользовательского интерфейса

      Примечание. Как указывалось в разделе предварительных требований, рекомендуется включить на сервере SSL/TLS. Если вы хотите сделать это, перед тем как перейти к шагу 4, выполните действия нашего обучающего модуля о Let’s Encrypt в Ubuntu 20.04 для получения бесплатного сертификата SSL для Nginx. Этот процесс автоматически обнаружит ваш серверный блок Zabbix и выполнит настройку для HTTPS. После получения сертификата SSL/TLS вы можете вернуться и завершить прохождение этого обучающего модуля.

      Шаг 4 — Настройка PHP для Zabbix

      Веб-интерфейс Zabbix написан на языке PHP, и для него требуется ряд специальных настроек сервера PHP. В ходе установки Zabbix был создан файл конфигурации PHP-FPM, который содержит эти настройки. Он расположен в каталоге /etc/zabbix и загружается автоматически PHP-FPM. Вам нужно внести небольшое изменение в этот файл, поэтому откройте его следующим образом:

      • sudo nano /etc/zabbix/php-fpm.conf

      Файл содержит параметры PHP, соответствующие необходимым требованиям для веб-интерфейса Zabbix. Однако настройка часового пояса комментируется по умолчанию. Чтобы Zabbix использовал правильное время, необходимо установить соответствующий часовой пояс:

      /etc/zabbix/php-fpm.conf

      ...
      php_value[max_execution_time] = 300
      php_value[memory_limit] = 128M
      php_value[post_max_size] = 16M
      php_value[upload_max_filesize] = 2M
      php_value[max_input_time] = 300
      php_value[max_input_vars] = 10000
      ; php_value[date.timezone] = Europe/Riga
      

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

      Теперь перезапустите PHP-FPM для применения этих новых настроек:

      • sudo systemctl restart php7.4-fpm.service

      Теперь вы можете запустить сервер Zabbix:

      • sudo systemctl start zabbix-server

      Затем проверьте правильность работы сервера Zabbix:

      • sudo systemctl status zabbix-server

      Вы увидите следующий статус:

      Output

      ● zabbix-server.service - Zabbix Server Loaded: loaded (/lib/systemd/system/zabbix-server.service; disabled; vendor preset: enabled) Active: active (running) since Fri 2020-06-12 05:59:32 UTC; 36s ago Process: 27026 ExecStart=/usr/sbin/zabbix_server -c $CONFFILE (code=exited, status=0/SUCCESS) ...

      Наконец, включите запуск сервера в момент загрузки:

      • sudo systemctl enable zabbix-server

      Сервер настроен и подключен к базе данных. Затем настройте веб-интерфейс.

      Шаг — Конфигурация настроек для веб-интерфейса Zabbix

      Веб-интерфейс позволяет видеть отчеты и добавлять хосты, которые вы хотите отслеживать, но для этого требуется определенная начальная настройка. Запустите браузер и перейдите по адресу http://zabbix_server_name или https://zabbix_server_name, если вы установили Let’s Encrypt. На первом экране вы увидите приветственное сообщение. Нажмите Next step (Далее), чтобы продолжить.

      На следующем экране вы увидите таблицу, где будут перечислены все предварительные требования для запуска Zabbix.

      Предварительные требования

      Рядом со всеми значениями в этой таблице должно стоять ОК, проверьте это. Обязательно прокрутите вниз и просмотрите все предварительные требования. Убедившись, что все готово, нажмите Next step (Далее), чтобы продолжить.

      Следующий экран запросит данные для подключения базы данных.

      Подключение базы занных

      Вы сообщили серверу Zabbix о вашей базе данных, но веб-интерфейсу Zabbix также необходим доступ к базе данных для управления хостами и считывания данных. Поэтому введите учетные данные MySQL, настроенные в шаге 2. Нажмите Next step (Далее), чтобы продолжить.

      На следующем экране вы можете оставить опции по умолчанию.

      Данные сервера Zabbix

      Name (Имя) необязательно; оно используется в веб-интерфейсе, чтобы различать серверы, если у вас несколько отслеживающих серверов. Нажмите Next step (Далее), чтобы продолжить.

      На следующем экране отобразится резюме предварительной установки, чтобы убедиться, что все указано верно.

      Summary

      Нажмите Next step (Далее), чтобы перейти к последнему экрану.

      Теперь установка веб-интерфейса завершена. В ходе этого процесса создается файл конфигурации /usr/share/zabbix/conf/zabbix.conf.php. Можно сделать его резервную копию и использовать в будущем. Нажмите Finish (Готово), чтобы перейти на экран входа. По умолчанию устанавливается пользователь Admin и пароль zabbix.

      Перед входом, установите агент Zabbix на вашем втором сервере Ubuntu.

      Шаг 6 — Установка и настройка агента Zabbix

      Теперь вам нужно настроить ПО агента, которое будет отправлять данные мониторинга на сервер

      Войдите на второй сервер Ubuntu:

      • ssh sammy@second_ubuntu_server_ip_address

      Как и на сервере Zabbix, запустите следующие команды для установки пакета конфигурации репозитория:

      • wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+focal_all.deb
      • sudo dpkg -i zabbix-release_5.0-1+focal_all.deb

      Затем обновите индекс пакета:

      Затем установите агент Zabbix:

      • sudo apt install zabbix-agent

      Хотя Zabbix поддерживает шифрование с помощью сертификата, настройка центра сертификации на входит в этот обучающий модуль. Но вы можете использовать предварительно предоставленные ключи (PSK)​​​ для защиты соединения между сервером и агентом.

      Сначала, сгенерируйте PSK:

      • sudo sh -c "openssl rand -hex 32 > /etc/zabbix/zabbix_agentd.psk"

      Отобразите ключ с помощью cat​​​, чтобы скопировать его:

      • cat /etc/zabbix/zabbix_agentd.psk

      Ключ будет выглядеть примерно так:

      Output

      75ad6cb5e17d244ac8c00c96a1b074d0550b8e7b15d0ab3cde60cd79af280fca

      Сохраните его для дальнейшего использования. Он потребуется для конфигурации хоста.

      Теперь отредактируйте настройки агента Zabbix для установки безопасного подключения к серверу Zabbix. Откройте в файл конфигурации агента в своем текстовом редакторе:

      • sudo nano /etc/zabbix/zabbix_agentd.conf

      Каждая настройка в этом файле документируется с помощью информационных комментариев по всему файлу, но вам нужно отредактировать только некоторые из них.

      Сначала нужно отредактировать IP-адрес сервера Zabbix. Найдите следующий раздел:

      /etc/zabbix/zabbix_agentd.conf

      ...
      ### Option: Server
      #       List of comma delimited IP addresses, optionally in CIDR notation, or DNS names of Zabbix servers and Zabbix proxies.
      #       Incoming connections will be accepted only from the hosts listed here.
      #       If IPv6 support is enabled then '127.0.0.1', '::127.0.0.1', '::ffff:127.0.0.1' are treated equally
      #       and '::/0' will allow any IPv4 or IPv6 address.
      #       '0.0.0.0/0' can be used to allow any IPv4 address.
      #       Example: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.example.com
      #
      # Mandatory: yes, if StartAgents is not explicitly set to 0
      # Default:
      # Server=
      
      Server=127.0.0.1
      ...
      

      Измените значение по умолчанию на IP-адрес вашего сервера Zabbix:

      /etc/zabbix/zabbix_agentd.conf

      ...
      Server=zabbix_server_ip_address
      ...
      

      По умолчанию сервер Zabbix подключается к агенту. Но для некоторых проверок (например, для мониторинга журналов) требуется обратное подключение. Для правильной работы нужно указать адрес сервера Zabbix и уникальное имя хоста.

      Найдите раздел, который настраивает активные проверки и измените значения по умолчанию:

      /etc/zabbix/zabbix_agentd.conf

      ...
      ##### Active checks related
      
      ### Option: ServerActive
      #       List of comma delimited IP:port (or DNS name:port) pairs of Zabbix servers and Zabbix proxies for active checks.
      #       If port is not specified, default port is used.
      #       IPv6 addresses must be enclosed in square brackets if port for that host is specified.
      #       If port is not specified, square brackets for IPv6 addresses are optional.
      #       If this parameter is not specified, active checks are disabled.
      #       Example: ServerActive=127.0.0.1:20051,zabbix.domain,[::1]:30051,::1,[12fc::1]
      #
      # Mandatory: no
      # Default:
      # ServerActive=
      
      ServerActive=zabbix_server_ip_address
      
      ### Option: Hostname
      #       Unique, case sensitive hostname.
      #       Required for active checks and must match hostname as configured on the server.
      #       Value is acquired from HostnameItem if undefined.
      #
      # Mandatory: no
      # Default:
      # Hostname=
      
      Hostname=Second Ubuntu Server
      ...
      

      Затем найдите раздел, который настраивает надежное подключение к серверу Zabbix и активирует поддержку предварительно предоставленный ключ Найдите раздел TLSConnect, который выглядит следующим образом:

      /etc/zabbix/zabbix_agentd.conf

      ...
      ### Option: TLSConnect
      #       How the agent should connect to server or proxy. Used for active checks.
      #       Only one value can be specified:
      #               unencrypted - connect without encryption
      #               psk         - connect using TLS and a pre-shared key
      #               cert        - connect using TLS and a certificate
      #
      # Mandatory: yes, if TLS certificate or PSK parameters are defined (even for 'unencrypted' connection)
      # Default:
      # TLSConnect=unencrypted
      ...
      

      Затем добавьте эту строку для конфигурации поддержки предварительно предоставленного ключа:

      /etc/zabbix/zabbix_agentd.conf

      ...
      TLSConnect=psk
      ...
      

      Затем найдите раздел TLSAccept, который выглядит следующим образом:

      /etc/zabbix/zabbix_agentd.conf

      ...
      ### Option: TLSAccept
      #       What incoming connections to accept.
      #       Multiple values can be specified, separated by comma:
      #               unencrypted - accept connections without encryption
      #               psk         - accept connections secured with TLS and a pre-shared key
      #               cert        - accept connections secured with TLS and a certificate
      #
      # Mandatory: yes, if TLS certificate or PSK parameters are defined (even for 'unencrypted' connection)
      # Default:
      # TLSAccept=unencrypted
      ...
      

      Настройте входящие соединения для поддержки предварительно предоставленных ключей, добавив эту строку:

      /etc/zabbix/zabbix_agentd.conf

      ...
      TLSAccept=psk
      ...
      

      Затем найдите раздел TLSPSKIdentity, который выглядит следующим образом:

      /etc/zabbix/zabbix_agentd.conf

      ...
      ### Option: TLSPSKIdentity
      #       Unique, case sensitive string used to identify the pre-shared key.
      #
      # Mandatory: no
      # Default:
      # TLSPSKIdentity=
      ...
      

      Выберите уникальное имя для идентификации вашего предварительно предоставленного ключа, добавив эту строку:

      /etc/zabbix/zabbix_agentd.conf

      ...
      TLSPSKIdentity=PSK 001
      ...
      

      Вы будете использовать его в качестве идентификатора PSK при добавлении хоста через веб-интерфейс Zabbix.

      Затем установите опцию, которая указывает на ранее созданный предварительно предоставленный ключ. Найдите опцию TLSPSKfile:

      /etc/zabbix/zabbix_agentd.conf

      ...
      ### Option: TLSPSKFile
      #       Full pathname of a file containing the pre-shared key.
      #
      # Mandatory: no
      # Default:
      # TLSPSKFile=
      ...
      

      Добавьте эту строку, чтобы направить агент Zabbix в созданный вами файл PSK:

      /etc/zabbix/zabbix_agentd.conf

      ...
      TLSPSKFile=/etc/zabbix/zabbix_agentd.psk
      ...
      

      Сохраните и закройте файл. Теперь вы можете перезапустить агент Zabbix и установить его запуск в момент загрузки:

      • sudo systemctl restart zabbix-agent
      • sudo systemctl enable zabbix-agent

      В дополнение к этому проверьте правильность работы агента Zabbix:

      • sudo systemctl status zabbix-agent

      Вы увидите следующий статус, указывающий на то, что агент работает:

      Output

      ● zabbix-agent.service - Zabbix Agent Loaded: loaded (/lib/systemd/system/zabbix-agent.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2020-06-12 08:19:54 UTC; 25s ago ...

      Агент будет прослушивать порт 10050 для подключений с сервера. Настройте UFW для разрешения подключений к этому порту:

      Дополнительную информацию о UFW можно получить в статье Настройка брандмауэра с UFW в Ubuntu 20.04.

      Теперь ваш агент готов направлять данные на сервер Zabbix. Но для его использования необходимо подключаться к нему с веб-консоли сервера. В следующем шаге вы завершите настройку.

      Шаг 7 — Добавление нового хоста на сервер Zabbix

      Установка агента на сервер, который вы хотите отслеживать, составляет только половину процесса. Каждый хост, который вы хотите отслеживать, должен быть зарегистрирован на сервере Zabbix, что вы можете сделать через веб-интерфейс.

      Войдите в веб-интерфейс сервера Zabbix, перейдя по адресу http://zabbix_server_name​​​ или https://zabbix_server_name:

      Экран входа в Zabbix

      После того, как вы выполните вход, нажмите Configuration (Настройка), затем Hosts (Хосты) на левой панели управления. Затем нажмите кнопку Create host​​​​​​ (Создать хост) в верхнем правом углу экрана. Откроется страница настройки хоста.

      Создание хоста

      Настройте Имя хоста и IP-адрес, чтобы они отображали имя хоста и IP-адрес вашего второго сервера Ubuntu, а затем добавьте хост в группу. Вы можете выбрать существующую группу, например серверы Linux, или создать собственную группу. Хост может быть в нескольких группах. Для этого введите имя существующей или новой группы в поле Groups (Группы) и выберите желаемое значение из предлагаемого списка.

      Перед тем как добавить группу, нажмите на вкладку Templates​​​.

      Добавление шаблона в хост

      Введите Template OS Linux by Zabbix agent​​​ в поле Search​​​ (Поиск) и затем выберите его из списка, чтобы добавить этот шаблон в хост.

      Затем перейдите на вкладку Encryption (Шифрование). Выберите PSK для Connections to host (Входящие соединения на хост) и Connections from host​​​ (Исходящие соединения от хоста). Затем установите в PSK identity​​​ (Идентификация PSK) настройку PSK 001, которая является значением настройки TLSPSKIdentity агента Zabbix, настроенного ранее. Затем установите значение PSK для ключа, который вы сгенерировали для агента Zabbix. Он хранится в файле /etc/zabbix/zabbix_agentd.psk на компьютере агента.

      Настройка шифрования

      Наконец, нажмите кнопку Add​​​ (Добавить) внизу формы для создания хоста.

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

      Zabbix

      Если у вас есть еще серверы для мониторинга, войдите в каждый хост, установите агент Zabbix, сгенерируйте PSK, настройте агент и добавьте хост в веб-интерфейс, выполнив те же действия, что и при добавлении первого хоста.

      Сервер Zabbix теперь отслеживает ваш второй сервер Ubuntu. Теперь настройте уведомления по электронной почте, чтобы знать о возникновении проблем.

      Шаг 8 — Настройка уведомлений по электронной почте

      Zabbix автоматически поддерживает несколько типов уведомлений: по электронной почте, в OTRS, Slack, Telegram​​​, СМС и т. д. Весь список совместимости можно увидеть на веб-сайте Zabbix.

      В качестве примера в этом обучающем модуле мы настроим уведомления по электронной почте.

      Нажмите Administration (Управление), а затем Media types (Типы связи) на левой панели навигации. Вы увидите список всех типов связи. Для электронной почты предусмотрено две предварительно настроенные опции: обычное текстовое уведомление и уведомления HTML. В этом обучающем модуле будет использоваться простое текстовое уведомление. Нажмите на Email​​​ (электронная почта).

      Настройте опции SMTP в соответствии с настройками, предоставленными вашей почтовой службой. В этом обучающем модуле используются возможности SMTP почтовой службы Gmail. При необходимости дополнительной информации об этой настройке см. Использование сервера SMTP Google.

      Примечание. Если вы используете двухэтапную аутентификацию для Gmail, необходимо сгенерировать пароль приложения для Zabbix. Пароль приложения вводится только один раз во время установки. Инструкции по генерированию этого пароля можно получить в Справочном центре Google.

      Если вы используете Gmail, введите smtp.gmail.com в поле SMTP server​​​ (Сервер SMTP), 465​​​​​​ в поле SMTP server port​​​ (Порт сервера SMTP), gmail.com в SMTP helo и ваш адрес электронной почты в SMTP email​​​ (Электронная почта SMTP). Затем выберите SSL/TLS для Connection security (Безопасность подключения) и Имя пользователя и пароль для Authentication​​​ (Аутентификация). Введите адрес Gmail в качестве Username (Имя пользователя) и пароль приложения, сгенерированный в учетной записи Google, в качестве Password (Пароль).

      Настройка электронной почты в качестве средства связи

      На вкладке Message templates (Шаблоны сообщений) вы увидите список стандартных сообщений для различных типов уведомлений. Наконец, нажмите кнопку Update​​​ (Обновить) внизу формы для обновления параметров электронной почты.

      Теперь вы можете протестировать отправку уведомлений. Для этого нажмите на подчеркнутую ссылку Test​​ (Тестирование) в соответствующей строке.

      Вы увидите всплывающее окно. Введите свой адрес электронной в поле Send to (Отправить) и нажмите кнопку Test Тестирование. Вы увидите сообщение об успешной отправке и получите тестовое сообщение.

      Тестирование электронной почты

      Закройте всплывающее окно, нажав кнопку Cancel (Отмена).

      Теперь создайте нового пользователя. Нажмите Administration (Управление), а затем Users (Пользователи) на левой панели навигации. Вы увидите список пользователей. Затем нажмите кнопку Create user (Создать пользователя) в верхнем правом углу экрана. Откроется страница настройки пользователя:

      Создание

      Введите новое имя пользователя в поле Alias (Псевдоним) и установите новый пароль. Затем добавьте пользователя в группу администратора. Введите Zabbix administrators в поле Groups (Группы) и выберите его из предложенного списка.

      После добавления группы нажмите на вкладку Media (Средство связи) и нажмите на подчеркнутую ссылку Add (не на кнопку Add (Добавить) под ней). Вы увидите всплывающее окно.

      Добавление электронной почты

      Выберите опцию Email (Электронная почта) из выпадающего списка поля Type (тип). Введите свой адрес электронной почты в поле Send to (Отправить). В остальных опциях можно оставить значения по умолчанию. Нажмите кнопку Add (Добавить) внизу для отправки.

      Теперь перейдите на вкладку Permissions (Разрешения). Выберите Zabbix Super Admin (Суперадминистратор Zabbix) из выпадающего меню поля User type (Тип пользователя).

      Наконец, нажмите кнопку Add​​​ (Добавить) внизу формы для создания пользователя.

      Примечание. Использование пароля по умолчанию небезопасно. Чтобы изменить пароль встроенного пользователя Admin (Администратор), нажмите на псевдоним в списке пользователей. Затем нажмите Change password (Изменить пароль), введите новый пароль и подтвердите изменения, нажав на кнопку Update (Обновить).

      Теперь необходимо включить уведомления. Нажмите на вкладку Configuration (Настройка), а затем Actions (Действия) на левой панели навигации. Вы увидите предварительно настроенное действие, отвечающее за отправку уведомлений всем администраторам Zabbix. Вы можете проверять и менять настройки, нажимая на названия. Для целей данного обучающего модуля используйте параметры по умолчанию. Чтобы активировать действие, нажмите на красную ссылку Disabled​​​ (Отключено) в столбце Status (Статус).

      Теперь вы готовы получать оповещения. В следующем шаге вы сгенерируете одно для тестирования настройки уведомлений.

      Шаг 9 — Создание тестового оповещения

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

      Создайте временный файл, чтобы он был достаточно большим, чтобы сработало оповещение об использовании файловой системы Для этого войдите на второй сервер Ubuntu, если вы еще не подключены:

      • ssh sammy@second_ubuntu_server_ip_address

      Затем определите, сколько есть свободного места на сервере. Чтобы выяснить это, можно использовать команду df​​​:

      Команда df будет сообщать об использовании места на диске в вашей файловой системе, а -h сделает читаемый вывод. Результат будет выглядеть примерно следующим образом:

      Output

      Filesystem Size Used Avail Use% Mounted on /dev/vda1 78G 1.4G 77G 2% /

      В этом случае свободное пространство составляет 77G. Ваше свободное пространство может отличаться.

      Используйте команду fallocate, которая позволяет предварительно распределять или освобождать пространство для файла или создавать файл, который занимает более 80 % имеющегося пространства на диске. Этого будет достаточно, чтобы сработало оповещение:

      • fallocate -l 70G /tmp/temp.img

      Приблизительно через час Zabbix активирует оповещение об объеме свободного пространства на диске и запустит действие, которое вы настроили, чтобы отправить сообщение с уведомлением. Вы можете проверить входящие на наличие сообщения с сервера Zabbix. Сообщение может выглядеть следующим образом:

      Problem started at 09:49:08 on 2020.06.12
      Problem name: /: Disk space is low (used > 80%)
      Host: Second Ubuntu Server
      Severity: Warning
      Operational data: Space used: 71.34 GB of 77.36 GB (92.23 %)
      Original problem ID: 106
      

      Также вы можете перейти на вкладку Monitoring (Мониторинг), а затем на Dashboard​​​ (Панель управления), чтобы увидеть уведомление и детали.

      Главная панель управления

      Теперь, когда вы знаете, как работают оповещения, удалите созданный временный файл, чтобы освободить место на диске:

      Через одну минуту Zabbix отправит сообщение и оповещение исчезнет с главной панели управления.

      Заключение

      В этом обучающем модуле вы узнали, как настраивать простое и надежное решение для мониторинга, которое поможет отслеживать состояние ваших серверов. Теперь вы сможете получать предупреждения о проблемах и иметь возможность анализировать процессы, происходящие в вашей ИТ-инфраструктуре.

      Дополнительную информацию о настройке инфраструктуры мониторинга можно найти на нашей тематической странице, посвященной мониторингу.



      Source link

      Использование типа данных MySQL BLOB для хранения изображений с PHP в Ubuntu 18.04


      Автор выбрал Girls Who Code для получения пожертвования в рамках программы Write for DOnations.

      Введение

      Большие двоичные объекты (BLOB) — это тип данных MySQL для хранения двоичных данных, таких как изображения, мультимедийные файлы и файлы PDF.

      При создании приложений, для которых требуются тесно связанные базы данных, где изображения нужно синхронизировать с другими данными (например, портал сотрудников, база данных студентов или финансовое приложение), будет полезно хранить изображения, например, фотографии паспортов и подписей студентов, в базе данных MySQL вместе с другой связанной информацией.

      Для этой цели будет полезен тип данных MySQL BLOB. Такой подход к программированию устраняет необходимость создания отдельной файловой системы для хранения изображений. Такая схема также обеспечивает централизацию базы данных, делая ее более портативной и безопасной за счет изоляции данных от файловой системы. Создавать резервные копии также будет проще, поскольку для этого достаточно будет создать один файл дампа MySQL, где будут храниться все ваши данные.

      Получение данных также ускорится, и при создании записей вы можете быть уверены в соблюдении правил проверки данных и целостности ссылок, особенно при использовании транзакций MySQL.

      В этом обучающем модуле мы используем тип данных MySQL BLOB для сохранения изображений в коде PHP в Ubuntu 18.04.

      Предварительные требования

      Для выполнения этого обучающего модуля вам потребуется следующее:

      Шаг 1 — Создание базы данных

      Для начала создайте тестовую базу данных для своего проекта. Для этого подключитесь к серверу через SSH и запустите следующую команду для входа на сервер MySQL с привилегиями root:

      Введите пароль пользователя root для вашей базы данных MySQL и нажмите ENTER, чтобы продолжить.

      Затем запустите следующую команду для создания базы данных. В этом обучающем модуле мы назовем базу данных test_company:

      • CREATE DATABASE test_company;

      После создания базы данных вы увидите следующее:

      Output

      Query OK, 1 row affected (0.01 sec)

      Затем создайте учетную запись test_user на сервере MySQL и обязательно замените PASSWORD на надежный пароль:

      • CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';

      Вывод должен выглядеть так:

      Output

      Query OK, 0 rows affected (0.01 sec)

      Чтобы предоставить пользователю test_user полные права доступа к базе данных test_company, выполните команду:

      • GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';

      Вы должны увидеть следующее:

      Output

      Query OK, 0 rows affected (0.01 sec)

      Очистите таблицу прав доступа, чтобы СУБД MySQL перезагрузила разрешения:

      На экран должно быть выведено следующее:

      Output

      Query OK, 0 rows affected (0.01 sec)

      Мы подготовили базу данных test_company и пользователя test_user. Теперь мы можем перейти к созданию таблицы products для сохранения образцов продуктов. Позднее мы используем эту таблицу для вставки и получения записей, чтобы продемонстрировать работу объектов MySQL BLOB.

      Выполните выход из сервера MySQL:

      Снова войдите в систему под учетными данными созданного пользователя test_user:

      Введите в диалоге пароль пользователя test_user и нажмите ENTER, чтобы продолжить. Переключитесь на базу данных test_company с помощью следующей команды:

      После выбора базы данных test_company MySQL выведет на экран следующее:

      Output

      Database changed

      Затем создайте таблицу products, запустив команду:

      • CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;

      Эта команда создает таблицу с именем products. В таблице имеется четыре столбца:

      • product_id: в этом столбце используется тип данных BIGINT, за счет чего обеспечивается поддержка больших списков продуктов, где может содержаться до 2⁶³-1 элементов. Вы пометили столбец как PRIMARY KEY для уникальной идентификации продуктов. Чтобы MySQL обрабатывала генерирование новых идентификаторов для вставленных столбцов, вы использовали ключевое слово AUTO_INCREMENT.

      • product_name: в этом столбце хранятся названия продуктов. Мы использовали тип данных VARCHAR, поскольку это поле обычно обрабатывает не более 50 бувенно-числовых символов. Предел в 50 символов — это гипотетическое значение, используемое для целей этого обучающего модуля.

      • price: для демонстрационных целей мы добавили в таблицу products столбец price для хранения информации о розничной цене продуктов. Поскольку некоторые продукты могут иметь значения с плавающей запятой (например, 23.69, 45.36, 102.99), мы использовали тип данных DOUBLE.

      • product_image: в этом столбце данные типа BLOB используются для хранения двоичных данных изображений продуктов.

      Мы использовали для таблицы InnoDB, СИСТЕМУ ХРАНЕНИЯ, поддерживающую широкий набор функций, включая транзакции MySQL. После выполнения этой команды для создания таблицы products вы увидите на экране следующее:

      Output

      Query OK, 0 rows affected (0.03 sec)

      Выполните выход с сервера MySQL:

      Вы увидите следующее

      Output

      Bye

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

      Шаг 2 — Создание скриптов PHP для подключения к базе данных и ее заполнения

      На этом шаге мы создадим скрипт PHP для подключения к базе данных MySQL, созданной нами на шаге 1. Этот скрипт подготовит три образца продуктов и вставит их в таблицу products.

      Для создания кода PHP откройте новый файл в текстовом редакторе:

      • sudo nano /var/www/html/config.php

      Введите в файл следующую информацию и замените PASSWORD паролем пользователя test_user, созданным на шаге 1:

      /var/www/html/config.php

      <?php
      
      define('DB_NAME', 'test_company');
      define('DB_USER', 'test_user');
      define('DB_PASSWORD', 'PASSWORD');
      define('DB_HOST', 'localhost');
      
      $pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
      
      

      Сохраните и закройте файл.

      В этом файле мы использовали четыре константы PHP для подключения к базе данных MySQL, созданной на шаге 1:

      • DB_NAME : эта константа хранит название базы данных test_company.

      • DB_USER : эта переменная хранит имя пользователя test_user.

      • DB_PASSWORD : эта константа хранит ПАРОЛЬ MySQL для учетной записи test_user.

      • DB_HOST: сервер, где располагается база данных. В данном случае мы используем сервер localhost.

      Следующая строка в вашем файле инициирует объект данных PHP (PDO) и выполняет подключение к базе данных MySQL:

      ...
      $pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
      ...
      

      Ближе к концу файла мы зададим пару атрибутов PDO:

      • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: этот атрибут предписывает PDO выдать исключение, которое можно зарегистрировать для целей отладки.
      • ATTR_EMULATE_PREPARES, false: эта опция повышает безопасности, предписывая СУБД MySQL выполнять подготовку вместо PDO.

      Мы добавим файл /var/www/html/config.php в два скрипта PHP для вставки и получения записей, которые мы сейчас создадим.

      Вначале создайте скрипт PHP /var/www/html/insert_products.php для вставки записей в таблицу products:

      • sudo nano /var/www/html/insert_products.php

      Затем добавьте следующую информацию в файл /var/www/html/insert_products.php:

      /var/www/html/insert_products.php

      <?php
      
      require_once 'config.php';
      
      $products = [];
      
      $products[] = [
                    'product_name' => 'VIRTUAL SERVERS',
                    'price' => 5,
                    'product_image' => file_get_contents("https://i.imgur.com/VEIKbp0.png")
                    ];
      
      $products[] = [
                    'product_name' => 'MANAGED KUBERNETES',
                    'price' => 30,
                    'product_image' => file_get_contents("https://i.imgur.com/cCc9Gw9.png")
                    ];
      
      $products[] = [
                    'product_name' => 'MySQL DATABASES',
                    'price' => 15,
                    'product_image' => file_get_contents("https://i.imgur.com/UYcHkKD.png" )
                    ];
      
      $sql = "INSERT INTO products(product_name, price, product_image) VALUES (:product_name, :price, :product_image)";
      
      foreach ($products as $product) {
          $stmt = $pdo->prepare($sql);
          $stmt->execute($product);
      }
      
      echo "Records inserted successfully";
      

      Сохраните и закройте файл.

      Вы добавили файл config.php в верхней части файла. Это первый файл, который вы создали для определения переменных базы данных и подключения к базе данных. Также этот файл инициирует объект PDO и сохраняет его в переменной $pdo.

      Далее вы создали массив данных о продуктах, которые нужно вставить в базу данных. Помимо значений product_name и price, подготовленных в виде текстовых и числовых значений соответственно, данный скрипт использует встроенную функцию PHP file_get_contents для чтения изображений из внешнего источника и передачи их в виде строк в столбец product_image.

      Затем вы подготовили выражение SQL и использовали выражение PHP foreach{...} для вставки каждого продукта в базу данных.

      Для выполнения файла /var/www/html/insert_products.php запустите его в окне браузера, используя следующий URL. Замените your-server-IP публичным IP-адресом вашего сервера:

      http://your-server-IP/insert_products.php
      

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

      Сообщение об успешной вставке записей в базу данных

      Вы успешно вставили три записи с изображениями продуктов в таблицу products. На следующем шаге мы создадим скрипт PHP для извлечения этих записей и их вывода в браузере.

      Шаг 3 — Отображение информации о продуктах из базы данных MySQL

      Мы разместили в базе данных информацию о продуктах и их ихображения. Теперь мы создадим еще один скрипт PHP, который будет запрашивать и выводить информацию о продуктах в таблице HTML в браузере.

      Для создания файла введите следующее:

      • sudo nano /var/www/html/display_products.php

      Затем введите в файл следующую информацию:

      /var/www/html/display_products.php

      <html>
        <title>Using BLOB and MySQL</title>
        <body>
      
        <?php
      
        require_once 'config.php';
      
        $sql = "SELECT * FROM products";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        ?>
      
        <table border="1" align = 'center'> <caption>Products Database</caption>
          <tr>
            <th>Product Id</th>
            <th>Product Name</th>
            <th>Price</th>
            <th>Product Image</th>
          </tr>
      
        <?php
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo '<tr>';
            echo '<td>' . $row['product_id'] . '</td>';
            echo '<td>' . $row['product_name'] . '</td>';
            echo '<td>' . $row['price'] . '</td>';
            echo '<td>' .
            '<img src = "data:image/png;base64,' . base64_encode($row['product_image']) . '" width = "50px" height = "50px"/>'
            . '</td>';
            echo '</tr>';
        }
        ?>
      
        </table>
        </body>
      </html>
      

      Сохраните изменения в файле и закройте его.

      Здесь мы опять использовали файл config.php для подключения к базе данных. Затем мы подготовили и выполнили команду SQL, используя PDO для извлечения всех элементов из таблицы products с помощью команды SELECT * FROM products.

      Затем мы создали таблицу HTML и заполнили ее данными о продуктах, используя выражение PHP while() {...}. Строка $row = $stmt->fetch(PDO::FETCH_ASSOC) отправляет запрос в базу данных и сохраняет результат в переменной $row как многомерный массив, который затем отображается как столбец таблицы HTML с использованием синтаксиса $row['column_name'].

      Изображения из столбца product_image заключены в теги <img src = "">. Мы использовали атрибуты width и height для уменьшения ширины и высоты изображений, чтобы они поместились в столбце таблицы HTML.

      Чтобы конвертировать данные, хранящиеся в объекте типа BLOB, обратно в изображения, мы использовали встроенную функцию PHP base64_encode и следующий синтаксис схемы URI данных:

      data:media_type;base64, base_64_encoded_data
      

      В данном случае image/png — это значение параметра media_type (тип файла), а закодированная строка Base64 из столбца product_image — это данные base_64_encoded_data.

      Выполните в браузере файл display_products.php, введя следующий адрес:

      http://your-server-IP/display_products.php
      

      Запустив в браузере файл display_products.php, вы увидите таблицу HTML со списком продуктов и связанных с ними изображений.

      Список продуктов из базы данных MySQL

      Это подтверждает, что скрипт PHP для извлечения изображений из базы данных MySQL работает ожидаемым образом.

      Заключение

      В этом обучающем модуле мы использовали тип данных MySQL BLOB для хранения и вывода изображений в коде PHP в Ubuntu 18.04. Мы увидели основные преимущества хранения изображений в базе данных по сравнению с их хранением в файловой системе. В число этих преимуществ входят портативность, безопасность и удобство резервного копирования. Эта технология будет вам полезна, если вы создаете приложение, для которого требуется хранить информацию и изображения вместе, например, студенческий портал или базу данных сотрудников.

      Дополнительную информацию о поддерживаемых типах данных в MySQL можно найти в руководстве по типам данных MySQL. Если вас интересуют дополнительные материалы по MySQL и PHP, пройдите следующие обучающие модули:



      Source link

      Установка и настройка сервера OpenVPN для CentOS 8


      Введение

      Виртуальная частная сеть (VPN) позволит вам работать в незащищенных сетях, как если бы вы находились в частной сети. Она предоставляет возможность получить безопасный и защищенный доступ к сети Интернет со смартфона или ноутбука при подключении к недоверенной сети, например Wi-Fi в отеле или в кафе.

      В сочетании с соединениями HTTPS данная схема позволяет защитить учетные данные и транзакции в беспроводной сети. Вы можете обойти географические ограничения и цензуру и скрыть свое местоположение, а также любой незашифрованный трафик HTTP при работе в незащищенной сети.

      OpenVPN — это полнофункциональное решение VPN с открытым исходным кодом, которое использует протокол TLS и позволяет использовать широкий круг конфигураций. В этом обучающем руководстве вы установите OpenVPN на сервере CentOS 8 и настроите его для доступа с клиентского компьютера.

      Примечание. Если вы планируете настроить сервер OpenVPN на DigitalOcean Droplet, то мы, как и многие поставщики хостинга, будем взимать плату за превышение лимита пропускной способности. По этой причине необходимо следить за объемом трафика, который обрабатывает ваш сервер.

      Дополнительную информацию можно найти на этой странице.

      Предварительные требования

      Для данного обучающего руководства вам потребуется следующее:

      Примечание. Хотя технически возможно использовать ваш сервер OpenVPN или ваш локальный компьютер в качестве центра сертификации, делать это не рекомендуется, поскольку это открывает ваш VPN для ряда уязвимостей. Согласно официальной документации OpenVPN, вы должны разместить ЦС на отдельном компьютере, который будет отвечать за импорт и подписание запросов сертификатов. По этой причине в данном обучающем руководстве предполагается, что ваш ЦС располагается на отдельном сервере CentOS 8, где также имеются пользователь non-root user с привилегиями sudo и активированный базовый брандмауэр.

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

      После выполнения всех предварительных требований вы можете начать установку и настройку сервера OpenVPN на CentOS 8.

      Примечание. Обратите внимание, что если вы отключите аутентификацию с помощью пароля при настройке этих серверов, то можете столкнуться с трудностями при передаче файлов между ними, как предусматривается последующими разделами этого обучающего руководства. Чтобы устранить эту проблему, вам нужно будет заново включить аутентификацию с помощью пароля на каждом сервере. Также вы можете сгенерировать пару ключей SSH для каждого сервера и добавить публичный ключ SSH сервера OpenVPN в файл authorized_keys на компьютере ЦС, и наоборот. Дополнительные инструкции по этим решениям можно найти в обучающем руководстве Настройка ключей SSH в CentOS 8.

      Шаг 1 — Установка OpenVPN и Easy-RSA

      Первый шаг этого руководства подразумевает установку OpenVPN и Easy-RSA. Easy-RSA — это инструмент управления инфраструктурой открытых ключей (PKI), который вы будете использовать на сервере OpenVPN для генерации запроса сертификата, который вы затем будете проверять и подписывать на сервере ЦС.

      OpenVPN и Easy-RSA отсутствуют по умолчанию в CentOS 8, так что вам нужно будет активировать репозиторий Extra Packages for Enterprise Linux (EPEL). EPEL управляется Fedora Project и содержит популярные нестандартные пакеты для Fedora, CentOS и других дистрибутивов Linux, использующих формат пакетов RPM. Войдите на сервер OpenVPN от имени пользователя non-root user с привилегиями sudo, созданного на начальном этапе установки, и запустите следующую команду:

      • sudo dnf install epel-release
      • sudo dnf install openvpn easy-rsa

      Далее вам потребуется создать новую директорию на сервере OpenVPN от имени вашего пользователя non-root user с названием ~/easy-rsa:

      Теперь вам нужно создать символьную ссылку из скрипта easyrsa, установленного пакетом в директории ~/easy-rsa, которую вы только что создали:

      • ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/

      Примечание. Хотя другие руководства могут предписывать скопировать файлы пакета easy-rsa в директорию PKI, в этом обучающем руководстве мы используем подход на основе символьных ссылок. Таким образом, любые изменения пакета easy-rsa будут автоматически отражаться в ваших скриптах PKI.

      В заключение убедитесь, что владельцем директории является ваш пользователь non-root user с привилегиями sudo, и ограничьте доступ с помощью команды chmod:

      • sudo chown sammy ~/easy-rsa
      • chmod 700 ~/easy-rsa

      После установки этих программ и их перемещения в нужные локации в вашей системе следующим шагом будет создание инфраструктуры открытых ключей (PKI) на сервере OpenVPN, чтобы вы могли запрашивать и управлять сертификатами TLS для клиентов и других серверов, которые будут подключаться к вашему VPN.

      Шаг 2 — Создание PKI для OpenVPN

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

      Для создания директории PKI на сервере OpenVPN вам нужно указать в файле vars ряд значений по умолчанию. Используйте команду cd для перехода в директорию easy-rsa, а затем создайте и отредактируйте файл vars с помощью предпочитаемого текстового редактора.

      Предоставляемый с CentOS 8 по умолчанию текстовый редактор — vi. vi является очень мощным текстовым редактором, но освоить работу с ним неопытным пользователям достаточно сложно. Вы можете установить более удобный для пользователя редактор, например nano, для облегчения редактирования файлов конфигурации на сервере CentOS 8:

      Когда вам будет предложено установить nano, введите y, чтобы продолжить выполнение установки. Теперь вы готовы к редактированию файла vars:

      После открытия файла вставьте следующие две строки:

      ~/easy-rsa/vars

      set_var EASYRSA_ALGO "ec"
      set_var EASYRSA_DIGEST "sha512"
      

      Эти строки будут гарантировать, что ваши закрытые ключи и запросы сертификата будут настроены для использования современной криптографии на эллиптических кривых (Elliptic Curve Cryptography, ECC) при генерации ключей и защищенных подписей для ваших клиентов и сервера OpenVPN.

      Под настройкой использования ECC для ваших серверов OpenVPN и ЦС подразумевается, что, когда клиент и сервер будут пытаться установить общий симметричный ключ, они будут использовать алгоритмы эллиптической кривой для обмена. Использование ECC для обмена ключами значительно быстрее, чем использование простого алгоритма Диффи — Хеллмана с классическим алгоритмом RSA, поскольку числа намного меньше, а вычисления выполняются быстрее.

      Справка: когда клиенты подключаются к OpenVPN, они используют асимметричное шифрование (также известное как открытый/закрытый ключ) для выполнения TLS-рукопожатия. Однако при передаче шифрованного VPN-трафика сервер и клиенты используют симметричное шифрование, которое также известно как шифрование общедоступного ключа.

      Симметричное шифрование требует гораздо меньшего количества вычислений по сравнению с асимметричным: используемые числа гораздо меньше, и современные процессоры имеют инструкции для выполнения оптимизированного симметричного шифрования. Для переключения с асимметричного на симметричное шифрование сервер OpenVPN и клиент будут использовать алгоритм Диффи — Хеллмана на эллиптических кривых для согласования общего секретного ключа в максимально короткие сроки.

      После добавления в файл vars данных вы можете перейти к созданию директории PKI. Для этого воспользуйтесь скриптом easyrsa с опцией init-pki. Хотя вы уже использовали эту команду на сервере ЦС в соответствии с предварительными требованиями, необходимо запустить ее здесь, поскольку сервер OpenVPN и сервер ЦС имеют разные директории PKI.

      Обратите внимание, что на сервере OpenVPN не нужно создавать центр сертификации. Ваш сервер ЦС отвечает за валидацию и подпись сертификатов. PKI на вашем сервере VPN используется только в качестве удобного и централизованного места хранения запросов сертификата и публичных сертификатов.

      После инициализации PKI на сервере OpenVPN вы можете перейти к следующему шагу и создать запрос сертификата и закрытого ключа сервера OpenVPN.

      Шаг 3 — Создание запроса сертификата и закрытого ключа сервера OpenVPN

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

      Для начала перейдите в директорию ~/easy-rsa на сервере OpenVPN, используя вашего пользователя non-root user:

      Теперь вы можете вызвать easyrsa с опцией gen-req, за которой необходимо указать стандартное имя для компьютера. Вы можете использовать любое стандартное имя, но лучше всего выбрать запоминающийся вариант. В этом обучающем руководстве для сервера OpenVPN будет использоваться стандартное имя server. Обязательно добавьте опцию nopass. Без этого файл запроса будет защищен паролем, что впоследствии может привести к проблемам с разрешениями.

      Примечание. Если вы выберете любое другое имя, а не server, вы должны будете следовать некоторым из приведенных ниже инструкций с изменениями. Например, при копировании сгенерированных файлов в директорию /etc/openvpn вам нужно будет указать правильные имена. Позднее вам нужно будет изменить файл etc/openvpn/server.conf, чтобы он указывал на соответствующие файлы .crt и .key.

      • ./easyrsa gen-req server nopass

      Output

      Common Name (eg: your user, host, or server name) [server]: Keypair and certificate request completed. Your files are: req: /home/sammy/easy-rsa/pki/reqs/server.req key: /home/sammy/easy-rsa/pki/private/server.key

      В результате будет создан закрытый ключ для сервера и файл запроса сертификата с именем server.req. Скопируйте ключ сервера в директорию /etc/openvpn/server:

      • sudo cp /home/sammy/easy-rsa/pki/private/server.key /etc/openvpn/server/

      В результате выполнения этих шагов вы успешно создали закрытый ключ для вашего сервера OpenVPN. Также вы создали запрос на подпись сертификата для сервера OpenVPN. Запрос на подпись сертификата теперь готов к подписи в вашем центре сертификации. В следующем разделе этого обучающего руководства вы узнаете, как подписать запрос на подпись сертификата с помощью закрытого ключа вашего сервера ЦС.

      Шаг 4 — Подпись запроса сертификата сервера OpenVPN

      На предыдущем шаге вы создали запрос на подпись сертификата (CSR) и закрытый ключ для сервера OpenVPN. Теперь сервер ЦС должен узнать о сертификате server и выполнить его валидацию. После подтверждения сертификата сервером ЦС и его отправки назад на сервер OpenVPN клиенты, которые доверяют вашему ЦС, также смогут доверять серверу OpenVPN.

      На сервере OpenVPN от имени вашего пользователя non-root user воспользуйтесь запросом на передачу или другим методом передачи для копирования запроса сертификата server.req на сервер ЦС для подписи:

      • scp /home/sammy/easy-rsa/pki/reqs/server.req sammy@your_ca_server_ip:/tmp

      Теперь выполните вход на сервер ЦС с помощью пользователя non-root user, которому принадлежат права на директорию easy-rsa, где вы создали ваш PKI. Импортируйте запрос сертификата с помощью скрипта easyrsa:

      • cd ~/easy-rsa
      • ./easyrsa import-req /tmp/server.req server

      Output

      . . . The request has been successfully imported with a short name of: server You may now use this name to perform signing operations on this request.

      Далее подпишите запрос, запустив скрипт easyrsa с опцией sign-req и указанием типа запроса и стандартного имени. В качестве типа запроса может использоваться client или server. Поскольку мы работаем с запросом сертификата сервера OpenVPN, необходимо использовать тип запроса server:

      • ./easyrsa sign-req server server

      В выводе вам будет нужно подтвердить, что запрос поступил из надежного источника. Введите yes, а затем нажмите ENTER для подтверждения:

      Output

      You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a server certificate for 3650 days: subject= commonName = server Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes . . . Certificate created at: /home/sammy/easy-rsa/pki/issued/server.crt

      Обратите внимание, что если вы зашифровали закрытый ключ ЦС, вам будет предложено ввести пароль в данный момент.

      В результате выполнения этих шагов вы успешно подписали запрос сертификата сервера OpenVPN с помощью закрытого ключа сервера ЦС. Полученный файл server.crt​​​ содержит открытый ключ шифрования сервера OpenVPN, а также новую подпись от сервера ЦС. Смысл подписи состоит в том, чтобы сообщить всем, кто доверяет серверу ЦС, что они также могут доверять серверу OpenVPN при подключении к нему.

      Для завершения настройки сертификатов скопируйте файлы server.crt и ca.crt с сервера ЦС на сервер OpenVPN:

      • scp pki/issued/server.crt sammy@your_vpn_server_ip:/tmp
      • scp pki/ca.crt sammy@your_vpn_server_ip:/tmp

      Теперь вернитесь на ваш сервер OpenVPN, скопируйте файлы из /tmp в /etc/openvpn/server:

      • sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server

      Теперь ваш сервер OpenVPN почти готов к принятию подключений. На следующем шаге вы выполните ряд дополнительных шагов для повышения безопасности сервера.

      Шаг 5 — Настройка криптографических материалов OpenVPN

      В качестве дополнительного уровня безопасности мы добавим дополнительный общий секретный ключ, который будет использовать сервер и все клиенты, с помощью директивы OpenVPN tls-crypt. Эта опция используется, чтобы «затемнить» сертификат TLS, используемый, когда сервер и клиент первоначально подключаются друг к другу. Также она используется сервером OpenVPN для выполнения быстрых проверок входящих пакетов: если пакет подписан с помощью предварительно предоставленного ключа, сервер обрабатывает его, если подпись отсутствует, сервер понимает, что пакет получен из непроверенного источника, и может отклонить его, не выполняя дополнительную работу по расшифровке.

      Эта опция поможет убедиться, что ваш сервер OpenVPN может справляться с неудостоверенным трафиком, сканированием портов и DoS-атаками, которые могут связывать ресурсы сервера. Она также затрудняет выявление сетевого трафика OpenVPN.

      Для получения предварительно предоставленного ключа tls-crypt​​​ запустите следующую команду на сервере OpenVPN в директории ~/easy-rsa:

      • cd ~/easy-rsa
      • openvpn --genkey --secret ta.key

      В результате вы получите файл с именем ta.key. Скопируйте его в директорию /etc/openvpn/server/:

      • sudo cp ta.key /etc/openvpn/server

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

      Шаг 6 — Создание сертификата клиента и пары ключей

      Хотя вы можете сгенерировать закрытый ключ и запрос сертификата на клиентской системе и отправить их в ЦС для подписания, в этом обучающем руководстве мы рассмотрим процесс генерирования запроса сертификата на сервере OpenVPN. Преимущество этого подхода заключается в том, что мы можем создать скрипт, который будет автоматически генерировать файлы конфигурации клиентов, содержащие все необходимые ключи и сертификаты. Благодаря этому вам не нужно будет передавать ключи, сертификаты и файлы конфигурации на клиентские системы, и процесс подключения к VPN ускорится.

      В этом обучающем руководстве мы создадим одну пару из ключа и сертификата для клиентской системы. Если у вас несколько клиентских систем, вы можете повторить этот процесс для каждой такой системы. Обратите внимание, что для каждого клиента в скрипте нужно указать уникальное имя. В этом обучающем руководстве мы будем использовать первую пару сертификат/ключ под именем client1.

      Вначале создайте в домашней директории структуру директорий, где будут храниться файлы сертификатов и ключей клиентской системы:

      • mkdir -p ~/client-configs/keys

      Поскольку в этой директории будут храниться пары сертификат/ключ ваших клиентов и файлы конфигурации, для нее следует закрыть все разрешения:

      • chmod -R 700 ~/client-configs

      Вернитесь в директорию EasyRSA и запустите скрипт easyrsa с опциями gen-req и nopass, указав обычное имя клиента:

      • cd ~/easy-rsa
      • ./easyrsa gen-req client1 nopass

      Нажмите ENTER, чтобы подтвердить обычное имя. Скопируйте файл client1.key в ранее созданную директорию ~/client-configs/keys/​​​:

      • cp pki/private/client1.key ~/client-configs/keys/

      Затем передайте файл client1.req на сервер ЦС, используя безопасный метод:

      • scp pki/reqs/client1.req sammy@your_ca_server_ip:/tmp

      Теперь выполните вход на ваш сервер ЦС. Затем перейдите в директорию EasyRSA и импортируйте запрос сертификата:

      • cd ~/easy-rsa
      • ./easyrsa import-req /tmp/client1.req client1

      Затем подпишите запрос, как вы делали это для сервера на предыдущем шаге. Однако в этот раз обязательно укажите тип запроса client:

      • ./easyrsa sign-req client client1

      При запросе введите yes, чтобы подтвердить, что вы планируете подписать запрос сертификата и что он поступил из доверенного источника:

      Output

      Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes

      Если вы зашифровали свой ключ ЦС, вам будет предложено ввести пароль.

      В результате будет создан файл клиентского сертификата с именем client1.crt. Переместите этот файл обратно на сервер.

      • scp pki/issued/client1.crt sammy@your_server_ip:/tmp

      Вернитесь на ваш сервер OpenVPN, скопируйте клиентский сертификат в директорию ~/client-configs/keys/​​:

      • cp /tmp/client1.crt ~/client-configs/keys/

      Затем скопируйте файлы ca.crt и ta.key в директорию ~/client-configs/keys/ и предоставьте соответствующие разрешения для вашего пользователя sudo:

      • cp ~/easy-rsa/ta.key ~/client-configs/keys/
      • sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
      • sudo chown sammy.sammy ~/client-configs/keys/*

      В результате вы сгенерировали ключи и сертификаты для сервера и клиента и сохранили их в соответствующих директориях на вашем сервере OpenVPN. С этими файлами еще предстоит выполнить несколько действий, но к ним мы вернемся позднее. Теперь вы можете перейти к настройке OpenVPN.

      Шаг 7 — Настройка OpenVPN

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

      Вначале скопируйте файл server.conf в качестве отправной точки для вашего собственного файла конфигурации:

      • sudo cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/

      Откройте новый файл для редактирования в текстовом редакторе по вашему выбору. В нашем случае мы будем использовать nano:

      • sudo nano /etc/openvpn/server/server.conf

      Нам нужно изменить несколько строк в этом файле. Сначала необходимо найти раздел HMAC в конфигурации, выполнив поиск директивы tls-auth. Эта строка должна быть разкомментирована. Закомментируйте ее, добавив ; в начало строки. Затем добавьте после нее новую строку, содержащую только значение tls-crypt ta.key​​​:

      /etc/openvpn/server.conf

      ;tls-auth ta.key 0 # This file is secret
      tls-crypt ta.key
      

      Затем найдите раздел криптографических шифров, выполнив поиск строк с текстом cipher. По умолчанию установлено значение AES-256-CBC, однако шифр AES-256-GCM обеспечивает более высокий уровень шифрования, производительности и лучше поддерживается современными клиентами OpenVPN. Мы закомментируем значение по умолчанию, добавив ; в начало этой строки, а затем добавим другую строку после нее, содержащую обновленное значение AES-256-GCM:

      /etc/openvpn/server.conf

      ;cipher AES-256-CBC
      cipher AES-256-GCM
      

      Сразу после этой строки добавьте директиву auth для выбора алгоритма выборки сообщений HMAC. Для этого хорошо подойдет SHA256:

      /etc/openvpn/server.conf

      auth SHA256
      

      Затем найдите строку с директивой dh, которая определяет параметры алгоритма Диффи — Хеллмана. Поскольку мы настроили все сертификаты для использования криптографии на эллиптических кривых, нет необходимости в использовании файла прототипа Диффи — Хеллмана. Закомментируйте существующую строку dh dh2048.pem​​​ или dh dh.pem. Имя файла для ключа Диффи — Хеллмана может отличаться от того, что перечислено в примере файла конфигурации сервера. Затем добавьте строку после нее с содержанием dh none:

      /etc/openvpn/server.conf

      ;dh dh2048.pem
      dh none
      

      Далее нам нужно запустить OpenVPN без привилегий, с которыми он запущен, поэтому нам нужно указать на необходимость запуска с пользователем и группой nobody. Чтобы активировать эту возможность, найдите и разкомментируйте строки user nobody и group nobody​​, удалив ; в начале каждой строки:

      /etc/openvpn/server.conf

      user nobody
      group nobody
      

      (Необязательно) Изменение DNS для перенаправления всего трафика через сеть VPN

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

      Для начала найдите и разкомментируйте строку push "redirect-gateway def1 bypass-dhcp". Она будет сообщать вашему клиенту о необходимости перенаправлять весь трафик через ваш сервер OpenVPN. Обратите внимание, что при активации этой функции могут возникать проблемы с подключением к другим сетевым службам, например SSH:

      /etc/openvpn/server.conf

      push "redirect-gateway def1 bypass-dhcp"
      

      Под этой строкой найдите раздел dhcp-option. Удалите ; в начале обеих строк, чтобы разкомментировать эти строки:

      /etc/openvpn/server.conf

      push "dhcp-option DNS 208.67.222.222"
      push "dhcp-option DNS 208.67.220.220"
      

      Эти строки будут сообщать вашему клиенту о необходимости использования бесплатных интерпретаторов OpenDNS на перечисленных IP-адресах. Если вы предпочитаете использовать другие интерпретаторы DNS, вставьте их на место выделенных IP-адресов.

      Это поможет клиентам изменить настройки DNS, чтобы туннель VPN использовался как шлюз по умолчанию.

      (Необязательно) Изменение порта и протокола

      По умолчанию сервер OpenVPN использует для подключения клиентов порт 1194 и протокол UDP. Если вам потребуется использовать другой порт из-за ограничений сети клиента, вы можете изменить номер порта. Если вы не храните веб-контент на сервере OpenVPN, вам подойдет порт 443, поскольку его обычно не запрещают правила брандмауэра.

      Чтобы заставить OpenVPN прослушивать порт 443, откройте файл server.conf и найдите строку, которая выглядит следующим образом:

      /etc/openvpn/server.conf

      port 1194
      

      Измените ее, указав порт 443:

      /etc/openvpn/server.conf

      # Optional!
      port 443
      

      Довольно часто этот порт также ограничивает протокол. В этом случае найдите строку proto под строкой port и измените протокол с udp на tcp:

      /etc/openvpn/server.conf

      # Optional!
      proto tcp
      

      Если вы действительно смените протокол на TCP, вам нужно будет изменить значение директивы explicit-exit-notify с 1 на 0, поскольку эта директива используется только протоколом UDP. В противном случае при запуске службы OpenVPN возможны ошибки протокола TCP.

      Найдите строку explicit-exit-notify в конце файла и измените значение на 0:

      /etc/openvpn/server.conf

      # Optional!
      explicit-exit-notify 0
      

      Если вам не нужно использовать другие порт и протокол, лучше всего оставить эти настройки без изменений.

      (Необязательно) Указание на учетные данные, отличающиеся от используемых по умолчанию

      Если вы выбрали другое имя при вводе команды ./easyrsa gen-req server ранее, измените строки cert и key​​​ в файле конфигурации server.conf​​, чтобы они указывали на соответствующие файлы .crt и .key. Если вы использовали имя по умолчанию server, можно считать, что все уже настроено корректно:

      /etc/openvpn/server.conf

      cert server.crt
      key server.key
      

      После завершения редактирования сохраните и закройте файл.

      Вы успешно завершили настройку общих параметров OpenVPN. На следующем шаге мы настроим сетевые параметры сервера.

      Шаг 8 — Настройка конфигурации сети сервера OpenVPN

      Чтобы OpenVPN мог правильно перенаправлять трафик через сеть VPN, необходимо изменить некоторые параметры конфигурации сети сервера. Прежде всего нужно изменить параметр IP forwarding, который определяет необходимость перенаправления IP-трафика. Это необходимо для реализации функций VPN, обеспечиваемых вашим сервером.

      Чтобы изменить используемые по умолчанию настройки IP-передачи сервера OpenVPN, откройте файл /etc/sysctl.conf с помощью nano или предпочитаемого редактора:

      • sudo nano /etc/sysctl.conf

      Затем добавьте следующую строку вверху файла:

      /etc/sysctl.conf

      net.ipv4.ip_forward = 1
      

      Сохраните файл и закройте его после завершения.

      Чтобы прочитать файл и загрузить значения для текущей сессии, введите:

      Output

      net.ipv4.ip_forward = 1

      Теперь ваш сервер OpenVPN сможет перенаправлять входящий трафик из одного сетевого устройства на другое. Эта настройка гарантирует, что сервер сможет направлять трафик от клиентов, подключенных к виртуальному интерфейсу VPN, на другие физические сетевые устройства. Эта конфигурация будет передавать весь веб-трафик от вашего клиента через IP-адрес вашего сервера, а открытый IP-адрес клиента будет фактически скрыт.

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

      Шаг 9 — Настройка брандмауэра

      К настоящему моменту вы установили OpenVPN на ваш сервер, настроили его и создали ключи и сертификаты, необходимые вашему клиенту для доступа к VPN. Однако вы еще не предоставили OpenVPN какие-либо инструкции о том, куда нужно отправлять входящий веб-трафик от клиентов. Вы можете указать, как сервер должен обрабатывать клиентский трафик, добавив ряд правил брандмауэра и настроив конфигурацию маршрутизации.

      Если вы выполнили предварительные требования, указанные в начале руководства, у вас на сервере должен быть установлен и запущен firewalld. Чтобы разрешить OpenVPN работу через брандмауэр, вам нужно узнать активную зону firewalld. Для этого воспользуйтесь следующей командой:

      • sudo firewall-cmd --get-active-zones

      Output

      public Interfaces: eth0

      Если вы не увидите доверенную зону с интерфейсом tun0, выполните следующие команды для добавления устройства VPN в эту зону:

      • sudo firewall-cmd --zone=trusted --add-interface=tun0
      • sudo firewall-cmd --permanent --zone=trusted --add-interface=tun0

      Затем добавьте службу openvpn в список разрешенных служб firewalld в активной зоне, после чего сделайте эти настройки постоянными, запустив команду снова, но добавив опцию --permanent:

      • sudo firewall-cmd --permanent --add-service openvpn
      • sudo firewall-cmd --permanent --zone=trusted --add-service openvpn

      Чтобы применить изменения в брандмауэре, выполните следующую команду:

      • sudo firewall-cmd --reload

      Теперь вы можете проверить, что служба была добавлена корректно, воспользовавшись следующей командой:

      • sudo firewall-cmd --list-services --zone=trusted

      Output

      openvpn

      Далее мы добавим правило подмены в брандмауэр. Подмена позволяет вашему серверу OpenVPN преобразовывать адреса клиентов OpenVPN в собственный открытый адрес сервера, а затем выполнять обратное преобразование для трафика, который отправляется обратно клиенту. Этот процесс также известен как преобразование сетевых адресов (NAT).

      Добавьте правила подмены с помощью следующих команд:

      • sudo firewall-cmd --add-masquerade
      • sudo firewall-cmd --add-masquerade --permanent

      Вы можете проверить, что подмена была добавлена корректно, воспользовавшись следующей командой:

      • sudo firewall-cmd --query-masquerade

      Output

      yes

      Далее вам нужно создать конкретное правило подмены, которое будет использоваться только для вашей подсети OpenVPN. Для этого необходимо сначала создать переменную оболочки (DEVICE в нашем примере), которая будет представлять первичный сетевой интерфейс, используемый вашим сервером, а затем использовать эту переменную, чтобы добавить правило маршрутизации на постоянной основе:

      • DEVICE=$(ip route | awk '/^default via/ {print $5}')
      • sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $DEVICE -j MASQUERADE

      Обязательно перезагрузите firewalld, чтобы все изменения вступили в силу:

      • sudo firewall-cmd --reload

      Команды с флагом --permanent будут гарантировать, что правила будут сохраняться после перезагрузки. Команда firewall-cmd --reload позволяет гарантировать, что все оставшиеся изменения для брандмауэра будут применены. После создания правил брандмауэра мы можем запустить службу OpenVPN на сервере.

      Шаг 10 — Запуск OpenVPN

      OpenVPN работает как служба systemd, поэтому мы можем использовать systemctl для управления. Мы настроим для OpenVPN запуск при загрузке, чтобы вы могли подключаться к вашему VPN в любое время, пока ваш сервер работает. Для этого активируйте службу OpenVPN, добавив ее в systemctl:

      • sudo systemctl -f enable openvpn-server@server.service

      Затем запустите службу OpenVPN:

      • sudo systemctl start openvpn-server@server.service

      Еще раз проверьте, что служба OpenVPN активна, воспользовавшись следующей командой. Вы должны увидеть в выводе active (running):

      • sudo systemctl status openvpn-server@server.service

      Output

      ● openvpn-server@server.service - OpenVPN service for server Loaded: loaded (/usr/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2020-04-07 02:32:07 UTC; 1min 52s ago Docs: man:openvpn(8) https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage https://community.openvpn.net/openvpn/wiki/HOWTO Main PID: 15868 (openvpn) Status: "Initialization Sequence Completed" Tasks: 1 (limit: 5059) Memory: 1.2M CGroup: /system.slice/system-openvpnx2dserver.slice/openvpn-server@server.service └─15868 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --cipher AES-256-GCM --ncp-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC:BF-CBC --config server.conf . . .

      Мы успешно завершили конфигурацию OpenVPN на стороне сервера. Далее вам нужно будет настроить клиентский компьютер и подключиться к серверу OpenVPN.

      Шаг 11 — Создание инфраструктуры конфигурации клиентских систем

      Создание файлов конфигурации для клиентов OpenVPN может быть связано с этой задачей, поскольку каждый клиент должен иметь собственную конфигурацию, и каждая из этих конфигураций должна соответствовать параметрам, заданным в файле конфигурации сервера. Вместо создания единого файла конфигурации, который можно использовать только для одного клиента, на этом шаге мы определим процесс создания инфраструктуры клиентской конфигурации, который вы сможете использовать для быстрого генерирования файлов конфигурации. Вначале вы создадите «базовый» файл конфигурации, а затем сценарий, который позволит по мере необходимости генерировать уникальные файлы конфигурации клиентов, сертификаты и ключи.

      Для начала создайте новую директорию для хранения файлов конфигурации клиентов в ранее созданной директории client-configs:

      • mkdir -p ~/client-configs/files

      Затем скопируйте файл с образцом конфигурации клиента в директорию client-configs, чтобы использовать ее как базовую конфигурацию:

      • cp /usr/share/doc/openvpn/sample/sample-config-files/client.conf ~/client-configs/base.conf

      Откройте новый файл в nano или предпочитаемом текстовом редакторе:

      • nano ~/client-configs/base.conf

      Найдите в файле директиву remote. Она указывает клиенту адрес сервера OpenVPN, т. е. публичный IP-адрес вашего сервера OpenVPN. Если вы решили изменить порт, который будет прослушивать сервер OpenVPN, вам нужно будет заменить 1194 на выбранный порт:

      ~/client-configs/base.conf

      . . .
      # The hostname/IP and port of the server.
      # You can have multiple remote entries
      # to load balance between the servers.
      remote your_server_ip 1194
      . . .
      

      Протокол должен соответствовать значениям, используемым в конфигурации сервера:

      ~/client-configs/base.conf

      proto udp
      

      Разкомментируйте директивы user и group, удалив символ ; в начале каждой строки:

      ~/client-configs/base.conf

      # Downgrade privileges after initialization (non-Windows only)
      user nobody
      group nobody
      

      Найдите директивы, задающие ca, cert и key. Поставьте знак комментария перед строками этих директив, поскольку вы вскоре добавите сертификаты и ключи в сам файл:

      ~/client-configs/base.conf

      # SSL/TLS parms.
      # See the server config file for more
      # description. It's best to use
      # a separate .crt/.key file pair
      # for each client. A single ca
      # file can be used for all clients.
      ;ca ca.crt
      ;cert client.crt
      ;key client.key
      

      Затем закомментируйте директиву tls-auth, поскольку вы добавите ta.key прямо в файл конфигурации клиента (а сервер настроен на использование tls-crypt):

      ~/client-configs/base.conf

      # If a tls-auth key is used on the server
      # then every client must also have the key.
      ;tls-auth ta.key 1
      

      Создайте зеркало настроек cipher и auth, заданных в файле /etc/openvpn/server/server.conf​​​:

      ~/client-configs/base.conf

      cipher AES-256-GCM
      auth SHA256
      

      Затем добавьте в файл директиву key-direction. Вы должны задать значение «1», чтобы VPN правильно работала на клиентском компьютере:

      ~/client-configs/base.conf

      key-direction 1
      

      В заключение добавьте несколько строк комментариев. Хотя вы можете включить эти директивы в каждый файл конфигурации клиента, их нужно включать только для клиентов Linux с файлом /etc/openvpn/update-resolv-conf. Этот скрипт использует утилиту resolvconf для обновления данных DNS клиентов Linux.

      ~/client-configs/base.conf

      ; script-security 2
      ; up /etc/openvpn/update-resolv-conf
      ; down /etc/openvpn/update-resolv-conf
      

      Если ваш клиент работает под управлением Linux и на нем есть файл /etc/openvpn/update-resolv-conf, удалите знак комментария в начале этих строк файла конфигурации клиента, когда он будет сгенерирован.

      Сохраните файл и закройте его после завершения.

      Далее создайте простой скрипт, который скомпилирует базовую конфигурацию с соответствующим сертификатом, ключом и файлами шифрования, и поместите сгенерированную конфигурацию в директорию ~/client-configs/files. Откройте новый файл с именем make_config.sh в директории ~/client-configs:

      • nano ~/client-configs/make_config.sh

      Добавьте в файл следующее:

      ~/client-configs/make_config.sh

      #!/bin/bash
      
      # First argument: Client identifier
      
      KEY_DIR=~/client-configs/keys
      OUTPUT_DIR=~/client-configs/files
      BASE_CONFIG=~/client-configs/base.conf
      
      cat ${BASE_CONFIG} 
      <(echo -e '<ca>') 
      ${KEY_DIR}/ca.crt 
      <(echo -e '</ca>n<cert>') 
      ${KEY_DIR}/${1}.crt 
      <(echo -e '</cert>n<key>') 
      ${KEY_DIR}/${1}.key 
      <(echo -e '</key>n<tls-crypt>') 
      ${KEY_DIR}/ta.key 
      <(echo -e '</tls-crypt>') 
      > ${OUTPUT_DIR}/${1}.ovpn
      

      Сохраните файл и закройте его после завершения.

      Прежде чем продолжить, отметьте этот файл как исполняемый, введя следующую команду:

      • chmod 700 ~/client-configs/make_config.sh

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

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

      Шаг 12 — Создание конфигураций клиентов

      Если вы следовали указаниям руководства, на шаге 6 вы создали клиентский сертификат и ключ с именами client1.crt и client1.key соответственно. Вы можете сгенерировать файл конфигурации для этих учетных данных, перейдя в директорию ~/client-configs и запустив скрипт, созданный в конце предыдущего шага:

      • cd ~/client-configs
      • ./make_config.sh client1

      При этом файл client1.ovpn будет создан в директории ~/client-configs/files:

      • ls ~/client-configs/files

      Output

      client1.ovpn

      Этот файл нужно будет переместить на устройство, которое вы планируете использовать в качестве клиента. Например, это может быть ваш локальный компьютер или мобильное устройство.

      Хотя конкретные приложения для передачи зависят от операционной системы устройства и ваших предпочтений, один из наиболее надежных и безопасных способов — использовать SFTP (протокол передачи файлов SSH) или SCP (защищенное копирование) на стороне сервера. При этом файлы аутентификации VPN вашего клиента будут передаваться через шифрованное соединение.

      Здесь представлен пример команды SFTP, которую можно запустить с локального компьютера (под управлением macOS или Linux). Она будет копировать файл client1.ovpn, который мы создали на последнем шаге, в вашу домашнюю директорию:

      • sftp sammy@openvpn_server_ip:client-configs/files/client1.ovpn ~/

      Ниже представлено несколько инструментов и обучающих руководств для безопасной передачи файлов с сервера OpenVPN на локальный компьютер:

      Шаг 13 — Установка клиентской конфигурации

      В этом разделе рассказывается о том, как установить клиентский профиль VPN в Windows, macOS, Linux, iOS и Android. Эти инструкции не зависят друг от друга, так что вы можете сразу перейти к той, которая относится к вашему устройству.

      Подключение OpenVPN будет иметь имя, совпадающее с именем файла .ovpn. В этом обучающем руководстве это означает, что соединение будет иметь имя client1.ovpn, что соответствует первому сгенерированному клиентскому файлу.

      Windows

      Установка

      Загрузите клиентское приложение OpenVPN для Windows со страницы загрузки OpenVPN. Выберите подходящую версию программы установки для вашей версии Windows.

      Примечание. Для установки OpenVPN требуются права администратора.

      После установки OpenVPN, скопируйте файл .ovpn в:

      C:Program FilesOpenVPNconfig
      

      При запуске OpenVPN профиль будет автоматически обнаружен и сделан доступным.

      Вы должны запускать OpenVPN от имени администратора каждый раз, даже если используете учетную запись администратора. Чтобы вам не нужно было при каждом запуске VPN нажимать правую кнопку мыши и выбирать Запуск от имени администратора, такой запуск следует настроить в учетной записи администратора. Это также означает, что обычным пользователям нужно будет ввести пароль администратора, чтобы использовать OpenVPN. Обычные пользователи не смогут правильно подключиться к серверу, если у приложения OpenVPN на клиентской системе нет прав администратора, поэтому необходим повышенный уровень привилегий.

      Чтобы настроить приложение OpenVPN для запуска от имени администратора при каждом запуске, нажмите правой кнопкой мыши на его ярлык и выберите пункт Свойства. Внизу вкладки Совместимость нажмите кнопку Изменить параметры для всех пользователей. В новом окне установите отметку Запускать эту программу от имени администратора.

      Подключение

      При каждом запуске графического интерфейса OpenVPN операционная система Windows будет спрашивать, разрешаете или вы этой программме внести изменения на вашем компьютере. Нажмите Да. При запуске клиентского приложения OpenVPN в области задач появляется значок приложения, с помощью которого вы сможете подключать и отключать соединение VPN; соединение VPN не устанавливается автоматически.

      После запуска OpenVPN нажмите правой кнопкой на значок OpenVPN в области задач, чтобы создать соединение. Откроется контекстное меню. Выберите client1 в верхней части меню (это ваш профиль client1.ovpn) и нажмите Подключиться.

      Откроется окно состояния, где будут выведены данные журнала при установке соединения, и после подключения клиента будет выведено сообщение.

      Отключение от VPN выполняется аналогично: перейдите в область задач, нажмите значок приложения OpenVPN правой кнопкой мыши, выберите профиль клиента и нажмите Отключиться.

      macOS

      Установка

      Tunnelblick — бесплатный клиент OpenVPN с открытым исходным кодом для macOS. Вы можете загрузить последний образ этого клиентского приложения со страницы загрузки Tunnelblick. Дважды нажмите загруженный файл .dmg и следуйте указаниям по установке.

      В конце процесса установки Tunnelblick спросит, есть ли у вас файлы конфигурации. Укажите ответ У меня есть файлы конфигурации и дайте Tunnelblick завершить работу. Откройте окно Finder и дважды нажмите client1.ovpn. Tunnelblick установит клиентский профиль. Для этого требуются привилегии администратора.

      Подключение

      Запустите Tunnelblick, дважды щелкнув значок Tunnelblick в папке Приложения. После запуска Tunnelblick в панели меню в правом верхнем углу экрана появится значок Tunnelblick для управления соединениями. Нажмите на значок, а затем нажмите на пункт меню Подключить client1, чтобы создать соединение VPN.

      Linux

      Установка

      Если вы используете Linux, существуют различные инструменты в зависимости от вашего дистрибутива. Диспетчер окон или среда рабочего стола также могут содержать утилиты для подключения.

      Однако проще всего будет использовать для этой цели программное обеспечение OpenVPN.

      В Ubuntu или Debian вы можете установить его так же, как и на сервере, введя следующую команду:

      • sudo apt update
      • sudo apt install openvpn

      В CentOS вы можете активировать репозитории EPEL и выполнить установку, введя следующую команду:

      • sudo yum install epel-release
      • sudo yum install openvpn

      Настройка

      Проверьте, включен ли в ваш дистрибутив скрипт /etc/openvpn/update-resolv-conf:

      Output

      update-resolv-conf

      Затем отредактируйте перемещенный файл конфигурации клиента OpenVPN:

      Если вы нашли файл update-resolv-conf, уберите значок комментария из начала трех строк, добавленных для изменения настроек DNS:

      client1.ovpn

      script-security 2
      up /etc/openvpn/update-resolv-conf
      down /etc/openvpn/update-resolv-conf
      

      Если вы используете CentOS, измените директиву group с nogroup на nobody для соответствия доступным группам дистрибутива:

      client1.ovpn

      group nobody
      

      Сохраните и закройте файл.

      Теперь для подключения к VPN вы можете просто указать команде openvpn файл конфигурации клиента:

      • sudo openvpn --config client1.ovpn

      Эта команда должна установить подключение к вашей VPN.

      iOS

      Установка

      Найдите в магазине приложений iTunes App Store приложение OpenVPN Connect, официальный клиент OpenVPN для iOS, и установите его. Чтобы переместить конфигурацию клиента iOS на устройство, подключите его к компьютеру напрямую.

      Здесь описан процесс завершения передачи с помощью iTunes. Откройте iTunes на компьютере и нажмите iPhone > приложения. Прокрутите страницу до раздела Общий доступ к файлам и нажмите на приложение OpenVPN. Пустое окно справа OpenVPN Documents предназначено для общего доступа к файлам. Перетащите файл .ovpn в окно OpenVPN Documents. iTunes, показывающий профиль VPN, готовый к подключению iPhone

      Запустите приложение OpenVPN на iPhone. Вы получите уведомление, что новый профиль готов к импорту. Нажмите зеленый значок плюс, чтобы импортировать его.

      Приложение OpenVPN для iOS показывает, что новый профиль готов к импорту Подключение

      Приложение OpenVPN готово к использованию нового профиля. Установите соединение, передвинув кнопку Подключиться в положение Вкл. Для отключения передвиньте эту же кнопку в положение Выкл.

      Примечание. Переключатель VPN в разделе Настройки нельзя использовать для подключения к VPN. Если вы попробуете сделать это, вы получите уведомление о том, что для подключения нужно использовать приложение OpenVPN.

      Приложение OpenVPN для iOS, подключенное к VPN

      Android

      Установка

      Откройте магазин приложений Google Play Store. Найдите приложение Android OpenVPN Connect, официальное клиентское приложение OpenVPN для Android, и установите его.

      Вы можете переместить профиль .ovpn, подключив устройство Android к вашему компьютеру через интерфейс USB и скопировав файл. Если у вас в компьютере есть разъем для SD-карт, вы можете извлечь SD-карту из устройства, скопировать на нее профиль и вставить карту обратно в устройство Android.

      Запустите приложение OpenVPN и нажмите меню FILE, чтобы импортировать профиль.

      Выбор меню импорта профиля в приложении OpenVPN для Android

      Затем перейдите в местоположение сохраненного профиля (на снимке экрана используется расположение /storage/emulated/0/openvpn) и выберите файл .ovpn​​​. Нажмите кнопку IMPORT, чтобы завершить импорт этого профиля.

      Приложение OpenVPN для Android выбирает профиль VPN для импорта

      Подключение После добавления профиля вы увидите следующий экран:

      Приложение OpenVPN для Android с добавленным новым профилем

      Для подключения нажмите кнопку-переключатель рядом с профилем, который вы хотите использовать. Вы увидите статистические данные вашего подключения в режиме реального времени и трафик, проходящий через ваш сервер OpenVPN: Приложение OpenVPN для Android, подключенное к VPN

      Для отключения просто нажмите кнопку-переключатель слева еще раз. Вам будет предложено подтвердить, что вы хотите отключиться от VPN.

      Шаг 14 — Тестирование соединения VPN (необязательно)

      Примечание. Этот метод тестирования подключения VPN будет работать только в случае, если вы выбрали перенаправление всего трафика через VPN на шаге 7 при редактировании файла server.conf​​ для OpenVPN.

      После завершения установки нужно провести простую проверку, чтобы убедиться, что все работает нормально. Не активируйте соединение VPN, откройте браузер и перейдите в DNSLeakTest.

      Сайт покажет IP-адрес, назначенный вашим интернет-провайдером и видный остальному миру. Чтобы проверить настройки DNS через этот же сайт, нажмите Расширенный тест, и вы увидите, какие серверы DNS вы используете.

      Теперь подключите клиент OpenVPN к VPN вашего дроплета и обновите браузер. Вы увидите совершенно другой IP-адрес (адрес вашего сервера VPN), и именно этот адрес будет виден остальному миру. Итак, в приложении DNSLeakTest функция Расширенный тест проверит ваши настройки DNS и подтвердит, что вы используете параметры DNS, заданные вашей VPN.

      Шаг 15 — Отзыв сертификатов клиента

      Иногда вам может понадобиться отозвать клиентский сертификат, чтобы предотвратить дальнейший доступ к серверу OpenVPN.

      Для этого воспользуйтесь примером в руководстве по установке и настройке центра сертификации в CentOS 8 в разделе Отзыв сертификата.

      После отзыва сертификата для клиента с помощью этих инструкций вам нужно будет скопировать созданный файл crl.pem на ваш сервер OpenVPN в директорию /etc/openvpn/server:

      • sudo cp /tmp/crl.pem /etc/openvpn/server/

      Затем откройте файл конфигурации сервера OpenVPN:

      • sudo nano /etc/openvpn/server/server.conf

      Добавьте в конце файла опцию crl-verify, чтобы сервер OpenVPN проверял созданный нами список отзыва сертификатов при каждой попытке подключения:

      /etc/openvpn/server/server.conf

      crl-verify crl.pem
      

      Сохраните и закройте файл.

      Перезапустите OpenVPN, чтобы завершить отзыв сертификата:

      • sudo systemctl restart openvpn-server@server.service

      Клиент больше не сможет подключаться к серверу, используя старые учетные данные.

      Чтобы запретить доступ другим клиентам, повторите эту процедуру:

      1. Для отзыва сертификата используется команда ./easyrsa revoke client_name.
      2. Создайте новый список CRL.
      3. Переместите новый файл crl.pem на сервер OpenVPN и скопируйте его в директорию /etc/openvpn/server/, чтобы перезаписать старый список.
      4. Перезапустите службу OpenVPN.

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

      Заключение

      Теперь у вас должна быть полностью готовая к использованию виртуальная частная сеть, запущенная на вашем сервере OpenVPN. Вы можете просматривать веб-ресурсы и загружать контент, не беспокоясь о том, что злоумышленники смогут отслеживать вашу активность.

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

      Для настройки большего числа клиентов вам нужно выполнить шаги 6 и 11–13 для каждого дополнительного устройства. Чтобы запретить доступ клиентским системам, следуйте указаниям в шаге 15.



      Source link