Things I learned today

Überschreiben des default route parameters in Rails

Bei Standard RESTful Routen in Rails, wird der :id parameter verwendet. Man kann ihn überschreiben in der routes.rb mit

resources :articles, param: :datum

.
Dummerweise wirkt sich dies nicht auf link_to und form_for helper aus, so dass weiterhin Links mit id erzeugt werden. Um dies zu beheben, muss man im Model die to_param Funktion überschreiben:

class Article < ActiveRecord::Base
  def to_param
    datum
  end
end

rsync mit ssh über einen nicht-standard Port

Rsync ist ein praktisches Tool zum Synchronisieren von zwei Linux-Rechnern. Tut man dies nicht im eigenen Netz, sollte man den Traffic durch ssh schicken. Folgenden Befehl kann man dazu nutzen, wenn bei einem ssh nicht auf dem Standardport läuft:

rsync -avzhe "ssh -p 7777" USER@DEIN.HOST:/QUELLVERZ ZIELVERZ

Alles großgeschiebene und den Port natürlich an die eigene Umgebung anpassen und los geht’s =)

Tripwire Reports *.twr öffnen und lesen

Tripwire ist ein Intrusion Detection System, welches die Dateistruktur beobachtet und Veränderungen meldet. In den meisten Distributionen erstellt es seinen Report in dem Verzeichnis:

 /var/lib/tripwire/report/

Die Reports sind allerdings in einem Binärformat. Um sie zu lesen braucht man folgenden Befehl:

/usr/sbin/twprint -m r --twrfile /var/lib/tripwire/report/<name>.twr

Da die Reports sehr lang werden können, am besten in ein Programm wie less pipen oder die Ausgabe in eine Datei umlenken.

/usr/sbin/twprint -m r --twrfile /var/lib/tripwire/report/<name>.twr | less

oder

/usr/sbin/twprint -m r --twrfile /var/lib/tripwire/report/<name>.twr > tw_report.txt

How to unmount an encfs directory on linux?

Just because I always forget how to do it!

Mount is easy:

encfs SOURCE_DIR TARGET_DIR

But because encfs is using the FUSE kernel module for creating the mount point for the encrypted directory you have to use:

fusermount -u TARGET_DIR

to unmount it again.

Linux logic at its best!

Android Game: Age of Empire – Strategy Guide and Tutorial

Age of Empire is a real time strategy game for Android devices. You can download it at the Google Play Store for free. Age of Empire is a massive multiplayer online game (MMO), which means you play with a lot of other humans on one of the many servers.

Invitation Code for new comers

First of all, newbies can use an invitation code, when they first install the game. The invitee gets 5 free gold, which is one of the currencies in the game. Gold is the rare currency which you usually get, by buying it with real money. 5 more Gold gives you a really nice head start.

If you are new to this game and want to try out the game, please use this invitation code: 5299869696 for free gold!

How to get started – The tutorial

Age of Empire has a really nice tutorial, which gets you started pretty good, if you follow the instructions. Pretty early in this tutorial you are prompted to spend 1 gold, to speed up the production of some troops. Don’t do it! It is not necessary to continue the tutorial and an utter waste of precious gold.

If you follow the tutorial, you will build some resource buildings, a warehouse, city hall and barracks, as well as some troops. You should do all that. In the beginning all building times are negligible and you will always have some stuff to do. After a while the building times begin to increase. That’s the time where you probably want to use your troops. You should think carefully before attacking a wild, because your n00b protection will stop the first time you attack something.

Resources

The following information might vary from server to server.

There are 4 kinds of resources: wood, stones, iron and food. You need them in different amounts for constructing buildings and to train troops.

  1. Wood
  2. Most of the time you will have more than enough wood. This is the cheapest and most seldom used resource. Don’t capture forests!

  3. Stones
  4. You need stones to train catapults and to upgrade you city hall. Apart from that, the use of stones is negligible.

  5. Iron
  6. Iron is important for building troops. You need a lot of it. Go and capture some high level wilds!

  7. Food
  8. Food is the only resource which gets used up without building something. Your troops eat up the food you produce. Therefore your actual food production is: amount of produced food – amount of troops = food surplus.
    Food is also important for building troops and upgrading your barracks. You will need some good wilds to cover your expanses here as well.
    In the late game however, it might be preferable to not produce food at all and buy all the food you need, because your troops eat up too much.

Important: Never hoard resources. Neither in your warehouse nor in your inventory. There are two reasons for that.

  • First, resources in your warehouse can be stolen. Be sure, to empty your warehouse each time you’ll be offline for a longer period of time.
  • Second, resources can and should be used to level up faster. The earlier you spend resources, the faster you level. It does not matter on what you spend the resources. It depends on what you need.

Just remember: stocked resources are wasted resources! You should however have a emergency stock of resources in your inventory. How big it is, is up to you. Be self-critical and ask yourself often, how big your emergency stock has to be. Use up everything else.

Troops

There are four kinds of troops. Each troop is strongest against one other type of troops.

  1. Infantry
  2. Infantry is strong against archers. They are the strongest defense unit.

  3. Cavalry
  4. Cavalry is strong against catapults.

  5. Archers
  6. Archers are strong against cavalry.

  7. Catapults
  8. Catapults are strong against infantry. They are the strongest attack unit.

This suggests, that you should build every kind of troop to adjust to the enemy you are facing. However the advantage over the antipodal troop type is so little, that it is negligible. Therefore I would like to compare the troops with a costs / attributes measure. In this calculation attribute are the values attack, defense and hit points summed up.

  • Infantry: 600 costs / 50 attributes = 12
  • One attribute point costs 12 resources

  • Cavalry: 567 costs / 42 attributes = 18
  • One attribute point costs 18 resources

  • Archers: 293 costs / 33 attributes = 16
  • One attribute point costs 16 resources

  • Catapults: 292 costs / 43 attributes = 19
  • One attribute point costs 19 resources

This shows that infantry has the best cost-benefit ratio, followed by archers. I would like to make another calculation however, because not all the resources are worth the same. In this second calculation I completely ignore the wood and stone costs, (because you usually have more than enough) and consider the ‘precious’ iron and food resources only.

  • Infantry: 390 costs / 50 attributes = 7,8
  • Cavalry: 757 costs / 42 attributes = 13,5
  • Archers: 534 costs / 33 attributes = 8,8
  • Catapults: 834 costs / 43 attributes = 6,7

Personally, I prefer the second calculation and build infantry and catapults only. I’ve seen people fight with catapults only as well. What kind of troops you build is up to you.

I discourage the use of cavalry, because they are too expensive and I discourage the use of archers, because they are too weak.

Battle formations

When you attack an unoccupied wild or other players there are several things to consider.

The easiest way to get wilds, is to take them from other players. For that, one hero with 6 troops of any kind is sufficient. But take into account, that this way, you will get attention of other players and probably get retaliation attacks. You should however attack 2 wilds from other players each day, for the daily quest “The victor is king” which gives you 200 free fame each day.

To understand the basics of troop formations, you should know the concept of decoy troops. Decoys are heroes with just one troop on it. When decoys get hit, you will only lose the one troop, no matter how big the attacking enemy stack is. Decoys are a perfect way to reduce you losses and to train your heroes (see The tower). Decoy troops should be archers, because they are the cheapest troops.

There are two good formations for occupying wilds. Wilds are held by NPC (non player character) troops. The higher the level of the wild, the more troops are stationed there.
This is how your formation should look like.

– N –
WME
– S –
(north, west, middle, east, south)

Requirement: Formations only work (best) if your strong troop, is strong enough to kill an enemy stack with one single hit.

Formation A
This formation is recommended for the lower levels of the tower.

N a decoy troop
M a strong troop (ie catapults)
E a strong troop (ie infantry)
S a decoy troop

With this formation you will only get casualties, when the enemy has four troops. The only dangerous enemy formation is a four stack formation with a really strong south troop, because that stack will hit you once in the second round of battle.
No other formation will be able to deal significant damage to you (providing you are able to one-hit the enemy stacks).

  • Pros:
    • Good to level a weaker hero, because he can stay protected behind the stronger one.
    • In the tower this formation won’t change after a refill! This is a big time-saver!
  • Cons:
    • Heavy losses in tower, when the enemy has only one stack which is too strong to one-hit. Therefore this formation is only useful in the lower levels.

Formation B
This formation is recommended for the higher levels of the tower.

N a strong troop
W and M a decoy troop
S a strong troop

In most cases this formation is as good as formation A. In some cases even better.

With this formation you will only get casualties, when the enemy has four troops. The only dangerous enemy formation is a four stack formation with a really strong middle troop, because that stack will hit you once in the second round of battle.
No other formation will be able to deal significant damage to you (providing you are able to one-hit the enemy stacks).

  • Pros:
    • Minimum casualties formation
    • You can go to higher levels in the tower, because you get four free attacks on a single-stack enemy.
  • Cons:
    • In the tower this formation has to be reassigned each refill. A huge time-killer!
    • Both of you strong stacks are on the front. If you miscalculte you will get more casualties.

Important: The strong stacks must be able to destroy any enemy stack with one hit.

With these formations your losses will be reduced to a minimum, because your strong troops will get hit only once by a full enemy stack.
These formations work in the tower as well and can be used against players. Fighting players however is a more complicated topic, where one should adapt to the enemies tactics.

Getting prestige

Prestige is extremely important. The more prestige you have, the higher your player level will be. Your level determines how many wilds and stronghold you can occupy. Therefore getting prestige is your main objective. There are several ways to get prestige:

  • The victor is king

This is a daily quest, which gives you 200 prestige. You should do it every day. To complete the quest you just have to take two wilds from enemy players.

  • Arena

Each day you can fight in the Arena for 15 times. Each victory gives you 10 prestige. This way you can get 150 prestige (and 3000 resources of each kind) a day. Do it daily.

  • Dragon

Once a day you can attack the dragon. Killing the dragon is not the objective, unless you have several tens of thousands troops to spare. But you get 20 prestige and some gold and resources, if you attack the dragon even with one troop only. Do it daily!

  • Fighting players

If you find enemy troops you can beat, destroy them. Each killed unit gives you 1 prestige. This is by far the best way to get prestige fast.

  • Buildings

You get prestige for every upgrade on any of your buildings. The higher the level, the more prestige you get.

The tower

Once a day you can enter the tower for free. In the tower you fight against NPC troops. You start at level one and fight your way up the tower. The higher you get, the bigger the enemy stacks will be. The tower is the best way to level up your heroes fast.

In the tower it is very important to use decoys. One the one hand, it reduces your losses enormously. And on the other hand, the two remaining heroes level up twice the speed, because they kill all the enemy troops on their own. The only drawback of using decoys in tower is, that you can’t use the fill-up button anymore. Each time you lose an archer, you have to close the tower and refill your troops with the hero menu.

Important: To close the tower, use the ‘X’ button in the top right corner. Pressing the ‘exit’ button will forfeit your daily free tower run and you have to start again at level 1 on the next day.

You should fight in the tower until your heroes are unable to one-hit an enemy stack. When you are unable to one hit, consider carefully if you want to go on. From that point on, you will get casualties. After you quitted the tower, the next day start from level 1 again.

For the tower I recommend a combination of formation A (see Attacking formations) and formation B. Formation A is good for the lower levels and to train one weaker hero. Formation B is good for the higher levels of the tower.

Do the tower daily!

Daily tasks

  • Tower
  • Arena
  • All daily quests (except trade master)
  • Dragon
  • Treasure hunt

Thanks

Thanks for reading my strategy guide!

Feel free to comment on this post, correct me, thank me or point out some missing important information. If you liked this strategy guide and you are new to this game, please use my invitation code the first time you start age of empire: 5299869696. You will get 5 free gold as a reward!

Übertragungsrate beschränken in ProFTP 1.3

Einer der gängisten FTP Programme unter Linux ist ProFTP. In manchen Szenarien möchte man eventuell die Übertragungsrate des FTP-Servers einschränken, damit er nicht die volle Bandbreite belegt. Die Dokumentation von ProFTP fand ich an dieser Stelle von nicht hilfreich bis zu irreführend, da hier nur Methoden für alte Versionen beschrieben wurden, bei mir jedoch ProFTP 1.3 läuft. Erst nach einigem Googlen bin ich auf die Lösung gestoßen.

<Anonymous ~ftp>
   TransferRate         RETR    128
   TransferRate         STOR    128
[...]
</Anonymous>

Mit diesen beiden Zeilen lassen sich die Schreib- und Lesegeschwindigkeiten begrenzen – in diesem Beispiel auf 128 KB/s.

SSH absichern auf Linux, Debian/Lenny

Heute mussten einige Veränderungen an meinem SSH-Daemon vorgenommen werden. Diese Gelegenheit habe ich gleich genutzt, um diverse Sicherheitsverbesserungen einzuführen.

1. Port ändern

Streng betrachtet verbessert dieser Schritt die Sicherheit des SSH-Daemons nicht. Andererseits werden durch diese Maßnahme 98% aller automatisierten script kiddy Attacken abgewehrt. SSH läuft standardmäßig auf Port 22.
In /etc/ssh/sshd_config ändert man die Zeile

Port 22

in einen beliebig anderen Port über 1024 und schon laufen die meisten Brute-Force Attacken in Leere. (Nicht vergessen die Firewall entsprechend anzupassen)

2. Root Zugriff verbieten

Durch die Zeile

PermitRootLogin no

in der /etc/ssh/sshd_config verhindert man, dass sich der Root-User per SSH anmelden kann. Es können sich also nur noch normale User anmelden, wodurch eine weitere Barriere entsteht, beziehungsweise ein weiteres Passwort nötig ist, um Root-Zugang zu erhalten.

3. Verbindungsaufbau beschränken per SSH

Ebensfalls in der /etc/ssh/sshd_config ist die Direktive MaxStartups zu finden. Der Standardwert liegt bei 10. Das heißt es können zehn (noch unauthentifizierte) Verbindungen zum SSH-Server aufgebaut werden. Alle weiteren Verbindungen werden von SSH automatisch abgelehnt. Abhängig von der Anzahl der User, die sich auf dem System regelmäßig anmelden, kann man diese Direktive nun anpassen.

MaxStartups 3:30:10

Die drei durch Doppelpunkt getrennten Zahlen stehen für start:rate:full.
Die erste Zahl bestimmt, ab wann die Zugriffe beschränkt werden sollen. Die zweite Zahl, wie viel Prozent der Verbindungen abgelehnt werden sollen und die dritte Zahl bestimmt, ab wann 100% der Verbindungen abgelehnt werden. Die obenstehende Zeile bewirkt also, dass ab drei noch unauthentifizierten Verbindungen 30% weiterer Verbindungen zufällig abgelehnt werden. Die Rate steigt linear und sobald zehn unauthentifizierte Verbindungen bestehen, werden alle weiteren Verbindungen automatisch abgelehnt.
Gleichzeitig sollte man die

LoginGraceTime 120

reduzieren. Dies ist die Zeit in Sekunden, die ein User hat um sich erfolgreich zu authentifizieren, also sein Passwort einzugeben. 120 Sekunden ist viel zu großzügig bemessen. Ein Wert von 30 sollte hier mehr als ausreichen.

Ich habe mich allerdings gegen diese Methode Verbindungen zu beschränken entschieden. Denn wenn ein Angreifer entscheidet den SSH-Port zu hammern, können sich auch wohlgesonnene Benutzer nicht mehr am System anmelden. Stattdessen habe ich mich für die nun folgende Lösung entschieden.

4. Verbindungsaufbau beschränken per iptables

iptables kann dazu benutzt werden Verbindungsversuche die von einer bestimmten IP kommen zu zählen und nach Erreichen einer bestimmten Anzahl weitere Verbindungsversuche zu verbieten. Dies geht mit Hilfe des Moduls recent sogar recht einfach.

iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP

1. Zeile: -m state –state NEW bewirkt, dass nur neue Verbindungen betrachtet werden. -m recent –set bewirkt, dass die IP des Rechners der die Verbindung aufbauen wollte in der recent list gespeichert wird. Diese wird dann in der zweiten Zeile verwendet.

2. Zeile: –update überprüft, ob die IP des Zugriffs bereits in der recent list steht. –seconds 60 betrachtet nur Verbindungen innerhalb der letzten Sekunden. –hitcount 3 trifft zu, wenn drei oder mehr Verbindungsversuche gemacht wurden.
Zusammengenommen wird diese Regel also ausgeführt, wenn:
Die IP des verbindungsaufbauenden Rechners bereits in der recent list steht und
der letzte Verbindungsaufbau von dieser IP nicht länger als 60 Sekunden her ist und
drei oder mehr Verbindungsversuche geschehen sind.

Trifft die Regel zu wird das Paket gedropt.

5. Sichere Passwörter

Dies ist eigentlich so selbstverständlich, dass ich es fast nicht erwähnen möchte. Ein sicheres Passwort sollte folgenden Bedingungen entsprechen.

  • Acht oder mehr Zeichen
  • Groß- und Kleinbuchstaben enthalten
  • Zahlen enthalten
  • Sonderzeichen (wie &,”,€,µ,?,µ) enthalten

Ob die gewählten Passwörter gut genug sind, kann mit Programmen wie john the ripper getestet werden.

6. Weitere Absicherungen

Je nach Anwendungsfall gibt es noch weitere Möglichkeiten, die ich zumindest erwähnen möchte:

  • Zugriff auf bestimmte IP beschränken (per sshd und/oder iptables)
  • Zugriff auf bestimmte User oder Usergruppen beschränken
  • Passwortauthentifizierung deaktivieren – Login per public/private key
  • IP blacklisten über denyhosts

Quellen

Using iptables to rate-limit incoming connections
Security Paranoia – restricting ssh access
Securing SSH
HOWTO: Five steps to a more secure SSH

In Windows 7 auf Dokumente und Einstellungen oder auch Documents and Settings zugreifen

Eine weitere Neuerung die bei Windows 7 Nutzern zu Verwirrung führen kann, ist die Meldung Zugriff verweigert, wenn man versucht auf Dokumente und Einstellungen zuzugreifen. Dieses Problem trifft natürlich nur auf, wenn man in den Ordneroptionen zuvor die Option verstecke Dateien anzuzeigen aktiviert hat.

Als erfahrener Windows-Nutzer versucht man normalerweise zuerst, die Rechte des Ordners anzupassen, so dass man Zugriff erhält. Unter Windows 7 geht dass aber nicht. Das liegt daran, dass diese Ordner nur Links sind. Es sind aber keine herkömmlichen Verknüpfungen, wie man es von alten Windows-Versionen kennt, sondern sogenannte “junction points”. Das sind NTFS-Verweise, die für Rückwärtskompatibilität für alte Programme sorgen soll. Ein User kann und brauch auf diese Verknüpfungen gar nicht zugreifen.

Diese windowsinternen Verweise zeigen natürlich trotzdem in einen entsprechenden Ordner. Man muss also lediglich wissen wo die eigentlichen Ordner liegen und kann die junction points getrost ignorieren.

Ach und bevor ichs vergesse: C:\Documents and Settings zeigt ganz einfach auf C:\Users. Und dort findet man auch seine restlichen Dateien. Aber Vorsicht: Unter C:\Users\[Username] sind wieder einige junction points zu finden. Hier ein paar Beispiele:

  • c:\Users\[Username]\Application Data -> c:\Users\[Username]\AppData\Roaming\
  • c:\Users\[Username]\Local Settings -> c:\Users\[Username]\AppData\Local\
  • c:\Users\[Username]\Start Menu -> c:\Users\[Username]\AppData\Roaming\Microsoft\Windows\Start Menu\

Und um das Verwirrspiel von Windows 7 komplett zu machen, findet man dort noch folgenden Verweis:

c:\Users\[Username]\My Documents\ -> c:\Users\[Username]\Documents\

In dem Documents Ordner findet man nun drei weitere Verweise:

  • c:\Users\[Username]\Documents\My Music -> c:\Users\[Username]\Music\
  • c:\Users\[Username]\Documents\My Pictures -> c:\Users\[Username]\Pictures\
  • c:\Users\[Username]\Documents\My Videos -> c:\Users\[Username]\Videos\

Und jetzt wundert man sich nicht mehr, wieso unter Windows 7 niemand mehr seine Dateien findet und sich über das ständige Zugriff verweigert ärgert m(

Quick launch (Schnellstart-Leiste) in Windows 7 aktivieren

Ich habe gerade begonnen mich mit Windows 7 auseinanderzusetzen. Eins der ersten Dinge, welche mir aufgefallen sind ist, dass es keine Quickstart-Leiste in Windows 7 mehr gibt, was mich sehr gestört hat, weil es eins meiner meistgenutzten Features in den alten Windowsversionen war.

Ist aber kein Problem, man kann die Schnellstartleiste relativ einfach wieder aktvieren:

  1. Neue Toolbar zur Taskleiste hinzufügen:
    Rechtsklick auf die Taskleiste -> Toolbars -> new toolbar…
  2. Zielordner auswählen:
    c:\Users\[UserName]\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\

Tadaa, schon ist die Schnellstartleiste wieder da.
Nun sieht sie noch ein bisschen ungewohnt aus. Aber dem ist auch schnell Abhilfe geschaffen. Einfach per Rechtsklick auf die Schnellstartleiste “Show Title” und “Show Text” abwählen und schon ist das gewohnte Aussehen wieder hergestellt. Wenn einen jetzt noch die Position stört, muss man per Rechtsklick auf die Tastleiste die Taskleiste entsperren und nun kann man seine neue Schnellstartleiste an die richtige Stelle verschieben. Danke an Thomas, der dass schon Ende 2009 herausgefunden hat 🙂

Howto: SSL-verschlüsselter Zugriff einer Ruby on Rails-Applikation auf eine remote MySQL Datenbank

Heute hatte ich eine besonders interessante Aufgabe: Ich habe eine lokale Rails-Applikation, die auf eine remote MySQL-Datenbank über ein Netzwerk zugreifen muss. Da das öffentlich über das Netz geht, soll der Datentransfer natürlich verschlüsselt ablaufen. Damit das Ganze läuft muss man einige Dinge beachten.

  • Wie kann man mit Rails per SSL auf eine remote Datenbank zugreifen?
  • Was muss bei MySQL eingestellt werden, um SSL Zugriffe zu erlauben?
  • Wie werden die entsprechenden Zertifikate erstellt?
  • Wie muss die Firewall eingerichtet sein?

Eine nützliche Quelle für diese Aufgabe war diese Anleitung, in der beschrieben wird, wie man MySQL und rails konfiguriert. Ich habe noch eine weitere Quelle genutzt, die ebenfalls den remote Zugriff auf eine MySQL-Datenbank behandelt. Hier wird zusätzlich auf die IP-Tables-Konfiguration eingegangen. SSL wird dort allerdings nicht behandelt.

MySQL

Kümmern wir uns zuerst um MySQL. Am Anfang sollte man prüfen, ob die MySQL-Installation überhaupt SSL unterstützt. Dies kann man in der lokalen MySQL-Konsole testen:

mysql> SHOW VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl      | YES   | 
+---------------+-------+

Steht an dieser Stelle YES oder DISABLED ist alles gut und man kann weiter machen. Ansonsten muss man zuerst eine MySQL-Version mit SSL-Unterstützung installieren, worauf ich hier jedoch nicht eingehe.

Damit MySQL überhaupt remote Zugriffe erlaubt, muss die Konfigurationsdatei /etc/mysql/my.cfg angepasst werden.
Bei dem Eintrag bind-address steht üblicherweise 127.0.0.1. Damit remote Zugriffe erlaubt werden, muss hier aber die öffentliche IP des Servers stehen.

bind-address  = 256.256.256.256 #hier die eigene ServerIP eintragen
#bind-address  = 127.0.0.1 # - alter Eintrag

Nun noch ein

/etc/init.d/mysql restart

und testen ob noch alles läuft.
Falls man mehrere Anwendungen hat, die auf die MySQL-Datenbank zugreifen, kann es durchaus sein, dass die ein oder andere mit den neuen Einstellungen nicht mehr läuft. Wenn man eine findet, die plötzlich nicht mehr geht, kann das diverse Ursachen haben. Z.B. falsche Rechte des users in der MySQL user table oder falsche Verbindungseinstellungen (Can’t connect to MySQL server on ‘127.0.0.1’ (111)).

Läuft (wieder) alles, werden nun die Zertifikate und Keys erzeugt. Dies ist recht gut in der MySQL Dokumentation erläutert.

Generieren des CA Zertifikats:

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem

Erstellen des Server Zertifikats:

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

Erstellen des Client Zertifikats:

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

Es ist relativ egal, was man bei den ganzen Abfragen eingibt, zumindest sofern man die Zertifikate nur selbst benutzen möchte. Passwort sollte hier keins benutzt werden!

Nun kopiert man die Datei ca-cert.pem server-cert.pem und server-key.pem in das MySQL-Konfigurationsverzeichnis.

mkdir /etc/mysql/ssl
mv ca-cert.pem  server-cert.pem  server-key.pem /etc/mysql/ssl

Hier sollte man unbedingt darauf achten, dass die Files nur die notwendigen Rechte (chmod und chown) haben, also nur der MySQL-User Lesezugriff hat und sonst niemand. Jeder der den Key kennt, kann ansonsten aufgrund des fehlenden Passwort eine SSL-Verbindung zu MySQL aufbauen.

Diese Dateien müssen nun in der MySQL-Konfigurationsdatei angegeben werden. Also noch einmal im Lieblingseditor /etc/mysql/my.cnf aufrufen und folgendes eintragen:

ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem

Anschließend darf man noch ein weiteres mal MySQL neustarten:

/etc/init.d/mysql restart

Ob alles geklappt hat und MySQL die angegeben Dateien auch findet und lesen kann, kann man so überprüfen:

mysql> show variables like '%ssl%';
+---------------+--------------------------------+
| Variable_name | Value                          |
+---------------+--------------------------------+
| have_openssl  | YES                            | 
| have_ssl      | YES                            | 
| ssl_ca        | /etc/mysql/ssl/ca-cert.pem     | 
| ssl_capath    |                                | 
| ssl_cert      | /etc/mysql/ssl/server-cert.pem | 
| ssl_cipher    |                                | 
| ssl_key       | /etc/mysql/ssl/server-key.pem  | 
+---------------+--------------------------------+

Firewall

Damit man das Ganze nun testen kann, muss man noch bei der Firewall, die man hoffentlich hat, den MySQL-Port 3306 öffnen. Bei iptables geht das so:

$iptables -I INPUT -i eth0 -p TCP -s $remoteip --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -I OUTPUT -o eth0 -p TCP --sport 3306 -d $remoteip --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT

Statt der Variablen $remoteip trägt man einfach die IP ein, von der der Zugriff erlaubt sein soll. Mit diesen Zeilen kann dann auf den Port 3306 nur von der spezifizierten IP aus zugegriffen werden.

Test der Verbindung

Zum Testen der Verbindung muss man erst einen User anlegen, der auf die gewünschte Datenbank zugreifen darf. Also startet man als root den mysql client und legt einen neuen User an:

grant all privileges on datenbank-name.* to 'username'@'remote-ip' require ssl;
set password for 'username'@'remote-ip' = password('Passwort');
flush privileges;

Bei diesen Befehlen muss der eigene Datenbankname eingetragen werden, sowie der Benutzername, und die IP von der der Zugriff erlaubt sein soll. Ebenfalls sollte man sich natürlich ein vernünftiges Passwort einfallen lassen 🙂

Nun kann man die MySQL-Verbindung testen. Ein einfacher Test kann per telnet vorgenommen werden.

telnet example.com 3306

Oder aber man testet es gleich mit einem MySQL-Client. Bevor das geht, muss man allerdings die Dateien ca-cert.pem client-cert.pem und client-key.pem auf den Client kopieren. Nun kann man die Verbindung von Client aus testen:

mysql -uUsername -pPasswort -hHostname --ssl-ca=ca-cert.pem

Hier nimmt man den Username und das Passwort, dass man zuvor gewählt hat und gibt den Host an auf den die Datenbank läuft. Wenn alles glatt läuft, sollte man nun Zugriff auf die Datenbank haben.

Rails konfigurieren

Anschließend muss man nur noch in Rails die neuen Verbindungdaten einstellen und man ist fertig.
Also kopiert man die Dateien ca-cert.pem client-cert.pem und client-key.pem in den db Ordner des Rails-Projektes und editiert die database.yml wie folgt:

  host: remote-ip
  adapter: mysql
  encoding: utf8
  reconnect: false
  database: Datenbank-name
  pool: 5
  username: Username
  password: Passwort
  sslca: db/ca-cert.pem
  sslkey: db/client-key.pem
  sslcert: db/client-cert.pem

Und schon sollte die Rails Applikation vollen SSL-verschlüsselten Zugriff auf die entfernte My-SQL Datenbank haben. 😀

Ich bin bei dieser Anleitung den beiden oben angegeben Quellen gefolgt. Mir ist noch nicht ganz klar, ob die Client-Zertifikatdateien in dieser Konfiguration überhaupt benötigt werden. Wenn nicht, freu ich mich natürlich über Kommentare.

Quellen:
How Do I Enable Remote Access To MySQL Database Server?
Connecting to MySQL using SSL encryption in Ruby on Rails
MySQL Reference Manual: 5.5.6. Using SSL for Secure Connections