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