Du kommst hier nicht rein. Oder: Wie authentifiziere ich MySQL User über das Betriebssystem

blog-titelbild

Mach Du das mal….

Ab und zu wäre es schön, den Authentifizierungsprozess dem Betriebssystem zu überlassen. Anstatt das Password eines Users oder einer Applikation in der Datenbank zu speichern, reicht uns als Legitimation die Tatsache aus, dass der User oder die Applikationen den Verbindungsaufbau als bestimmter Betriebssystem-User durchführt. Dies kann bei MySQL durchaus realisiert werden. Voraussetzung hierfür ist, dass der OS-User und die Datenbank auf dem gleichen System (also localhost) arbeiten müssen. Dies ist aber z.B. bei LAMP-Architekturen (LAMP= Linux + Apache + MySQL + PHP) oftmals der Fall. In unserem einfachen Beispiel läuft eine MySQL DB unter dem OS-User „mysql":

bash> ps -ef | grep mysql  | grep db01  
mysql    12702 12510  2 15:54 pts/3    00:00:22 ./bin/mysqld --datadir=/mysql/db01 --user=mysql --server-id=1   

Die Datenbank verfügt über einen Applikations-User namens ‚ordix', der sich von „localhost" mit seinem Passwort authentifizieren darf:

mysql> select user, host, plugin from user where user = 'ordix';
+-------+-----------+-----------------------+
| user  | host      | plugin                |
+-------+-----------+-----------------------+
| ordix | localhost | caching_sha2_password |
+-------+-----------+-----------------------+
1 row in set (0,00 sec)   

Du kannst Dich gerne auf den Socket stellen

Unser Wunsch ist es jedoch, dass sich dieser User ab sofort über das OS authentifiziert. Dazu muss beim Start des Servers ein Authentifizierungs-Plugin geladen werden:

bash> ps -ef | grep mysql  | grep db01  
mysql    12702 12510  2 15:54 pts/3    00:00:22 ./bin/mysqld --datadir=/mysql/db01 --user=mysql --server-id=1 --plugin-load=auth_socket.so   

Die Aktivierung des Plugins erfolgt dann per Kommando online:

mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
mysql> select plugin_name, plugin_status from information_schema.plugins where plugin_name like '%socket%';
+-------------+---------------+
plugin_name | plugin_status |
+-------------+---------------+
| auth_socket | ACTIVE        |
+-------------+---------------+
1 row in set (0,01 sec) 

Im Anschluss an die Aktivierung kann nun der User ‚ordix'@‚localhost' auf die Betriebssystem-Authentifizierung umgestellt werden:

mysql> alter user 'ordix'@'localhost' identified with auth_socket;
Query OK, 0 rows affected (0,00 sec)   

Vertrauen ist gut, Kontrolle ist besser

Abschließend testen wir den Zugriff als Betriebssystem-User ‚ordix':

bash> su - ordix
bash> id uid=1000(ordix) gid=1000(ordix) Gruppen=1000(ordix) …  
bash> mysql -uordix

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14 Server version: 8.0.16 MySQL Community Server - GPL  
mysql> status  
mysql  Ver 8.0.11 for el7 on x86_64 (MySQL Community Server - GPL)
…
Connection id:        14
Current database:     
Current user:        ordix@localhost
…
Threads: 3  Questions: 80  Slow queries: 0  Opens: 212  Flush tables: 3  Open tables: 116  Queries per second avg: 0.055 

Fazit

Die Authentifizierung über den OS-User ist bei MySQL kein Hexenwerk und in einigen Fällen sicherlich nützlich. Vielen sind jedoch die unterschiedlichen Authentifizierungs-Plugins nicht bekannt. Ein Blick in die MySQL Dokumentation kann hier zur Aufklärung beitragen: https://dev.mysql.com/doc/refman/8.0/en/authentication-plugins.html

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/