FreeIPA pridanie SSL certikátu na lokálne domény

Obsah
1. Architektúra riešenia
2. Caddy Reverse Proxy
3. Inštalácia Caddy
4. Vytvorenie DNS záznamu v Pi-hole
5. Príprava FreeIPA
6. Generovanie SSL certifikátu
7. Vydanie certifikátu vo FreeIPA
8. Stiahnutie a overenie certifikátu
9. Nasadenie certifikátu do Caddy
10. Dôvera certifikátom na klientskych zariadeniach
11. Import FreeIPA Certificate Authority (ca.crt)
12. Troubleshooting
13. Používanie SSL certifikátov na ďalších zariadeniach
Čo je SSL a na čo slúži
SSL/TLS certifikát je digitálny certifikát slúžiaci na zabezpečenie šifrovanej komunikácie medzi klientom a serverom. Zabezpečuje overenie identity servera, ochranu prenášaných dát pred odpočúvaním a zachovanie integrity komunikácie. Je využívaný na ochranu webových stránok, aplikácií, e-mailových služieb a ďalších systémov komunikujúcich prostredníctvom siete.
SSL/TLS certifikáty je možné nasadiť na verejne dostupné internetové služby a domény, ako aj na interné firemné systémy a lokálne servery. V internom prostredí sa používajú napríklad na zabezpečenie webových aplikácií, intranetových portálov, databázových serverov, VPN riešení alebo administrátorských rozhraní.
Čo budeme potrebovať?
Pre vystavenie SSL certifikátu na lokálnu IP adresu, budeme potrebovať
- FreeIPA server,
- DNS server
- Caddy
1. Architektúra riešenia
Klient (Firefox, Chrome, Safari)
│
▼
Caddy Reverse Proxy
10.10.8.5
│
┌──────────────┼──────────────┐
│ │ │
▼ ▼ ▼
Grafana Zabbix NetBox
:3000 :8080 :4030
│
▼
FreeIPA CA
10.10.8.6
│
▼
Pi-hole DNS
10.10.8.2
2. Caddy Reverse Proxy
Caddy je moderný webový server a reverzný proxy server, ktorý prijíma HTTPS požiadavky od klientov a presmerováva ich na interné služby bežiace na rôznych portoch.
V našej infraštruktúre Caddy zabezpečuje:
- SSL/TLS ukončenie
- používanie certifikátov z FreeIPA CA
- jednotný vstupný bod na portoch 80 a 443
- reverzné proxy pre interné aplikácie
3. Inštalácia Caddy
Caddy môžete nainštalovať na ľubovoľný server. Odporúča sa však prevádzkovať ho na dedikovanom serveri, ktorý sprostredkúva HTTPS komunikáciu pre interné aplikácie.
Ako prvé si pridáme repozitáre
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
| sudo gpg --dearmor \
-o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
| sudo tee /etc/apt/sources.list.d/caddy-stable.list
Aktualizujeme repozitáre
sudo apt update
Nainštalujeme Caddy
sudo apt install caddy
Verziu nainštalovanej verzie Caddy
caddy version
Príklad
caddy version
v2.11.4 h1:XKxkMTgNSizEvKG6QHue6cAsFOteU2qA61w2tKkCWi0=
Certifikáty môžete ukladať napr. sem
sudo mkdir -p /etc/caddy/certs
4. Vytvorenie DNS záznamu v Pi-hole
Ako prvé si musíte na DNS serveri vytvoriť A záznam. Ja používam Pi-hole
Zvoľte Settings a následne Local DNS Records


Môžete overiť vytvorenie A záznamu následovne
nslookup wikijs.ibasterisk.local 10.10.8.2
Príklad
Server: 10.10.8.2
Address: 10.10.8.2#53
Name: wikijs.ibasterisk.local
Address: 10.10.8.6
Ďalšie príklady na overenie
dig @10.10.8.2 wikijs.ibasterisk.local A
ping wikijs.ibasterisk.local
A následne kliknite na plus. Týmto sa práve vytvoril A záznam, ktorý je na hostname wikijs.ibasterisk.local
5. Príprava na FreeIPA
Vo FreeIPA zvoľte Identity a následne Hosts

V pravo hore Kliknite na Add

Následne Add

Následne kliknite v Identity naa Services

Kliknite na Add
- Services volíme HTTP
- a hostname, v mojom prípade wikijs.ibasterisk.local
- Následne kliknite na Force

Kliknite na Add
6. Generovanie SSL certifikátu
Po vytvorení Host a Service záznamu vo FreeIPA môžeme vytvoriť privátny kľúč a certifikačnú požiadavku (CSR).
Vytvorenie privátneho kľúča
V mojom prípade vytváram certifikát pre službu:
wikijs.ibasterisk.local
Pomocou príkazu
openssl genrsa -out wikijs.ibasterisk.local.key 4096
Výsledkom je
wikijs.ibasterisk.local.key
Privátny kľúč slúži na identifikáciu servera a je potrebné ho uchovávať v bezpečí.
Vytvorenie CSR požiadavky
Následne vytvoríme požiadavku pre FreeIPA CA:
openssl req -new \
-key wikijs.ibasterisk.local.key \
-out wikijs.ibasterisk.local.csr \
-subj "/CN=wikijs.ibasterisk.local" \
-addext "subjectAltName=DNS:wikijs.ibasterisk.local"
Výsledkom je súbor:
wikijs.ibasterisk.local.csr
Kontrola CSR
Pred odoslaním do FreeIPA odporúčam overiť SAN záznam:
openssl req -in wikijs.ibasterisk.local.csr -noout -text | grep -A2 "Subject Alternative"
Príklad výstupu
X509v3 Subject Alternative Name:
DNS:wikijs.ibasterisk.local
Signature Algorithm: sha256WithRSAEncryption
Zobrazenie CSR
Obsah CSR zobrazíme:
cat wikijs.ibasterisk.local.csr
7. Vydanie certifikátu vo FreeIPA
Vo FreeIPA otvoríme:
- Identity
- → Services
- → HTTP/wikijs.ibasterisk.local
- → Actions
- → New Certificate

Klikneme na službu: HTTP/wikijs.local@IBASTERISK.LOCAL

Volíme Actions a následne New Certificate

Do formulára vložíme celý obsah súboru:
wikijs.ibasterisk.local.csr
cat wikijs.ibasterisk.local.csr

Následne klikneme na Issue
8. Stiahnutie certifikátu
Po úspešnom vydaní certifikátu klikneme na Actions a tam nájdeme možnosť Download:


Pre lepšiu orientáciu som certifikát premenoval na:
wikijs.ibasterisk.local.pem

Poznámka:
FreeIPA môže certifikát stiahnuť pod rôznymi názvami
(napr. cert.pem, wikijs.ibasterisk.local.crt alebo
wikijs.ibasterisk.local.crt.pem).
Pre lepšiu orientáciu som certifikát premenoval na:
wikijs.ibasterisk.local.pem
Tento certifikát otvoríme v textovom editore a obsah skopírujeme (najrýchlešia cesta) a vložíme ho do:
nano wikijs.ibasterisk.local.pem
Overenie certifikátu
openssl x509 \
-in wikijs.ibasterisk.local.pem \
-noout \
-subject \
-issuer
Výstup
subject=O=IBASTERISK.LOCAL, CN=wikijs.ibasterisk.local
issuer=O=IBASTERISK.LOCAL, CN=Certificate Authority
8. Nasadenie certifikátu do Caddy
Vytvorenie adresára:
sudo mkdir -p /etc/caddy/certs
Kopírovanie certifikátu:
sudo cp wikijs.ibasterisk.local.pem /etc/caddy/certs/wikijs.ibasterisk.local.crt
Kopírovanie privátneho kľúča:
sudo cp wikijs.ibasterisk.local.key /etc/caddy/certs/wikijs.ibasterisk.local.key
Nastavenie oprávnení:
sudo chown -R caddy:caddy /etc/caddy/certs/
sudo chmod 600 /etc/caddy/certs/*.key
sudo chmod 644 /etc/caddy/certs/*.crt
Konfigurácia Caddy
Otvoríme konfiguračný súbor:
sudo nano /etc/caddy/Caddyfile
wikijs.ibasterisk.local {
tls /etc/caddy/certs/wikijs.ibasterisk.local.crt /etc/caddy/certs/wikijs.ibasterisk.local.key
reverse_proxy 10.10.8.6:3070
}
10. Dôvera certifikátom na klientskych zariadeniach
Po vytvorení a nasadení certifikátu je potrebné zabezpečiť, aby klientské zariadenia dôverovali certifikačnej autorite FreeIPA.
Používanie certifikátov na ďalších zariadeniach
Ak chcete využívať lokálne domény (.local) aj na ďalších zariadeniach
(napr. notebook, PC, Mac, mobilný telefón alebo tablet),
je potrebné importovať certifikát certifikačnej autority FreeIPA.
Stačí importovať certifikát:
ca.crt
Po jeho importe budú automaticky dôveryhodné všetky certifikáty
vydané FreeIPA Certificate Authority.
Nie je potrebné importovať jednotlivé certifikáty služieb
(grafana, zabbix, netbox, wikijs, synology a pod.).
Bez tohto kroku bude prehliadač zobrazovať upozornenie:
Not Secure
alebo
Warning: Potential Security Risk Ahead

Získanie certifikátu CA
sudo docker cp freeipa-server:/data/etc/ipa/ca.crt ~/ca.crt
Overenie
openssl x509 -in ~/ca.crt -noout -subject -issuer
Príklad výstupu
subject=O=IBASTERISK.LOCAL, CN=Certificate Authority
issuer=O=IBASTERISK.LOCAL, CN=Certificate Authority
Následne súbor:
ca.crt
stiahneme do klientského zariadenia a importujeme ho medzi dôveryhodné certifikáty.
Po importe certifikátu ca.crt budú automaticky dôveryhodné všetky súčasné aj budúce certifikáty vydané FreeIPA Certificate Authority.
11. Import FreeIPA Certificate Authority
Do klientského zariadenia importujeme certifikát certifikačnej autority:
macOS
Keychain Access
→ System
→ Import Items
12. Troubleshooting
Chyba pri načítaní certifikátu
Pri overovaní certifikátu sa môže zobraziť:
Príčina
Certifikát sa nenachádza v aktuálnom adresári alebo bol uložený pod iným názvom.
Overenie
ls -lh
alebo
find ~ -name "*.pem"
Riešenie
Použiť správny názov certifikátu:
openssl x509 \
-in wikijs.ibasterisk.local.pem \
-noout \
-subject \
-issuer
Chyba pri štarte Caddy
Príklad chyby:
loading certificates:
permission denied
alebo
open /etc/caddy/certs/wikijs.ibasterisk.local.key:
permission denied
Príčina
Používateľ alebo skupina caddy nemá oprávnenie čítať certifikát alebo privátny kľúč.
Overenie
ls -l /etc/caddy/certs/
Nesprávny stav:
-rw-r----- 1 root root ...
správany stav
-rw-r----- 1 root caddy ...
Riešenie
sudo chown root:caddy /etc/caddy/certs/*
sudo chmod 640 /etc/caddy/certs/*
Následne:
sudo systemctl restart caddy
Očakávaný výsledok:
Active: active (running)
Certifikát je platný, ale prehliadač zobrazuje „Not Secure“
Príčina
Klientské zariadenie nedôveruje certifikačnej autorite FreeIPA.
Riešenie pre macOS
Keychain Access
→ System
→ Import Items
→ ca.crt
Nastaviť:
Trust
→ Always Trust
Riešenie pre Firefox
Settings
→ Privacy & Security
→ Certificates
→ View Certificates
→ Authorities
→ Import
Importovať
ca.crt
a zaškrtnúť:
Trust this CA to identify websites
DNS záznam vracia NXDOMAIN
Overenie
nslookup wikijs.ibasterisk.local 10.10.8.2
alebo
dig @10.10.8.2 wikijs.ibasterisk.local A
Nesprávny DNS záznam smeruje mimo Caddy
Príznaky
HTTPS funguje, ale prehliadač zobrazuje:
Not Secure
Overenie certifikátu zobrazí:
openssl s_client \
-connect wikijs.ibasterisk.local:443 \
-servername wikijs.ibasterisk.local \
</dev/null 2>/dev/null | \
openssl x509 -noout -subject -issuer
subject= /O=IBASTERISK.LOCAL/CN=freeipa.ibasterisk.local
issuer= /O=IBASTERISK.LOCAL/CN=Certificate Authority
Napriek tomu, že bol vytvorený certifikát:
wikijs.ibasterisk.local
Príčina
DNS záznam smeruje priamo na server služby namiesto na server s Caddy Reverse Proxy.
Nesprávne:
wikijs.ibasterisk.local -> 10.10.8.6
Správne:
wikijs.ibasterisk.local -> 10.10.8.5
Overenie
nslookup wikijs.ibasterisk.local
Príklad nesprávneho stavu:
Name: wikijs.ibasterisk.local
Address: 10.10.8.6
Riešenie
V Pi-hole zmeniť DNS záznam:
wikijs.ibasterisk.local
na
10.10.8.5
Po úprave vyčistiť DNS cache:
macOS
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
Overenie
nslookup wikijs.ibasterisk.local
Výstup
Name: wikijs.ibasterisk.local
Address: 10.10.8.5
Výsledok
Po korekcii DNS bude klient komunikovať:
Klient
↓
Caddy (10.10.8.5)
↓
Wiki.js (10.10.8.6:3070)
a certifikát:
CN=wikijs.ibasterisk.local
bude zobrazený korektne.
13. Používanie SSL certifikátov na ďalších zariadeniach
Ak chcete pristupovať k interným službám z ďalších zariadení (napríklad notebook, PC, Mac, mobilný telefón alebo tablet), je potrebné na každom zariadení nainštalovať certifikát certifikačnej autority FreeIPA.
Bez vykonania tohto kroku budú prehliadače zobrazovať upozornenia:
Not Secure
alebo
Warning: Potential Security Risk Ahead
Certifikát certifikačnej autority
Zo servera FreeIPA si stiahnite:
ca.crt
Tento certifikát predstavuje internú certifikačnú autoritu (CA), ktorá vydáva certifikáty pre všetky lokálne služby.
Služby využívajúce FreeIPA CA
Po importe certifikátu ca.crt budú automaticky dôveryhodné všetky certifikáty vydané FreeIPA, napríklad:
grafana.ibasterisk.local
zabbix.ibasterisk.local
netbox.ibasterisk.local
evidence.ibasterisk.local
wikijs.ibasterisk.local
nas.ibasterisk.local
Nie je potrebné importovať každý certifikát samostatne.
Stačí importovať:Nie je potrebné importovať každý certifikát samostatne.
Stačí importovať:
ca.crt
a zariadenie bude dôverovať všetkým budúcim certifikátom vydaným FreeIPA Certificate Authority.
Výhoda
Po vytvorení novej služby stačí:
1. Vytvoriť DNS záznam
2. Vytvoriť certifikát vo FreeIPA
3. Nasadiť certifikát do služby
Klientské zariadenia už nevyžadujú žiadnu ďalšiu konfiguráciu, pokiaľ majú nainštalovaný certifikát:
ca.crt