Umleitung auf einen anderen DNS-Namen und erzwingen von HTTPS innerhalb eines VirtualHosts

Wenn man eine Webseite mit mehreren DNS-Namen betreibt, möchte man meistens nur ein SSL-Zertifikat für diese erwerben. Eine solche Webseite wird bei einem Apache Webserver zudem meistens innerhalb eines VirtualHost konfiguriert. Daraus ergibt sich somit die Anforderung, innerhalb eines VirtualHost bei einem Apache Webserver gleich zwei Weiterleitungen zu konfigurieren.

  1. Eine Weiterleitung von http://<hostname1>.<domain>.de auf http://<hostname2>.<domain>.de
  2. Eine Weiterleitung von  http://<hostname2>.<domain>.de auf https://<hostname2>.<domain>.de

Damit der Browser keine Warnmeldung ausgibt, muss dass Zertifikat für den richtigen DNS-Namen ausgestellt sein. Deshalb ist es sehr wichtig, dass die Weiterleitungen nicht gleichzeitig sondern nacheinander ausgeführt werden. Beim ersten Aufruf der Seite muss nur auf den zweiten DNS-Namen umgeleitet werden. Beim zweiten Aufruf der Seite (der dann ja schon über den zweiten DNS-Namen erfolgt) muss dann von HTTP auf HTTPS umgeleitet werden.

Die serverseitige Umleitung von einer URL auf die andere Erfolg bei Apache üblicherweise über das Modul mod_rewrite. Bevor man dieses verwendet, muss es aktiviert werden. Dies geschieht bei Debien oder Ubuntu mit den folgendem Befehl.

a2enmod rewrite

Danach muss der Apache neu gestartet werden, damit das Modul geladen wird. Dies erledigt man bei einem neueren Ubuntu z.B. mit dem folgenden Befehl.

service apache2 restart

Die Regel für eine Weiterleitung besitzt bei Apache sogenannte Flags. Diese legen die genaue Funktionsweise der Weiterleitung fest. Um eine Weiterleitung durch Ersetzen zu erreichen wird das Flag R benötigt. Das Flag R steht für Replace und bedeutet, dass Teile der URL durch etwas anderes ersetzt werden. Wenn die Weiterleitung zudem dauerhaft sein soll, ist bei dem Flag R zudem ein Grund 301 hilfreich. Dieser Grund signalisiert, dass die Weiterleitung dauerhaft sein soll. Das Flag wird dann als „R=301“ geschrieben.

Obwohl die Konfiguration für beide Weiterleitungen in der Konfiguration von demselben VirtualHost steht, darf nur eine zur Zeit ausgeführt werden. Dies wird durch das Flag L erreicht. Dieses Flag steht für Last und bedeutet, dass beim Greifen der Rewrite-Regel keine weitere Rewrite-Regel ausgeführt wird. Es wird also immer nur eine Regel pro Aufruf ausgeführt.

Zudem ist wichtig, dass als erstes die Regel für die Weiterleitung auf den ersten DNS-Namen kommt. Erst danach darf die Regel für die Weiterleitung auf HTTPS kommen.

Wenn man all diese Bedingungen beachtet, sollten Rewrite-Regeln wie folgt aussehen.

RewriteEngine on
RewriteCond %{HTTP_HOST}   ^hostname1\.domain\.de$ [NC]
RewriteRule   ^/(.*)$ http://hostname2.domain.de/$1  [R=301,L]
 
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Weitere Informationen zum mod_rewrite gibt es auf den entsprechenden Webseiten beim Apache-Projekt unter http://httpd.apache.org/docs/current/mod/mod_rewrite.html oder https://httpd.apache.org/docs/current/rewrite/flags.html zu finden.

VPN-Anbindung eines Internetservers mit strongSwan 4.2

Bei mir kommt es immer häufiger vor, dass ein Webserver Zugriff auf sensible Dienste eines Servers im internen Netzwerk erhalten soll. Um diesen Zugriff so sicher wie möglich zu gestallten, sollte die dazu notwendige Netzwerkverbindung verschlüsselt werden. Also muss eine VPN-Verbindung her.

Bei Linux-Servern kann man diese Verbindung ganz einfach mit der Software strongSwan einrichten. Bei den meisten Linux-Distributionen ist das dazu nötige Paket enthalten und schnell installiert. Bei Ubuntu 12.04 geht dies z.B. ganz einfach mit dem folgenden Befehl:

sudo apt-get install strongswan

Um die software einzurichten ist noch ein geheimes Kennwort für den Verbindungsaufbau und eine Konfiguration für die VPN-Verbindung notwendig. Das Kennwort wird in der Datei /etc/ipsec.secrets festgelegt. Wenn der Internetserver die IP 144.133.122.111 und die Firewall des internen Netzwerkes die IP 143.132.121.110 hat, müsste die Datei die folgende Zeile beinhalten (das Kennwort sollte natürlich anders sein):

144.133.122.111 143.132.121.110 : PSK 'HierKommtEinGeheimesLangesKennwortHin'

Die Konfiguration der VPN-Verbindung erfolgt in der Datei /etc/ipsec.conf. Für eine Verbindung mit dem Namen InternesNetzwerk kommt der folgende Abschnitt in die Datei:

conn InternesNetzwerk
        left=144.133.122.111
        leftsubnet=144.133.122.111/255.255.255.255
        right=143.132.121.110
        rightsubnet=172.30.4.0/255.255.255.0
        leftid="144.133.122.111"
        rightid="143.132.121.110"
        ike=aes128-sha-modp1536,aes128-sha-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha-modp1536,3des-sha-modp1024,3des-md5-modp1536,3des-md5-modp1024
        esp=aes128-sha1,aes128-md5,3des-sha1,3des-md5
        ikelifetime=1h
        keylife=8h
        dpddelay=30
        dpdtimeout=120
        dpdaction=restart
        pfs=yes
        authby=secret
        auto=start
	keyexchange="ikev1"

Bei der Verbindung werden die zuvor schon genannten IP-Adressen von Webserver und Firewall verwendet. Ferner ist ein interner IP-Bereich 172.30.4.0/24 für das interne Netzwerk konfiguriert. Für die IPSec Verbindung wurde IKE in der Version 1, Dead Peer Detektion, Perfect Forward Seurity und einige andere übliche Einstellungen gesetzt. All diese Einstellungen müssen natürlich den jeweiligen Gegebenheiten angepasst werden. Außerdem müssen die IPSec Parameter denen der Firewall entsprechen.

Wenn auch die Firewall auf der Gegenseite eingerichtet ist, lässt sich die Konfiguration durch einen Neustart von strongSwan bzw. IPSec aktivieren.

sudo /etc/init.d/ipsec restart

Danach kann man sich mit dem Befehl

sudo ip xfrm state

oder dem Befehl

sudo ip xfrm policy

anzeigen lassen, ob ein Tunnel zustande gekommen ist. Eventuelle Fehlermeldungen sind wie immer in der Datei /var/log/syslog zu finden. Wenn man die letzen 50 Zeilen anzeigen lassen möchte also einfach den folgenden Befehlt eingeben:

tail /var/log/syslog -n 50

SPAM-E-Mails aus der Postfix-Queue löschen

Heute wurden mit einem geklauten Benutzerzugang über einen unserer Server innerhalb weniger Minuten ca. 10.000 SPAM-E-Mails verschickt. Ich habe den betroffenen Zugang natürlich sofort gesperrt, nachdem durch die Hohe Anzahl von E-Mails der Alarm ausgelöst wurde. Aber was macht man jetzt mit den ganzen E-Mails in der Queue von Postfix?

Durch eine Analyse der E-Mail-Adressen der Empfänger in der Ausgabe des Befehls mailq zeigte sich, dass die E-Mail-Adressen eine bestimmte Systematik hatten. Die meisten enthielten das word admin. Durch die Kombination von ein paar Unix-Befehlen konnte ich deshalb die meisten SPAM-E-Mails löschen, bevor sie versendet wurden. Hier der Befehl, welchen ich dazu verwendet habe:

mailq | awk 'BEGIN { RS = "" } / admin@.*$/ { print $1 }' | tr -d '*!' | postsuper -d -

Die wichtigsten URL Escapecodes

Da ich in der Vergangenheit immer wieder im Internet gesucht habe, schreibe ich mir hier mal die wichtigsten URL Escapecodes auf. Ich hoffe das hilft auch anderen weiter.

  • SPACE = %20
  • < = %3C
  • > =%3E
  • # = %23
  • % = %25
  • { = %7B
  • } = %7D
  • | = %7C
  • \ = %5C
  • ^ = %5E
  • ~ = %7E
  • [ = %5B
  • ] = %5D
  • ` = %60
  • ; = %3B
  • / = %2F
  • ? = %3F
  • : = %3A
  • @ANTISPAM@ = %40
  • = = %3D
  • & = %26
  • . = %2E
  • ! = %21

Pure FTPd SSL/TLS beibringen

Wenn man den Pure FTP unter Debian oder Ubuntu installiert, ist noch keine SSL/TLS Verschlüsselung konfiguriert. Die lässt sich aber wie folgt leich nachholen.

Falls noch nicht vorhanden Verzeichnis für die Zertifikate anlegen.

mkdir -p /etc/ssl/private

Zertifikat erstellen.

openssl req -x509 -nodes -newkey rsa:1024 -days 3650 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem

Rechte so setzen, dass nur root lesen und schreiben darf.

chmod 600 /etc/ssl/private/pure-ftpd.pem

TLS im Pure FTPd aktivieren.

echo 1 > /etc/pure-ftpd/conf/TLS

Zum Schluss muss der Pure FTPd noch neu gestartet werden.

/etc/init.d/pure-ftpd restart

Securepoint: Webinterface startet nicht

Wenn bei der Securepoint Firewall das Webinterface beim Start hängt, liegt die oft an einem schrägen Sonderzeichen, dass nicht gelesen werden kann. In diesem Fall kann man mit dem Befehlt

config convert

die Konfiguration bereinigen. Hinterher sollte das Webinterface wieder starten.

Securepoint Firewall: Konfiguration der XFRM-Schnittstelle

Die Securepoint Firewall verwendet die XFRM-Schnittstelle des Linux-Kernels, um IP-Sec-Verbindungen aufzubauen. Wenn man genauere Informationen über die Tunnel angezeigt bekommen möchte, kann man sich im CLI (Command Line Interface) mit dem Befehlt

ip xfrm policy | more

die genaue Konfigaration der XFRM-Schnittstelle anzeigen lassen.

pfSense: Windows 7 per OpenVPN anbinden

Windows 7 verwendet bei IPSec-Verbindungen das IKE-Protokoll in der Version 2. pfSense kann bisher nur die Version 1. Deshalb kann man mit Bordmitteln keine IPSec-Verbindung zwischen Windows 7 und einer pfSense Firewall herstellen. Die pfSense Firewall beherrscht neben IPSec aber auch noch OpenVPN und PPTP. Im folgenden eine kleine Anleitung, für die Einrichtung einer OpenVPN-Verbindung zwischen einem Windows 7 und pfSense.

Einrichtung des OpenVPN-Clients

  1. Download und Installation des OpenVPN-Clients unter der URL: http://openvpn.net/download.html
  2. Ein „command prompt“ mit Administrationsrechten starten
  3. In das Verzeichnis “ c:\programfiles\openvpn\easy-rsa“ wechseln
  4. „init-config.bat“ Ausführen
  5. „vars.bat“ editieren und die letzen Zeilen wie folgt anpassen:
    set KEY_COUNTRY=DE
    set KEY_PROVINCE=HH
    set KEY_CITY=Hamburg
    set KEY_ORG=Firmenname
    set KEY_EMAIL=hostmaster@firmendomain.de
  6. „vars.bat“ ausführen
  7. „clean-all.bat“ ausführen
  8. „build-ca.bat“ ausführen
  9. „build-key-server.bat server“ ausführen. Wobei die vorgeschlagenen Werte übernommen werden können. Nur bei „Common Name“ sollte „server“ angegeben werden.
  10. „build-dh.bat“ ausführen
  11. „build-key.bat ovpn_client1“ ausführen. Wobei die vorgeschlagenen Werte übernommen werden können. Nur bei „Common Name“ sollte „ovpn_client1“ angegeben werden.
  12. Kopieren der Dateien ca.crt, ovpn_client1.key und ovpn_client1.crt aus dem Verzeichnis „c:\programfiles\openvpn\easy-rsa\keys“ in das Verzeichnis „c:\programfiles\openvpn\config“
  13. Datei mit dem Namen ovpn_client1.ovpn und dem folgenden Inhalt (die IP-Adresse muss dabei natürlich angepasst werden!) in dem Verzeichnis „c:\programfiles\openvpn\config“ anlegen:
    client
    dev tun
    proto tcp
    remote 123.123.123.123 1194
    ping 10
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca ca.crt
    cert ovpn_client1.crt
    key ovpn_client1.key
    ns-cert-type server
    comp-lzo
    pull
    verb 3
  14. In der Verknüpfung, mit welcher der OpenVPN-Client gestartet wird solle unbedingt in dem Eigenschaften unter Kompatibilität „Programm als Administrator ausführen“ ausgewählt werden! Ansonsten darf der OpenVPN-Client keine Routen setzen, was für den Zugriff auf das Netzwerk hinter der Firewall meistens nötig ist.

Einrichtung der pfSense Firewall

  1. Aufrufen des Menüpunktes „OpenVPN“ im Menü „VPN“ der Webgui von der pfSense.
  2. Anlegen eines neuen Eintrages mit dem folgenden Inhalt unter dem Reiter „server“
    Protocol: TCP
    Local port: 1194
    Address pool: 192.168.200.0/24 (das Netz darf auf der Firewall noch nicht verwendet werden!)
    Local Network: 192.168.1.0/24 (hier muss das interne Netzwerk stehen!)
    Remote Network: leer
    Cryptography: BF-CBC (128 bit)
    Authentication Method: PKI
    CA certificate: Inhalt der Datei "c:\programfiles\openvpn\easy-rsa\keys\ca.crt"
    Server Certificate: Inhalt der Datei "c:\programfiles\openvpn\easy-rsa\keys\server.crt"
    Server Key: Inhalt der Datei "c:\programfiles\openvpn\easy-rsa\keys\server.key"
    DH parameters: Inhalt der Datei "c:\programfiles\openvpn\easy-rsa\keys\dh1024.pem"
    DHCP-Opt: Disable NetBIOS
    LZO Compression: Ein
  3. Anlegen einer Firewall-Regel für das WAN-Interface, die TCP-Port 1194 für das Internet frei gibt.
  4. Anlegen einer Firewall-Regel für das LAN-Interface, die any (oder was benötigt wird) für den Address pool 192.168.200.0/24 frei gibt.

Älteren Securepoint Firewalls Open-VPN beibringen

Bei Securepoint Firewalls die mit einem älteren Installationsmedium installiert wurden funktioniert die Anleitung für die Einrichtung von Open-VPN von Securepoint nicht, da es keine Zone vpn-openvpn und kein Interface tun0 gibt. Betroffen sind alle Firewalls die mit einem Installationsmedium installiert wurden, das älter als Version 2007r3 ist.

Wenn man Open-VPN auf solchen Firewalls verwenden möchte muss man die Zone und das Interface zuvor anlegen. Dies kann man am einfachsten über die CLI (Comman Line Interface) mit den folgenden Befehlen.

add zone vpn-openvpn
add interface tun0 10.10.14.1/24 0 1500 0 vpn-openvpn 0 10MBIT_HALF_DUPLEX

Danach muss man die Konfiguration mit dem Befehl config save speichern. Wenn man den Konfigurationsname nicht kennt, kann man diesen zuvor mit dem Befehl config list abfragen. Dieser Befehl gibt eine Liste mit allen vorhandenen Konfigurationen aus. In dieser Liste ist die aktuelle Startkonfiguration mit einem * gekennzeichnet.

Zum Schluss muss die Konfiguration dann noch aktiviert werden. Dies geschieht mit dem Befehl update interface. Dabei sollte man jedoch beachten, dass alle Interfaces neu gestartet werden. Das kann natürlich bestehende VPN- oder Netzwerk-Verbindungen kurzzeitig unterbrechen.

Magento: Zwischensummen und Versandkosten inkl. MWSt. anzeigen

Lustiger Weise gibt es bei Magento bis zur aktuellen Version 1.3.2.4 immer noch keine Einstellung, um die Zwischensumme und die die Versandkosten inklusive MWSt. anzuzeigen. Dies ist insbesondere bei einem deutschen B2C-Shop jedoch dringend erforderlich. Ansonsten geht man das Risiko ein von der Konkurrenz kostenpflichtig Abgemahnt zu werden.

Gott sei dank war Tschan so nett im Magento-Forum eine Anleitung zu posten. Diese besteht aus zwei Schritten:

1. Oben in die Datei /app/design/frontend/default/YourTheme/template/checkout/total/default.phtml das folgende einfügen.

getTotals();

if ($this->getTotal()->getCode() == 'subtotal') {
    $subtotal = $this->getTotal()->getValue();
    $subtotal += $totals['tax']->getValue()-$totalsObj->getQuote()->getShippingAddress()->getShippingTaxAmount();
    $this->getTotal()->setValue($subtotal);
    $this->getTotal()->setTitle(Mage::helper('sales')->__('Subtotal incl. Tax'));
}

if ($this->getTotal()->getCode() == 'shipping') {
    $shipping = $this->getTotal()->getValue();
    $shipping += $totalsObj->getQuote()->getShippingAddress()->getShippingTaxAmount();
    $this->getTotal()->setValue($shipping);
}

?>

2. In die beiden Dateien /app/design/frontend/default/YourTheme/template/sales/order/items.phtml und /app/design/frontend/default/YourTheme/template/email/order/items.phtml nach der Zeile getOrder() ?> das folgende einfügen.

getSubtotal() + $_order->getTaxAmount() - $_order->getShippingTaxAmount();
$_order->setSubtotal($subtotalInclTax);

$shippingInclTax = $_order->getShippingAmount() + $_order->getShippingTaxAmount();
$_order->setShippingAmount($shippingInclTax);

?>