Software Raid unter Linux

Bei den meisten Distributionen kann direkt bei der Installation eine Software Raid angelegt werden. Sehr praktisch ist dies wenn man nicht das Geld oder die Möglichkeiten hat ein Hardware-Raid zu implementieren.

Über ein cat /proc/mdstat kann man sich den aktuellen Status eines Array anschauen. Das ganze sieht dann folgendermaßen aus:

Personalities : [raid1]
md1 : active raid1 sdb1[1] sda1[0]
      104320 blocks [2/2] [UU]

md3 : active raid1 sdb2[1] sda2[0]
      8385856 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
      4192896 blocks [2/2] [UU]

md0 : active raid1 sdb4[1] sda4[0]
      148151360 blocks [2/2] [UU]

unused devices: <none>

Das hier gezeigte Raid Array befindet sich in einem optimalen Zustand, alle Bestandteile des Array sind up and running. Im Fehlerfall sieht das ganze dann so aus: (Anderer Rechner!)

cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] [multipath] [raid6] [raid10]
md1 : active raid1 hda14[0] sda11[2](F)
      2803200 blocks [2/1] [U_]

In diesem Fall ist die Platte/Partition sda11 gestorben/aus dem tritt geraten. Diese sollte nun entfernt und wieder hinzugefügt oder durch ein anderes Device ersetzt werden. Im ersten Fall muss man mit großer Wahrscheinlichkeit das System booten, ansonsten ist das Devie busy und läßt sich nicht aus dem Verbund lösen. Im zweiten Fall kann man einfach ein Ersatzdevice angeben und einbinden.

Im Fall zwei entfernt man das Device mit folgendem Befehl aus dem Verbund:

mdadm -r /dev/md1 /dev/sda11

ein.

Im Fall eins sollte das Device nach dem booten automatisch entfernt worden sein und man kann es mit folgenden befehl erneut hinzunehmen:

mdadm -a /dev/md1 /dev/sda11

in beiden Fällen sollte nach dieser Aktion ein Rebuild beginnen, welcher folgendermaßen aussieht:

Personalities : [linear] [raid0] [raid1] [raid5] [multipath] [raid6] [raid10]
md1 : active raid1 sda11[2] hda14[0]
      2803200 blocks [2/1] [U_]
      [>....................]  recovery =  4.7% (132096/2803200) finish=1.0min #speed=44032K/sec

Ist der Rebuild abgeschlossen kann das Array wieder benuzt werden.

Hinweis: Das erneute hinzufügen einer Platte sollte nur dann passieren, wenn man sich sicher ist, das diese nicht wirklich defekt ist. Bei der hohen Belastung des Rebuilds ist es nicht unmöglich, das die zweite Platte ebenfalls ausfällt. Generell ersetzt gerade ein Softwareraid keine Datensicherung und es ist auch kein 100%tiger Schutz gegen Hardwareausfälle! Ein günstiges Hardwareraid aber auch nicht.

Mit ssh keys Programme auf entfernten Rechnern ausführen

Man kann per ssh recht sicher Programme auf anderen Rechner ausführen. Der verwendete Key kann dann nur dazu benutzt werden ein bestimmtes Programm auszuführen. Dazu erzeugt man einen ssh-key ohne Passphrase. Lässt also die Passphrase einfach leer. Und gibt als Pfad einen anderen Namen an.

[test@tn ~]$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa): /home/test/.ssh/id
_rsa_on
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/test/.ssh/id_rsa_on.
Your public key has been saved in /home/test/.ssh/id_rsa_on.pub.
The key fingerprint is:
1f:5b:04:7b:50:f1:2c:3c:5a:db:71:df:01:8b:a1:3d test@tn.xxx.de
[test@tn ~]$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa): /home/test/.ssh/id
_rsa_off
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/test/.ssh/id_rsa_off.
Your public key has been saved in /home/test/.ssh/id_rsa_off.pub.
The key fingerprint is:
9e:75:41:16:50:2c:e0:3d:2e:0d:c3:22:85:fa:cf:2b test@tn.xxx.de

Nun haben wir unter .ssh vier Datein mehr:
[test@tn .ssh]$ ls
id_rsa  id_rsa_off  id_rsa_off.pub  id_rsa_on  id_rsa_on.pub  id_rsa.pub

Die privaten Schlüssel id_rsa_off und id_rsa_on und die öffentlichen Schlüssel id_rsa_off.pub und id_rsa_on.pub. Wenn man nun diese beiden Schlüssel auf einem Rechner in die .ssh/authorized_keys2 einfügt, kann man davor noch bestimmte Kommandos einfügen:

[test@woanders .ssh]$ cat authorized_keys2
command="/usr/local/bin/mein_command ON",no-pty,no-port-forwarding <der öffentliche Schlüssel (id_rsa_on.pub>
command="/usr/local/bin/mein_command OFF",no-pty,no-port-forwarding <der öffentliche Schlüssel (id_rsa_off.pub>

Damit wird dann immer beim Verbinden mit einem der Schlüssel das Kommando auf dem Rechner ausgeführt. Wie verbindet man sich nun mit dem entsprechenden Key? Man übergibt dem ssh einfach mit der Option -i den entsprechenden Key.

ssh -i ~/.ssh/id_rsa_on test@woanders.xxx.de

So kann man aus Scripten heraus relativ gut Programme ausführen. Man muss allerdings erwähnen, das jemand der auf dem Rechner eingebrochen ist, auch diese Programme ausführen darf. Also vorsicht bei der Programmwahl!

Einfaches Login mit ssh keys

Manchmal möchte man einfach kein passwort eingeben müssen um von einem auf den anderen Rechner zu kommen. Oder sich einfach nicht verschiedene Passwörter merken müssen. Dazu lassen sich ssh-keys sehr einfach und schön nutzen. Als erstes muss man sich einen ssh-key erzeugen.

ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa):
Created directory '/home/test/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/test/.ssh/id_rsa.
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
The key fingerprint is:
9c:92:f0:fd:9e:06:8a:07:b8:1f:62:bd:bd:e9:d1:0c test@tn.xxx.de

Mit diesem Kommando haben wir einen recht sicheren 4096 Bit Key erzeugt. Daraus ergeben sich nun zwei Dateien, welche in diesem Beispiel unter .ssh des users test liegen.

[test@tn ~]$ cd .ssh/
[test@tn .ssh]$ ls
id_rsa  id_rsa.pub

Die Datei id_rsa enthält nun den privaten Schlüssel. Wie privat schon sagt, ist er der Schlüssel der geschützt werden muss. Diesen Schlüssel sollte niemand in die Finger bekommen (Auch wenn er noch mit einer Passphrase geschützt ist). Die andere Datei id_rsa.pub enthält deinen öffentlichen Schlüssel. Diesen kann man auf den anderen Rechnern verteilen. Der Inhalt ist zumindestens teilweise Menschenlesbar:

[test@tn .ssh]$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEA2sA2xEE48ouEq+ks2ZY0RVu6v6+tKt2T+3lOz3RVrGjSjpPcDvHgqC0fZkROoXcrxwAp
oQiAUky5n1sZBsDn5Q4JUoKOSzvA/8C2bL8dOfnrdUt89+L38SgIvFAmb7BLfZgtWI4MAZaOvwVgPrwiLCUUb7yKXuV3z2B3
iF6JQ5SMYT+6m+ILjcHo+yyN8Dfr7JbZCbdEw8yaRiM0YVgRtf06/f/nYsFSYk5oJn9bVGF6t6YczJOtW9CH4/eB0vI2O378
nlcOKKZvTfC9/kmlDijskU4QWwZxKF1zrlNRGk7oM1evWxyrnm2Qztu4+mWM4vMTkfKVQQ8/41P0TBjDigS+6Gb16aQueRyg
f6eUP+OnO+WWXGL+bpmAXW+jJs5Rlc7ITUC2ATOoXDEm1SaUs9UDVaMprolmZcxb5sJ3x4xnbx/gFSYvZb2MtPb2c/Vj6rHb
8KJM37WTsd2TDmmQNjv8n7Wy57jj2Tmqs8c3tezigy1HW0CgtRnW3vn/tHGOniGruvsC36B9oWs0x4mcNyzIg2XG0yzZNjoS
CX+YVF3nvGAan4T1Ide8mya4s5goYr1kseW+C9XsxRUdzsCvAwt1IAs6K+3OzsYB9LRWG2omINNNqt5QkkYeRYm75RhbAD53
WFKbLZVaaROc1kJiPfNnXJnY+hi3d4APDwUIN98= test@tn.xxx.de

Diesen Key kann man nun evtl. auch mit anderen auf einem anderen Rechner unter .ssh/authorized_keys2 ablegen. In der Regel wird man dann nach seiner Passphrase des SSH Keys gefragt, nicht mehr nach dem Passwort. Die Passphrase kann man auf seiner Workstation auch permanent in den Speicher laden (was zumindestens Theoretisch natürlich ein Sicherheitsrisiko ist). Dazu beötigt man einen ssh-agent. Diesen startet man folgendermaßen:

[test@tn ~]$ ssh-add .ssh/id_rsa
Enter passphrase for .ssh/id_rsa:
Identity added: .ssh/id_rsa (.ssh/id_rsa)

Ab sofort merkt sich der ssh-agent die Passphrase für einen und mann kann ohne Passwort auf verschiedene Rechner auf denen der Public key abgelegt ist.

Sieve – Eine starke Sprache

Sieve ist eine E-Mail Filtersprache, die Serverseitig auf IMAP/POP Servern eingesetzt wird. Prominentes Beispiel hierfür ist der Cyrus Imapd. Dort können Serverseitig diverse Regeln ausfgestellt werden, die damit clientunabhängig Mails sehr Leistungsstark sortieren. Unter Linux gibt es Clients mit integrierter Sievefunktionalität wie Kmail. Weiterhin gibt es einige Webbasierte Lösungen wie Ingo aus dem Horde Paket (http://www.horde.org) oder Websieve als standalone Lösung.

Sieve unterstützt einiges an Fuktionalität um seine Mails zu filter. Hier ein paar Beispiele:

Bedingungen / Kontrollstrukturen:

if header :comparator "i;ascii-casemap" :contains "X-Spam-Level" "*****"

Diese Bedingung bedeutet, das immer wenn der Header die Zeile X-Spam-Level ***** beinhaltet etwas mit der Mail getan wird.

if address :all :comparator "i;ascii-casemap" :is "To" "xxx@xxx.de"

Bedeutet das immer wenn die To Adresse (Empfänger) gleich xxx@xxx.de ist (hartes ist) etwas getan wird.

if address :all :comparator "i;ascii-casemap" :contains "From" "xxx@xxx.de"

Bedeutet wie oben, das wenn die To Adresse (Empfänger) xxx@xxx.de enthält (weiches enthält) etwas getan wird.

Dieses etwas getan bezeichnet man oft auch als Aktion, Sieve enthält eine ganze fülle von Aktionen, die populärsten (die die ich nutze) seien hier kurz vorgstellt:

fileinto "INBOX.laber";
    addflag "\\Seen";
    stop; 

Diese Aktion speichert die Mail in das Unterverzeichnis „laber“ auf dem Imap Server. Zusätzlich wird die Mail anschließend noch als gelesen markiert.

     discard;
    stop;

Diese Aktion verwirft (löscht) die Mail und stoppt anschließend die weitere Abarbeitung weiterer Regel, hier ist das auch sinnvoll, da löschen doch ehr zu den entgültigen Aktionen gehört.

Mysql (root) Passwort vergessen?!

Hat man mal sein mysql root passwort vergessen, kann dies sehr unpraktisch sein. Es gibt aber eine recht einfache möglichkeit sich wieder zugriff zu verschaffen. Tragt einfach folgendes in die my.cnf euer Mysql ein:

[mysqld]
skip-grant-tables
skip-networking #schaltet das netzwerk ab, ändern geht nur über localhost!

Das skip-networking ist extrem wichtig, ansonsten ist die Datenbank für jeden zugänglich, allerdings muss das nicht reichen. Wenn Ihr lokale user auf der Büchse habt, müsst Ihr beachten, das währen Ihr das macht, die Mysql für jeden ohne Passwort verfügbar ist, der lokal auf der Büchse ist. Also obacht.

Nun started die mysql Datenbank neu. Ihr könnt euch nun mit

mysql -u root

an eurer Datenbank Anmelden, praktischerweise benötigt Ihr nun kein Passwort. Anschließend könnt Ihr das Passwort so neu setzen:

UPDATE mysql.user SET Password=PASSWORD('NeuesPasswort') WHERE User='root';
FLUSH PRIVILEGES; 

Und schon ist alles wieder grün. Mysql neu starten und Passwort merken!

Mysql Backup und Restore

Backup

Hin und wieder kann so ein Backup ja nichts schaden, genauso ist es auch bei Datenbanken. Hier kurz beschrieben wie man einen Dump einer Mysql macht. Diesen kann man natürlich nicht nur als Backup verwenden, sondern auch zum umziehen etc. Zu beachten ist das dies ein Stand ist, und das dumpen ggf. recht viel performance zieht.

mysqldump -A --add-drop-databases --add-drop-tables -u root -p > backup.sql

Dumped die Datenbank. Nach absetzen des Befehls wird man nach dem root-pw gefragt. Istman bei einem Hoster muss man ggf. anstatt des nutzers root einen bestimmten Benutzernamen verwenden.

Restore

Das restore ist auch recht simple, auch wieder nur eine Zeile:

mysql -u root -p < backup.sql 

ModAJP tips+tricks

Ich Arbeite recht viel mit der Kombination aus Tomcat und Apache. Dazu benötigt man das das modajp (Ich weiß man kanns auch mit mod proxy machen). Hier mal ein paar Infos die ich mit der Zeit gelernt hab.

Basiskonfiguration

Theoretisch funktioniert der Kram recht easy, und zwar indem man mod_proxy und mod_proxy_balancer einschaltet und folgendes in die httpd.conf einträgt:

ProxyRequests Off

Das verhindert erstmal, das wir offener Proxy spielen, ganz, ganz, ganz, ganz … wichtig. Und nun brauchen wir noch den AJP Connect:

ProxyPass / ajp://127.0.0.1:8009/

Und fertig sind wir, wir haben jetzt einen AJP Connector auf das Loopbackinterface und Port 8009 konfiguriert. Dazu muss natürlich, in der server.xml des Tomcats, folgendes eingetragen sein:

<Connector port=“8009″ protocol=“AJP/1.3″ redirectPort=“8443″ />

Genau, ein AJP Connector.

Also funktioniert das ganze jetzt schon mal. Meiner Erfahrung nach, läuft es aber so einfach, gerade in Hochlastzeiten nicht zufriedenstellend. Deswegen ….

A bisl Tuning

Wir haben eben den ajp connector im Apache gemacht, diesem kann man wenn man mag noch ein paar hilfreiche Optionen mit auf den Weg geben. Getestet mit ein paar Milliarden zugriffen bisher ist folgendes:

ProxyPass / ajp://127.0.0.1:8009/ smax=5 max=20 ttl=10 retry=0 disablereuse=On

Das macht meiner Erfahrung nach die ganze Nummer erheblich stabiler.

Den Connector des Tomcats kann man dazu natürlich auch noch ein bischen anpassen, siehe dazu die Optionen des HTTP Connectors.

Server Tokens im Apache konfigurieren

Wie gewöhne ich dem Apache ab zuviel Informationen über sich Preis zu geben? Einfach

ServerTokens Prod

in die httpd.conf einfügen.

Wie sehe ich nun ob das was gebracht hat? Einfach ein fehlendes Dokument aufrufen. Wenn das sowas erscheint:

Not Found

The requested URL /dkwjhdwe was not found on this server.
Apache/2.2.2 (Fedora) Server at www.xxx.de Port 80

dann sieht man zuviel, nochmal checken bitte. Wenn das ganze allerdings so aussieht:

Error 404
tn.genano.de
Wed Jun 27 17:05:58 2007
Apache

Dann passt das.

Self Signed (Selbst signiertes) Zertifikat erstellen

Privaten Schlüssel generieren:

Zuerst brauchen wir einen privaten Schlüssel, den generieren wir mit openssl:

openssl genrsa -des3 -out server.key 1024

Hier steht die 1024 für die stärke (Bitanzahl) des Schlüssels, je größer der Wert, desto sicherer. Allerdings auf je größer der Wert, desto mehr rechenaufwand ist nötig. Gute werte sind zwischen 1024 und 4096 bit.

Wir erhalten folgende Ausgabe:

openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
……………………………………………………++++++
…….++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying – Enter pass phrase for server.key:

Die Passphrase die Ihr hier eingebt müsst Ihr euch merken, da wir diese benötigen um die Passphrase hinterher zu entfernen und das Zertifikat zu erstellen. Wollt Ihr das Zertifikat nicht für einen Webserver verwenden oder Ihr habt wirklich starke Sicherheitsansprüche, kann es sinnvoll sein, das Passwort zu belassen. Ihr müsst die Passphrase dann allerdings bei jedem Start des Apaches eingeben.

CSR (Certificate Signing Request) generieren

Jetzt müssen wir den CSR generieren. Auch hier benötigen wir wieder openssl.

openssl req -new -key server.key -out server.csr

Wenn wir den Befehl abgesetzt haben erhalten wir folgende Ausgabe:

Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‚.‘, the field will be left blank.
—–
Country Name (2 letter code) [GB]:DE
State or Province Name (full name) [Berkshire]:Bavaria
Locality Name (eg, city) [Newbury]:Nuernberg
Organization Name (eg, company) [My Company Ltd]:Meine Firma
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server’s hostname) []:tn.genano.de
Email Address []:nicht.an.schreiben@genano.de

Please enter the following ‚extra‘ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Hier tragen wir die Daten ein und kommen schon zum nächsten Schritt, dem entfernen der Passphrase.

Passphrase vom Schlüssel entfernen

Um nicht jedes mal ein Passwort eingeben zu müssen wenn wir den Apache starten, entfernen wir die Passphrase vom Schlüssel. Ich möchte allerdings darauf hinweisen, das dieses Vorgehen, sicherheitstechnisch nicht korrekt ist! Aber für die meisten Zwecke ausreicht.

cp server.key server.key.org

Wir kopieren als erstes mal den Schlüssel und anschließend entfernen wir die Passphrase

openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.org:
writing RSA key

Dieses eine mal müssen wir das PW noch eingeben, dann aber haben wir mit dem server.key einen passwortloen Schlüssel für unseren Webserver. Jetzt brauchen wir nur noch das Zertifikat.

Zertifikat erstellen

Um ein Zertifikat mit einer Gültigkeit von 365 Tagen zu erstellen machen wir jetzt folgendes:

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Wir erhalten folgende Ausgabe:

Signature ok
subject=/C=DE/ST=Bavaria/L=Nuernberg/O=Meine Firma/OU=IT/CN=tn.genano.de/emailAddress=nicht.an.schreiben@genano.de
Getting Private key

Und tada nun haben wir alles zusammen was wir brauchen.

Im Apache

Jetzt müssen wir den Kram noch in den Apachen eintragen, hier ein mini Beispiel:

Listen 443

<VirtualHost *:443>
DocumentRoot „/var/www/html/“
ServerName tn.genano.de
ServerAdmin webmaster@genano.de
ErrorLog /var/log/httpd/error_log
TransferLog /var/log/httpd/access_log

SSLEngine on

SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /etc/ssl/ServerCerts/server.crt
SSLCertificateKeyFile /etc/ssl/ServerCerts/server.key
<Files ~ „\.(cgi|shtml|phtml|php3?)$“>
SSLOptions +StdEnvVars
</Files>
<Directory „/srv/www/cgi-bin“>
SSLOptions +StdEnvVars
</Directory>
<Directory „/var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
SetEnvIf User-Agent „.*MSIE.*“ \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog /var/log/httpd/ssl_request_log   ssl_combined
</VirtualHost>