MySQL selbst neu kompilieren / alte ./configure-parameter herausfinden

MySQL, PostgreSQL, SQLite
lilalaunebaer
Posts: 8
Joined: 2008-04-30 16:57

MySQL selbst neu kompilieren / alte ./configure-parameter herausfinden

Post by lilalaunebaer » 2009-04-08 18:13

Hey Folks,

Ich hab nen 1&1 RootServer mit SuSe Linux und hab das übliche setup von 1&1 mit apache, mysql, php etc..
nun hat mein mysql-server aber kein SSL eingebaut, und über yast kann man auch keine version nachinstallieren/updaten die ssl unterstüzt
(ich hab zumindest nichts gefunden, wenn einer was weiß...).

und die developer-downloads auf dev.mysql.com sagen auch nichts zu ssl-support.. (wo gibt's ne feature list für die angebotenen RPM's?)

jedenfalls möchte ich natürlich in der umgebung die fertig eingerichtet & funktionsfähig ist möglichst wenig veränderungen vornehmen.
da 1&1 bzw. das serverteam die mysql-versionen aber installiert haben, weiß ich nichts über die benutzten ./configure - parameter
der aktuellen version.
gibt's irgend eine funktion die mit ähnlich wie PHP in phpinfo() die benutzten kommandos fürs configscript ausspuckt?

danke!

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: MySQL selbst neu kompilieren / alte ./configure-parameter herausfinden

Post by isotopp » 2009-04-08 18:41

lilalaunebaer wrote:da 1&1 bzw. das serverteam die mysql-versionen aber installiert haben, weiß ich nichts über die benutzten ./configure - parameter der aktuellen version.


Mit dem Server kommt ein Shellscript 'mysqlbug', das im Scripttext oben die gesuchte Information enthält.

Du willst jedoch mit einem MySQL-Server nicht mit SSL reden, insbesondere nicht, wenn Du PHP, Perl oder eine andere Umgebung verwendest, die vorrangig mit transienten Verbindungen arbeitet. Der Haupt-Aufwand bei SSL besteht in der Aushandlung von SSL-Parametern, dem Austausch von Zertifikaten und Key-Material, darunter auch der Session-Key. Bei Umgebungen mit transienten Verbindungen passiert das am Beginn jeder Seite neu, und ist extrem langsam. Auf talks.php.net findest Du einen Haufen Slides von Rasmus, die unter anderem dies verwenden um eine besonders eindrucksvolle Tuning-Session zu bauen.

Wenn Du eine Verbindung zu einem MySQL-Datenbankserver schützen mußt - und das mußt Du nie, wenn sie durch ein vertrauenswürdiges Netz läuft - dann bau Dir einen IPsec oder OpenVPN-Tunnel und leg eine unverschlüsselte Verbindung da durch. Das hat eine ganze Reihe von Vorteilen - zum Beispiel findet eine wesentlich seltenere Schlüsselaushandlung statt und es ist nicht nur Datenbank-Kommunikation gesichert, sondern grundsätzlich alle Kommunikation die durch Dein VPN geroutet wird.

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: MySQL selbst neu kompilieren / alte ./configure-parameter herausfinden

Post by Roger Wilco » 2009-04-08 18:45

lilalaunebaer wrote:gibt's irgend eine funktion die mit ähnlich wie PHP in phpinfo() die benutzten kommandos fürs configscript ausspuckt?

Nein, aber im Source RPM (.srpm) gibt es ein Specfile, dass die gewünschten Informationen enthält.

Ich kann mir aber irgendwie nicht vorstellen, dass der mysqld von OpenSuSE ohne SSL-Unterstützung ausgeliefert wird. Was gibt denn `ldd /path/to/mysqld` aus?

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: MySQL selbst neu kompilieren / alte ./configure-parameter herausfinden

Post by isotopp » 2009-04-08 19:00

Roger Wilco wrote:Ich kann mir aber irgendwie nicht vorstellen, dass der mysqld von OpenSuSE ohne SSL-Unterstützung ausgeliefert wird. Was gibt denn `ldd /path/to/mysqld` aus?


Interessanter ist die folgende Ausgabe:

Code: Select all

root@localhost [(none)]> show variables like 'HAVE%';
+-----------------------+----------+
| Variable_name         | Value    |
+-----------------------+----------+
| have_archive          | YES      |
| have_bdb              | NO       |
| have_blackhole_engine | YES      |
| have_compress         | YES      |
| have_crypt            | YES      |
| have_csv              | YES      |
| have_dynamic_loading  | YES      |
| have_example_engine   | NO       |
| have_federated_engine | YES      |
| have_geometry         | YES      |
| have_innodb           | YES      |
| have_isam             | NO       |
| have_merge_engine     | YES      |
| have_ndbcluster       | DISABLED |
| have_openssl          | DISABLED |
| have_ssl              | DISABLED |
| have_query_cache      | YES      |
| have_raid             | NO       |
| have_rtree_keys       | YES      |
| have_symlink          | YES      |
+-----------------------+----------+
20 rows in set (0.02 sec)


und hier insbesondere have_ssl. NO heißt nicht eincompiliert. DISABLED heißt eincompiliert, aber nicht korrekt konfiguriert.

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: MySQL selbst neu kompilieren / alte ./configure-parameter herausfinden

Post by Roger Wilco » 2009-04-08 19:25

Und wieder ein Stückchen schlauer. Danke für die Erklärung.

lilalaunebaer
Posts: 8
Joined: 2008-04-30 16:57

Re: MySQL selbst neu kompilieren / alte ./configure-parameter herausfinden

Post by lilalaunebaer » 2009-04-09 14:30

Hallo!

Vielen Dank, die Info war genau was ich brauchte.

Also ich habe nicht vor von PHP aus per SSL mit MySQL zu kommunizieren; das läuft auf dem gleichen Server und ist auch nicht meine Sorge.
Ich habe aber ein C# .NET- Programm das den MySQL Connector/.NET benutzt um auf die Datenbank zuzugreifen (Webseite & Verwaltungsprogramm werden aus gleicher DB auf Server gespeist), und dafür möchte (muss) ich SSL verwenden.

und da das programm die in-memory architektur von .NET benutzt, brauche ich auch keine dauernde verbindung, ein IPsec-tunnel oder so wäre in diesem rahmen wohl der overkill.
(es sei denn jemand kann mir eine wirklich einfache lösung beschreiben wie ich das auf beiden seiten mit IPsec / VPN umsetze, besonders die windows-seite wäre dann wohl das wovon ich gar keine ahnung hab)

Und der bei meinem Rootserver gelieferte mysqld hat "has_ssl" bzw. "has_openssl" auf NO.. sonst wär ich wohl auch schon fertig :-)

danke!

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: MySQL selbst neu kompilieren / alte ./configure-parameter herausfinden

Post by isotopp » 2009-04-17 13:41

lilalaunebaer wrote:(es sei denn jemand kann mir eine wirklich einfache lösung beschreiben wie ich das auf beiden seiten mit IPsec / VPN umsetze, besonders die windows-seite wäre dann wohl das wovon ich gar keine ahnung hab)


Das klingt IMHO so als wollest Du Dir mal ein beliebiges openvpn Tutorial im Web greifen und auf Deinem Server einen openvpn Server auf einem Port Deiner Wahl installieren. Den Client gibt es auch für Windows und er ist reicht trivial zu installieren.

Ich habe das für meinen Dedi getan, und das hat mich etwa eine Stunde Arbeit gekostet ohne Vorwissen über openvpn zu haben. Ich verwende es unter anderem um mit meinem Macbook via openvpn durch den Firmen-Proxy ins Internet gehen zu können ohne der Firma alle meine URLs in deren Proxylog zu hinterlassen.

openvpn verwendet normales TCP oder UDP, auf Wunsch auch auf Port 443 und durch einen Webproxy, um IP zu tunneln. Es verschlüsselt mit SSL (openssl).

lilalaunebaer
Posts: 8
Joined: 2008-04-30 16:57

MINI-HOWTO: MySQL selbst neu kompilieren / alte ./configure-parameter herausfinden

Post by lilalaunebaer » 2009-07-11 16:42

Hallo leute, mittlerweile habe ich alles fertig und dachte ich poste mal die schritte, die bei mir funktioniert haben.
Achtung: ich hab nen AMD64 DualCore Dedicated bei 1&1, openSUSE 11, Plesk 9.2.1. Ob alles bei anderen konfigurationen funktioniert, sei dahingestellt.
anwendung auf eigene gefahr, selbstverständlich.

1. macht euch unter root nen verzeichnis

Code: Select all

cd ~
mkdir software
cd software


2. holt euch die Mysql version die ihr benutzen wollt; bei mir wars 5.1.36. gibts unter dev.mysql.com.

Code: Select all

wget <url-to-source-tarball>
tar -xzf mysql-<version>.tar.gz
cd mysql-<version>


3. per yast folgende pakete installieren, falls nicht schon vorhanden:
    gcc
    gcc-c++
    make
    ncurses-devel
    readline-devel
    libopenssl-devel
    openssl
falls noch was fehlt, wird euch das das configure-script schon mitteilen.

4. im verzeichnis das .configure-script ausführen:

Code: Select all

CC='gcc' ./configure  '--with-ssl' '--with-plugins=innobase' '--with-charset=utf8' '--with-collation=utf8_unicode_ci' '--enable-assembler' '--without-readline' '--infodir=/usr/share/info' '--libdir=/usr/lib64' '--libexecdir=/usr/sbin' '--localstatedir=/var/lib/mysql' '--mandir=/usr/share/man' '--prefix=/usr' '--sysconfdir=/etc' '--with-mysqld-user=mysql' '--without-debug' '--datadir=/usr/share' '--includedir=/usr/include' '--with-extra-charsets=complex' '--with-unix-socket-path=/var/lib/mysql/mysql.sock' '--enable-thread-safe-client' '--with-comment=My own build' '--with-libwrap' '--with-server-suffix=-max' 'HOSTNAME=/bin/hostname -f' '--with-server-suffix=-Max' '--with-embedded-server' 'CFLAGS=-O2 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -g -DPIC -fPIC -DUNDEF_HAVE_INITGROUPS -DFORCE_INIT_OF_VARS -fno-strict-aliasing' 'CXXFLAGS=-O2 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -g -DPIC -fPIC -DUNDEF_HAVE_INITGROUPS -DFORCE_INIT_OF_VARS -fno-strict-aliasing -fno-exceptions -fno-rtti'

WICHTIG: bei diesem script kommt es natürlich sehr auf euer konkretes system an. in meinem falle war ja schon mysql-5.0 installiert; da kann man mit dem mysqlbug-script
über

Code: Select all

mysqlbug --help

oder

Code: Select all

VISUAL=vi; export VISUAL; mysqlbug

infos bekommen wie die letzten build-parameter waren. ich musste jedoch etwas probieren bis alles funktionierte. vor allem um den InnoDB-Support zuzuschalten wars schwierig; den parameter

Code: Select all

 '--with-plugins=innobase'

hab ich so nicht in den mysqldocs finden können.

5. kommen keine fehlermeldungen, das ganze per make erstellen:

Code: Select all

make > make.log

dabei wird der output in make.log geschrieben, was viele viele bildschirmausgaben verhindert.

6. SICHERUNG:
    /etc/my.cnf
    /usr/bin/mysqld (falls gewünscht)

7. im gleichen verzeichnis

Code: Select all

make install

ausführen. damit ist der server und der client auf dem rechner installiert.

8. SSL-einrichtung. wie oben festgelegt, haben wir MySQL mit yaSSL-support gebacken. nun brauchen wir noch zertifikate.
wer schon ein CA-zertifikat hat, braucht natürlich keins zu erstellen. sonst kann man dies z.B. über

Code: Select all

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 10000 -config ca_conf.txt -key ca-key.pem > ca-cert.pem

erledigen. dabei muss man vorher ca_conf.txt mit angepasstem inhalt erstellen (geht auch ohne config-file, nur ists lästig bei erneuter ausführung wieder anzugeben)

Code: Select all

[ req ]
distinguished_name     = req_distinguished_name
prompt                 = no

[ req_distinguished_name ]
C                      = DE
ST                     = NRW
L                      = <Ort>
O                      = <Organisation>
OU                     = <unternehmen>
CN                     = <authority_name>
emailAddress           = pgp@danielwirtz.de


nun erstellt man noch das mysql-certifikat:

Code: Select all

openssl req -newkey rsa:2048 -days 10000 -config mysql_conf.txt -nodes -keyout mysql-key.pem > mysql-req.pem
openssl x509 -req -in mysql-req.pem -days 10000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > mysql-cert.pem

wieder wird eine config-datei (mysql_conf.txt) benötigt.
hierbei: unter CN sollte die adresse stehen unter der später der server angesprochen wird, z.b. mysql.mydomain.de. dies kann lästige fehlermeldungen verhindern.

9. nun muss man die zertifikate noch an einen günstigen ort kopieren; ich habs alles in den Mysql-ordner verschoben:

Code: Select all

cp *.pem /var/lib/mysql


10. eintragen in my.cnf. unter mysqld kommen folgende einträge

Code: Select all

[mysqld]
[...]
ssl-ca = /var/lib/mysql/ca-cert.pem
ssl-cert = /var/lib/mysql/mysql-cert.pem
ssl-key = /var/lib/mysql/mysql-key.pem


11. nun muss man noch den Mysql-daemon neu starten. normalerweise tuts ein

Code: Select all

rcmysql restart

wie auch immer, bei mir fährt der mysqld dann nicht runter. also einfach mit der brechstange

Code: Select all

kill <mysqld-process-id>

eingeben und mit

Code: Select all

rcmysql start

wieder starten. ob der neue server geladen wurde sieht man z.b. mit

Code: Select all

mysqld -V


12. upgrade ausführen, falls man vorher mysql 5.0 hatte:

Code: Select all

mysql_upgrade -u <root-user> -p


12. für plesk: man muss noch

Code: Select all

chown mysql:mysql /var/lib/mysql

ausführen, damit plesk wieder dort temporäre sql-caches einrichten kann; mein plesk hat sich da beim domaineinrichten beschwert.

13. prüfen ob alles klappt:

Code: Select all

mysql -u admin -p
mysql> show variables like '%ssl%';

dann sollte da sowas stehen wie

Code: Select all

have_ssl    yes
ssl-ca = /var/lib/mysql/ca-cert.pem
[...]


herzlichen glückwunsch, mysql 5.1 mit SSL läuft!
ich hab lang genug gebraucht, ich hoffe ich kanns vielen einfacher machen!

grüße
lilalaunebaer

lilalaunebaer
Posts: 8
Joined: 2008-04-30 16:57

Re: MySQL selbst neu kompilieren / alte ./configure-parameter herausfinden

Post by lilalaunebaer » 2009-07-12 14:25

das geht natürlich auch :-)

wenn man doch nur die richtigen quellen kennen würde! wie bindet man die url denn in yast ein?

das erledigt zwar noch nicht das zertifikaterstellen, aber das ist ja klar.
ich wäre da aber vorsichtig was das rpm-upgrade angeht; woher weiß man welche features mit einkompiliert wurden?
und ob das dann mit plesk funktioniert? DAS würde ich eh mal gerne wissen, aber auf nem livesystem werd ich solche experimente tunlichst lassen.

wie kann man den sowas wieder deinstallieren falls man doch lieber das vorige mysql 5.0.xx benutzt hätte? da habe ich noch gar keine ahnung von..
das ist immer ein one-way trip bei mir ..

danton
Posts: 47
Joined: 2006-01-10 17:45

Re: MySQL selbst neu kompilieren / alte ./configure-parameter herausfinden

Post by danton » 2009-07-13 10:09

Ich würde mir den SSL-Quatsch ja sparen und einfach den SQL-Port per SSH forwarden - dann braucht man den SQL-Server nicht öffentlich zugängig machen...