Caddy je webový server s otevřeným zdrojovým kódem napsaný v jazyce Go. Poskytuje podporu HTTP/3, TLS v1.3, automatickou konfiguraci SSL pomocí Let's Encrypt, reverzní proxy a podporuje více pluginů pro rozšíření jeho funkčnosti. Má tu výhodu, že veškerá jeho konfigurace je obsluhována z jednoho souboru bez ohledu na to, kolik webů potřebujete hostovat.
Tento tutoriál se bude zabývat instalací a konfigurací Caddy a PHP na serverech založených na Fedora 34 a CentOS 8. Probereme, jak hostovat jeden a více webů a jak používat reverzní proxy spolu s několika dalšími bezpečnostními funkcemi.
Předpoklady
-
Server založený na Fedora 34 nebo CentOS 8
-
Uživatel bez oprávnění root s právy sudo
-
Název domény směřující na IP adresu serveru
-
SELinux je zakázán.
$ sudo setenforce 0
-
Ujistěte se, že je vše aktualizováno.
$ sudo dnf update
Krok 1 – Konfigurace brány firewall
Prvním krokem je nakonfigurovat bránu firewall tak, aby otevírala porty HTTP a HTTPS. Fedora a CentOS se dodávají s předinstalovaným firewallem Firewalld.
Zkontrolujte, zda je spuštěna brána firewall.
$ sudo firewall-cmd --state
Měli byste získat následující výstup.
running
Zkontrolujte aktuální povolené služby/porty.
$ sudo firewall-cmd --permanent --list-services
Měl by ukazovat následující výstup.
dhcpv6-client mdns ssh
Povolit porty HTTP a HTTPS.
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
Znovu zkontrolujte stav brány firewall.
$ sudo firewall-cmd --permanent --list-services
Měli byste vidět podobný výstup.
dhcpv6-client http https mdns ssh
Znovu načtěte bránu firewall.
$ sudo systemctl reload firewalld
Krok 2 – Instalace Caddy
Prvním krokem je instalace serveru. Instalační kroky zůstávají stejné pro Fedora 34 i CentOS 8.
$ sudo dnf install 'dnf-command(copr)'
$ sudo dnf copr enable @caddy/caddy
$ sudo dnf install caddy
Instalaci můžete ověřit pomocí následujícího příkazu.
$ caddy version
v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=
Krok 3 – Základy konfigurace Caddy
Caddy používá JSON jako primární formát pro ukládání nebo zápis konfigurace. Je to nejflexibilnější způsob zápisu konfigurace a podporuje všechny funkce Caddy. Pokud ale nevíte, jak psát soubory JSON, Caddy nabízí jednodušší způsob v podobě Caddyfile.
Balíček Fedora / CentOS obsahuje Caddyfile na /etc/caddy/Caddyfile
. Mělo by to vypadat následovně (při ignorování komentářů)
:80 {
root * /usr/share/caddy
file_server
}
Povolte a spusťte démona nosiče.
$ sudo systemctl enable --now caddy
Můžete otevřít adresu URL http://youripaddress
zkontrolovat. Měli byste vidět následující uvítací stránku.
Caddy nabízí mnoho funkcí a konfigurací, takže pro obsluhu našich webových stránek se budeme věnovat pouze těm důležitým. Výchozí konfigurace slouží přes HTTP, který je zadán jako :80
. root
direktiva říká Caddymu, aby hledal soubory, které mají být obsluhovány v /usr/share/caddy
adresář.
file_server
direktiva říká Caddy, aby fungoval jako souborový server, což znamená, že bude obsluhovat pouze statické soubory přes výchozí adresu.
Konfigurace Caddy pro základní HTML web
Vytvořme základní konfigurační soubor caddy pro obsluhu statické webové stránky.
Vytvořte adresář pro hostování vašich webových stránek a uložte soubory protokolu.
$ sudo mkdir -p /var/www/example.com/html
$ sudo mkdir /var/log/caddy
Nastavte vlastnictví adresáře na Caddy.
$ sudo chown caddy:caddy /var/www/example.com/html -R
$ sudo chown caddy:caddy /var/log/caddy
Vytvořte soubor HTML k testování a otevřete jej pro úpravy.
$ sudo nano /var/www/example.com/html/index.html
Přidejte následující kód.
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1>Hello, from Caddy!</h1>
</body>
</html>
Stiskněte Ctrl + X zavřete editor a stiskněte Y až budete vyzváni k uložení souboru.
Otevřete Caddyfile pro úpravy.
$ sudo nano /etc/caddy/Caddyfile
Nahraďte stávající kód následujícím.
example.com {
root * /var/www/example.com/html
file_server
encode gzip
log {
output file /var/log/caddy/example.access.log
}
@static {
file
path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.pdf *.webp
}
header @static Cache-Control max-age=5184000
tls [email protected]
}
Stiskněte Ctrl + X zavřete editor a stiskněte Y až budete vyzváni k uložení souboru.
Pojďme si projít všechny směrnice v souboru. encode gzip
direktiva říká Caddymu, aby komprimoval soubory pomocí komprese Gzip.
log
direktiva vypíše přístupový protokol pro web do /var/log/caddy/example.access.log
soubor. Ve výchozím nastavení Caddy otáčí soubory protokolu, když dosáhnou 100 MB. Otočené soubory jsou smazány po 90 dnech nebo v případě, že existuje více než 10 otočených protokolů. Výchozí parametry můžete změnit následujícím způsobem.
log {
output file /var/log/caddy/example.access.log {
roll_size 10MB
roll_keep 5
roll_keep_for 240h
}
}
Ve výše uvedeném kódu jsou rotované soubory protokolů omezeny na 10 MB a smažou se po 10 dnech (240 hodinách) nebo pokud existuje více než 5 otočených protokolů.
Caddy vygeneruje a nainstaluje SSL certifikát automaticky bez jakéhokoli zásahu. tls
direktiva nám umožňuje poskytnout další možnosti konfigurace HTTPS, jako je e-mailová adresa používaná pro získávání zpráv Let's Encrypt.
header
Direktiva umožňuje řízení mezipaměti u všech statických souborů (obrázky/javascript/soubory CSS). Můžete přidat více přípon souborů nebo zkopírovat kód a nastavit různé trvání pro různé formáty souborů. Budete muset změnit hodnotu static
na něco jiného, protože se jedná o pojmenovaný odkaz.
Po dokončení můžete svou konfiguraci ověřit pomocí následujícího příkazu.
$ caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile
Musíme použít --adapter caddyfile
protože ve výchozím nastavení příkaz ověřuje pouze konfigurace JSON.
Pokud se zobrazí následující varování, můžete jej snadno opravit jediným příkazem.
WARN input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}
Chybu opravíte spuštěním následujícího příkazu.
$ caddy fmt --overwrite /etc/caddy/Caddyfile
Výše uvedený příkaz zformátuje a přepíše Caddyfile.
Restartujte Caddy, abyste povolili konfiguraci. Při každé změně v konfiguraci budete muset restartovat server.
$ sudo systemctl restart caddy
Otevřete ve svém prohlížeči a měli byste vidět následující stránku, což znamená, že konfigurace funguje.
Konfigurace více stránek v Caddy
V jednom souboru caddy můžete nakonfigurovat více míst. Chcete-li to provést, vytvořte samostatné bloky pro každý web následujícím způsobem.
example1.com {
root * /var/www/example1.com/html
...
}
example2.com {
root * /var/www/example2.com/html
...
}
Tato metoda je vhodná pro několik webů, ale pokud hostujete více webů, jeden může být pěkně velký a obtížně se udržuje.
Vytvořte adresář `/etc/caddy/caddyconf.
$ sudo mkdir /etc/caddy/caddyconf
Nyní můžete importovat konfigurační soubory z adresáře ve vašem /etc/caddty/caddyfile
v horní části souboru.
import caddyconf/*.conf
Posledním krokem je vytvoření individuálních konfiguračních souborů pro každý web.
Konfigurace stránek PHP
Doposud jsme hovořili pouze o obsluze statických stránek pomocí Caddy. Caddy můžete stejně snadno používat také k obsluze dynamických stránek PHP. Chcete-li povolit podporu PHP, přidejte do bloku svého webu následující kód.
example1.com {
root * /var/www/example1.com/html
...
php_fastcgi unix//run/php-fpm/www.sock
}
Budete také muset nainstalovat PHP.
$ sudo dnf install php-fpm php-cli php-gd
Můžete nainstalovat jakýkoli další modul PHP, který potřebujete. Budete také muset nakonfigurovat soubor /etc/php-fpm.d/www.conf
. Otevřete soubor pro úpravy.
$ sudo nano /etc/php-fpm.d/www.conf
Musíme nastavit unixového uživatele/skupinu PHP procesů na caddy . Najděte user=apache
a group=apache
řádků v souboru a změňte je na nginx.
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = caddy
; RPM: Keep a group allowed to write in log dir.
group = caddy
...
Najděte řádek listen.acl_users = apache,nginx
a změňte jeho hodnotu na následující.
...
listen.acl_users = apache,nginx,caddy
...
Uložte soubor stisknutím Ctrl + X a zadáním Y až budete vyzváni.
Spusťte proces PHP-fpm.
$ sudo systemctl start php-fpm
Chcete-li otestovat nastavení PHP, vytvořte soubor test.php
v html
složka.
$ sudo nano /var/www/example.com/html/test.php
Přidejte do něj následující obsah a uložte soubor stisknutím Ctrl + X a zadáním Y až budete vyzváni.
<?php phpinfo();
Spusťte http://example.com/test.php
ve vašem webovém prohlížeči a měli byste vidět následující.
Konfigurace reverzního proxy
Caddy lze také použít jako reverzní proxy server. Chcete-li jej nastavit, použijte následující kód.
example1.com {
...
reverse_proxy localhost:8000 {
header_up Host {http.reverse_proxy.header.X-Forwarded-Host}
}
}
Krok 4 – Caddy Global Options
Caddyfile vám umožňuje nastavit některé možnosti, které budou použitelné globálně, tj. budou platit pro všechny vaše stránky. Je výhodné definovat globální možnosti, abyste je nemuseli znovu deklarovat v každém bloku serveru.
Globální možnosti byste měli zahrnout úplně nahoře ve vašem Caddyfile. Existuje spousta možností, které můžete nastavit globálně. Projdeme si jen některé důležité. Pro zbytek byste se měli podívat na dokumentaci Caddy.
Zde jsou některé výchozí možnosti, které můžete použít ve svém Caddyfile.
{
#TLS Options
email [email protected]
servers :443 {
protocol {
experimental_http3
}
max_header_size 5mb
}
servers :80 {
protocol {
allow_h2c
}
max_header_size 5mb
}
}
Ve výše uvedeném kódu email
určuje e-mailové ID použité pro registraci certifikátu SSL u autority Let's Encrypt. Sešívání OCSP zlepšuje výkon webů HTTPS tím, že prohlížečům automaticky poskytuje informace o odvolání certifikátu. max_header_size
volba určuje velikost hlaviček HTTP požadavků klienta, které mají být analyzovány.
Povolili jsme také protokol HTTP/3 pro weby HTTPS a podporu HTTP/2 pro weby HTTP. Jedná se o experimentální funkce a pravděpodobně budou nakonec odstraněny, takže před jejich povolením buďte opatrní.
Krok 5 – Zvýšení zabezpečení
Povolení ověřování HTTP
Pro určité adresáře můžete povolit jednoduché ověřování HTTP. Nejprve pro něj musíte vytvořit ověřovací údaje.
Caddy přijímá v konfiguraci pouze hashovaná hesla. Nejprve tedy musíte vytvořit hashované heslo. Chcete-li to provést, spusťte následující příkaz.
$ caddy hash-password
Enter password:
Confirm password:
JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
Jakmile budete mít heslo připraveno, zadejte do svého Caddyfile následující kód.
basicauth /secret/* {
John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
}
Výše uvedený příkaz ochrání /secret
adresář s přihlašovacími údaji, které jste právě vytvořili.
Hardening Site Security a povolení HSTS
K ochraně vašich webů můžete přidat další konfigurace zabezpečení. Za tímto účelem vytvoříme další soubor /etc/caddy/caddy_security.conf
.
$ sudo nano /etc/caddy/caddy_security.conf
Přidejte do něj následující kód.
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Xss-Protection "1; mode=block"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Permissions-Policy "interest-cohort=()"
Content-Security-Policy "upgrade-insecure-requests"
Referrer-Policy "strict-origin-when-cross-origin"
Cache-Control "public, max-age=15, must-revalidate"
Feature-Policy "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'self'; camera 'none'; encrypted-media 'none'; fullscreen 'self'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture *; speaker 'none'; sync-xhr 'none'; usb 'none'; vr 'none'"
}
Výše uvedený kód umožňuje/implementuje následující.
- Povoluje podporu HSTS pro web a všechny jeho subdomény.
- Povoluje filtrování XSS.
- Zabraňuje sledování obsahu/MIME.
- Brání vašemu webu v načtení uvnitř prvku IFRAME.
- Zabraňuje tomu, aby byly vaše stránky zahrnuty do zkušebních verzí sledování FLOC.
- Přidává zásady zabezpečení obsahu týkající se způsobu, jakým uživatelští agenti zacházejí s nezabezpečenými adresami URL.
- Implementuje zásadu odkazujícího zdroje, takže pokud protokol říká totéž, na požadavky s křížovým původem je odesílán pouze odkazující server.
- Zásady funkcí poskytují mechanismus pro povolení a zakázání určitých funkcí prohlížeče.
Dále importujte soubor do libovolného požadovaného bloku webu.
example.com {
...
import /etc/caddy/caddy_security.conf
}
Pro provedení změny restartujte server.
Závěr
Tímto končí tutoriál o instalaci a konfiguraci webového serveru Caddy na serverech založených na Fedora 34 / CentOS 8. Pokud máte nějaké dotazy, napište je do komentářů níže.