Webserver Jail

Das Erstellen einer Jail geht recht einfach:

ezjail-admin create demo "lo1|10.23.42.5,lo1|fd10:23:42:23::5"

Die IP-Adressen stammen aus dem Bereich, den ich beim konfigurieren der Firewall für die Jails vorgesehen habe.

Die IPv4 Adresse ist dank Reverse-Proxy Jail nicht zwingend nötig, allerding kann es sein, dass man von der Jail aus IPv4-only Hosts erreichen möchte, deshalb habe ich eine vergeben.

Falls noch Dienste laufen, die auf Wildcard Adressen lauschen meckert ezjail (zu recht) rum. Dies sollte man abstellen und dann von vorne beginnen (z.B. Anleitung für NTPd).

Da wir nur einen kurzen Namen gesetzt haben, passen wir den Hostnamen in der /usr/local/etc/ezjail/demo an:

export jail_demo_hostname="demo.example.com"

Nachdem man unter /usr/jails/demo verifiziert hat, dass der Flavour korrekt funktioniert hat, kann man die Jail starten:

ezjail-admin start demo

Um in die Jail zu gelangen gibt es den console Befehl:

ezjail-admin console demo

Als erstes sollte man die /etc/hosts innerhalb der Jail glatt ziehen:

::1                     localhost
127.0.0.1               localhost

fd10:23:42:23::5        demo.example.com
10.23.42.5              demo.example.com

NGINX

nginx aus den Quellen zu bauen ist recht einfach:

cd /usr/ports/www/nginx
make config-recursive install clean

Hierbei habe ich alles auf Standard gelassen, jedoch das MAIL_MODULE abgewählt.

In der /etc/rc.conf wird nginx aktiviert:

nginx_enable="YES"

Auf FreeBSD erwartet nginx seine Konfigurationsdatei unter /usr/local/etc/nginx/nginx.conf.

Die Standardeinstellungen würden schon genügen, allerdings will ich wie immer meine Extrawurst haben und alles selbst konfigurieren…

Die Anforderungen sind folgende:

  • Wir hängen hinter einem Reverse-Proxy, deshalb:
    • müssen wir uns nicht um SSL kümmern
    • kann man es sich leisten auf IPv4 zu verzichten
    • kann man die meisten (Security-) Header weglassen
    • braucht man auch kein GZip

Somit habe ich /usr/local/etc/nginx/ mal wegkopiert und mir ein eigenes Set an Konfiguration erstellt:

find /usr/local/etc/nginx -type f
/usr/local/etc/nginx/sites/demo.example.com.conf
/usr/local/etc/nginx/conf/general.conf
/usr/local/etc/nginx/mime.types
/usr/local/etc/nginx/nginx.conf
  • /usr/local/etc/nginx/mime.types wurde wieder hin kopiert…

  • /usr/local/etc/nginx/nginx.conf

user www;
pid /var/run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 65535;

events {
    multi_accept on;
    worker_connections 65535;
}

http {
    charset utf-8;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;
    log_not_found off;
    types_hash_max_size 2048;
    client_max_body_size 64M;

    # MIME
    include mime.types;
    default_type application/octet-stream;

    # logging
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log warn;

    # load configs
    include sites/*.conf;
}
  • /usr/local/etc/nginx/conf/general.conf
# dot files
location ~ /\. {
    deny all;
}

# assets, media
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv|svgz?|ttf|ttc|otf|eot|woff2?)$ {
    expires max;
    access_log off;
}
  • /usr/local/etc/nginx/sites/demo.example.com.conf
server {
    listen [fd10:23:42:23::5]:80;

    server_name demo.example.com;
    root /usr/local/www/demo.example.com;

    # logging
    access_log /var/log/nginx/demo.example.com.access.log;
    error_log /var/log/nginx/demo.example.com.error.log warn;

    include conf/general.conf;
}

Danach noch eine /usr/local/www/demo.example.com/index.html anlegen und dieser die Gruppe www zuweisen (auch dem Ordner darüber).

Dann nginx mittels service nginx start erstmals starten.

Vom Host aus kann man überprüfen, ob alles geklappt hat:

echo "GET /" | nc fd10:23:42:23::5 80

Dies sollte den Inhalt der index.html ausgeben.

Damit man von außen auch die Webseite betrachten kann, fehlt ein letzter Baustein: Die Reverse-Proxy Jail.