Новости:

SMF - Just Installed!

Главное меню

Последние сообщения

#71
mikroTik / Настройка openvpn mikrotik
Последний ответ от George - Фев. 04, 2023, 08:43
Важно. Для корректной работы надо настроить синхронизацию времени. Как я понял, настройка из консоли изменилась, и ни ожно руководство в инете не верно

Код: bash
/system ntp client set enabled=yes servers=0.ru.pool.ntp.org,1.ru.pool.ntp.org


Настраиваем OVPN-сервер на ROS

1. Настройка PKI

1.1. Сертификат CA:

Код: bash
/certificate add name=tmpl-cloud-CA country="RU" state="MO" locality="ODN" organization="Cloud-life" unit="IT" common-name="cloud-CA" key-size=4096 days-valid=3650 key-usage=crl-sign,key-cert-sign


Код: bash
/certificate sign tmpl-cloud-CA ca-crl-host=127.0.0.1 name="cloud-CA"


Примечание: ca-crl-host= — обязательный параметр, иначе список отзыва не будет создан; полный путь к списку отзыва будет указан в параметрах сертификата, графа "[1]Точка распределения списка отзыва (CRL)"; в принципе, можно указать любой из ip-адресов нашего микротика, тот что укажем — и будет прописан в сертификате. Доменные имена параметром не поддерживаются, к сожалению.

1.2. Сертификат сервера:

Код: bash
/certificate add name=OVPN-SRV country="RU" state="MO" locality="ODN" organization="Cloud-life" unit="IT" common-name="srv-OVPN" key-size=4096 days-valid=1095 key-usage=digital-signature,key-encipherment,tls-server


Код: bash
/certificate sign OVPN ca="cloud-CA" name="srv-OVPN"


Примечание: для сертификата сервера key-usage лучше не менять, почему так — описано здесь (а если очень хотим поменять — то там же написано что нужно прописать в конфиге клиента для этого).

Примечание: в отличие от SSTP — OVPN не проверяет соответствие common-name сертификата сервера fqdn'у этого сервера.

1.3. Шаблон для сертификатов клиентов:

Код: bash
/certificate add name=templ-CL country="RU" state="MO" locality="ODN" organization="Cloud-life" unit="IT" common-name="client-vpn-templ" key-size=4096 days-valid=365 key-usage=tls-client


1.3.1 Сертификат первого клиента:

Код: bash
/certificate add name=user1 copy-from="templ-CL" common-name="test-client-ovpn-1"


Код: bash
/certificate sign user1 ca="cloud-CA" name="test-client-ovpn-1"


1.3.2. Сертификат второго и последующих клиентов:

См. п. 3.1, но меняем значение параметров.

common-name="test-client-ovpn-1"


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

name="test-client-ovpn-1"

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

1.4 В будущем, для отзыва сертификатов используем команду:

Код: bash
certificate issued-revoke %cert-name%


Где %cert-name% — поле name= подписанного сертификата, то есть отображаемое PKI микротика.

2. Настройка OVPN сервера

Примечание: можно настроить в режиме tun («ip» в ROS), а можно в режиме tap («ethernet» в ROS). Режим tun — обычный туннель. Режим tap — эмуляция полноценного ethernet, в частности в режиме tap клиентов можно объединить в режим моста и они будут прекрасно друг друга видеть. В теории в режиме tap можно запустить DHCP-сервер, но в текущей версии ROS это не реализовано.

2tun. Режим tun

2tun.1. Задаём пул адресов для OVPN-клиентов (можно задать непосредственно в PPP-profile):

Код: bash
/ip pool add name=OVPN_srv_pool ranges=192.168.100.2-192.168.254


2tun.2. Создаём PPP-profile для OVPN-сервера:

Код: bash
/ppp profile add name=OVPN_server local-address=192.168.100.1 remote-address=OVPN_srv_pool


Опционально! Остальные параметры по вашему вкусу и в соответствии с вашими целями. Например:
Код: bash
dns=192.168.100.1 use-ipv6=no

2tun.3. Настраиваем режим аутентификации пользователей:

Код: bash
/ppp aaa set accounting=yes


2tun.4. Добавляем пользователей:

Код: bash
/ppp secret add name=test-user-1 password=P@ssword1 service=ovpn profile=OVPN_server


Код: bash
/ppp secret add name=test-user-2 password=P@ssword2 service=ovpn profile=OVPN_server


2tun.5. Включаем OVPN-сервер:

Код: bash
/interface ovpn-server server set auth=sha1 cipher=blowfish128 default-profile=OVPN_server mode=ip netmask=24 require-client-certificate=yes certificate=srv-OVPN enabled=yes


2tap. Режим tap

2tap.1. Задаём пул адресов для OVPN-клиентов (можно задать непосредственно в PPP-profile):

Код: bash
/ip pool add name=OVPN_srv_pool ranges=192.168.100.2-192.168.254


2tap.1+. Создаём мост для OVPN-подключений:

Код: bash
/interface bridge add name=OVPN_bridge arp=enabled


Примечание: IP для моста назначать совершенно не обязательно, он и так имеется в PPP-profile (кроме того если указать адрес для моста, но не указать local-address= в PPP-profile, то клиент не подключится).

Примечание: arp должен быть включён, иначе клиенты друг-друга не увидят.

2tun.2. Создаём PPP-profile для OVPN-сервера:

Код: bash
/ppp profile add name=OVPN_server local-address=192.168.100.1 remote-address=OVPN_srv_pool bridge=OVPN_bridge


Опционально! Остальные параметры по вашему вкусу и в соответствии с вашими целями. Например: dns=192.168.100.1 use-ipv6=no

2tap.3. Настраиваем режим аутентификации пользователей:

Код: bash
/ppp aaa set accounting=yes


2tap.4. Добавляем пользователей:

Код: bash
/ppp secret add name=test-user-1 password=P@ssword1 service=ovpn profile=OVPN_server


Код: bash
/ppp secret add name=test-user-2 password=P@ssword2 service=ovpn profile=OVPN_server


2tap.5. Включаем OVPN-сервер:
Код: bash
/interface ovpn-server server set auth=sha1 cipher=blowfish128 default-profile=OVPN_server mode=ethernet netmask=24 require-client-certificate=yes certificate=srv-OVPN enabled=yes


Примечания для обоих режимов:

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

2. RADIUS-аутентификацию я не рассматриваю просто потому, что не тестировал. Могу лишь предположить, что работать она будет только для username/password, а сертификаты будут всё так же проверяться на микротике.

3. Следите за тем, что бы пул адресов соответствовал подсети, указываемой в настройках OVPN-сервера. ROS'овский OVPN-сервер не будет разбираться принадлежат ли одной сети local-address= сервера и назначаемый из пула адрес клиента, более того, если, к примеру, использовать маску 29, а в качестве пула прописать ranges=192.168.100.0/29, клиенту может быть в лёгкую назначен броадкастовый 192.168.100.7, как это было у меня. Точно такая же ситуация может возникнуть, если указанный пул больше, чем подразумевает маска — только проблема выявится не сразу, а чуть погодя.

3. Экспорт сертификатов для настройки клиентов

3.1. Экспорт сертификата CA:

Код: bash
/certificate export-certificate cloud-CA export-passphrase=""


Примечание: Нам нужен только сам сертификат, закрытый ключ НЕ нужен, поэтому параметр export-passphrase="" должен быть пустым.

3.2. Экспорт сертификатов клиентов:

Код: bash
/certificate export-certificate test-client-ovpn-1 export-passphrase=private-key-password1


Код: bash
/certificate export-certificate test-client-ovpn-2 export-passphrase=private-key-password2


Примечание: export-passphrase= — обязательный параметр для экспорта закрытых ключей; используем для каждого клиента свой пароль; НЕ используем тот же самый пароль, который указывали в пунктах 2.4 для пользователей!

3.3. Извлекаем полученные файлы сертификатов и ключей из микротика любым удобным способом (как правило, я таскаю туда-сюда файлы прямо из винбокса).

Настройка Windows-клиента

1. Получаем OVPN-дистрибутив с openvpn.net.
2. Устанавливаем, все опции оставляем по-умолчанию, в том числе tap-интерфейс, который понадобится для любого режима настройки.
3. Идём в OpenVPN\config (по-умолчанию C:\Program Files\OpenVPN\config) и создаём там файл client.ovpn (или копируем из OpenVPN\sample-config).
4. Создаём конфигурацию клиента, или вносим правки с sample-config.

Содержимое client.ovpn с небольшими комментариями
# Режим, в котором работает OVPN сервис
Код: bash
client

# Внимание! Указываем только один параметр из двух
# Для режима tup указываем параметр
Код: bash
dev tun
# Для режима tap указываем параметр
Код: bash
dev tap

# Этот параметр указываем только в случае использования режима tap, а вместо MyTap подставляем имя tap интерфейса в windows (ipconfig /all, или сетевые подключения в панели управления)
Код: bash
dev-node MyTap
# Используемый протокол. ROS'овский OVPN-сервер работает только в режиме tcp
Код: bash
proto tcp

# Адрес сервера, к которому будем подключаться, и порт. Вместо ovpn.my.domain — dns-имя или же ip-адрес. Можно указать несколько серверов.
Код: bash
remote ovpn.my.domain 1194
;remote my-server-2 1194

# Этот параметр нужен только в случае использования более чем одного сервера; При указании этого параметра при подключении клиент случайном образом выбирает один из указанных серверов
;remote-random

# Тайм аут между попытками определить ip-адрес по указанному DNS-имени сервера, в секундах (или бесконечность — infinite)
Код: bash
resolv-retry infinite

# Если указан этот параметр, то клиент будет использовать динамический исходящий порт для подключения
Код: bash
nobind

# Разрешают клиенту сохранять настройки туннеля при переподключении, а так же не перечитывать файлы ключей
Код: bash
persist-key
persist-tun

# Настройки прокси
;http-proxy-retry # retry on connection failures
Код: bash
;http-proxy [proxy server] [proxy port #]
# Отключает сообщения о повторяющихся пакетах
Код: bash
;mute-replay-warnings

# Пути к файлам сертификатов
# ca — сертификат CA, которым выданы сертификат клиента И сертификат сервера
# cert — сертификат клиента
# key — закрытый ключ сертификата клиента
Код: bash
ca cert_export_test-CA.crt
cert cert_export_test-client-ovpn-1.crt
key cert_export_test-client-ovpn-1.key

# auth-user-pass говорит OVPN-клиенту использовать логин и пароль (но не вместо сертификатов, а вместе с сертификатами)
# user-pwd.txt указывает на файл, в котором хранятся логин и пароль; первая строка в файле — логин, вторая — пароль; при отсутствии этого аргумента логин и пароль будут запрашиваться каждый раз при подключении
# Примечание: В случае использования сертификата с закрытым ключом, к которому и так нужно вводить ключ при каждом подключении, я не считаю необходимым заставлять пользователя помнить ещё и логин с паролем
Код: bash
--auth-user-pass user-pwd.txt

# Сообщает клиенту, что он должен проверять сертификат сервера на предмет правильности используемых key-usage
Код: bash
remote-cert-tls server

# Ключ для шифрования начала процесса аутентификации (handshake), дополнительная мера безопасности. Имеет смысл при использовании только логина/пароля, без сертификатов.
Код: bash
;tls-auth ta.key 1

# Задание особого метода шифрования, по-умолчание используется blowfish128.
Код: bash
;cipher x

# Использование lzo-сжатия. Не поддерживается OVPN на ROS.
Код: bash
;comp-lzo

# Уровень лога. Чем больше значение — тем подробнее.
Код: bash
verb 3

# Блокирование повторяющихся сообщений в логе
Код: bash
;mute 20

# Выше были приведены параметры, которые присутствуют в «родном» примере конфига для клиента + 1 необходимый нам параметр
# Ниже я приведу ещё несколько, на мой взгляд, полезных параметров.

# Маршрут, устанавливаемый при запуске подключения
# Маршрут указывает не на шлюз, а непосредственно на подключение
Код: bash
route 192.168.88.0 255.255.255.0

# Пауза перед установкой маршрутов после установления подключения (в секундах)
Код: bash
route-delay 5

# Если мы хотим задать OVPN-подключение в качестве основного шлюза
route-gateway 192.168.100.1
Код: bash
redirect-gateway def1
//Спасибо пользователю @bibliary за правку. Согласно докам этот вариант верен, но протестировать на момент редактирования не имею возможности.



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

Примечание: список большинства параметров здесь но он несколько устаревший.

Настройка MikroTik-клиента

1 Импорт сертификатов

1.1 Кладём в микротик файл сертификата CA и файл сертификата и файл ключа клиента любым удобным способом

1.2 Импортируем сертификат CA

Код: bash
/certificate import file-name=cert_export_test-CA.crt passphrase=""


1.3 Импортируем сертификат и ключ клиента
Код: bash
/certificate import file-name=cert_export_test-client-ovpn-1.crt passphrase=""


Код: bash
/certificate import file-name=cert_export_test-client-ovpn-1.key passphrase=private-key-password1


2. Настраиваем клиент

Код: bash
/interface ovpn-client add name=OVPN_client connect-to={ovpn.my.domain|xxx.xxx.xxx.xxx} port=1194 mode={ip|ethernet} user=test-user-1 password=P@ssword1 profile=default certificate=cert_32 auth=sha1 cipher=blowfish128 add-default-route={no|yes} disabled=no


Значения в {} указываете в соответствии с предыдущими настройками и вашими потребностями.
#72
Подготовка системы

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

1. Обновляем списки пакетов.

Актуализируем списки пакетов в репозиториях, чтобы установки проходили без ошибок:

Код: bash
apt update

    При желании, мы также можем обновить пакеты:

 
Код: bash
  apt upgrade

2. Синхронизируем время.

Устанавливаем утилиту chrony:

Код: bash
apt install chrony

Выставляем нужный часовой пояс:

Код: bash
timedatectl set-timezone Europe/Moscow

* в данном примере московское время.

Разрешаем запуск демона chrony:

Код: bash
systemctl enable chrony

3. Настройка брандмауэра.

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

Выполняем команды:

Код: bash
iptables -I INPUT -p tcp --dport 80 -j ACCEPT

Код: bash
iptables -I INPUT -p tcp --dport 443 -j ACCEPT

Сохраним правила с помощью netfilter-persistent:
Код: bash
apt install iptables-persistent

Код: bash
netfilter-persistent save
Настройка сервера баз данных

В качестве СУБД используем MariaDB.

Устанавливаем:

Код: bash
apt install mariadb-server

Разрешаем автозапуск и стартуем сервис:

Код: bash
systemctl enable mariadb
Код: bash
systemctl start mariadb

Задаем пароль для суперпользователя mysql:
Код: bash
mysqladmin -u root password

Подключаемся к MariaDB, создаем базу данных и пользователя:

Код: bash
mysql -uroot -p

Код: bash
CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

>
Код: bash
GRANT ALL PRIVILEGES ON nextcloud.* TO nextcloud@localhost IDENTIFIED BY 'nextcloud';

Код: bash
\q
Установка и настройка веб-сервера
PHP

Перед тем, как устанавливать php, стоит изучить системные требования Nextcloud. Для корректной работы нужно установить рекомендуемую версию PHP.

На момент последнего обновления инструкции, рекомендовалось установить PHP версии 8.1. Для дальнейшего удобства работы, мы сохраним ее в переменную:

Код: bash
export PHP_VER=8.1

Посмотреть, какая версия будет установлена из репозитория системы можно командой:

Код: bash
apt search --names-only '^php[.0-9]{3}$'

а) Если она соответствует рекомендации Nextcloud, вводим команду для установки PHP, PHP-FPM и необходимых расширений:

Код: bash
apt install php php-fpm php-common php-zip php-xml php-intl php-gd php-mysql php-mbstring php-curl php-imagick

б) Если рекомендованной PHP версии в репозитории нет, переходим к инструкции Установка разных версий PHP на Linux Ubuntu. А для установки расширений используем команду:

Код: bash
apt install php${PHP_VER}-fpm php${PHP_VER}-common php${PHP_VER}-zip php${PHP_VER}-xml php${PHP_VER}-intl php${PHP_VER}-gd php${PHP_VER}-mysql php${PHP_VER}-mbstring php${PHP_VER}-curl php${PHP_VER}-imagick php${PHP_VER}-gmp php${PHP_VER}-bcmath libmagickcore-6.q16-6-extra

* где PHP_VER — ранее определенная нами переменная с рекомендованной версией PHP.

Установка php завершена и можно перейти к ее настройке.

Настраиваем php-fpm:

Код: bash
vi /etc/php/${PHP_VER}/fpm/pool.d/www.conf

* путь к данной папке зависит от установленной версии php. В данном примере это 8.1 (задана через переменную PHP_VER).

Снимаем комментарии со следующей строки:

Цитироватьenv[PATH] = /usr/local/bin:/usr/bin:/bin

Настраиваем php.ini:

vi /etc/php/${PHP_VER}/fpm/php.ini

Цитироватьopcache.enable_cli=1
opcache.interned_strings_buffer=32
opcache.revalidate_freq=1

Код: bash
sed -i 's/;opcache.enable=.*/opcache.enable=1/' /etc/php/8.3/fpm/php.ini
Код: bash
sed -i 's/;opcache.enable_cli=.*/opcache.enable_cli=1/' /etc/php/8.3/fpm/php.ini
Код: bash
sed -i 's/;opcache.memory_consumption=.*/opcache.memory_consumption=128/' /etc/php/8.3/fpm/php.ini
Код: bash
sed -i 's/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=8/' /etc/php/8.3/fpm/php.ini
Код: bash
sed -i 's/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=10000/' /etc/php/8.3/fpm/php.ini

Разрешаем автозапуск php-fpm и перезапускаем его:

Код: bash
systemctl enable php${PHP_VER}-fpm

Код: bash
systemctl restart php${PHP_VER}-fpm
NGINX

Nextcloud можно развернуть на NGINX или Apache. В данной инструкции будем использовать первый.

Устанавливаем веб-сервер:

Код: bash
apt install nginx

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

Код: bash
vi /etc/nginx/sites-enabled/nextcloud.conf

Код: vi
server {
        listen 80;
        listen 443 ssl;
        server_name nextcloud.yourdomain.com;

        if ($scheme = 'http') {
            return 301 https://$host$request_uri;
        }

        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/cert.key;

        root /var/www/nextcloud;

        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        client_max_body_size 10G;
        fastcgi_buffers 64 4K;

        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

        index index.php;
        error_page 403 = /core/templates/403.php;
        error_page 404 = /core/templates/404.php;

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
                deny all;
        }

        location ^~ /.well-known {
                location = /.well-known/carddav { return 301 /remote.php/dav/; }
                location = /.well-known/caldav  { return 301 /remote.php/dav/; }
                location = /.well-known/webfinger  { return 301 /index.php/.well-known/webfinger; }
                location = /.well-known/nodeinfo  { return 301 /index.php/.well-known/nodeinfo; }
                location ^~ /.well-known{ return 301 /index.php/$uri; }
                try_files $uri $uri/ =404;
        }

        location / {
                rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
                rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
                rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
                try_files $uri $uri/ index.php;
                if ($request_method = OPTIONS) {
                    return 301 $scheme://$server_name/remote.php/webdav/;
                }
        }

        location ~ ^(.+?\.php)(/.*)?$ {
                try_files $1 = 404;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$1;
                fastcgi_param PATH_INFO $2;
                fastcgi_param HTTPS on;
                fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        }

        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
                expires modified +30d;
                access_log off;
        }
}

* где:

    nextcloud.yourdomain.com — домен, на котором будет работать сервис;
    /etc/nginx/ssl — каталог, в котором будут храниться сертификаты;
    /var/www/nextcloud — каталог с порталом.
    fastcgi_pass — обработчик скриптов. В нашем примере используется php-fpm. Обратите внимание, что путь до сокетного файла будет зависить от версии PHP.

Создаем каталог для хранения сертификатов и переходим в него:

Код: bash
mkdir /etc/nginx/ssl

Код: bash
cd /etc/nginx/ssl

Генерируем сертификат:
Код: bash
openssl req -new -x509 -days 1461 -nodes -out cert.pem -keyout cert.key -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=nextcloud.yourdomain.com/CN=nextcloud"

* данная команда создаст сертификат на 4 года для URL nextcloud.yourdomain.com или nextcloud.

В нашем примере мы запустили nextcloud с использованием самоподписанного сертификата. Для продуктивной среды рекомендуется использовать купленный сертификат или бесплатный от Let's Encrypt.

После установки php мог установиться и запуститься apache. Отключаем его:

Код: bash
systemctl stop apache2

Код: bash
systemctl disable apache2

Проверяем конфигурацию nginx и перезапускаем сервис:

Код: bash
nginx -t

Код: bash
systemctl restart nginx

Разрешаем автозапуск:

Код: bash
systemctl enable nginx
Установка Nextcloud

Устанавливаем пакет unzip:

Код: bash
apt install unzip

Imagemagik
Код: bash
apt install imagemagick

На странице nextcloud можно ознакомиться с возможными вариантами загрузки портала. Мы же возьмем последнюю версию.

Переходим во временную папку и скачиваем исходник:

Код: bash
cd /tmp

Код: bash
wget https://download.nextcloud.com/server/releases/latest.zip

Распаковываем скачанный архив:

Код: bash
unzip latest.zip

И переносим содержимое архива в каталог /var/www:

Код: bash
mv nextcloud /var/www

Задаем права доступа:

Код: bash
chown -R www-data:www-data /var/www/nextcloud

Открываем браузер и переходим по адресу https://nextcloud.yourdomain.com, где nextcloud.yourdomain.com — адрес облачного сервиса.

Задаем логин и пароль для администратора. В качестве базы данных выбираем MySQL/MariaDB (если предлагается выбор) и вводим в качестве логина, пароля и базы nextcloud.

Задаем параметры для подключения к базе данных

Завершаем установку.

Оптимизируем работу базы данных:

Код: bash
sudo -u www-data php /var/www/nextcloud/occ db:convert-filecache-bigint
Тюнинг после установки

Для корректной работы системы выполним дополнительную настройку. После входа в nextcloud под администратором, переходим в настройки для пользователя:

Переходим в настройку Nextcloud

В разделе «Параметры сервера» переходим в Основные сведения:

Переходим к общим сведениям

В разделе «Проверка безопасности и параметров» мы можем увидеть список проблем:

В разделе «Проверка безопасности и параметров» мы можем увидеть список проблем

Рассмотрим процесс решения некоторых из них.
1. Разрешённое максимальное значение использования памяти PHP ниже рекомендуемого значения в 512 МБ

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

Код: bash
vi /etc/php/${PHP_VER}/fpm/php.ini

Меняем настройку для memory_limit:

Код: bash
memory_limit = 512M

Перезапускаем php-fpm:

Код: bash
systemctl restart php${PHP_VER}-fpm
2. В системе не установлены рекомендуемые модули PHP

Данная ошибка устраняется в зависимости от списка модулей, которых не хватает системе. Чаще всего, подходит команда:
Цитироватьdnf install php-<название модуля>

Например:

Код: bash
apt install php-gmp php-bcmath

После перезапускаем php-fpm:
Код: bash
systemctl restart php${PHP_VER}-fpm
3. Не настроена система кеширования

Для решения проблемы мы должны установить и настроить одно из средств кэширования:

    APCu
    Redis
    Memcached

Мы рассмотрим два последних варианта.
Redis

Устанавливаем сам Redis Server и модуль php:

Код: bash
apt install redis-server php-redis

* в случае установки сервера Redis на отдельный сервер, необходимо выполнить на сервере Nextcloud только установку php-redis.

Перезапускаем php-fpm:

Код: bash
systemctl restart php${PHP_VER}-fpm

Открываем конфигурационный файл для nextcloud:

Код: bash
vi /var/www/nextcloud/config/config.php

И добавим:

Код: bash
  'memcache.local' => '\\OC\\Memcache\\Redis',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'redis' => 
      array (
          'host' => 'localhost',
          'port' => 6379,
      ),

Готово.
Memcached

Выполняем установку модуля для php и сам сервис memcached:

Код: bash
apt install memcached php-memcached

После разрешаем его автозапуск:

Код: bash
systemctl enable memcached

Перезапускаем php-fpm:

Код: bash
systemctl restart php${PHP_VER}-fpm

После этого открываем конфигурационный файл для nextcloud:

Код: bash
vi /var/www/nextcloud/config/config.php

И добавим:

  ...
Код: bash
  'memcache.local' => '\\OC\\Memcache\\Memcached',
  'memcache.distributed' => '\\OC\\Memcache\\Memcached',
  'memcached_servers' =>
  array (
    0 =>
    array (
      0 => 'localhost',
      1 => 11211,
    ),
  ),
  ...

Готово.
4. Не указан регион размещения этого сервера Nextcloud

Для решения проблемы открываем конфигурационный файл nextcloud:

Код: bash
vi /var/www/nextcloud/config/config.php

Добавляем:

...
Код: bash
'default_phone_region' => 'RU',
Работа с пользователями из UNIX-Shell

В состав nextcloud входит php-скрипт occ, с помощью которого можно управлять сервисом из командной строки Linux.
Добавление пользователя

Создать нового пользователя можно командой:

Код: bash
sudo -u www-data php /var/www/nextcloud/occ user:add admin

* где admin — имя учетной записи.
Сброс пароля

При необходимости сбросить пароль пользователя, можно воспользоваться командой:

Код: bash
sudo -u www-data php /var/www/nextcloud/occ user:resetpassword admin

* где admin — учетная запись пользователя, чей пароль хотим сбросить.
Подключение папки nextcloud по webdav

Мы можем подключить пользовательские данные nextcloud в качестве сетевого диска или раздела. Рассмотрим процесс для Windows и Linux.
Windows

Для начала необходимо включить службу «Веб-клиент». Для этого открываем от администратора командную строку и вводим команды:

Код: bash
sc config webclient start= auto

Код: bash
net start webclient

* первая команда включит автозапуск службы; вторая — запустит ее.

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

Код: bash
net use <Буква диска>: https://<путь до nextcloud>/remote.php/webdav /user:user password

Например, для нашей настройки:
Код: bash
net use N: https://nextcloud.yourdomain.com/remote.php/webdav /user:admin password

* где N — буква сетевого диска; nextcloud.yourdomain.com — адрес нашего сервера; admin — учетная запись, которая была создана при установке системы; password — пароль от пользователя admin.

Ограничение на копирование файла с webdav

В Windows при попытке скопировать большой файл с папки webdav, мы можем получить ошибку «Ошибка 0x800700DF: Размер файла превышает установленное ограничение, сохранение файла невозможно.»:

Ошибка при копировании большого файла с папки webdav

Для решения проблемы необходимо на клиенте разрешить больший объем для загрузки файлов. Это делается в реестре — ветка HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters, параметр FileSizeLimitInBytes. Для примера, если задать значение 4294967295 (максимально возможное), то мы получим ограничение в 4 Гб.

Также можно воспользоваться командой:

Код: bash
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v FileSizeLimitInBytes /t REG_DWORD /d 4294967295 /f

* команду нужно запускать в консоли, запущенной от администратора. В данном примере мы задаем также ограничение в 4 Гб.
Linux

Установим клиент davfs2. Действия будут немного различаться в зависимости от дистрибутива Linux.

а) Ubuntu / Debian:

Код: bash
apt install davfs2

б) CentOS / Red Hat:

Код: bash
yum install davfs2

Теперь мы можем примонтировать

Код: bash
mount -t davfs -o noexec https://nextcloud.yourdomain.com/remote.php/webdav /mnt

* в данном примере мы запустим команду на монтирование раздела по webdav в каталог /mnt. Обращение выполняется на наш сервер nextcloud.yourdomain.com.

После ввода команды, система попросит нас ввести логин и пароль от учетной записи Nextcloud:

  Username: user
  ...
  Password: 

После каталог будет примонтирован.

Для постоянного монтирования серез fstab, открываем файл:

Код: bash
vi /etc/fstab

Добавляем строчку:

Код: bash
https://nextcloud.yourdomain.com/remote.php/webdav/    /mnt    davfs    user,rw,_netdev 0 0

После открываем файл:
Код: bash
vi /etc/davfs2/secrets

И добавляем строку:

Код: bash
/mnt user password

* где /mnt — предполагаемый каталог, куда мы будем монтировать данные; user и password — логин и пароль от учетной записи в Nextcloud.

Монтируем каталог командой:

Код: bash
mount -a
#73
Seafile может быть развернут как Docker-контейнер или при помощи готового скрипта. Но в данной инструкции мы подробно рассмотрим процесс ручной установки и настройки Seafile на собственный серер. По большей части, мы будем опираться на официальную инструкцию.

В нашем примере будут использоваться:

Linux Ubuntu 20.04.
Seafile Server версии 9.
СУБД MariaDB.
Веб-сервер NGINX.
Пошагово, мы познакомимся с требованиями, опишем предварительную настройку системы и развертывание Seafile Server со всем необходимым прикладным софтом.

Требования к системе
Подготовка к установке Seafile
Установка дополнительных компонентов
Установка Seafile
Настройка автозапуска
Читайте также

Системные требования
Рассмотрим программно-аппаратные требования для развертывания Seafile Server:

Процессор: минимум 2 ядра.
Память ОЗУ: 2 Гб.
Операционная система: Linux Ubuntu (старые и новые версии), Linux CentOS (старые версии).
СУБД: MariaDB/MySQL, SQLite.
Веб-сервер: NGINX, Apache.
Также рекомендована установка memcached для работы 50 пользователей и более.

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

1. Обновление пакетов
Обновляем список пакетов:

Код: bash
apt update

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

Код: bash
apt upgrade -y

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

Установим сервис синхронизации времени и разрешим его автозапуск:

Код: bash
apt install chrony -y

Код: bash
systemctl enable chrony

Настраиваем временную зону:

Код: bash
timedatectl set-timezone Europe/Moscow

* В данном примере мы задаем зону по московскому времени.

Список всех доступных зон можно посмотреть командой

Код: bash
timedatectl list-timezones

3. Настройка брандмауэра
По умолчанию, в Ubuntu брандмауэр пропускает все сетевые пакеты и не требует настройки. В этом случае, можно пропустить выполнение данного пункта.

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

Для нормальной работы системы нам нужно открыть 2 порта:

Код: bash
iptables -I INPUT -p tcp --dport 8000 -j ACCEPT

Код: bash
iptables -I INPUT -p tcp --dport 8082 -j ACCEPT

* на порту 8000 работает веб-сервер seahub; на 8002 будет слушать сервер seafile.

Для сохранения правила используем утилиту iptables-persistent:

Код: bash
apt install iptables-persistent -y

Код: bash
netfilter-persistent save

Установка программных компонентов
Установим программные продукты, которые необходимы для работы Seafile.

Memcache
Начать необходимо с Memcache, так как его библиотеки нужны для установки пакетов python. Для установки вводим:

Код: bash
apt install memcached libmemcached-dev -y

Внесем небольшую корректировку в работу сервиса:

Код: bash
vi /etc/memcached.conf

Добавим памяти, которую может использовать memcached для своей работы:

Цитировать-m 512

* до 512 Мб. Но можно и больше...

Перезапускаем сервис и разрешаем его автозапуск:

Код: bash
systemctl restart memcached

Код: bash
systemctl enable memcached

Python
Для запуска и работы нашей облачной системы необходим python версии 3. Выполним его установку с дополнительными компонентами:

Код: bash
apt install python3 python3-setuptools python3-pip libmysqlclient-dev -y

* где:

python3 — интерпретатор для языка программирования python.
python3-setuptools — дополнение для python-distutils, который в свою очередь, нужен для установки дополнительных модулей.
python3-pip — менеджер установки пакетов python.
libmysqlclient-dev — набор файлов для разработки под СУБД MySQL/MariaDB.
С помощью менеджера пакетов python также установим:

Код: bash
pip3 install --timeout=3600 django==3.2.* Pillow pylibmc captcha jinja2 sqlalchemy==1.4.3 django-pylibmc django-simple-captcha python3-ldap mysqlclient pycryptodome==3.12.0 cffi==1.14.0

MariaDB
Как говорилось выше, мы будем использовать в качестве сервера баз данных MariaDB. Она может быть установлена из репозитория командой:

Код: bash
apt install mariadb-server -y

* подробнее об установке MariaDB читайте инструкцию Установка MariaDB на CentOS или Ubuntu.

Установим пароль для основной учетной записи СУБД (root):

Код: bash
mysqladmin -u root password

* система запросит новый пароль. Его нужно ввести дважды.

Чтобы пароль применился, нужно сбросить привилегии в СУБД. Для этого заходим в оболочку sql:

Код: bash
mysql -uroot -p

И вводим:

> flush privileges;

После выходим обратно:

> quit

Разрешаем автозапуск демона:

Код: bash
systemctl enable mariadb

Мы готовы переходить к установке Seafile.

Установка Seafile
Создаем учетную запись seafile, от которой будет работать наш сервис:

Код: bash
useradd seafile -r

Создаем каталог, в который загрузим установочные файлы Seafile:

Код: bash
mkdir -p /opt/seafile/bin

На странице загрузки официального сайта копируем ссылку на архив с приложением:

Копируем ссылку на архив сервера seafile

С помощью скопированной ссылки загружаем архив:

Код: bash
wget https://s3.eu-central-1.amazonaws.com/download.seadrive.org/seafile-server_9.0.10_x86-64.tar.gz

И распаковываем его в каталог /opt/seafile/bin:

Код: bash
tar zxf seafile-server_*.tar.gz -C /opt/seafile/bin --strip-components 1

Назначим в качестве владельца каталога seafile и распакованных файлов ранее созданного пользователя:

Код: bash
chown -R seafile:seafile /opt/seafile

Заходим под пользователем seafile:

Код: bash
su seafile

Переходим в каталог с установочными файлами и запускаем скрипт:

Код: bash
cd /opt/seafile/bin

Код: bash
./setup-seafile-mysql.sh

Мы увидим приветствие мастера установки. Просто нажимаем ENTER:

-----------------------------------------------------------------
This script will guide you to setup your seafile server using MySQL.
Make sure you have read seafile server manual at

        https://download.seafile.com/published/seafile-manual/home.md

Press ENTER to continue
-----------------------------------------------------------------

Вводим имя сервера, который будут видеть клиенты:

What is the name of the server? It will be displayed on the client.
3 - 15 letters or digits
[ server name ] dmosk_seafile

Вводим IP-адрес или имя сервера, по которому можно подключиться к серверу:

What is the ip or domain of the server?
For example: www.mycompany.com, 192.168.1.101
[ This server's ip or domain ] seafile.dmosk.ru

Вводим порт, на котором должен слушать сервис или оставляем 8082:

Which port do you want to use for the seafile fileserver?
[ default "8082" ]

Выбираем, использовать имеющуюся базу или создать новую. Мы создадим новую:

-------------------------------------------------------
Please choose a way to initialize seafile databases:
-------------------------------------------------------

[1] Create new ccnet/seafile/seahub databases
[2] Use existing ccnet/seafile/seahub databases

[ 1 or 2 ] 1

Указываем настройки для подключения к СУБД — хост, порт, пароль для root:

What is the host of mysql server?
[ default "localhost" ]

What is the port of mysql server?
[ default "3306" ]

What is the password of the mysql root user?
[ root password ]

Задаем имя пользователя mysql, который будет создан для seafile (можно оставить предложенный вариант, нажав ENTER):

Enter the name for mysql user of seafile. It would be created if not exists.
[ default "seafile" ]

Задаем пароль для создаваемой учетной записи в mysql:

Enter the password for mysql user "seafile":
[ password for seafile ]

Вводим имя для базы данных для сервера ccnet:

Enter the database name for ccnet-server:
[ default "ccnet-db" ]

Вводим имя для базы данных для сервера seafile:

Enter the database name for seafile-server:
[ default "seafile-db" ]

Вводим имя для базы данных для сервера seahub:

Enter the database name for seahub:
[ default "seahub-db" ]

Смотрим на сводную информацию:

---------------------------------
This is your configuration
---------------------------------

    server name:            dmosk_seafile
    server ip/domain:      seafile.dmosk.ru

    seafile data dir:      /opt/seafile/seafile-data
    fileserver port:        8082

    database:              create new
    ccnet database:        ccnet-db
    seafile database:      seafile-db
    seahub database:        seahub-db
    database user:          seafile

---------------------------------
Press ENTER to continue, or Ctrl-C to abort
---------------------------------

Если ошибок нет, вводим ENTER — начнется установке и конфигурирование.

Мы должны увидеть сообщение:

-----------------------------------------------------------------
Your seafile server configuration has been finished successfully.
-----------------------------------------------------------------

run seafile server:    ./seafile.sh { start | stop | restart }
run seahub  server:    ./seahub.sh  { start <port> | stop | restart <port> }

-----------------------------------------------------------------
If you are behind a firewall, remember to allow input/output of these tcp ports:
-----------------------------------------------------------------

port of seafile fileserver:  8082
port of seahub:              8000

When problems occur, Refer to

        https://download.seafile.com/published/seafile-manual/home.md

for information.

Установка завершена.

Внесем изменения в конфигурационный файл:

Код: bash
vi /opt/seafile/conf/gunicorn.conf.py

Отредактируем строку

Цитироватьbind = "0.0.0.0:8000"

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

Открываем другой конфигурационный файл:

Код: bash
vi /opt/seafile/conf/seahub_settings.py

Добавим строки:

Код: bash
CACHES = {
    'default': {
        'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
        'LOCATION': '127.0.0.1:11211',
    },
}
* в данном примере мы говорим серверу использовать memcached.

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

seafile fileserver — сервер, принимающий запросы от клиентов.
seahub — веб-сервер на python.
Стартуем первый:

Код: bash
 /opt/seafile/bin/seafile.sh start

Мы должны увидеть:

Starting seafile server, please wait ...
** Message: 16:02:58.146: seafile-controller.c(621): No seafevents.

Seafile server started

Done.

Запускаем второй сервис:

Код: bash
 /opt/seafile/bin/seahub.sh start

Система задаст несколько вопросов.

Адрес электронной почты администратора (это же будет логин администратора):

What is the email for the admin account?
[ admin email ] postmaster@dmosk.ru

Пароль, который будет использоваться для администратора (вводим дважды):

What is the password for the admin account?
[ admin password ]

Enter the password again:
[ admin password again ]

Мы должны увидеть:

ЦитироватьSeahub is started

Done.

Сервер запущен.

Попробуем открыть браузер и перейти по адресу http://<IP-адрес сервера>:8000 — должна открыться страница авторизации. Вводим логин и пароль, который создали при старте seahub (в нашем примере для пользователя postmaster@dmosk.ru). Мы должны попасть в систему с правами администратора. Теперь у нас есть возможность управлять сервисом из графического интерфейса.

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

С предыдущей настройки мы вошли в консоль под пользователем seafile. Оставаясь в нем, остановим ранее запущенные сервисы:


Код: bash
/opt/seafile/bin/seahub.sh stop


Код: bash
/opt/seafile/bin/seafile.sh stop

Выходим из консоли пользователя seafile:


Код: bash
exit

Вводим команду для создания первого юнита:

Код: bash
systemctl edit --full --force seafile

Код: bash
[Unit]
Description=Seafile Service
After=network.target

[Service]
User=seafile
Group=seafile
Type=forking
ExecStart=/opt/seafile/bin/seafile.sh start
ExecStop=/opt/seafile/bin/seafile.sh stop
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target

Создаем второй юнит:

Код: bash
systemctl edit --full --force seahub

Код: bash
[Unit]
Description=Seahub Service
After=network.target

[Service]
User=seafile
Group=seafile
Type=forking
ExecStart=/opt/seafile/bin/seahub.sh start
ExecStop=/opt/seafile/bin/seahub.sh stop
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Разрешаем запуск созданных сервисов:

Код: bash
systemctl enable seafile seahub

Стартуем их:

Код: bash
systemctl start seafile seahub

Проверяем состоянию запущенных служб:

Код: bash
systemctl status seafile seahub
#74
Настройки *nix (почта, web, система etc) / SSL и NGINX
Последний ответ от George - Янв. 26, 2023, 02:51
В данной инструкции разберем принцип правильной настройки поддержки https в веб-сервере NGINX, которая пройдет проверку безопасности с присвоением максимальной категории. Тестировать конфигурацию мы будем с помощью сервиса https://www.ssllabs.com/ssltest/ — наша задача получить категорию А:

Категория А при проверке безопасности сервисом ssllabs

Статья не рассчитана на новичков — вы должны понимать общие принципы настройки https в NGINX. Команды, приведенные в данном руководстве выполняются на системе Linux. Для Windows принцип настройки остается таким же, за исключением конкретных команд и путей до конфигурационных файлов.

Для достижения результата мы рассмотрим:

Что такое правильный сертификат и как его получить
Использование сертификата с ключами от центров сертификации
Как отключить поддержку устаревших протоколов безопасности в NGINX
Настройку Forward Secrecy
Усиление шифра Diffie-Hellman
Перенаправление всех запросов на https

1. Правильный сертификат
Под этим подразумевается выполнение двух условий:

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

Для получения сертификата от правильного центра, необходимо за него заплатить или получить бесплатно от Let's Encrypt. Купить сертификат можно у большинства хостеров или регистраторов доменных имен. Для получения бесплатного сертификата можно воспользоваться инструкцией Получение бесплатного SSL сертификата Let's Encrypt.

И наоборот, сертификат может быть выпущен не доверенным центром или локально на компьютере (самоподписанный). В таком случае мы получим ошибку при проверке подлинности.

Сертификат для домена
Заказывая сертификат, мы обязательно указываем, для какого доменного имени его будем использовать. Это обязательное требование. Например, если мы хотим настроить SSL-подключение к узлу security.dmosk.ru, то необходимо указывать именно это имя при заказе ключа безопасности. В противном случае, браузер будет выдавать нам ошибку, что сертификат выдан для другого узла.

Также мы можем заказать сертификат типа wildcard — он применим к домену и все его поддоменам. Например, в нашем случае мы можем заказать ключ для *.dmosk.ru — он будет применять для любого доменного имени 3-го уровня с корнем dmosk.ru.

2. Использование всей цепочки сертификатов
Применяя сертификат в NGINX, необходимо загрузить не только сертификат для домена, но и для всех центров сертификации — как основного, так и промежуточных. В противном случае, мы получим ошибку This server's certificate chain is incomplete. Grade capped to B:

Ошибка при проверке сертификата, если загружена не вся цепочка ключей безопасности

В случае покупки сертификата, нам отправляют все ключи в отдельных файлах. Цепочка сертификатов, как правило, идет в файле chain. Мы должны скопировать последовательность в данном файле и добавить ее к содержимому в файле с сертификатом домена — получиться файл, содержащий как последовательность для домена, так и всех центров. Назвать его можно fullchain.pem.

В случае получение бесплатного сертификата от Let's Encrypt, мы получаем 4 файла, один из которых называется fullchain.pem — именно он и содержит все необходимые последовательности.

И так, при настройке виртуального домена в NGINX, необходимо указать путь до файла, содержащего в себе все ключи, например:

Цитироватьserver {
Код: bash
        listen 443;
        server_name security.dmosk.ru;
        ssl on;
        ssl_certificate /etc/nginx/ssl/fullchain.pem;
        ssl_certificate_key /etc/nginx/ssl/cert.key;

        ...
}

* в данном примере мы настраиваем NGINX для домена security.dmosk.ru; обратите внимание, что мы указали путь до файла fullchain.pem, в котором должны находиться последовательности, как для домена, так и центров сертификации.

Не забываем перезапустить nginx:

Код: bash
systemctl restart nginx

3. Отключение устаревших протоколов
В случае, если наш веб-сервер поддерживает подключение с использованием устаревших протоколов безопасности, например, TLS 1.0, мы получим ошибку This server supports TLS 1.0 and TLS 1.1:

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

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

Код: bash
vi /etc/nginx/nginx.conf

Внутри раздела http добавим:

Цитироватьhttp {
    ...
 
Код: bash
  ssl_protocols TLSv1.2 TLSv1.3;
    ..
}
* в данном примере мы указали, что разрешены подключения только по TLS версий 1.2 и 1.3.

Не забываем перезапустить nginx:

Код: bash
systemctl restart nginx

4. Задаем приоритет для серверных шифров
Нам необходимо указать, чтобы при использовании протокола TLS серверные шифры были приоритетнее, чем клиентские. В противном случае мы увидим ошибку This server does not support Forward Secrecy with the reference browsers:

Неправильная настройка Forward Secrecy

Задать настройку можно в разделе http основного конфигурационного файла:

Код: bash
vi /etc/nginx/nginx.conf

Цитироватьhttp {
    ...
Код: bash
    ssl_prefer_server_ciphers on;
    ..
}

Не забываем перезапустить nginx:

Код: bash
systemctl restart nginx

5. Настройка более стойкого ключа Диффи-Хилмана
Для шифрования сессий NGINX использует DH-шифры. Если последовательность не достаточно стойкая (ниже 2048 бит), мы увидим ошибку This server supports weak Diffie-Hellman (DH) key exchange parameters:

Ошибка при использовании слабого шифра Diffie-Hellman

Чтобы исправить ошибку, генерируем стойкую последовательность для Diffie-Hellman файла:

Код: bash
openssl dhparam -out /etc/nginx/dh2048.pem 2048

В настройках NGINX (разделе http) добавляем:

vi /etc/nginx/nginx.conf

Цитироватьhttp {
    ...
Код: bash
    ssl_dhparam dh2048.pem;
    ..
}

Не забываем перезапустить nginx:

systemctl restart nginx
Код: bash
(Опционально) Перенаправление с 80 на 443
Стоит добавить настройку для перенаправления запроса с http на https. Для этого в настройке виртуального домена в NGINX добавим:

Цитироватьserver {
Код: bash
  listen 80;
        server_name security.dmosk.ru;
        return 301 https://$host$request_uri;
}

* в данном примере все http-запросы на домен security.dmosk.ru будет перенаправляться на https.

И перезапустим nginx:

Код: bash
systemctl restart nginx
#75
Настройки *nix (почта, web, система etc) / PHP 7.4 на CentOS 9
Последний ответ от George - Янв. 22, 2023, 01:04
Код: bash
dnf config-manager --set-enabled crb

Код: bash
sudo dnf install \
    https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm \
    https://dl.fedoraproject.org/pub/epel/epel-next-release-latest-9.noarch.rpm

Код: bash
sudo dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-9.rpm -y

Код: bash
sudo dnf install \
    https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm \
    https://dl.fedoraproject.org/pub/epel/epel-next-release-latest-8.noarch.rpm

Код: bash
sudo dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm -y

Код: bash
dnf module list php

Код: bash
sudo dnf module enable php:remi-7.4 -y

Ставим РНР

Apache (httpd) PHP:

Код: bash
sudo dnf install php php-cli -y

Nginx PHP:

Код: bash
sudo dnf install php-fpm php-cli -y

Все модули:

Код: bash
sudo dnf install php-cli php-fpm php-curl php-mysqlnd php-gd php-opcache php-zip php-intl php-common php-bcmath php-imagick php-xmlrpc php-json php-readline php-memcached php-redis php-mbstring php-apcu php-xml php-dom php-redis php-memcached php-memcache
#76
Подготовка системы

Заставить работать ни 19.8 ни 20.1 с SRTP мне не удалось. Версия библиотеки libsrtp похоже не подходит для res_srtp

Для корректной работы сервера необходимо настроить системное время, открыть порты в брандмауэре и отключить SELinux. Также мы установим несколько пакетов и создадим учетную запись, от которой будет работать Asterisk.

1. Время

Задаем часовой пояс:

Код: bash
timedatectl set-timezone Europe/Moscow


* в данном примере московское время. Список всех зон можно посмотреть командой timedatectl list-timezones.

Устанавливаем сервис для синхронизации времени:

Код: bash
yum install chrony

И запускаем его с разрешением автозапуска:

Код: bash
systemctl enable chronyd --now

У меня оказался установленным.

2. Настройка firewall

Мы должны открыть порты:

    5060 — SIP.
    5061 — SIP over TLS.
    80 — http.
    443 — https.
    10000-20000 — диапазон для динамических портов.

В CentOS для управления брандмауэром может использоваться firewalld или iptables. Рассмотрим настройку и того, и другого.
Firewalld

Разрешаем порты для работы asterisk:

Код: bash
firewall-cmd --permanent --add-port={5060,5061}/{tcp,udp}

Код: bash
firewall-cmd --permanent  --add-port=10000-20000/udp

... и веб-сервера NGINX:

Код: bash
firewall-cmd --permanent --add-service={http,https}

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

Код: bash
firewall-cmd --reload

Iptables

Открываем порты для астериска и веб-сервера:

Код: bash
iptables -I INPUT -p tcp --match multiport --dports 5060,5061 -j ACCEPT

Код: bash
iptables -I INPUT -p udp --match multiport --dports 5060,5061 -j ACCEPT

iptables -I INPUT -p tcp --match multiport --dports 80,443 -j ACCEPT

Код: bash
iptables -I INPUT -p udp --match multiport --dports 80,443 -j ACCEPT

Код: bash
iptables -I INPUT -p udp --dport 10000:20000 -j ACCEPT

Для сохранения правил установим:

Код: bash
dnf install iptables-services

И разрешим автозапуск сервиса:

Код: bash
systemctl enable iptables

Теперь сохраняем сами правила:
Код: bash
service iptables save

* правила будут сохранены в файл /etc/sysconfig/iptables.

Настоятельно рекомендую сменить порты SIP и SIPS, ломать вас будут пытаться на стандартных портах. Также, если сервер смотрит в инет напрямую, ни в коем случае не открывать порты http и https снаружи. Соответственно на firewall открываем порты, на которые будем менять(для SIP и SIPS). Проброс порта через nat со сменой (входящий не стандарт, перенаправление на 5060) приводит к обрыву соединения через 24 секунды примерно. О том, как поменять порты ссылка в конце статьи

3. Отключение SELinux

Для отключения SELinux вводим две команды:

Код: bash
setenforce 0

Код: bash
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

4. Установка пакетов


Выполним установку пакетов:

Код: bash
dnf install wget tar glibc-langpack-ru

* где:

    wget — утилита для загрузки файлов по сети.
    tar — для распаковки архивов.
    glibc-langpack-ru — русская локаль. Она нужна, чтобы у нас была возможность выбрать русский интерфейс во FreePBX.

5. Создание пользователя

Нам нужен общий пользователь, от которого будет работать Asterisk и веб-сервер. Это необходимо, чтобы веб-сервер имел доступ к каталогам астериска.

Создаем пользователя командой:

Код: bash
useradd asterisk -m

Настройка веб-сервера

Для работы FreePBX нам необходим веб-сервер и СУБД. В нашем примере мы установим связку NGINX + PHP + MariaDB + NodeJS.

Сервер баз данных


Устанавливаем сервер mariadb:

Код: bash
dnf install mariadb-server

Стартуем сервис и разрешаем его автозапуск:

Код: bash
systemctl enable mariadb --now

Задаем пароль для суперпользователя СУБД:

Код: bash
mysqladmin -u root password

NGINX

Для установки веб-сервера вводим команду:

Код: bash
dnf install nginx

Открываем конфигурационный файл:

Код: bash
vi /etc/nginx/nginx.conf

В секции http добавим опцию:

Код: bash
client_max_body_size 128M;

* данный параметр разрешает загрузку файлов размером 128 Мб.

Стартуем nginx:

Код: bash
systemctl enable nginx --now

Открываем браузер и заходим по адресу http:<IP-адрес сервера> — должна открыться страница приветствия NGINX:

Стартовая страница NGINX

Веб-сервер установлен.

PHP

Установка РНР 7.4 на CentOS 9

По умолчанию ставит 8.1, на нее не встает FreePBX!! Как понял я вырезана какая-то функция, используемая установщиком.

Код: bash
dnf install php php-fpm php-bcmath php-gd php-json php-mbstring php-mysqlnd php-pear php-snmp php-zip

настройки для php:

Код: bash
sed -i "s/upload_max_filesize = .*/upload_max_filesize = 128M/" /etc/php.ini
Код: bash
sed -i "s/post_max_size = .*/post_max_size = 128M/" /etc/php.ini
Код: bash
sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php.ini

И установим Time zone

Код: bash
vi /etc/php.ini

Код: bash
date.timezone = "Europe/Moscow"

*где:

    upload_max_filesize — максимальный объем загружаемого файла.
    post_max_size — максимальный объем всех загружаемых файлов за один раз.
    date.timezone — временная зона.
    memory_limit — максимальный объем памяти, который может использовать интерпретатор.


Открываем настройки php-fpm:

Код: bash
vi /etc/php-fpm.d/www.conf

Задаем значения для следующих опций:

Цитироватьuser = asterisk
...
group = asterisk
...
listen.acl_users = asterisk,apache,nginx

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

Запускаем php-fpm:

Код: bash
systemctl enable php-fpm --now

NGINX + PHP

Свяжем наш веб-сервер с php. Для этого откроем конфигурационный файл:
Код: bash
vi /etc/nginx/nginx.conf

Добавим следующие строки в разделы http - server:

Цитировать...
http {
    ...
    server {
        ...
        server_name  192.168.1.15;
        ...
        location ~ \.php$ {
            set $root_path /usr/share/nginx/html;
            fastcgi_pass unix:/run/php-fpm/www.sock;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
            fastcgi_param SERVER_NAME $host;
        }
        ...

* в данном примере мы задаем настройку для server_name — указываем имя хоста или IP-адрес, по которому мы будем подключаться к FreePBX. Также мы создаем секцию location для обработки php через php-fpm.

Перезапустим nginx:

Код: bash
systemctl reload nginx

Создадим файл php в домашней директории nginx:

Код: bash
vi /usr/share/nginx/html/index.php

Код: bash
<?php phpinfo(); ?>

Открываем браузер и заходим по адресу http:<IP-адрес сервера> — должна открываться страница с информацией об установленной версии php и всех компонентах:

NodeJS

Последний компонент для нашего веб-сервера — NodeJS. Для его установки выполняем команду:

Код: bash
dnf install nodejs

Убедиться в установке можно командой просмотра версии:

Код: bash
node --version

Наш веб-сервер готов к работе.
Установка Asterisk

Мы будем устанавливать 16-ю версию Asterisk. На странице загрузки мы можем посмотреть все версии АТС и ссылки на них.

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

Код: bash
dnf --enablerepo=powertools install libedit-devel


Но на CentOS 9 этого репозитория нет, и дальше все собирается и без него...

После скачиваем Asterisk:

Код: bash
wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz

Распаковываем архив и переходим в него:

Код: bash
tar -xvf asterisk-*.tar.gz

Код: bash
cd asterisk-*/

Устанавливаем зависимости для астериска:

Код: bash
./contrib/scripts/install_prereq install

Мы должны увидеть:

Complete!
#############################################
## install completed successfully
#############################################

Чистим временные файлы, которые появились после установки зависимостей:

Код: bash
make distclean

Добавляем библиотеку для работы с mp3:

Код: bash
./contrib/scripts/get_mp3_source.sh

Конфигурируем исходник:

Код: bash
./configure

* в данном примере мы конфигурируем исходник без дополнительных опций. Полный перечень опций и что они означают можно посмотреть командой ./configure -h.

Чтобы правильно сконфигурировать с поддержкой SRTP вводим:

Код: bash
yum install  libsrtp libsrtp-devel

Код: bash
./configure --libdir=/usr/lib64 --with-crypto --with-ssl=ssl --with-srtp

Мы должны увидеть:

...
configure: Menuselect build configuration successfully completed

              .$$$$$$$$$$$$$$$=..     
            .$7$7..          .7$$7:.   
          .$$:.                ,$7.7 
        .$7.    7$$$$          .$$77 
    ..$$.      $$$$$            .$$$7
    ..7$  .?.  $$$$$  .?.      7$$$.
  $.$.  .$$$7. $$$$7 .7$$$.      .$$$.
.777.  .$$$$$$77$$$77$$$$$7.      $$$,
$$$~      .7$$$$$$$$$$$$$7.      .$$$.
.$$7          .7$$$$$$$7:          ?$$$.
$$$          ?7$$$$$$$$$$I        .$$$7
$$$      .7$$$$$$$$$$$$$$$$      :$$$.
$$$      $$$$$$7$$$$$$$$$$$$    .$$$. 
$$$        $$$  7$$$7  .$$$    .$$$. 
$$$$            $$$$7        .$$$.   
7$$$7            7$$$$        7$$$     
$$$$$                        $$$     
  $$$$7.                      $$  (TM)   
  $$$$$$$.          .7$$$$$$  $$     
    $$$$$$$$$$$$7$$$$$$$$$.$$$$$$     
      $$$$$$$$$$$$$$$$.               

configure: Package configured for:
configure: OS type  : linux-gnu
configure: Host CPU : x86_64
configure: build-cpu:vendor:os: x86_64 : pc : linux-gnu :
configure: host-cpu:vendor:os: x86_64 : pc : linux-gnu :

Продолжаем настройку — запускаем меню для выбора параметров:

Код: bash
make menuselect
В разделе «Add-ons» выберите «chan_ooh323» и «format_mp3»

В разделе «Core Sound Packages» выберите необходимые аудиопакеты (опционально)

В разделе «Music On Hold» выберите нужные форматы музыки на удержании (опционально)

В разделе «Extra Sound Packages» выберите дополнительные аудиопакеты (опционально)

В разделе «Applications» выберите «app_macro» (в — Deprecated —)

включим поддержку SRTP

В разделе Resource Modules включить установку модуля res_srtp

Затем нажмите save and exit

В версии 20.1 нет выбора аудиопакетов, а res_srtp оказался включен по умолчанию. В 19.8 аудиопакеты есть, но SRTP не включается. Собранный с ним asterisk не может загрузить этот модуль и падает через несколько секунд

Теперь можно запустить сборку астериска:

Код: bash
make

Мы должны увидеть сообщение об успешной сборке:

+--------- Asterisk Build Complete ---------+
+ Asterisk has successfully been built, and +
+ can be installed by running:              +
+                                          +
+                make install              +
+-------------------------------------------+

После выполняем установку:

Код: bash
make install

Мы увидим:

+---- Asterisk Installation Complete -------+
+                                          +
+    YOU MUST READ THE SECURITY DOCUMENT    +
+                                          +
...

Устанавливаем скрипты для автозапуска АТС и готовые конфигурационные файлы:

Код: bash
dnf install chkconfig

Код: bash
make config

Код: bash
make samples

Код: bash
make install-logrotate

Если требуется установка logrotate для ротации лог-файлов

Код: bash
ldconfig

Настройте запуск asterisk из под соответствующего пользователя:

Откройте файл /etc/sysconfig/asterisk и раскоментируйте следующие строки:

Код: bash
vi /etc/sysconfig/asterisk
ЦитироватьAST_USER="asterisk"
AST_GROUP="asterisk"

Код: bash
vi /etc/asterisk/asterisk.conf

Снимаем комментарий с опций:

Цитироватьrunuser = asterisk
rungroup = asterisk

... и снимем комментарий с последующим редактированием:

Цитироватьdefaultlanguage = ru
documentation_language = ru_RU

Задаем владельца для следующих каталогов:

Код: bash
chown -R asterisk:asterisk /var/run/asterisk

Код: bash
chown -R asterisk:asterisk /etc/asterisk

Код: bash
chown -R asterisk:asterisk /var/{lib,log,spool}/asterisk

Код: bash
chown -R asterisk:asterisk /var/log/asterisk

Одной командой:

Код: bash
sudo chown -R asterisk.asterisk /etc/asterisk /var/run/asterisk /var/{lib,log,spool}/asterisk /usr/lib64/asterisk

и проверяем настройки:

Код: bash
asterisk -c

Мы должны увидеть Asterisk Ready:

Проверка запуска Asterisk

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

После успешной проверки, можно запустить Asterisk в качестве демона:

Код: bash
systemctl enable asterisk

Код: bash
systemctl start asterisk

Установка FreePBX

Возвращаемся в домашнюю папку пользователя:

Код: bash
cd ~

Установим пакеты:

Код: bash
dnf install sox mpg123 -y


* где:

    sox — консольная утилита для преобразования аудиофайлов из одного формата в другой.
    mpg123 — аудиопроигрыватель/декодер реального времени.

Скачиваем портал для управления астериском:

Код: bash
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-16.0-latest.tgz

* мы скачаем freepbx версии 15. Для CentOS 8 это оптимальная версия. Если необходимо установить freepbx 14, то устанавливаемая по умолчанию версия php выдаст ошибку.

Распаковываем скачанный архив:
Код: bash
tar zxvf freepbx-*.tgz

Переходим в распакованный каталог:

Код: bash
cd freepbx

Запускаем скрипт проверки работы Asterisk:

Код: bash
./start_asterisk start

Если видим:

ЦитироватьSTARTING ASTERISK
Asterisk is already running

... запускаем установку:

Код: bash
./install -n --dbuser root --dbpass password --webroot=/usr/share/nginx/html

* в данном примере мы указали учетные данные для подключения к СУБД (логин root и пароль, который мы создали после установки MariaDB); также мы указываем путь /usr/share/nginx/html, который является домашней директорией веб-сервера NGINX.

Начнется установка — в конце мы должны увидеть:

ЦитироватьYou have successfully installed FreePBX

Открываем браузер и заходим по адресу http:<IP-адрес сервера> — должна открываться страница конфигурирования FreePBX. Задаем настройки:

Задаем стартовые настройки freepbx

* достаточно указать логин и пароль для пользователя, под которым мы будем заходить в панель управления FreePBX и email адрес.

После входим в панель администратора под созданной учетной записью. Система нас запросит региональные настройки:

Настраиваем язык веб-интерфейса

Теперь открываем конфигурационный файл:

Код: bash
vi /etc/asterisk/manager.conf

Находим строки:

Цитировать#include manager_additional.conf
#include manager_custom.conf

... и меняем их на:

Цитировать;include manager_additional.conf
;include manager_custom.conf
Перезапускаем сервис Asterisk:

Код: bash
systemctl restart asterisk

Asterisk + FreePBX настроен.
#77
ервое, что требуется сделать — это обновить систему. Признаюсь честно это полезно делать перед каждой серьезной операцией.

   
Код: bash
sudo dnf update

Далее надо проверить текущую версию ядра.

Код: bash
uname -r

В терминале должен появится следующий ответ.

5.14.0-205.el9.x86_64

Теперь включите репозиторий под названием elrepo, который собирает для нас пакеты ядра и облегчает весь процесс.

Перед тем как добавить его в систему, скачайте и примените GPG ключ от него.

   
Код: bash
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

Теперь добавьте репозиторий:

   
Код: bash
sudo dnf install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm

Теперь можно легко установить ядро Linux Kernel 6.x. Для этого выполните следующую команду.

   
Код: bash
sudo dnf --enablerepo=elrepo-kernel install kernel-ml


Вот так легко и быстро это делается.

Чтобы применить изменения и загрузиться с новым ядром вам требуется перезагрузить машину (ПК).

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

    uname -r

Работает ядро 6.1
Работает ядро 6.1

Вы увидите новую версию ядра.
#78
 sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
#79
Windows. Все о нашей "любимой" ОС / DICM /Online
Последний ответ от George - Янв. 16, 2023, 04:36
Вы можете указать WIM или ESD файл с оригинальным установочным образом Windows, который нужно использовать в качестве источника для восстановления файлов компонентов системы. Предположим, вы смонтировали установочный ISO образ Windows 10 в виртуальный привод E:. Для восстановления хранилища компонентов из образа используйте одну из команд:

DISM /online /cleanup-image /restorehealth /source:E:\sources\install.wim
Или:
DISM /online /cleanup-image /restorehealth /source:E:\sources\install.esd

Чтобы запретить использовать центр обновлений Windows в Интернете, и выполнять сканирование и восстановление образа Windows только из локального WIM/ESD файла:

DISM /online /cleanup-image /restorehealth /source:E:\sources\install.wim /limitaccess
Или:
DISM /online /cleanup-image /restorehealth /source:E:\sources\install.esd /limitaccess

dism /online /cleanup-image /restorehealth /limitaccess
#80
Windows. Все о нашей "любимой" ОС / Virtual machine fails to start...
Последний ответ от George - Янв. 13, 2023, 11:32
When trying to start a virtual machine for the first time after copying (or replacing) its virtual hard drive file (.vhd or .vhdx) the virtual machine fails to start with the following error:

(x) An error occurred while attempting to start the selected virtual machine(s).

'PC-Name; failed to start.

Microsoft Emulated IDE Controller (Instance ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX): Failed to Power on with Error 'General access denied error'.

IDE/ATAPI Account does not have sufficient privilege to open attachment 'E:\Hyper-V\PC-Name\Virtual Hard Disks\MyVHD.vhdx'. Error: 'General access denied error'.

Where 'PC-Name' is the name of the virtual PC, the instance ID will be a unique series of letters and MyVHDX.vhdx will be the name (and path) of your own virtual hard drive file.

Causes
Each virtual machine is started using a virtual machine account. The virtual machine account needs read and write access to the .vhd/.vhdx file, but if the file has just been copied from somewhere then it most likely lacks the necessary file permissions.

Remedy
If you don't already have the Hyper-V Manager error dialog open ("An error occurred while attempting to start the selected virtual machine(s) ...") then try to start the virtual machine now. You need the error open.
Click "See details". This will show additional details, and will look something like:
'PC-Name' failed to start. (Virtual machine ID B9C4F7D4-0009-4BE2-90FB-9D60B1A06BDD)

'PC-Name' Microsoft Emulated IDE Controller (Instance ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX): Failed to Power on with Error 'General access denied error' (0x80070005). (Virtual machine ID B9C4F7D4-0009-4BE2-90FB-9D60B1A06BDD)

'PC-Name': IDE/ATAPI Account does not have sufficient privilege to open attachment 'E:\Hyper-V\PC-Name\Virtual Hard Disks\MyVHD.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID B9C4F7D4-0009-4BE2-90FB-9D60B1A06BDD)

'PC-Name': Hyper-V Virtual Machine Management service Account does not have sufficient privolege to open attachment 'E:\Hyper-V\PC-Name\Virtual Hard Disks\MyVHD.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID B9C4F7D4-0009-4BE2-90FB-9D60B1A06BDD)

Where PC-Name will be the name of your virtual PC. The long sequence of letters and numbers (in my case above "B9C4F7D4-0009-4BE2-90FB-9D60B1A06BDD") is the Virtual Machine ID. This number is significant and you need it to fix the problem.

On the host server open an elevated command prompt.
Enter the following:
Код: bash
icacls "full-path-to-vhd-or-vhdx-file" /grant "NT VIRTUAL MACHINE\Virtual-Machine-ID":(F)

substituting the path to the vhd/vhdx file - you can obtain this from the original error message, and the Virtual-Machine-ID that you obtained from the "See details" part of the error.

So the line for me was:

Код: bash
icacls "E:\Hyper-V\PC-Name\Virtual Hard Disks\MyVHD.vhdx" /grant "NT VIRTUAL MACHINE\B9C4F7D4-0009-4BE2-90FB-9D60B1A06BDD":(F)

But the path and Virtual Machine ID will be different to mine.

If you get the message "Failed processing 1 files" then check the virtual machine ID.

Now try to start the virtual machine. The error should no longer be present.
🡱 🡳

Отметьте интересные вам фрагменты текста и они станут доступны по уникальной ссылке в адресной строке браузера.