SSL certifikát pre subdoménu pomocou Mailcow

V tomto návode si ukážeme, ako sprístupniť lokálnu Docker aplikáciu prostredníctvom vlastnej subdomény a zabezpečiť ju SSL certifikátom Let’s Encrypt pomocou Mailcow.

Ako príklad použijeme aplikáciu bežiacu lokálne na:

10.10.8.4:3080

ktorú chceme sprístupniť prostredníctvom adresy:

https://video.ibasterisk.eu

Mailcow Nginx bude v tomto prípade slúžiť ako reverse proxy a kontajner acme-mailcow zabezpečí vystavenie a obnovovanie SSL certifikátu.

Vytvorenie DNS

Ako prvé vytvoríme DNS záznam u poskytovateľa, ktorý spravuje DNS zónu našej domény.

Pre subdoménu:

video.ibasterisk.eu

vytvoríme DNS záznam smerujúci na verejnú IP adresu servera, cez ktorý bude aplikácia dostupná z internetu.

V mojom prípade subdoména video.ibasterisk.eu smeruje na verejnú IP adresu:

109.230.12.223

Port forwarding

Následne musíme zabezpečiť, aby požiadavky z internetu na portoch 80 a 443 smerovali na server, na ktorom beží Mailcow Nginx.

Samotná aplikácia Video beží v mojom prípade na:

10.10.8.4:3080

Port 3080 však nie je potrebné publikovať priamo do internetu. Verejná HTTP/HTTPS komunikácia smeruje najskôr na Mailcow Nginx a až ten následne požiadavku presmeruje na interný port aplikácie.

Komunikácia teda vyzerá nasledovne:

Internet
   ↓
109.230.12.223:80 / :443
   ↓
FortiGate
   ↓
10.10.8.4:80 / :443
   ↓
Mailcow Nginx
   ↓
server_name video.ibasterisk.eu
   ↓
reverse proxy
   ↓
10.10.8.4:3080
   ↓
Video Docker

Na FortiGate prejdeme do:

Policy & Objects → Virtual IPs

a následne zvolíme:

Create New

Vytvoríme pravidlo, ktoré presmeruje komunikáciu z verejnej IP adresy na internú IP adresu servera s Mailcow.

Následne nastavíme parametre Virtual IP pravidla podľa našej sieťovej konfigurácie.

Príklad nastavenia port forwardingu:

Následne prejdeme do:

Policy & Objects → Firewall Policy

V mojom prípade mám pravidlá rozdelené do blokov a subdomény smerujúce cez Mailcow mám zaradené pod pravidlo pre mail server.

Otvoríme príslušné pravidlo pomocou Edit, pridáme vytvorený Virtual IP objekt a zmeny potvrdíme pomocou Apply.

Kontrola DNS

Keď máme DNS záznam vytvorený, môžeme si pomocou terminálu overiť, či sa subdoména správne prekladá na verejnú IP adresu.

Použijeme príkaz:

nslookup video.ibasterisk.eu

V mojom prípade dostaneme napríklad:

Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	video.ibasterisk.eu
Address: 109.230.12.223

Ak sa nový DNS záznam ešte nezobrazuje, je potrebné chvíľu počkať. Propagácia DNS môže trvať niekoľko minút, v niektorých prípadoch aj dlhšie.

Príprava SSL certifikátu prostredníctvom Mailcow

Odporúčanie

Pre jednoduchšiu administráciu a úpravu konfiguračných súborov odporúčam používať textový editor Vim.

Ak ho nemáme nainštalovaný, môžeme ho doinštalovať pomocou:

sudo apt update
sudo apt install vim

Základné príkazy Vim

i             vstup do režimu editácie
Esc           ukončenie režimu editácie
dd            zmazanie celého riadku
/slovo        vyhľadanie textu
n             ďalší výsledok vyhľadávania
N             predchádzajúci výsledok vyhľadávania
:set number   zapnutie číslovania riadkov
:wq           uloženie súboru a ukončenie Vim
:q!           ukončenie Vim bez uloženia zmien   

Ak si chceme pri editovaní zobraziť čísla riadkov, vo Vim použijeme:

:set number

Výsledok môže vyzerať napríklad takto:

1  server {
2      listen 80;
3      listen [::]:80;
4      listen 443 ssl;
5      listen [::]:443 ssl;
6
7      server_name christmas.ibasterisk.eu ... video.ibasterisk.eu;
8
9      ssl_certificate /etc/ssl/mail/cert.pem;
10

Pridanie subdomény do mailcow.conf

Najskôr prejdeme do adresára, v ktorom máme nainštalovaný Mailcow:

cd /opt/mailcow-dockerized

Otvoríme hlavný konfiguračný súbor:

sudo vim mailcow.conf

Vo Vim môžeme vyhľadať položku:

ADDITIONAL_SAN=

pomocou:

/ADDITIONAL_SAN=

Do existujúceho zoznamu pridáme na koniec, oddelenú čiarkou a bez medzery, novú subdoménu:

video.ibasterisk.eu

Výsledok môže vyzerať napríklad:

ADDITIONAL_SAN=mail.ibasterisk.eu,cv.ibasterisk.eu,music.ibasterisk.eu,christmas.ibasterisk.eu,chat.ibasterisk.eu,halloween.ibasterisk.eu,ibasterisk.eu,moto.ibasterisk.eu,video.ibasterisk.eu

ADDITIONAL_SAN určuje ďalšie DNS názvy, ktoré majú byť zahrnuté do SSL certifikátu Mailcow.

Zmeny uložíme pomocou:

:wq

Pridanie subdomény do Nginx reverse proxy

V mojom prostredí používam vlastný Nginx konfiguračný súbor pre ďalšie aplikácie:

/opt/mailcow-dockerized/data/conf/nginx/00-custom-apps.conf

Názov vlastného konfiguračného súboru sa môže v inom prostredí líšiť.

Súbor otvoríme:

sudo vim /opt/mailcow-dockerized/data/conf/nginx/00-custom-apps.conf

Subdoménu video.ibasterisk.eu pridáme medzi domény, ktoré má tento Nginx server obsluhovať, napríklad:

server_name christmas.ibasterisk.eu cv.ibasterisk.eu music.ibasterisk.eu chat.ibasterisk.eu halloween.ibasterisk.eu ibasterisk.eu moto.ibasterisk.eu video.ibasterisk.eu;

Následne nastavíme port, na ktorom beží samotná aplikácia:

if ($host = "video.ibasterisk.eu") {
    set $target_port "3080";
}

A požiadavku odošleme na lokálnu Docker aplikáciu:

proxy_pass http://10.10.8.4:$target_port;

Súbor opäť uložíme pomocou:

:wq

Aplikovanie zmeny v Mailcow

Po zmene mailcow.conf spustíme:

cd /opt/mailcow-dockerized
sudo docker compose up -d

Mailcow tým aplikuje zmenenú konfiguráciu. Tento krok odporúča aj oficiálna dokumentácia po úprave ADDITIONAL_SAN.

Spustenie ACME klienta

Teraz môžeme nechať Mailcow znovu spustiť ACME klienta:

sudo docker compose restart acme-mailcow

acme-mailcow skontroluje požadované domény a pri úspešnom overení vystaví nový Let’s Encrypt certifikát obsahujúci aj:

video.ibasterisk.eu

Priebeh sledujeme v druhom termináli:

sudo docker compose logs --tail=200 -f acme-mailcow

Sledovanie logu ukončíme pomocou:

CTRL + C

Reštart Nginx

Po získaní certifikátu môžeme načítať konfiguráciu Nginx:

sudo docker compose restart nginx-mailcow

Po reštarte Nginx by mala byť aplikácia dostupná prostredníctvom zabezpečenej HTTPS adresy:

https://video.ibasterisk.eu

Overenie SSL certifikátu

Najjednoduchšie:

curl -I https://video.ibasterisk.eu

Alebo si môžeme pozrieť priamo certifikát:

echo | openssl s_client \
-connect video.ibasterisk.eu:443 \
-servername video.ibasterisk.eu 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates

A všetky názvy zahrnuté v certifikáte:

echo | openssl s_client \
-connect video.ibasterisk.eu:443 \
-servername video.ibasterisk.eu 2>/dev/null \
| openssl x509 -noout -ext subjectAltName

Vo výstupe by sme mali nájsť aj našu subdoménu:

Výstup

X509v3 Subject Alternative Name: 
DNS:chat.ibasterisk.eu, DNS:christmas.ibasterisk.eu, DNS:cv.ibasterisk.eu, DNS:halloween.ibasterisk.eu, DNS:ibasterisk.eu, DNS:mail.ibasterisk.eu, DNS:moto.ibasterisk.eu, DNS:music.ibasterisk.eu, DNS:video.ibasterisk.eu

Ak sa medzi hodnotami Subject Alternative Name nachádza DNS:video.ibasterisk.eu, znamená to, že subdoména je správne zahrnutá v SSL certifikáte.

Celý postup v skratke

1. DNS
   video.ibasterisk.eu
   ↓
   verejná IP adresa

2. FortiGate / Firewall
   TCP 80 a 443
   ↓
   Mailcow Nginx

3. /opt/mailcow-dockerized/mailcow.conf
   ↓
   ADDITIONAL_SAN=...,video.ibasterisk.eu

4. data/conf/nginx/00-custom-apps.conf
   ↓
   pridať video.ibasterisk.eu
   ↓
   nastaviť target_port 3080

5. docker compose up -d

6. docker compose restart acme-mailcow

7. skontrolovať ACME log

8. docker compose restart nginx-mailcow

9. overiť
   https://video.ibasterisk.eu

naspäť