Posts mit dem Label Apache werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Apache werden angezeigt. Alle Posts anzeigen

Freitag, 13. August 2021

Security - Click-Jacking-Angriffe vermeiden mittels CSP-Header (Content Security Policy)

Die Content-Security-Policy (CSP) entstand ursprünglich unter dem Namen "Content-Restriction", der Grund dafür war die damals zunehmenden Sicherheitslücken bei Internetskripten wie z.B. durch Cross-Site-Scripting (XSS). In diesem Artikel gehe ich auf die Implementierung des CSP-Frame-Vorfahren ein.


Die Richtlinie "frame-ancestors", legt fest welche Domains die Seite in Frames und iFrames einbauen bzw. einbetten dürfen und funktioniert mit allen aktuellen Browserversionen außer dem Internet Explorer IE. Siehe hierzu auch https://caniuse.com/?search=frame-ancestors oder https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors .

  • "frame-ancestors 'none';" ==> Alle ablehnen
  • "frame-ancestors 'self';" ==> Selber erlaubt, aber alle anderen ablehnen
  • "frame-ancestors 'self' 'shemel.de' 'test.de';" ==> Selber erlaubt, und bestimmte Domains zulassen

Damit der Browser die Content Security Policy anwendet, muss vor der Auslieferung des HTML-Dokuments ein spezieller HTTP-Header gesetzt werden. Hierfür gibt es die folgenden Möglichkeiten:

HTML-Code: <meta>-Element hinzufügen

Wird vom Webserver kein CSP-Header versendet, kann dies mit den den folgenden <meta>-Elementen nachgeholt werden:

<head>
...
  <meta http-equiv="Content-Security-Policy" content="frame-ancestors 'none';">
  <meta http-equiv="X-Content-Security-Policy" content="frame-ancestors 'none';">
  <meta http-equiv="X-WebKit-CSP" content="frame-ancestors 'none';">
...
</head>


Ähnlich funktioniert dies auch bei serverseitigen Scriptsprachen, wie zum Beispiel PHP:

<?php
...
header("Content-Security-Policy: frame-ancestors 'none';");
header("X-Content-Security-Policy: frame-ancestors 'none';");
header("X-WebKit-CSP: frame-ancestors 'none';");
...
?>


Webserver Konfiguration: Apache HTTP

Das Modul mod_headers muss aktiv sein:
a2enmod headers //Enabling module headers.

Anschließend muss die Konfiguration in der httpd.conf angepasst werden:
Header set Content-Security-Policy "frame-ancestors 'none';"

Nach dem Speichern der Datei muss der Apache Webserver neu gestartet werden.

Donnerstag, 24. Dezember 2020

Apache HTTP Server - Basis Wissen (Module mod_info, mod_status, mod_remoteip)

Als Erweiterung zum Artikel Apache HTTP Server - vHost Konfiguration bietet sich ein Blick in die offizielle Apache Dokumentation für die Module mod_info, mod_status und mod_remoteip an.

Apache Module mod_info

Bietet einen umfassenden Überblick über die Serverkonfiguration, https://httpd.apache.org/docs/2.4/mod/mod_info.html.

Achtung: Sobald mod_info auf den Server geladen ist, ist seine Funktion in allen Konfigurationsdateien verfügbar, einschließlich Dateien pro Verzeichnis (z. B. .htaccess). Dies kann sicherheitsrelevante Auswirkungen auf die Webseiten haben. Daher am Besten den Zugriff auf den "localhost" beschränken, bzw. nur für bestimmte IP-Adressen freigeben.

<Location "/server-info">
    SetHandler server-info
    # Allow access from server itself
    Require ip 127.0.0.1

    # Additionally, allow access from local workstation
    Require ip 192.168.1.111
</Location>


Apache Module mod_status

Bietet Informationen zur Serveraktivität und -leistung, https://httpd.apache.org/docs/2.4/mod/mod_status.html.

Achtung: Auch hier ist zu beachten, dass beim Laden des Moduls mod_status der Server die Funktion in allen Konfigurationsdateien verfügbar ist, einschließlich der Dateien pro Verzeichnis (z. B. .htaccess). Dies kann auch hier sicherheitsrelevante Auswirkungen auf die Webseite haben! Daher am Besten den Zugriff auf den "localhost" beschränken, bzw. nur für bestimmte IP-Adressen freigeben.

<Location "/server-status">
    SetHandler server-status
    # Allow access from server itself
    Require ip 127.0.0.1

    # Additionally, allow access from local workstation
    Require ip 192.168.1.11
</Location>

Apache Module mod_remoteip

Das Module Remote IP https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html ersetzt die ursprüngliche Client-IP-Adresse durch die IP-Adresse des useragent, die von einem Proxy oder einem Load Balancer über die Anforderungsheader angezeigt wird. So kann man dennoch auf die IP-Adresse des Besuchers reagieren.


Apache Serversignatur

Anpassung unter: /etc/apache2/conf-available/security.conf

ServerSignature
Bestimmt ob die Serversignatur angezeigt wird.
ServerSignature On | Off

ServerTokens
Bestimmt die Art der Serversignatur, wobei Full die meisten und Prod die wenigsten Informationen ausgibt.
ServerTokens Full | OS | Minimal | Minor | Major | Prod


Samstag, 23. Mai 2020

JavaScript - Fetch API File Upload: Apache 403 Forbidden error SecFilterEngine

Für eine Erweiterung meiner Webcamseiten, benötigte ich ein Formular mit Bild-Upload-Funktion. Das Hochladen von Dateien ist eine der häufigsten Funktionen für eine Webanwendung. Ich verwende in meinem Beispiel KEINE der vielen JavaScript-Bibliotheken, sondern die Fetch-API (eine native JavaScript Funktion).


Als erstes benötigt man auf der Webseite ein HTML Formular mit einem Eingabeelement:

...
    <form action="xyz.php" name="melderForm" method="post" enctype="multipart/form-data">
...
        <input id="formMelderImage-file" class="form-control" type="file">
...
    </form>


Mit dem folgenden JavaScript Code wird ein Event-Listener hinzugefügt, wenn der Benutzer eine Datei auswählt. Mit der Methode fileUpload () wird ein Dateiobjekt als Eingabe empfangen und es mit fetch () auf den Server hochgeladen (inklusive einer Überprüfung des Dateityps (nur Bilder) und der Dateigröße (< 10MB).

<script>
    // Datei vom Formular
    const fileInput = document.getElementById('formMelderImage-file');

    // event listener
    fileInput.addEventListener('change', () => {
        fileUpload(fileInput.files[0]);
    });
   
    const fileUpload = (file) => {
        // Check des Dateityps
        if(!['image/jpeg', 'image/gif', 'image/png', 'image/svg+xml'].includes(file.type)) {
            console.log('Es sind nur Bilder erlaubt!');
            return;
        } else if(file.size > 10 * 1024 * 1024) { // Check der Groesse (< 10MB)
            console.log('Die Datei muss kleiner 10MB sein!');
            return;
        } else {
            // Datei zum FormData object hinzufügen
            const fd = new FormData();
            fd.append('formMelderImage-file', file);

            // `POST` request senden
            fetch('/upload/image', {
                method: 'POST',
                body: fd
            })
            // Abfangen von Fehlern
            .then(res => res.json())
            .then(json => console.log(json))
            .catch(err => console.error(err));
        }
    }
</script>

SyntaxError: "JSON.parse: unexpected character at line 1 column 1 of the JSON data" - 403 Forbidden


404- oder 403-Fehlern nach dem Senden eines Formulars können an der mod_security-Einstellung in Apache auf dem Server liegen. Das Apaches-Modul mod_security hat standardmäßig ein Upload-Limit von 60 KB, sodass bei jedem größeren Upload ein 403-Fehlercode ausgegeben wird.

Man kann versuchen diese zu deaktivieren, und folgendes zu der .htaccess-Datei hinzuzufügen, man wird aber vermutlich keinen Erfolg mehr haben (support for .htaccess files was discontinued in 2.x as it raised too many security issues https://stackoverflow.com/questions/19093542/how-to-disable-mod-security-and-mod-security2-in-htaccess/19196856#19196856)

<IfModule mod_security.c>
  SecFilterEngine Off
</IfModule>

Oder wenn man direkten Zugriff auf die Apache Einstellungen hat, geht dies auch direkt unter nano  /etc/httpd/conf.d/mod_security.conf .

<IfModule mod_security.c>

    # Turn the filtering engine On or Off
    SecFilterEngine Off

Montag, 4. September 2017

Apache HTTP Server - vHost Konfiguration

Wie kann man mehrere Webseiten mithilfe von einem Webserver betreiben?

Dies geht mit Hilfe des "Virtual Hosting". Dabei wird der Webserver (z.B. Apache) so konfiguriert, dass er auf unterschiedliche Hostnamen (Doamins) reagieren kann. Somit ist es möglich, auf einem Webserver, mehrere Webseiten unter der gleichen IP-Adresse gleichzeitig zu betreiben. Der Webserver entscheidet auf Basis des HTTP-Headers, welche Webseite ausgeliefert werden soll.

Auszug eines HTTP Headers:

Beispiele von Apache für die Konfiguration befindet sich unter /etc/apache2/sites-available
  • default
  • default-ssl 
Diese können als Basis für eine eigene Konfiguration verwendet werden:

Konfiguration der eigenen "Virtual Host" Datei

Im Verzeichnis /etc/apache2/sites-available habe ich eine neue Datei namens hemel angelegt. Dazeu habe ich ein Verzeichnis unter /var/www/virtual/hemel angelegt, da sich dann hier die eigentlichen "html Dateien" befinden werden.

Hier meine Beispiel Konfigiration um auf die Domain "beispiel.de" reagieren zu können:
#############################################################
# www.beispiel.de
#############################################################
<VirtualHost *:80>
     ServerName www.beispiel.de:80

     ServerAdmin server@beispiel.de
     ServerAlias www.beispiel.de

     # -Indexes - Verzeichnis Inhalt nicht anzeigen!
     Options -Indexes
     DocumentRoot /var/www/virtual/hemel/htdocs/beispiel-de
     ScriptAlias /cgi-bin/ /var/www/virtual/hemel/cgi-bin/

     LogLevel warn
     ErrorLog /var/log/apache2/beispiel-error.log
     CustomLog /var/log/apache2/beispiel-access.log combined

     # Leitet alle Anfragen an den ssl-host weiter.
     #RedirectPermanent / https://beispiel.de/
</VirtualHost>


  • ServerAdmin: E-Mail-Adresse des Server-Administrators hinterlegen, diese würde man bei Fehlermeldungen im Apache sehen. 
  • ServerName: Unter diesem Namen ist die Seite erreichbar. Muss aber per DNS oder über /etc/hosts auflösbar sein.
  • DocumentRoot: Basisverzeichnis "document root" des Virtual Hosts. http://BEISPIEL.de/datei.html => Zugriff auf die Datei /var/www/virtual/hemel/htdocs/beispiel-de/datei.html
Nach dem ein neuer Virtual Host angelegt wurde ("available"), muss diese noch im Webserver aktiviert werden ("enabled"). Dies geht mit dem folgenden Befehl:
  • sudo a2ensite hemel
Jetzt ist die angelegt Datei unter /etc/apache2/sites-enabled verlinkt und aktiviert.

Hinweis: Mehr Details zu den einzelnen Konfigurationen finden sich in der Apache Dokumentation http://httpd.apache.org/docs/2.2/de/mod/core.html#virtualhost


Sonntag, 27. September 2015

Raspberry Pi - Webserver installieren

Mit dieser Anleitung ist es möglich auf dem Raspberry PI einen Webserver (Lighttpd sowie PHP) zu  installieren. Diese funktioniert desweiteren auch mit Debian und Ubuntu ;-)

Der Grund für die Installation ist, dass ich in meinem Heim-Netzwerk grafisch aufbereitete Daten von meinem Temperatur Sensor (http://sebastianhemel.blogspot.de/2015/01/temperatursensor-ds18b20-raspberry-pi.html) bereitstellen möchte.

Mit Hilfe des Programms MRTG (Multi Router Traffic Grapher) und RRD (Round-Robin-Database) lassen sich unter Linux sehr schnell grafische Auswertungen und Darstellungen von Messwerten erstellen. Es können HTML Seiten mit Grafiken erstellt werden. Siehe https://sebastianhemel.blogspot.com/2016/01/raspberry-pi-monitoring-mit-mrtg-und.html .


Mit den folgenden Befehlen werden Lighttpd und PHP 5 mit CGI installiert:

sudo apt-get update
sudo apt-get install lighttpd

sudo apt-get install php5-common php5-cgi php5
sudo lighty-enable-mod fastcgi-php
sudo lighty-enable-mod cgi

Anschließend muss ein Neustart vom Webserver durchgeführt werden:
sudo service lighttpd force-reload

Damit wir jetzt auch CGI Scripe ausführen können muss noch der Passende Ordner erstellt werden und die Besitzrechte von /var/www übernommen werden.
sudo mkdir /var/www/cgi-bin
sudo chown -R www-data:www-data /var/www
sudo chmod 775 /var/www
Nach dem die Rechte gesetzt wurden muss noch der Pi Benutzer der www-data Gruppe hinzugefügt werden.
sudo usermod -a -G www-data pi
Jetzt muss noch die Datei 10-cgi.conf angepasst werden und die Zeile alias.url hinzugefügrt werden:
sudo nano /etc/lighttpd/conf-available/10-cgi.conf 
---
# /usr/share/doc/lighttpd/cgi.txt

server.modules += ( "mod_cgi" )

alias.url += ( "/cgi-bin/" => "/var/www/cgi-bin/" )

$HTTP["url"] =~ "/cgi-bin/" {...
Zum Abschluss muss der Webserver noch einmal neugestartet werden.
sudo service lighttpd force-reload
Jetzt sind die CGI-Skripte per Browser (http://IP-ADRESSE-PI/cgi-bin/hello-world.cgi ) erreichbar!

Download: hello-world.cgi
Hinweis: Mit chmod +x ausführbar machen, sonst gibt es den Fehler 500 (Internal Server Error) zu sehen. 

Evtl. weitere Einstellungen können in der Konfigurationsdatei 
/etc/lighttpd/lighttpd.conf 
server.document-root        = "/var/www"
vorgenommen werden.

Montag, 3. Februar 2014

Erreichbarkeit von Webseiten oder Servern mit wget überpfüfen inkl. E-Mail Versand

Mithilfe der Spider Funktion kann man mit wget überprüfen, ob eine Webseite oder auch ein Server auf einem bestimmten Port erreichbar ist.

Aufbau von wget:
Mit dem Programm wget kann man direkt aus einem Terminal (shell) Dateien von FTP- oder HTTP-Servern herunterladen.

wget -q --spider http://tomcat.testserver.de:8080/
oder
wget -q --spider http://www.testserver.de/index.html


-q, --quiet    Verhindert dass wget Informationen auf der Konsole ausgibt.
-spider         Spider-Modus eingeschaltet.  Prüfe ob die Datei auf dem Server existiert.


Aufbau von sendmail:
Sendmail ist auf den meisten Unix System vorinstalliert und man somit direkt E-Mails über die Konsole versenden.

/usr/sbin/sendmail -v mailme@testserver.de < /home/user/test_apach.mail

In der Datei "/home/user/test_apach.mail" befindet sich der Betreff und der Inhalt der E-Mail:
Subject: Apache - Down!


Beispiel Dateien, welche mit Hilfe eines Cron-Jobs z.B. alle 5min aufgerufen werden können:

test_server.sh:
#!/bin/bash
#
# (c) Sebastian Hemel

####
#Dieses Script ruft eine Datei auf, um zu sehen ob der Apache oder Tomcat noch laeuft
####

### apache_webserver ###

if wget -q --spider http://www.simply-eat.de/test.txt
        then
                echo "Apache: is - UP"
        else
                echo "Apache: is - DOWN!"
                /usr/sbin/sendmail -v mailme@testserver.de < /home/user/test_simplyeat.mail
fi


#### tomcat_1 ####

if wget -q --spider http://www.simply-eat.de:8080/
  then
    echo "tomcat_1: is - UP"
 else
    echo "tomcat_1: is - DOWN"
    /usr/sbin/sendmail -v mailme1@testserver.de < /home/user/webtest/tomcat1.mail
    /usr/sbin/sendmail -v mailme2@testserver.de < /home/user/webtest/tomcat1.mail
fi

exit