Linux Server Security

Ubuntu Server Härtung für Web-Apps

Stephan Pfeiffer

Ein nackter ASP.NET Core Kestrel-Server sollte niemals direkt Anfragen aus dem Internet annehmen. In diesem Artikel erkläre ich mein praxiserprobtes Setup auf einem Ubuntu 26.04 Server (Resolute Raccoon) inklusive Apache2 Reverse Proxy, UFW Firewall und SSL/TLS Zertifikaten.

Warum ein Reverse Proxy?

Kestrel ist rasend schnell und ideal für die Ausführung von C#-Code. Aber er ist nicht dafür gebaut, komplexe Angriffe auf Netzwerkebene abzuwehren oder als robuster Edge-Server zu dienen. Ein Reverse Proxy wie Apache2 oder Nginx übernimmt das SSL-Offloading, blockt fehlerhafte Requests ab und leitet nur sauberen Traffic an Kestrel (meist auf Port 5000) weiter.

Die Firewall: UFW richtig konfigurieren

Der allererste Schritt auf einem neuen Server ist das Abdichten aller Ports. Mit UFW (Uncomplicated Firewall) geht das unter Ubuntu kinderleicht:

Bash
# Standardmäßig alles blockieren
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH erlauben (sonst sperren wir uns aus!)
sudo ufw allow ssh

# Web-Traffic für Apache erlauben (Port 80 und 443)
sudo ufw allow 'Apache Full'

# Firewall aktivieren
sudo ufw enable
Achtung: Bevor du sudo ufw enable ausführst, vergewissere dich unbedingt, dass SSH (Port 22 oder dein Custom-Port) erlaubt ist!

Apache2 Reverse Proxy Setup

Nachdem Apache installiert ist (sudo apt install apache2), müssen wir die Proxy-Module aktivieren und einen VirtualHost für unsere Domain anlegen.

Apache Config (/etc/apache2/sites-available/homepage.conf)
<VirtualHost *:80>
    ServerName www.devaluator.de
    
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/
    
    ErrorLog ${APACHE_LOG_DIR}/homepage-error.log
    CustomLog ${APACHE_LOG_DIR}/homepage-access.log common
</VirtualHost>

ASP.NET Core für den Proxy anpassen

Damit unsere C#-Anwendung weiß, dass sie hinter einem Proxy läuft (und z.B. die echte IP-Adresse des Nutzers erkennt), müssen wir in der Program.cs die Forwarded Headers Middleware aktivieren:

Program.cs
using Microsoft.AspNetCore.HttpOverrides;

var builder = WebApplication.CreateBuilder(args);

// ... andere Services ...

var app = builder.Build();

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

// ... Middleware-Pipeline ...

Let's Encrypt (Certbot)

Zu guter Letzt sichern wir die Verbindung mit einem kostenlosen SSL-Zertifikat. Mit Certbot ist das ein Einzeiler:

Bash
sudo certbot --apache -d www.devaluator.de

Certbot ändert die Apache-Konfiguration automatisch so ab, dass jeglicher HTTP-Traffic auf HTTPS (Port 443) umgeleitet wird. Zudem richtet es einen Cronjob ein, der das Zertifikat alle 90 Tage von selbst erneuert. Fertig ist das kugelsichere Setup!