Как опубликовать Web сервер (NextCloud) через Sophos UTM с использование HTTPS и Let’s Encrypt?

Есль локальный web сервер (в нашем случае это NextCloud), необходимо его опубликовать через Sophos UTM по HTTPS с использование Let’s Encrypt

Как опубликовать Web сервер (NextCloud) через Sophos UTM с использование HTTPS и Let's Encrypt?

Из-за того что на текущий момент Sophos UTM официально не имеет инструментов для автоматической генерации сертификатов Let’s Encrypt, то мы будем использовать подмену сертификата. Итак приступим.

Что мы имеем:

Шлюз Sophos UTM         – 192.168.10.1
Web сервер (NextCloud) – 192.168.10.71
Web сервер с LEMP на борту на базе FreeBSD 10 и несущий NextCloud на боту мы настраивали ранее, и все конфиги nginx мы будем использовать оттуда.

Схема подключения следующая:

Sophos UTM

Приступим:

1)  Скачиваем промежуточный сертификат https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem
2)  Заходим в WebUi Sophos UTM и переходим по “Webserver Protection > Certificate Management > Certificate Authority > New CA…”
3)  Добавляем скаченный сертификат как CA

Sophos UTM CA
Sophos UTM CA

4)  Создаем новое правило для Firewall разрешающие соединение по SSH между шлюзом и Web сервером. В WebUi Sophos UTM переходим “Network Protection > Firewall > New Rule…”  И вносим следующие настройки:

Sophos UTM Firewall

 • Sources: ваш сервер Sophos UTM
Services: сервис SSH (22 порт)
Destinations: ваш webserver
• Сохраняем и включаем.

5) Подключаемся через SSH к нашему серверу Sophos UTM ( Как включить shell вы можете прочитать ЗДЕСЬ)
6) Скачиваем все необходимые скрипты и конфиги:

sudo su -
cd /root
wget https://raw.githubusercontent.com/srvrco/getssl/master/getssl --no-check-certificate
wget https://raw.githubusercontent.com/rklomp/sophos-utm-letsencrypt/master/update-cert --no-check-certificate
wget http://web.mit.edu/crypto/openssl.cnf
chmod +x getssl
chmod +x update-cert

 7) Так как создать сертификат с нуля для Let’s Encrypt нельзя, а можно только заменить. То мы сначала создам болванку. Для это нам потребуется зайти “Webserver Protection > Certificate Management > Certificates > New Certificate…”
8) И создаем болванку которую потом мы будем потом подменять:

Sophos UTM Web Server

9) Возвращаемся в консоль SSH:

cc
127.0.0.1 MAIN > OBJS
127.0.0.1 OBJS > ca
127.0.0.1 OBJS ca > host_key_cert
127.0.0.1 OBJS ca host_key_cert >

Два раза нажимаем TAB и мы видим список всех сертификатов:

Sophos UTM Cert

10) Выписываем (ну или запоминаем) REF сертификата который мы создали выше (в нашем случае это REF_kPsiGwrpNkhh[yoursite.com,ca,host_key_cert])
11) Набираем exit выходим
12) Создаем конфиги:

./getssl -c yourdomain.ru
vi ~/.getssl/getssl.cfg

В этом файле редактируем строчки:

ACCOUNT_EMAIL=<Ваш рабочий email>
SSLCONF="/root/openssl.cnf"

Сохраняем и выходим.
Редактируем файл конфигурации домена:

vi ~/.getssl/yourdomain.ru/getssl.cfg

В строчке “RELOAD_CMD=” прописываем REF сертификата который мы смотрели выше:

RELOAD_CMD="/root/update-cert yourdomain.ru REF_CaHosLetsEncrypt"

Редактируем строчку “ACL=” и приводим её к виду:

$ ACL=('ssh:root@192.168.10.71:/var/www/yourdomain.ru/letsencrypt/.well-known/acme-challenge')

Где root – это пользователь Web сервера, а 192.168.10.71 его IP.
Шлюз будет автоматически подключаться к Web серверу по SSH и ложить в заданную папку файл ответа (Ещё можно передачу файлов настроить через FTP, но мы ее не будем рассматривать).

На сервере Sophos UTM генерируем ключ SSH и передаем его на Web Server:

ssh-keygen
ssh-copy-id root@192.168.10.71

Вводим пароль от пользователя root (или другого, зависит от того кого вы задали владельцем папки на Web сервере) и ждем положительного ответа что ключи перенеслись.

13) На Web Server необходимо поправить файлы конфигурации и проверить доступность папки. В нашем случае мы возьмем за основу конфигурацию файла из ранее установленного и настроенного сервера nginx под NextCloud, и добавим необходимые настройки:

server {
    listen 80;
    charset utf-8;
    server_name yoursite.com;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this
    # topic first.
    add_header Strict-Transport-Security "max-age=15552000;
    # includeSubDomains; preload;";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;

    # Path to the root of your installation
    root /var/www/nextcloud/;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
	
    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
    # last;
	
    location ~ /.well-known 
    { 	
    location = /.well-known/acme-challenge/* {
      allow all;
    }
    }	
    location = /.well-known/carddav {
      return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host/remote.php/dav;
    }	

    # set max upload size
    client_max_body_size 10250M;
    fastcgi_buffers 64 4K;

    # Disable gzip to avoid the removal of the ETag header
    gzip off;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

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

    location / {
        rewrite ^ /index.php$uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
        deny all;
    }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php-fpm.sock;		
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
        #Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_request_buffering off;
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
        try_files $uri/ =404;
        index index.php;
    }

    # Adding the cache control header for js and css files
    # Make sure it is BELOW the PHP block
    location ~* \.(?:css|js|woff|svg|gif)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control "public, max-age=7200";
        # Add headers to serve security related headers (It is intended to
        # have those duplicated to the ones above)
        # Before enabling Strict-Transport-Security headers please read into
        # this topic first.
        # add_header Strict-Transport-Security "max-age=15768000;
        #  includeSubDomains; preload;";
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        # Optional: Don't log access to assets
        access_log off;
    }

    location ~* \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        # Optional: Don't log access to other assets
        access_log off;
    }
}

(Если в вашем файле конфигурации сервера есть блок для запрета открытия файлов, начинающихся с точки, то нужно вставлять блок с .well-known ДО НЕГО, иначе при попытке зайти в браузере по адресу yourdomain.ru/.well-known/acme-challenge, вы будете получать 403 ошибку (так как запрещено открытие папок, начинающихся с точки))

Далее создаем все необходимые папки и раздаем права:

mkdir -p /var/www/nextcloud/.well-known/acme-challenge
chown -hR www:www /var/www/nextcloud/.well-known/acme-challenge
service nginx restart

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

echo "Hello world" > /var/www/nextcloud/.well-known/acme-challenge/index.html
chown -hR www:www /var/www/nextcloud/.well-known/acme-challenge/index.html

И для проверки открываем браузер и вбиваем свой домен:
http://yourdomain.ru/.well-known/acme-challenge/index.html
Если вы увидели “Hello world” то все в порядке и можно двигаться дальше, если нет, то надо разбираться в чём дело двигаться дальше смысла нет.

13) В консоли Sophos UTM получаем сертификат и подменяем болванку:

Sophos UTM Lets Encrypt

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

14) Заканчиваем настройку:

vi ~/.getssl/yourdomain.ru/getssl.cfg

 Расскоментируем строчку:

CA="https://acme-v01.api.letsencrypt.org"

 Запускаем:

./getssl -f yourdomain.ru

 Если опять увидели надпись Done!  То Вас можно поздравить теперь у вас есть сертификат Let’s Encrypt и можно перенастроить публикацию Web Server на https.

16) Заходим в WebUi Sophos UTM, переходим “Webserver Protection > Web Application Firewall >  Virtual Webservers”   выбираем наш опубликованный сервер и редактируем его (Если у вас сервер еще не опубликован, то я вообще удивляюсь как вы смогли дойти до сюда и получить сертификат. Но всякое бывает и почитать инструкцию о публикации Webserver через Sophos UTM можно ТУТ).

Sophos UTM Web Server

Меняем:
Type:  на Encrypted (HTTPS)
Certificate: выбираем ранее созданный.

17) Заходим в браузер заходим на наш опубликованный сайт, и мы должны увидеть вот это:

Lets Encrypt

18) Возвращаемся в консоль Sophos UTM и редактируем cron:

crontab -e
0 0 * * * /root/getssl yourdomain.ru

 19) А вот теперь все, можно пользоваться) Сертификат будет обновляться сам.

Как опубликовать Web сервер (NextCloud) через Sophos UTM с использование HTTPS и Let's Encrypt?
Publisher
Оцените автора
AsaDagar
Добавить комментарий