meta data for this page
This is an old revision of the document!
MariaDB zertifikatbasiertes Anmeldesystem
Das ab 2016 eingeführte Anmeldesystem an die KSDB basiert auf einer Benutzerauthorisierung durch Client-Zertifikate. Diese Zertifikate werden auf dem Server erstellt und in die HOME-Verzeichnisse der Benutzer kopiert.
Die Benutzer werden in der Datenbank angelegt als <user>@192.168.7.%, sodass sie sich nur noch anmelden können, wenn sie sich im Hausnetz befinden, was die Sicherheit erhöht.
Der Prozess gliedert sich nun in die Blöcke
- Server-Zertifikate erstellen
- Client-Zertifikate erstellen und Benutzer anlegen
- Anmeldeverfahren anpassen
Server-Zertifikate erstellen
Auf dem Server benötigen wir zwei Zertifikate. Das erste ist ein sogenanntes CA-Zertifikat und bildet die Authorisierungs-Instanz.
- Issuer-Zertifikat und Server-Zertifikat erstellen
cd /etc/mysql
[ -e certs ] && rm -Rf certs
mkdir certs
cd certs
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -sha256 -days 3600 -key ca-key.pem -out ca-cert.pem -subj '/C=CH/ST=Zug/L=Zug/O=Kraemer, Schwab & Co. AG Investment Management/CN=ksco'
openssl req -newkey rsa:2048 -days 3600 \
-nodes -keyout server-key.pem -out server-req.pem -subj '/C=CH/ST=Zuerich/L=Volketswil/O=Haas AG/OU=haasdb/CN=haasdb'
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 \
-CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Die ca-cert.pem ist für die Clients bestimmt und wird nach /volume1/transfer/Software/haasadmin kopiert:
cp ca-cert.pem /volume1/transfer/Software/haasadmin/
Ebenso wichtig ist es nun, die Zertifikate in die ''/var/packages/MariaDB/etc/mysql/my.cnf'' einzutragen, mit folgenden Zeilen:
ssl
ssl-ca = /etc/mysql/certs/ca-cert.pem
ssl-cert = /etc/mysql/certs/server-cert.pem
ssl-key = /etc/mysql/certs/server-key.pem
- Anschliessend unbedingt mysql neu starten:
/usr/share/mysql/mysql.server restart
- Nun werden die Zertifikate für alle Datenbank-User erstellt. Dazu verwenden wir die Tabelle personal als Referenz:
echo "#!/bin/sh" >/var/tmp/userlist.tmp mysql -Nsr -uroot -p -Dhaas >>/var/tmp/userlist.tmp <<EOF SELECT CONCAT( '# ****** ', login_user, '\n', '[ -e /volume1/homes/', login_user, '/haasdb ] && rm -Rf /volume1/homes/', login_user, '/haasdb\n', 'mkdir /volume1/homes/', login_user, '/haasdb\n', 'openssl req -newkey rsa:2048 -days 3600 -nodes -keyout /volume1/homes/', login_user, '/haasdb/key.pem -out /volume1/homes/', login_user, '/haasdb/req.pem -subj \'/C=CH/ST=Zuerich/L=Volketswil/O=Haas AG Print Finishing Systems & Solutions/OU=', REPLACE(IFNULL(text_1, login_user), 'ü', 'ue'), '/CN=', login_user, '\'\n', 'openssl rsa -in /volume1/homes/', login_user, '/haasdb/key.pem -out /volume1/homes/', login_user, '/haasdb/key.pem\n', 'openssl x509 -req -in /volume1/homes/', login_user, '/haasdb/req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out /volume1/homes/', login_user, '/haasdb/cert.pem\n', 'chown -R ', login_user, ':users /volume1/homes/', login_user, '/haasdb') \ FROM personal p join mysql.user u on u.user = p.login_user and u.host = '192.168.1.%' WHERE p.inaktiv = 0 AND p.gruppe_jn = 0 and p.login_user = 'lager'; EOF chmod u+x /var/tmp/userlist.tmp /var/tmp/userlist.tmp rm /var/tmp/userlist.tmp
- Nun werden die Benutzer umgestellt. Bisher meldete sich xyz mit einem Password pw_xyz an. Neu darf er sich, sofern er aus dem internen Netz kommt und SSL-zertifiziert ist, ohne Passwort anmelden. Kommt er jedoch von aussen, dann soll er sich mit dem bisherigen Passwort anmelden. Ohne SSL-Zertifikat darf er sich hingegen gar nie mehr anmelden.
- Dazu müssen zuerst die Benutzer von % auf 192.168.1.% umgestellt werden mit
mysql -uroot -p -e"update mysql.user set host = '192.168.1.%' where host = '%'; mysql -Nsr -uroot -p -Dhaas >/var/tmp/userlist.tmp <<EOF SELECT CONCAT( 'GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON haas.* TO \'', login_user, '\'@\'%\' REQUIRE Subject \'/C=CH/ST=Zuerich/L=Volketswil/O=Haas AG Print Finishing Systems & Solutions/OU=', IFNULL(text_1, login_user), '/CN=', login_user, '\' AND ISSUER \'/C=CH/ST=Zuerich/L=Volketswil/O=Haas AG/CN=haas\';\n', 'set password for \'', login_user, '\'@\'%\' = \'', password, '\';\n', 'GRANT USAGE ON haas.* TO \'', login_user, '\'@\'192.168.1.%\' REQUIRE Subject \'/C=CH/ST=Zuerich/L=Volketswil/O=Haas AG Print Finishing Systems & Solutions/OU=', REPLACE(IFNULL(text_1, login_user), 'ü', 'ue'), '/CN=', login_user, '\' AND ISSUER \'/C=CH/ST=Zuerich/L=Volketswil/O=Haas AG/CN=haas\';\n', 'set password for \'', login_user, '\'@\'192.168.1.%\' = \'\';\n') \ FROM personal p join mysql.user u on u.user = p.login_user and u.host = '192.168.1.%' WHERE p.inaktiv = 0 AND p.gruppe_jn = 0; EOF mysql -uroot -p </var/tmp/userlist.tmp rm /var/tmp/userlist.tmp