Quasseldroid git 15.12.2012

Mal wieder ein Lebenszeichen von mir :-)

Da es schon lange keine neue Quasseldroid Version mehr gab (Quasseldroid Community Builds) habe ich mich dazu entschlossen die neueste Version zu bauen und hier zur Verfügung zu stellen:

QuasselDroid git 15.12.2011

Bitte beachtet, dass sich mein Key jederzeit ändern kann. Im Moment ist es ein automatisch generierter und ich plane ihn in naher Zukunft durch meinen eigenen zu ersetzen.

Programmieren mit VIM

Mal wieder ein Lebenszeichen von mir :-) VIM ist ja bekanntlich mein Lieblingseditor und deshalb wollte ich hier ein paar “Cheats” vorstellen:

Einrücken/Ausrücken:

1
2
2>>			- 2 Zeilen einrücken
2<<			- 2 Zeilen ausrücken

Die 2 kann wie immer durch eine andere Zahl ersetzen, um mehr oder weniger Zeilen ein-/auszurücken.

Block kommentieren:

1
2
3
STRG+V			- Block markieren
I+//			- Kommentarzeichen (//) Zeichen einfügen
Esc			- Kommentarzeichen vor jeder Zeile einfügen

Block auskommentieren:

1
2
STRG+V			- Kommentarzeichen (//) markieren
x			- Kommentarzeichen löschen

Suche:

1
2
3
:set ic			- Case-insensitive
:noh			- Suchwort Highlighting entfernen
%			- Zur dazugehörigen Klammer springen

Code Formatierung:

1
2
gg=G			- Code einrücken
:!indent %		- Code schöner machen (beautify)

Ich hoffe die Befehle helfen einigen von euch weiter :-)

Sommerpraktikum

Are you extreme? Im Sommer werde ich ein Praktikum bei der Firma IBM absolvieren. Es geht darum einen Datenbankbeschleuniger auf FPGA Basis zu entwickeln. Das Ganze findet im Rahmen des Extreme Blue Programms statt. Abschlusspräsentation ist dann in Dublin.
Bin schon super gespannt wie es so wird. Man hat ja nur gutes über Extreme Blue gelesen und vor allem liegt es dank der Datenbankbeziehung genau in meinem Interessensgebiet. Dazu gibt es noch einen Einblick in ein anderes höchst spannendes Gebiet, die Hardware(nahe)-Programmierung.
Weitere Informationen zum Projekt findet man unter: http://www-05.ibm.com/de/entwicklung/extremeblue/projekte.html#foo3

Sammelleidenschaft

Gerade kurz vor den Klausuren sucht man sich ja immer mal wieder gerne Beschäftigungen um sich vom Lernen abzuhalten. So ist das auch bei mir. Meine Sammelleidenschaft wurde wieder neu entfacht. Und das für meine treue Kindheitskonsole: das Super Nintendo. Bis heute hat es keine einzige Konsole geschafft mich so zu fesseln wie das SNES zu seiner Zeit. Auf keiner Konsole gab es so viele faszinierende Rollenspiele wie auf dem Super Nintendo. Höchste Zeit die Konsole mal wieder auszupacken und die Spielesammlung etwas zu erweitern. Insbesondere mit Spieleperlen wie Star Ocean, Tales of Phantasia, Secret of Mana 2, … kurzum mit Spielen, die es nie nach Europa bzw. in die USA geschafft haben und die durch Fanübersetzungen für mich erst spielbar wurden. Da am Emulator kein so richtiges Flair aufkommen will, muss ein anderer Weg her diese Spiele auf dem SNES zu spielen. Das Stichwort heißt Cartmodding und damit verbunden auch andere Hardware-Hacks an der Konsole. Mehr zu diesen Themen bald hier auf dem Blog, bzw. auf einer gesonderten Projektseite.

Neue Universität, alter Stress

Man sollte meinen andere Hochschulen seien besser organisiert als die Berufsakademie Stuttgart, doch weit gefehlt! Wenn ich einen Vergleich ziehe, dann ist die BA Stuttgart die bestorganisierte Hochschule, die ich kenne (allerdings kenne ich nur 2 Hochschulen). Sekretärinnen haben keine Sprechstunden, man hat definitive Ansprechpartner, Probleme können schnell, unkompliziert und unbürokratisch gelöst werden, …
Ganz anders hier. Mit meiner Zulassung zum Masterstudiengang waren Zulassungsauflagen verbunden. Ich will hier nicht pauschal behaupten, dass man BA-Studenten damit einen Stein in den Weg legen will, z.B. weil man sie an regulären Hochschulen nicht oder nur sehr ungern aufnehmen will, aber der Eindruck kann schnell entstehen. Natürlich gab ich mich mit den Zulassungsauflagen nicht zufrieden, da ich alle Leistungen, die ich nachholen sollte schon an der BA Stuttgart erfolgreich erbracht habe. Also hieß es: Bescheinigungen an der BA einholen, Anträge schreiben, begründen, Gegenüberstellungstabellen ausfüllen, etc etc. Der Antrag ging letzte Woche dann endlich durch den Prüfungsausschuss und siehe da: er wurde in allen Punkten bewilligt. Mein (naheliegender) Schluss ist nun, dass einem wirklich jemand Steine in den Weg legen will oder dass Zulassungsanträge nicht individuell bearbeitet werden, sondern sobald ein gewisses Stichwort gefunden wurde (wie z.B. Berfusakademie) pauschal (nicht gerechtfertigte) Auflagen erteilt werden.
Mein Tipp für alle, denen es ähnlich geht: Wenn ihr euch ungerecht behandelt fühlt, wehrt euch! Und wehrt euch früh, denn wenn man es erst kurz vor Semesterende macht, wie z.B. ich, dann ist der Stundenplan schon versaut und man kommt nicht auf seine XX ECTS-Punkte, die man in einem Semester sammeln soll, damit man das Studium in der Regelstudienzeit abschließen kann. Der Prüfungsausschuss ist gerne bereit sein “Urteil” zu revidieren, wenn man nachvollziehbar darlegt, dass man geforderte Leistungen schon erbracht hat.

P.S.: Meine Auflagen waren das Nachholen von Theoretischer Informatik, Mathematik 3 (z.B. Gleichungen mehrerer Veränderlicher, Integralrechnung), sowie Algorithmen. Also nicht gerade wenig Auflagen und auch nicht gerade wenig anspruchsvoll. Und vor allem völlig unnötig, wenn man die Leistungen schon erbracht hat…

Der neue Server: Teil X Sonstiges

Der Entwurf zu diesem Beitrag ist schon fast ein Jahr alt. Ich will ihn nun endlich mal veröffentlichen in der Hoffnung, dass er einigen Leuten hilft und ihnen Arbeit abnimmt.

——————

In diesem Beitrag sind alle Dinge zusammengefasst, die thematisch nicht direkt zusammenpassen oder nicht direkt in einen einzigen Beitrag passen, da sie mehrere Themen streifen.

ssl-Zertifikat erstellen

Jetzt erstellen wir ein ssl-Zertifikat, welches wir bei cacert.org signieren lassen. Dies bietet einige Vorteile gegenüber dem Selbst-Signieren (self-signing). Leider ist das cacert.org Root-Zertifikat noch nicht in Firefox aufgenommen und somit erhält man immer diese lästige Warnung, wenn man eine cacert-zertifizierte Webseite aufruft, bis man deren Root-Zertifikat in Firefox importiert.
Am Besten geht man nach dieser Anleitung vor zum Erstellen eines Zertifikats: http://wiki.cacert.org/wiki/CSRGenerator. Danach verschiebt man den Private-Key nach “/etc/ssl/private” und den Public-Key nach “/etc/ssl/certs“. Nun kann man das Zertifikat z.B. in Apache verwenden, aber auch für den Mailserver, IMAP-/POP-Server, svn, … Sollte eine Applikation nicht auf den Private-Key zugreifen können, benötigt aber Zugriff darauf, so muss man den Benutzer unter der die Applikation läuft in die Gruppe “ssl-cert” aufnehmen (ACHTUNG: Dies könnte ein Sicherheitsrisiko darstellen!).

Diffie-Hellman-Code erzeugen

Dies wird z.B. für postfix gebraucht, aber auch für einige IMAP-Server, deshalb erzeugen wir hier diesen Code und speichern ihn unter “/etc/ssl/private/”:

openssl gendh -out /etc/ssl/private/dh_1024.pem -2 -rand /dev/urandom 1024
openssl gendh -out /etc/ssl/private/dh_512.pem -2 -rand /dev/urandom 512

SSL-vHost in apache erstellen

Um in apache einen SSL-vHost erstellen kann, muss man die Datei ports.conf unter “/etc/apache2” ändern und die folgende Zeilen hinzufügen/ergänzen:

<IfModule mod_ssl.c>
    # SSL name based virtual hosts are not yet supported, therefore no
    # NameVirtualHost statement here
    NameVirtualHost *:443
    Listen 443
</IfModule>

Danach können wie gehabt vHosts erstellt werden, mit dem Unterschied, dass die Zeile “” in “” geändert werden und folgende Zeilen hinzugefügt werden:

        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/server.pem
        SSLCertificateKeyFile /etc/ssl/private/privatekey.pem
        SSLCipherSuite HIGH
        SSLProtocol all -SSLv2

Weiter unten stelle ich ein Skript vor, mit welchem man bequem vHosts (sowohl mit und ohne SSL) erstellen kann und automatisch von Port 80 auf Port 443 weiterleiten, wenn der vHost SSL unterstützt.

Quellen:
http://wiki.cacert.org/wiki/CSRGenerator
http://cacert.org/

sftp-Gastzugang

Oft möchte man Leuten einen Zuganz zu seinem Server verschaffen, damit man etwas in ein bestimmtes Verzeichnis hochladen, bzw. daraus herunterladen darf, aber nicht aus diesem Verzeichnis herausnavigieren darf und evtl. Schaden anrichten kann. Dies kann man mit openSSH 5.0 sehr einfach lösen, da es eingebaute chroot-Mechanismen hat. So kann man z.B. eine ganze Gruppe auf ihr Home-Laufwerk oder einen anderen Ordner beschränken oder aber auch nur einen einzigen Benutzer. Im Folgenden legen wir eine Gruppe “chrooted” an, welche auf ihr Home-Laufwerk beschränkt sein wird. Alle Home-Laufwerke dieser Gruppe werden standardmäßig unter “/home/chrooted” liegen. Für unseren Gastbenutzer legen wir darunter ein Verzeichnis “upload” an und ändern die Rechte entsprechend:

mkdir upload
chown <uploaduser>:users /home/chrooted/upload
chmod 775 /home/chrooted/upload

Will man Ordner außerhalb des Home-Laufwerks zugänglich machen, kann man diese mit “mount -o bind” temporär einbinden, bzw. über die “/etc/fstab” dauerhaft:

/pfad/zum/quellverzeichnis /pfad/zum/zielverzeichnis none rw,bind 0 0

Gruppe “chrooted” anlegen:

addgroup --system chrooted

Um einen Benutzer in die Gruppe “chrooted” aufzunehmen, führt man folgenden Befehl aus:

adduser <uploaduser> chrooted

Danach muss man die sshd_config anpassen, bzw. erweitern:

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
 
Match group chrooted
        # chroot all users of these group to their homes
        # %h will be substituted by the user's home
        # %u will be substituted with the user's user name
        ChrootDirectory %h
        AllowTcpForwarding no
        ForceCommand internal-sftp

Wichtig ist, dass das Home-Verzeichnis des Benutzers root gehören muss (“chown root: /pfad/zu/home”). Die Unterordner sollten dann wieder dem Benutzer gehören, damit das ganze auch Sinn macht und er Dateien hoch-/runterladen kann. In unserem Beispiel bedeutet das, dass “/home/chrooted” root gehören muss und “/home/chrooted/upload” dem .
Zusätzlich kann man nun noch unter “/etc/passwd” die Standardkonsole des auf “/bin/false” setzen, denn der Benutzer darf sich nur via sftp anmelden und nicht über die Konsole:

<uploaduser>:x:1666:1666:Guest upload-account,,,:/home/chrooted:/bin/false

Quellen:
http://binblog.wordpress.com/2008/04/06/openssh-chrooted-sftp-eg-for-webhosting/
http://www.debian-administration.org/articles/590

Tauschverzeichnis anlegen

Da alle Konsolenbenutzer auch Mitglied in der Gruppe “users” sind, ist es ein leichtes ein Tausch-Verzeichnis unter “/home/shared” anzulegen. Darunter legen wir – der Benutzerfreundlichkeit zuliebe – einen Symlink nach “/home/chrooted/upload” an (siehe vorheriges Kapitel):

mkdir /home/shared
chown root:users /home/shared
chmod 775 /home/shared
ln -s /home/chrooted/upload upload

Nun können sich alle Konsolenbenutzer über dieses Verzeichnis austauschen und auf die Dateien des Gast-Accounts zugreifen, welche für ihn bereitstellen bzw. je nach Rechten auch welche löschen.

vHosts-Skript

Um einem die Arbeit etwas zu erleichtern habe ich schnell ein kleines bash-Skript runtergehackt, mit welchem man bequem vHosts unter apache2 anlegen kann. Ist man nach Der neue Server: Teil 4 apache vorgegangen, so müssen im Skript normalerweise keine Änderungen vorgenommen werden, anderfalls braucht das Skript evtl. ein paar Anpassungen.

Hier das Skript:

createVhost.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/bin/bash
 
# createVhost.sh - Creates an Apache2 vHost configuration
#
# Copyright (C) 2009 johker
#
# This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License v2 as published by the Free Software Foundation
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v2 for more details.
 
 
### CHANGE ME! ###
 
WWW_ROOT="/var/www"
SITES_ROOT="/etc/apache2/sites-available"
 
CHANGE_PHP_INI="no"
 
EXAMPLE_ROOT="$WWW_ROOT/example"
SITES_EXAMPLE="$SITES_ROOT/example"
SITES_EXAMPLE_SSL="$SITES_EXAMPLE-ssl"
 
SSL_PRIV_DEFAULT="/etc/ssl/private/privatekey.pem"
SSL_PUB_DEFAULT="/etc/ssl/certs/publickey.pem"
 
PHP_INI_TEMPLATE="/etc/php5/cgi/php.ini"
 
### END CHANGE ME! ###
 
#############################################################
########## DO NOT CHANGE ANYTHING BELOW THIS LINE! ##########
#############################################################
 
# Make sure only root can run our script
if [ "$(id -u)" != "0" ]; then
	echo "ERROR: This script must be run as root!" 1>&2
	exit 1
fi
 
# Query the user for some details
read -p "Domain name: " SRV_NAME
read -p "Domain aliases (leave blank if no aliases available, separated by blank): " SRV_ALIAS
read -p "Admin e-mail address: " SRV_ADMIN
read -p "vHost owner (system user): " USER
read -p  "Use SSL (yes/no)[no]: " SSL
if [ -z $SSL ]; then
	# set default value
	SSL="no"
fi
 
if [ $SSL == "yes" ]; then
	read -p "SSL private key[$SSL_PRIV_DEFAULT]: " CERT_PRIV
	read -p "SSL public key[$SSL_PUB_DEFAULT]: " CERT_PUB
	if [ -z $CERT_PRIV ]; then
		# set default value
		CERT_PRIV=$SSL_PRIV_DEFAULT
	fi
	if [ -z $CERT_PUB ]; then
		# set default value
		CERT_PUB=$SSL_PUB_DEFAULT
	fi
fi
 
VHOST_ROOT="$WWW_ROOT/$SRV_NAME"
DOC_ROOT="$VHOST_ROOT/docs"
CONF_ROOT="$VHOST_ROOT/conf"
LOG_ROOT="$VHOST_ROOT/logs"
TMP_ROOT="$VHOST_ROOT/tmp"
 
PHP_FCGI="$CONF_ROOT/php-fcgi.conf"
PHP_INI="$CONF_ROOT/php.ini"
 
VHOST_CONF="$SITES_ROOT/$SRV_NAME"
 
# GROUP equals USER
GROUP=$USER
 
function changeFcgiConfig {
	# adjust fcgi config
	sed "s!{SRV_NAME}!$SRV_NAME!g" -i $PHP_FCGI
	# ... php.ini
	if [ $CHANGE_PHP_INI == "yes" ]; then
		sed "s!;upload_tmp_dir =!upload_tmp_dir = $TMP_ROOT!g" -i $PHP_INI
		sed "s!;open_basedir =!open_basedir = $DOC_ROOT:$TMP_ROOT!g" -i $PHP_INI
		sed "s!;session.save_path = /var/lib/php5!session.save_path = $TMP_ROOT!g" -i $PHP_INI
	fi
}
 
function createDirs {
	# create the directory structure
 
	cp -R $EXAMPLE_ROOT $VHOST_ROOT
 
	if [ $CHANGE_PHP_INI == "yes" ]; then
		# don't put a symlink to php.ini in $CONF_ROOT, but copy it there
		rm $CONF_ROOT/php.ini
		cp $PHP_INI_TEMPLATE $CONF_ROOT
	fi
 
	changeFcgiConfig
 
	chown $USER:$GROUP -R $VHOST_ROOT
 
	chattr +i $CONF_ROOT/php-fcgi.conf
	# as $CONF_ROOT/php.ini is just a symlink most of the time, chattr will usually fail
	chattr +i $CONF_ROOT/php.ini 2> /dev/null
}
 
function createApacheConfig {
	# now let's adjust the apache vHost-configuration
	if [ $SSL == "yes" ]; then
		cp $SITES_EXAMPLE_SSL $VHOST_CONF
	else
		cp $SITES_EXAMPLE $VHOST_CONF
	fi
 
	# now do sed operations on $VHOST_CONF
	sed "s!{SRV_NAME}!$SRV_NAME!g" -i $VHOST_CONF
	if [ -z "$SRV_ALIAS" ]; then
		sed "s!{SRV_ALIAS}!!g" -i $VHOST_CONF
	else
		sed "s!{SRV_ALIAS}!$SRV_ALIAS!g" -i $VHOST_CONF
		sed "s!#	ServerAlias!	ServerAlias!g" -i $VHOST_CONF
	fi
	sed "s!{SRV_ADMIN}!$SRV_ADMIN!g" -i $VHOST_CONF
	sed "s!{USER}!$USER!g" -i $VHOST_CONF
	sed "s!{GROUP}!$GROUP!g" -i $VHOST_CONF
 
	sed "s!{DOC_ROOT}!$DOC_ROOT!g" -i $VHOST_CONF
	sed "s!{CONF_ROOT}!$CONF_ROOT!g" -i $VHOST_CONF
	sed "s!{LOG_ROOT}!$LOG_ROOT!g" -i $VHOST_CONF
 
	if [ $SSL == "yes" ]; then
		sed "s!{CERT_PUB}!$CERT_PUB!g" -i $VHOST_CONF
		sed "s!{CERT_PRIV}!$CERT_PRIV!g" -i $VHOST_CONF
	fi
}
 
createDirs
createApacheConfig
 
exit 0

Die dazugehörenden Ordnerstruktur unter “/var/www/example“:

mkdir /var/www/example
mkdir /var/www/example/conf
mkdir /var/www/example/docs
mkdir /var/www/example/tmp
mkdir /var/www/example/logs
touch /var/www/example/logs/access.log
touch /var/www/example/logs/error.log
ln -s /etc/php5/cgi/php.ini /var/www/example/conf/php.ini

Hier noch die Datei “php-fcgi.conf“, welche nach “/var/www/example/conf/” gehört:

php-fcgi.conf:

#!/bin/sh
PHPRC="/var/www/{SRV_NAME}/conf"
export PHPRC
PHP_FCGI_CHILDREN=3
export PHP_FCGI_CHILDREN
exec /usr/bin/php5-cgi

Dazu noch die vHost-configs “example”, sowie “example-ssl” unter /etc/apache2/sites-available”:

  • example:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    <VirtualHost *:80>
            SuExecUserGroup {USER} {GROUP}
     
            ServerName {SRV_NAME}
    #	ServerAlias {SRV_ALIAS}
            ServerAdmin {SRV_ADMIN}
     
            DocumentRoot {DOC_ROOT}
            AddHandler fcgid-script .php
            <Directory {DOC_ROOT}>
                    FCGIWrapper {CONF_ROOT}/php-fcgi.conf .php
                    Options +SymLinksIfOwnerMatch +MultiViews +ExecCGI -Indexes
                    AllowOverride FileInfo AuthConfig
                    Order allow,deny
                    allow from all
            </Directory>
     
            ErrorLog {LOG_ROOT}/error.log
            CustomLog {LOG_ROOT}/access.log combined
            LogLevel warn
            ServerSignature Off
    </VirtualHost>
  • example-ssl:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    
    <VirtualHost *:80>
            ServerName {SRV_NAME}
    #	ServerAlias {SRV_ALIAS}
            ServerAdmin {SRV_ADMIN}
     
    	<IfModule mod_ssl.c>
              RewriteEngine   on
    	  RewriteCond     %{SERVER_PORT} ^80$
              RewriteRule     ^(.*)$ https://%{SERVER_NAME}$1 [L,R]
     
    	  RewriteLog      {LOG_ROOT}/rewrite.log
              RewriteLogLevel 2
    	</IfModule>
     
            ErrorLog {LOG_ROOT}/error.log
            CustomLog {LOG_ROOT}/access.log combined
            LogLevel warn
     
            ServerSignature Off
    </VirtualHost>
     
    <VirtualHost *:443>
            SuExecUserGroup {USER} {GROUP}
     
            ServerName {SRV_NAME}
    #	ServerAlias {SRV_ALIAS}
            ServerAdmin {SRV_ADMIN}
     
            SSLEngine on
            SSLCertificateFile {CERT_PUB}
            SSLCertificateKeyFile {CERT_PRIV}
            SSLCipherSuite HIGH
            SSLProtocol all -SSLv2
     
            DocumentRoot {DOC_ROOT}
            AddHandler fcgid-script .php
            <Directory {DOC_ROOT}>
                    FCGIWrapper {CONF_ROOT}/php-fcgi.conf .php
                    Options +SymLinksIfOwnerMatch +MultiViews +ExecCGI -Indexes
                    AllowOverride FileInfo
                    Order allow,deny
                    allow from all
            </Directory>
     
            ErrorLog {LOG_ROOT}/error.log
            CustomLog {LOG_ROOT}/access.log combined
            LogLevel warn
     
            ServerSignature Off
    </VirtualHost>

Das Skript kann als Benutzer root ausgeführt werden. Es fragt nach ein paar Parametern (default-Werte stehen in eckigen Klammern und können durch Drücken der Eingabetaste übernommen werden) und erstellt dann den vHost und die dazugehörige Konfiguration. Nach Ausführen des Skripts muss der vHost noch mittels des “a2ensite“-Befehls aktiviert werden und die apache-Konfiguration muss neu eingelesen werden.