XMPP Server unter Ubuntu aufsetzen

Möchte man Instant Messaging mittels XMPP (früher unter dem Namen Jabber bekannt) nutzen, so kann man natürlich zu einem der vielen Dienste wie GMail, GMX und ähnliches gehen. Damit bekommt man dann neben den Vorteilen auch den Nachteil, das man sich nicht sicher sein kann was mit den eigenen Daten passiert. Eine andere Lösung ist es hier den XMPP Server selbst aufzusetzen. Dazu bietet sich „ejabberd“ an. Mittels:

sudo apt-get install ejabberd

wird das passende Paket installiert. Der Server „ejabberd“ unterstützt dabei die Verwaltung mehrerer Domains, so das eine Serverinstanz die Adressen und bereitstellen kann. Um dies umzusetzen, geht es im ersten Schritt an die Konfiguration. Dazu wird die Datei „/etc/ejabberd/ejabberd.cfg“ mittels „nano“ geöffnet:

nano /etc/ejabberd/ejabberd.cfg

Die Syntax der Datei ist dabei im Gegensatz zu anderen Konfigurationsdateien etwas gewöhnungsbedürftig, da sie auf der Programmiersprache Erlang basiert. Kommentare z.B. werden in dieser Datei mit einem Prozentzeichen eingeleitet. Im ersten Schritt werden die Domain respektive Hostnamen definiert, welche „ejabberd“ verwalten soll. Dazu wird der Punkt „hosts“ gesucht und mit den entsprechenden Domains gefüllt.

{hosts, ["xmpp.example.com", "xmpp.example.org"]}.

Die Serversprache kann man für einen deutschsprachigen Server geändert werden:

{language, "de"}.

Damit werden Nachrichten vom Server in Deutsch anstatt in Englisch ausgegeben. Standardmäßig ist der Server so eingestellt, das niemand außer dem Administrator Nutzer anlegen kann. Natürlich wäre es auch denkbar, einen Server zu betreiben, bei welchem sich jeder registrieren kann. Damit man Nutzer anlegen kann, muss ein Nutzer mit den entsprechenden Rechten definiert werden:

{acl, admin, {user, "seeseekey", "xmpp.example.com"}}.

Damit ist der Nutzer „“ ein Nutzer mit administrativen Rechten. Allerdings muss dieser Nutzer noch erstellt werden:

service ejabberd restart
ejabberdctl register seeseekey xmpp.example.com geheimespasswort

Weitere Nutzer können anschließend über die Weboberfläche angelegt werden. Zu erreichen ist diese dabei unter:

http://xmpp.example.com:5280/admin

Die Zugangsdaten entsprechen dabei denen des administrativen Nutzers.

Weitere Informationen gibt es unter:
https://wiki.archlinux.de/title/Ejabberd

OpenVPN auf einem Ubuntu Server aufsetzen

Wenn man sich einem unsicheren Netz bewegt, z.B. in einem freien WLAN empfielt es sich ein VPN zu nutzen. Dafür gibt es die unterschiedlichsten VPN-Dienste, welche dies gegen einen monatlichen Obolus anbieten. Besitzt man einen eigenen Server, so kann man sich mittels OpenVPN einen solchen Dienst selber aufsetzen. Im ersten Schritt wird OpenVPN installiert:

apt-get install openvpn

Aus den Beispieldateien wird das Skript „easy-rsa2“ zum Erstellen der Zertifikate an den entsprechenden Ort kopiert:

cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa2

Für die Erzeugung der Zertifikate müssen einige Parameter angepasst werden. Dazu wird die entsprechende Datei im Editor geöffnet:

cd /etc/openvpn/easy-rsa2
nano vars

Der Wert Keysize „KEY_SIZE“ wird von 1024 auf 2048 erhöht. Am Ende der Datei befinden sich dann folgende Einträge:

export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL=""
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=changeme
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

Nach der Konfiguration sollte das ganze dann in etwa so aussehen:

export KEY_COUNTRY="DE"
export KEY_PROVINCE="MV"
export KEY_CITY="Neubrandenburg"
export KEY_ORG="Example Inc."
export KEY_EMAIL=""
export KEY_CN="vpn.example.org"
export KEY_NAME="Example VPN"
export KEY_OU="VPN"
#export PKCS11_MODULE_PATH=changeme
#export PKCS11_PIN=1234

Die „vars“-Datei wird den Umgebungsvariablen hinzugefügt und anschließend das Masterzertifikat erstellt:

source ./vars
mkdir /etc/openvpn/easy-rsa2/keys
sudo -E ./clean-all
sudo -E ./build-ca

Damit ist die Certificaty Authority (CA) erstellt. Nun geht es an die Erstellung der Schlüssel für den Server:

sudo -E ./build-key-server server

Beim Common Name, gibt man die Domain ein unter welcher der VPN Server später erreichbar sein soll (z.B. vpn.example.org). Nach der Erstellung wird man im „keys“ Verzeichnis die Dateien „server.crt“, „server.csr“ und „server.key“ finden. Für den Diffie-Hellman Schlüsselaustausch müssen entsprechende Paramater erzeugt werden:

sudo -E ./build-dh

Nun fehlen nur noch die Zertifikate für die entsprechenden Nutzer. Ein Nutzer wird dabei mittels:

sudo -E ./build-key nutzerOderClientName

erstellt. Damit sind alle benötigten Zertifikate und Schlüssel erstellt, so das nun die restliche Konfiguration des Servers vorgenommen werden kann. Als Basis wird dabei die mitgelieferte Beispieldatei genutzt:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gunzip /etc/openvpn/server.conf.gz

Nach dem Kopiervorgang wird die Datei „/etc/openvpn/server.conf“ mittels „nano“ geöffnet. Folgende Einstellungen werden dabei angepasst werden:

ca ca.crt -> ca ./easy-rsa2/keys/ca.crt
cert server.crt -> cert ./easy-rsa2/keys/server.crt
key server.key -> key ./easy-rsa2/keys/server.key 

dh 1024.pem -> dh ./easy-rsa2/keys/dh2048.pem

;user nobody -> user nobody
;group nogroup -> group nogroup

;push "redirect-gateway def1 bypass-dhcp" -> push "redirect-gateway def1 bypass-dhcp"

Damit jegliche Kommunikaton vom Client über den Server läuft, muss die Datei „/etc/rc.local“ auf dem Server um einige Einträge ergänzt werden:

iptables -t nat -F POSTROUTING
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source IP_DES_SERVERS

Nun ist der Server konfiguriert und kann mittels:

reboot

neugestartet werden.

Weitere Informationen gibt es unter:
http://wiki.ubuntuusers.de/OpenVPN
https://de.wikipedia.org/wiki/OpenVPN

Nginx Server mit PHP und MySQL unter Ubuntu aufsetzen

Mittels Nginx ist ein Webserver mit PHP und MySQL in ein paar Minuten eingerichtet. Dazu installiert man unter Ubuntu folgende Pakete:

sudo apt-get install mysql-server nginx php5-fpm php5-curl php5-gd php5-imap php5-mysql

Nach der Installation der nötigen Pakete geht es an die grundlegende Konfiguration des Webserver:

mkdir -p /var/www/example.org/root
mkdir -p /var/www/example.org/test
cd /var/www
chown -R www-data:www-data . 
usermod -a -G www-data nutzername

In diesem Beispiel soll die Domain „example.org“ sowie die Subdomain „test.example.org“ eingerichtet werden. Deshalb legen wir zwei Ordner an. Anschließend teilen wir Nginx mit, welche Domains und Subdomains der Webserver verwalten soll. Dazu legen wir die Datei „/etc/nginx/sites-available/example“ an und füllen diese mit folgendem Inhalt:

server {
        listen   80;
        listen [::]:80;

        root /var/www/example.org/root;
        index index.php index.html index.htm;
 
        server_name .example.org;

        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

server {
        listen   80;
        listen [::]:80;

        root /var/www/example.org/test;
        index index.php index.html index.htm index.php; 

        server_name test.example.org;

        location / {
            auth_basic "Access denied";
            auth_basic_user_file /var/www/example.org/root/.htpasswd;

            autoindex on;
        }

        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

Im ersten Block wird die Domain „example.org“ definiert und konfiguriert. Durch die Notation „.example.org“ wird Nginx angewiesen, jede Subdomain welche nicht definiert ist, auf die Hauptseite umzuleiten. Für die Domain „test.example.org“ wurde außerdem ein Passwortschutz angelegt und die Verzeichnisansicht aktiviert. Damit die Konfiguration auch aktiv werden kann, muss eine symbolische Verknüpfung in das Verzeichnis „/etc/nginx/sites-enabled“ angelegt werden:

ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/example

Die bestehende „default“-Datei im „sites-enabled“ Ordner enthält eine Beispielkonfiguration. Diese kann entwerder entfernt werden oder konfiguriert werden:

server {
        listen   80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /var/www/default/root;
        index index.php index.html index.htm;
 
        server_name _;
}

Mit dieser Konfiguration wird jede Seite auf Default umgeleitet, welche nicht in anderen Konfigurationen auftaucht. Nun muss nur noch der Webserver (und des PHPs Moduls) neugestartet werden:

service nginx restart
service php5-fpm restart

Ist der Server bereits online, reicht es auch die Konfiguration neuzuladen:

service nginx reload

Sollten während der Konfiguration Fehler auftreten, so hilft ein Blick in das entsprechende Log:

cat /var/log/nginx/error.log

Benötigt man eine Datenbank für die gewünschte Webanwendung, so muss diese in die SQL Datenbank eingespielt werden. Ist alles richtig konfiguriert worden, läuft der Webserver auf Port 80 und wartet auf erste Anfragen.

PHP, Curl und GD

Seit einigen Tagen läuft diese Webseite auf einer Nginx Instanz mit einer entsprechenden PHP Konfiguration. Bei der minimalen Installation fehlen dabei einige Bibliotheken, welche von entsprechenden PHP Anwendungen benötigt werden. Konkret handelt es sich dabei um „curl“ und „gd“. Um diese auf einem Ubuntusystem nachzurüsten genügt es die Pakete „php5-curl“ und „php5-gd“ zu installieren:

sudo apt-get install php5-curl php5-gd

Im Falle von Nginx müssen dabei keine Änderungen an der Konfiguration vorgenommen werden. Nginx wird bei der Paketinstallation automatisch neugestartet.

Kleinere größere Downtime

In den letzten Tagen war seeseekey.net leider nicht zu erreichen. Mit einem Umzug auf einen neuen Server sollten die entstandenen Probleme erst einmal gelöst sein. Sollte es die nächsten Tage doch etwas holpriger auf der Seite zugehen, so liegt das an den weiteren Optimierungen welche ich im Hintergrund durchführe.

Der alte Webserver war den Anforderungen nicht mehr gewachsen

Der alte Webserver war den Anforderungen nicht mehr gewachsen

Ab morgen geht es dann wieder weiter mit interessanten Artikeln rund alles was diesen Blog ausmacht.