SASL mit PAM, SSSD, LDAP unter Opensuse – I

Auf den meisten Linux-Systemen ist von Haus aus ja das generische Framework PAM zur Login- und Berechtigungskontrolle im Einsatz. PAM kann über entsprechende Module mit mehreren Backends – wie z.B. ein LDAP-System – Kontakt aufnehmen und dortige Authentifizierungsdaten abfragen. Etliche Serverdienste – wie z.B. Cyrus IMAP – nutzen dagegen das “Cyrus SASL“-Framework und seine Sub-Services zur Authentifizierung von Anwendern. Auch SASL kann über Submodule – ähnlich wie PAM – verschiedene Authentifizierungs-Backends direkt ansprechen. Eine dritte Klasse von Services wiederum nutzt SASL nur als Zwischenschicht und delegiert die Authentifizierung an andere Verfahren wie PAM.

Insgesamt ergibt sich so eine große Bandbreite an Authentifizierungsverfahren, mit denen sich der Linux-Admin potentiell herumschlagen muss. Hat man ein Opensuse-Server-System vorliegen, bei dem die

  • die per SASL zu authentifizierenden User identisch mit Systembenutzern sind,
  • die zu authentifzierenden User gleichzeitig auf einem zentralen OpenLDAP-Server verwaltet werden,
  • der SSSD-Dämon zum Einsatz kommt, um TLS-Verbindungen um LDAP-Server zu erzwingen

so möchte man zur Vereinfachung ggf. gerne folgende Authentifizierungskette nutzen:

SASL => PAM => SSSD => LDAP

  • SASL nutzt als erstes PAM,
  • PAM wiederum greift auf SSSD (sss.so-Module) zu,
  • SSSD nutzt über einen erzwungenen, verschlüsselten TLS-Kanal schließlich LDAP als Authentication-Backend.

Der letzte Aspekt erlaubt dann auch die Nutzung von “PLAIN”-Mechanismen – also die Weitergabe unverschlüsselter Passwörter an ein Backend-System – ohne zu große Sicherheitslücken zu reißen. Ich beschreibe in diesem Beitrag kurz, wie man die genannte Sequenz für die Authentifizierung unter Opensuse zum Laufen bringt. Dabei betrachte ich nur die einfachst mögliche Konfigurationsvariante, die man allein mit Bordmitteln von Opensuse bewerkstelligen kann.

Voraussetzung: TLS-fähiger LDAP-Server

Wie man mit Hilfe von Opensuse 12.1 eine einfache, zentrale und LDAP-basierte User-Authentifizierung im Netzwerk ermöglicht, habe ich in einer Sequenz von Beiträgen zu OpenLDAP in diesem Blog bereits erläutert.

Opensuse 12.1 – LDAP IOpensuse 12.1 – LDAP IIOpensuse 12.1 – LDAP IIIOpensuse 12.1 – LDAP IVOpensuse 12.1 – LDAP V

Hinweis zur LDAP-Einrichtung unter Opensuse 12.3 und 13.1:

Unter Opensuse 12.3 funktioniert die LDAP-Einrichtung leider nur fast genauso wie für Opensuse 12.1 beschrieben. Man wird bei der LDAP-Client-Einrichtung gezwungen, SSSD einzusetzen und TLS als Verschlüsselungsmechanismus für die Verbindung zum LDAP-Server zu aktivieren. Das bedeutet,

  1. dass die SSS-Pakete installiert werden müssen,
  2. dass auch auf dem LDAP-Server SSSD aktiv sein muss und der LDAP-Server TLS-fähig einzurichten ist.

Die Einrichtung von TLS ist in meinen LDAP-Artikeln ausführlich erläutert. Ich habe zum Setup eine zentrale CA im Netz genutzt.
Sowohl auf dem LDAP-Serversystem als auch auf den LDAP-Client-Hosts sind SSL-Zertifikate bereitgestellt worden. Wie man die erstellt, ist ebenfalls im Rahmen der Artikel zu LDAP beschrieben. Wir gehen in diesem Beitrag nur kurz darauf ein.

In der Beschreibung der LDAP-Client-Kommunikation mit dem LDAP-Server fehlten in meinen Blog-Artikeln bislang allerdings Ausführungen dazu, wie man dabei SSSD im Zusammenhang mit PAM nutzt. Wir erledigen dies in diesem Artikel mit. Es lohnt sich also, erst den vorliegenden Artikel bzgl. der SSSD-Einrichtung zu lesen, wenn man noch vor der LDAP-Server-Einrichtung mit Opensuse 12.2/12.3/13.x stehen sollte.

Ansonsten setzen wir für diesen Artikel voraus, dass es im Netz einen TLS-fähigen LDAP-Server gibt, dessen Baum mit klassischen Objekten für die User- und Gruppenverwaltung unter Opensuse bestückt ist. Die Objekt-Struktur kann man (einmalig) bei der LDAP-Client-Einrichtung auf dem LDAP-Server mittels “YaST2 >> LDAP-Client” anlegen lassen. Das sollte man aber wirklich nur genau einmal tun – nämlich bei der LDAP-Client-Einrichtung per YaST2 auf dem LDAP-Server selbst. Bei der Einrichtung weiterer Systeme als LDAP-Client muss man die erneute LDAP-Struktureinrichtung per YaST tunlichst unterlassen! S. hierzu meine LDAP-Artikel.

Weiter setzen wir voraus, dass es im LDAP-Baum einen User “tarja” gibt, den wir für Tests benutzen können. In der sehr einfachen Konfiguration dieses Artikels verwenden wir keine Host- und User-spezifischen Zugangsregeln. Dafür muss ein späterer Artikel herhalten.

Server- und Domain-Bezeichnungen für unser Konfigurationsbeispiel

Der LDAP-Server heiße nachfolgend “ldap-serv“, der Server auf dem SASL und PAM in Verbindung mit dem LDAP-Server Nutzer im Netz authentifizieren sollen, heiße “c-serv“. Beide seien in einer Domaine “anraconx.de” beheimatet:

  • ldap-serv.anraconx.de
  • c-serv.anraconx.de

Diese Domaine sei auch charakteristisch für den zu durchsuchenden Zweig des LDAP-Baums:

dc=anraconx,dc=de

bzw.

ou=people,dc=anraconx,dc=de
ou=group,dc=anraconx,dc=de

Bzgl. der SSL-Zertifikate gilt, dass diese für die Hosts mit FQDN ausgestellt wurden.

Server-Zertifikat und Übertragung des öffentlichen CA-Keys auf den LDAP-Client-Host

Unser Server “c-serv” (= LDAP-Client), auf dem SASL, PAM und LDAP genutzt werden sollen, erhält ein Serverzertifikat der zentralen CA (die z.B. auf dem zentralen LDAP-Server eingerichtet sein kann). Das Ausstellen eines “Common Server Certificates” für den c-serv ist für unser Thema nicht unbedingt erforderlich; es ist aber nützlich, wenn man beim Import des “Common Server Certificate” gleich den öffentlichen Teil des CA-Zertifikats mit importiert.

Letzteres wird im Falle von self signed Zertifikaten (Die CA liegt ggf. auf dem zentralen LDAP-Server) zwingend für eine erfolgreiche TLS-Verbindung zum LDAP-Server benötigt.

Zur Ausstellung des Serverzertifikats nutzt man die zentrale CA. Unter Opensuse erstellt und verwaltet man die CA am einfachsten mit Hilfe des YaST2 CA-Modul auf dem CA-Server. Wie man damit ein solches Zertifikat ausstellt, habe ich in den LDAP-Artikeln beschrieben. Am Ende der Zertifikatserstellung exportiert man das Zertifikat (inkl. der CA-Hierarchie !) als *.p12-Datei (z.B. als “c-serv.anraconx.p12”) in ein Verzeichnis seiner Wahl auf dem CA-Server. Die Auswahl des richtigen Dateityps erkennt man in einem entsprechenden Dialog von YaST-CA.

Ich nutze als Ablageort für solche Zertifikats-Dateien “/etc/certs”; das Verzeichnis erhält nur Lese- und Schreibrechte für root. Von dort kopiert man die Datei
per “scp” in ein analoges Verzeichnis auf dem Zielserver “c-serv”. Also z.B.:

c-serv:~# mkdir /etc/certs

c-serv:~# chmod 600 /etc/certs

und

ldap-serv:/etc/certs # scp ./c-serv.anraconx.p12 root@c-serv:/etc/certs
Password:
c-serv.anraconx.p12
100% 4237 4.1KB/s 00:00
ldap-serv:/etc/certs #

Danach öffnet man auf “c-serv” das YaST2-Tool “Common Server Certificate”. Mit dessen Hilfe importieren wir das Zertifikat aus der lokalen Datei “/etc/certs/c-serv.anraconx.p12”. Die Zertifikatsinformationen landet dann mit den richtigen Rechten in den richtigen Verzeichnissen – u.a. in “/etc/ssl/servercerts” (u.a. der private Serverkey in der Datei “serverkey.pem” mit Rechten 600) und in “/etc/ssl/certs”. In letzterem Verzeichnis befindet sich dann die öffentliche “YaST-CA.pem” der mit YaST verwalteten CA im Netz. Diese Datei benötigen wir für den korrekten Aufbau der LDAP-Verbindung mittels SSSD.

Natürlich hätte man sich die Datei auch einfach vom CA-Server holen können. Aber so haben wir nun gleichzeitig ein Serverzertifikat, das auf “c-serv” von allen Serverdiensten benutzt werden kann, die mit OpenSSL TLS/SSL-Verschlüsselungen anbieten wollen. Z.B. Apache, Postfix (SMTP), Cyrus Imap, vsftp….

Konfiguration von “c-serv” als “LDAP-Client”

Jeder Host, auf dem eine Authentifizierung über LDAP erfolgen soll, sollte als LDAP-Client eingerichtet werden. Die erforderlichen Konfigurationsschritte habe ich bereits ausführlich in den oben genannten LDAP-Artikeln beschrieben. Siehe im besonderen:
Opensuse 12.1 – LDAP III

Das Yast2-Modul “LDAP-Clint” erzwingt ab Opensuse 12.2 allerdings die Installation erforderlicher SSS-RPMs. In meinem Fall (Opensuse 13.1) sind das folgende Pakete:

libnsssharedhelper0, libsss_idmap0, sssd, sssd-32bit, sssd-tools.

DieYaST2-Einrichtungsroutine nimmt während der Installation Einstellungen in mehreren Dateien vor, u.a. in

  • /etc/ldap.conf,
  • /etc/openldap/ldap.conf,
  • /etc/sssd/sssd.conf,
  • /etc/nsswitch.conf,
  • diversen Dateien unter /etc/pam.d,
  • Konfigurationsvorgaben für den YaST2-eigenen LDAP-Browser,
  • Konfigurationsvorgaben für die YaST2-eigene User- und Gruppen-Verwaltung.

Wir betrachten zunächst den Input in die Masken der YaST2-basierten LDAP-Client-Konfiguration auf “c-serv” – hier anhand der späteren Ergebnismasken, aber der notwendige Input in die Dialoge geht auch daraus hervor. Danach zeige ich die korrespondierenden Inhalte einiger lokaler Konfigurationsdateien, damit man deren Inhalte auch unabhängig von YaST prüfen oder manipulieren kann.

Masken zur LDAP-Client-Konfiguration

Zunächst die einleitende Maske der LDAP-Client-Konfiguration:

ldap_client

Das Erzeugen des Home-Directories beim ersten Login-Versuch auf “c-serv” habe ich dabei zugelassen.

Die Maske zu dem Zertifikaten, die man über den Klick des Buttons “SSL/TLS Configuration” erreicht, sieht wie folgt aus:

certs

Nachfolgend der Inhalt spezieller Angaben zum LDAP-Schema, die in die
Konfigurationsdatei “/etc/sssd/sssd.conf” einfließen:

naming

Hier ist die von mir gewählte sssd-offline-Einstellung durchaus diskussionswürdig. Es werden in meinem Fall keine Offline-Credentials vom SSSD-Dämon gespeichert. Das geht für Hosts, die fest in ein Netzwerk eingebunden sind, in dem der LDAP-Server oder ein Backup-System (Slave) immer als erreichbar vorausgesetzt werden können. Für Laptops wäre ein Offline-Caching von Credentials aber durchaus interessant, weil sonst bei Nicht-Erreichbarkeit des LDAP-Servers kein Login in das System möglich wäre. Das Caching von Credentials kann aber auch Nachteile haben. U.a. muss man wie bei Caches üblich Update-Intervalle oder – Bedingungen festlegen. Hierauf kann ich in diesem Artikel nicht eingehen.

Abschließend Festlegungen, die für den LDAP-Browser und die Konfiguration für die User- und Gruppenverwaltung mit Opensuse-spezifischen Baumstrukturen erforderlich sind:

schema

Wie bereits erwähnt, würden wir die Checkbox zu “Create Default Configuration Objects” nur einmal (!) bei der Einrichtung des LDAP-Clients auf dem Server selbst setzen, denn dadurch manipulieren wir den LDAP-Baum auf den Server – und das wollen wir später nicht mehr, wenn wir bereits User angelegt haben. Also: Checkbox nicht (!) markieren.

Die Konfigurationen, die man über den Button “Configure User Management Settings” erreichen würde, betreffen eben die eingerichteten LDAP-Strukturen zur User- und Gruppen-Verwaltung und deren Feintuning. Hierzu verweise ich wieder auf die früheren LDAP-Artikel.

LDAP-Client-Konfigurationsdateien

Nun zum Inhalt der LDAP-Konfigurationsdateien. Hier sind zwei Dateien für verschiedene Klassen von Clients relevant (siehe hierzu Opensuse 12.1 – LDAP III):

/etc/openldap/ldap.conf

#BASE dc=example,dc=com
#URI ldap://ldap.example.com ldap://ldap-master.example.com:666
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
uri ldap://ldap-serv.anraconx.de
base dc=anraconx,dc=de
TLS_CACERTDIR /etc/ssl/certs
TLS_CACERT /etc/ssl/certs/YaST-CA.pem

/etc/ldap.conf

uri ldap://ldap-serv.anraconx.de
base dc=anraconx,dc=de
nss_map_attribute uniqueMember member
ssl no
tls_cacertdir /etc/ssl/certs
tls_cacertfile /etc/ssl/certs/YaST-CA.pem
pam_password exop
pam_filter objectClass=posixAccount

Vergleicht man diese letzte Datei mit der entsprechenden Konfigurationsdatei unter Opensuse 12.1, so erkennt man doch deutliche Vereinfachungen, die mit dem Einsatz von SSSD zusammenhängen. Natürlich erwartet man, dass in der Konfigurationsdatei von sssd dann Dinge auftauchen, die früher in “/etc/ldap.conf” zu finden waren.

Die Inhalte weiterer Konfigurationsdateien folgen unter den nächsten Abschnitten.

PAM mit SSSD auf den Hosts lauffähig machen

Zu SSSD habe ich Links mit weiterführenden Informationen in folgendem Blog-Beitrag zusammengestellt:
Opensuse 12.3, LDAP, sssd – II

SSSD erscheint als weiterer Sicherheits-Layer, der z.B. im Rahmen von PAM genutzt werden kann und selbst sog.
Security Domainen verwaltet. PAM soll durch SSSD beim Zugriff auf verschiedene Backend-Authentifizierungsquellen unterstützt werden. Unterschiedliche Konfigurationsdateien und PAM-Plugin-Module sollen so vermieden werden.

Ob die Welt durch diesen Ansatz wirklich einfacher und standardisierter wird, bleibt abzuwarten. Konfigurationsseitig ist der zusätzliche Layer zunächst eine Hürde – vor allem dann, wenn man bereits eine funktionierende Einrichtung von PAM für LDAP hatte. Siehe etwa :
Opensuse 12.1 – LDAP III

SSSD muss auf dem LDAP-Server und auch auf allen anderen Systemen, die über SSSD miteinander oder mit dem LDAP-Server sprechen sollen, installiert und konfiguriert werden. Das meiste wird bei der LDAP-Client-Einstellung per YaST zwar bereits erledigt. Natürlich kann man die Einträge aber auch unabhängig von YaST pflegen oder prüfen.

SSSD-Konfiguration

Schritt 1: “NSS”-Konfiguration anpassen
Hierzu muss man die Datei “/etc/nsswitch.conf editieren und die Einträge für “passwd” und “group” ergänzen:

passwd:    compat sss
group:    files sss

Dies gilt für die Hosts “ldap-serv” und “c-serv” gleichermaßen.

Schritt 2: SSSD auf “ldap-serv” konfigurieren
Zuständig ist hier die Datei “/etc/sssd/sssd.conf”. Die sieht komprimiert bei mir “ldap-serv” wie folgt aus:

[sssd]
config_file_version = 2
services = nss,pam
domains = default
 
[nss]
filter_groups = root
filter_users = root
 
[pam]
 
# Section created by YaST
[domain/default]
ldap_uri = ldap://ldap-serv.anraconx.de
ldap_search_base = dc=anraconx,dc=de
ldap_schema = rfc2307bis
id_provider = ldap
ldap_user_uuid = entryuuid
ldap_group_uuid = entryuuid
;ldap_id_use_start_tls = True
ldap_id_use_start_tls = False
enumerate = True
;cache_credentials = True
chpass_provider = ldap
auth_provider = ldap
;ldap_tls_reqcert = never
ldap_user_search_base = ou=people,dc=anraconx,dc=de
ldap_group_search_base = ou=group,dc=anraconx,dc=de
cache_credentials = False
ldap_tls_cacertdir = /etc/ssl/certs
ldap_tls_cacert = /etc/ssl/certs/YaST-CA.pem

Zur Bedeutung der für das LDAP-Backend zu treffenden Domain-Einträge muss ich auf die im oben genannten Artikel angegebenen Quellen – insbesondere auf jene von Red Hat – verweisen. U.a.:
https://fedorahosted.org/sssd/

Die LDAP-Konfiguration könnte natürlich etwas anders aussehen, da der LDAP-Host hier ja der lokale Host ist. Man könnte die Verbindung möglicherweise auch über einen Socket aufnehmen; habe ich aber nicht probiert. Die Search Base und das angegebene Schema im LDAP-Baum rühren in meinem Fall natürlich daher, dass die User- und Gruppen-Daten auf dem LDAP-System über eine opensuse-spezifische YaST-LDAP-Konfiguration erzeugt wurde. Auf einem selbst eingerichteten LDAP-Server sind natürlich Anpassungen erforderlich.

Schritt 3: SSSD auf dem Host “c-serv” konfigurieren
Auch hier ist die “/etc/nsswitch.conf” wie oben beschrieben abzuändern. Die Datei “/etc/sssd/sssd.conf” ist mit der des “ldap-serv” praktisch identisch:

[sssd]
config_file_version = 2
services = nss,pam
domains = default
 
[nss]
filter_groups = root
filter_users = root
 
[pam]
&nbsp:
# Section
created by YaST
[domain/default]
ldap_uri = ldap://ldap_serv.anraconx.de
ldap_search_base = dc=anraconx,dc=de
ldap_schema = rfc2307bis
id_provider = ldap
ldap_user_uuid = entryuuid
ldap_group_uuid = entryuuid
ldap_id_use_start_tls = False
enumerate = True
cache_credentials = False
ldap_tls_cacertdir = /etc/ssl/certs
ldap_tls_cacert = /etc/ssl/certs/YaST-CA.pem
chpass_provider = ldap
auth_provider = ldap

Hier war ich aus bestimmten Gründen nur scheinbar schlampig; es wird offenbar der ganze Baum durchsucht. Dies liegt an für “c-serv” zusätzlich wichtigen Einträgen im LDAP-Baum, die auf dem LDAP-Server selbst keine Rolle spielen sollen. Gibt es User- und Gruppen-Einträge in einer Standard-Installation nur im Ast “ou=people” kann man die user- und group-search-base analog zur Konfiguration auf dem LDAP-Server auch auf “ou=people,dc=anracona,dc=de” eingrenzen.

Anpassen der PAM-Standard-Dateien

Nun muss man natürlich auch PAM für die Nutzung des SSSD-Service konfigurieren und dabei im Gegensatz zu der in
Opensuse 12.1 – LDAP III
beschriebenen PAM-Einrichtung, Moduleinträge wie “pam_ldap.so” eliminieren. Die nachfolgende Konfiguration gilt sowohl für den Server “ldap-serv” als auch den Host “c-serv”.

Wir betrachten hier nur die wichtigsten zentralen PAM-Dateien unter Opensuse, die bei Bedarf in service-spezifische PAM-Konfigurationsdateien per “include”-Anweisung eingebunden werden können. Für die klassischen Auth-Mechanismen “Login”, Session”, “Password” etc. ist das unter Opensuse bereits der Fall. Daher hilft die Modifikation der nachfolgenden Dateien dort auch schon direkt weiter. Bei eigenen, mehr service-spezifische Konfigurationen (z.B. für “cyrus imapd”) bleibt einem zusätzliche Arbeit natürlich nicht erspart.

Die anzupassenden Dateien findet man im Verzeichnis “/etc/pam.d“. Wir gehen sie hier der Reihe nach durch. Man beachte jeweils den Eintrag des Moduls “pam_sss.so“.

Files “common-account” und “common-account-pc”
——————————————————

account requisite pam_unix.so try_first_pass
account sufficient pam_localuser.so
account required pam_sss.so use_first_pass

Files “common-auth” und “common-auth-pc”
———————————————–

auth required pam_env.so
auth optional pam_gnome_keyring.so
auth sufficient pam_unix.so try_first_pass
auth required pam_sss.so use_first_pass

File common-password
———————

password requisite pam_cracklib.so
password optional pam_gnome_keyring.so use_authtok
password sufficient pam_unix.so use_authtok nullok shadow try_first_pass
password required pam_sss.so use_authtok

File common-password-pc
——————————

password requisite pam_cracklib.so
password optional pam_gnome_keyring.so use_authtok
password sufficient pam_unix.so use_authtok nullok shadow try_first_pass
password required pam_sss.so use_authtok

File common-session
————————-

session optional pam_mkhomedir.so
session required
pam_limits.so
session required pam_unix.so try_first_pass
session optional pam_sss.so
session optional pam_umask.so
session optional pam_systemd.so
session optional pam_gnome_keyring.so auto_start only_if=gdm,gdm-password,lxdm,lightdm
session optional pam_env.so

File common-session-pc
————————-

session optional pam_mkhomedir.so
session required pam_limits.so
session required pam_unix.so try_first_pass
session optional pam_sss.so
session optional pam_umask.so
session optional pam_systemd.so
session optional pam_gnome_keyring.so auto_start only_if=gdm,gdm-password,lxdm,lightdm
session optional pam_env.so

Im Vergleich zu Opensuse 12.1 – LDAP III erkennt man, dass das Modul “pam_ldap.so” eigentlich nur gegen “pam_sssd.so” ausgetauscht wurde. Die wirklichen Vorteile von SSSD kommen in den hier besprochenen einfachen Beispielen also noch nicht zum Tragen.

Test, ob LDAP als Auth-Backend eingestellt ist und genutzt wird

Das Gröbste an der Konfiguration ist bereits geschafft. Wir checken nun auf “c-serv”, dass uns die User- und Gruppen-Verwaltung unter YaST2 dort Zugang zu dem LDAP-Server ermöglicht und dass LDAP als Backend aktiviert ist. Dazu öffnen wir “YaST2 >> User and Group Management” und gehen auf den Reiter “Authentication Settings”. Dort sollten alle erforderlichen LDAP-Einstellungen bereits vorgenommen sein. Also etwa:

LDAP
Servers:ldap-serv.anraconx.de
Base DN:dc=anraconx,dc=de
Client Enabled:Yes
System Security Services Daemon (SSSD) Set

Danach kann man an einem Terminal einen ersten Login-Versuch des Users “tarja” auf “c-serv” testen. (“tarja” darf auf c-serv bislang natürlich nicht als User angelegt sein.) Ist alles OK, so erfolgt die Authentifizierung über “ldap-serv” und es wird auf “c-serv” das Home-Verzeichnis für “tarja” auf c-serv angelegt und man kann arbeiten. Siehe hierzu die genannten LDAP-Artikel. Über ssh von einem System “mylinux” aus, sieht das wie folgt aus:

mylinux:~ # ssh -X tarja@c-serv
Password:
Creating directory ‘/home/tarja’.
Have a lot of fun…
/usr/bin/xauth: file /home/tarja/.Xauthority does not exist
tarja@c-serv:~>

Damit haben wir das Zusammenspiel von sssd und LDAP verifiziert.

SASL – genauer saslauthd – und PAM

Voraussetzung der Verwendung von “sasl” als Authentication Layer für bestimmte Services ist die Installation von SASL-RPM-Paketen (hier auf c-serv). SASL bietet mehrere maßgeschneiderte Module/Dienste für die Nutzung von anderen Authentication-Layern oder den direkten Zugriff auf bestimmte Backends an. Wichtig für die Nutzung von PAM ist der SASL-Dienst “saslauthd“. Ich installiere mir aber gleich auch die Pakete für weitere Dienste dazu, um bei Bedarf darauf zugreifen zu können. Die wichtigsten SASL-RPMs sind:

cyrus-sasl, cyrus-sasl-32bit, cyrus-sasl-devel,
cyrus-sasl-crammd5, cyrus-sasl-digestmd5, cyrus-sasl-plain,
cyrus-sasl-gssapi, cyrus-sasl-ldap-auxprop, cyrus-sasl-saslauthd

Die 2-te Zeile enthält Verfahren zur Passwort-Verschlüsselung. Da wir die Verbindung zum LDAP-Server über TLS aufbauen, interessieren uns hier starke Verfahren wie crammd5 oder digestmd5 im Moment nicht. Die 3-te Zeile zeigt verschiedene Bibliotheken, die für verschiedene Backends benutzt werden können. Wir benutzen davon im Moment aber nur “saslauthd“;
dieses Module erlaubt die Nutzung von PAM als nächstem Authentifizierungslayer. Dies kann man auf einem Host z.B. dadurch erreichen, in dem man den “saslauthd”-Daemon explizit wie folgt startet:

c-serv:/etc/sasl2 # cd /etc/init.d

c-serv:/etc/init.d # ./saslauthd start -a pam

Wie bei Opensuse üblich, kann der Startup von “saslauthd” aber auch über eine Datei unter /etc/sysconfig – nämlich /etc/sysconfig/saslauthd – konfiguriert werden. Die sieht bei mir wie folgt aus:

## Path: System/Security/SASL
## Type: list(getpwent,kerberos5,pam,rimap,shadow,ldap)
## Default: pam
## ServiceRestart: saslauthd
#
# Authentication mechanism to use by saslauthd.
# See man 8 saslauthd for available mechanisms.
#
SASLAUTHD_AUTHMECH=pam
#
## Path: System/Security/SASL
## Type: integer(0:)
## Default: 5
## ServiceRestart: saslauthd
#
# Number of processes that saslauthd should fork to responding to
# authentication queries. A value of zero will indicate that saslauthd
# should fork an individual process for each connection.
#
SASLAUTHD_THREADS=5
#
## Path: System/Security/SASL
## Type: string
## Default: “”
## ServiceRestart: saslauthd
#
# Additional parameters to use by saslauthd.
# See the saslauthd(8) manpage for available parameters.
#
SASLAUTHD_PARAMS=””

Diese Parameter werden in das Startup-Skript für saslauthd unter /etc/init.d – nämlich /etc/init.d/sasauthd – eingebunden. Nach einem

c-serv:/etc/init.d #systemctl enable saslauthd.service

wird der saslauthd-Dämon dann regelmäßig beim Systemstart von “systemd” gestartet.

Test der Funktionstüchtigkeit von saslauthd mit PAM

Jetzt wird es Zeit für einen Test, ob “saslauthd” auch seinen Dienst tut und PAM nutzt. Hierfür gibt es das CLI-Testtool “testsaslauthd“. Für unsere auf dem LDAP-Server eingetragene Testuserin “tarja” verwenden wir es wie folgt; die Option “-p” erfordert dabei die Angabe des Passwords für “tarja”.

c-serv:/etc/init.d # testsaslauthd -u tarja -p TARJAPWD
0: OK “Success.”
c-serv::/etc/init.d #

Damit haben wir im Prinzip die gewünschte Kette geschlossen:

Man kann den “saslauthd”-Dienst als Brückenglied zu PAM benutzen. PAM greift dann – wie gewünscht über SSSD TLS-gesichert auf den LDAP-Server zu.

Konfiguration von Services zur Nutzung von SASL und “saslauthd” – Beispiel Postfix

Natürlich muss jeder Services auf die Nutzung von SASL und im besonderen auf die Nutzung des Subservices “saslauthd” ausgerichtet werden. Was man dafür zu tun hat, ist natürlich dienste-abhängig. Ich gehe hier beispielhaft, kurz und oberflächlich auf den Dienst Postfix ein.

Postfix und der zugehörige SMTP-Dienst erfordern auf einem aktuellen Opensuse-System u.a. eine Konfigurationsdatei “/etc/sasl2/smtp.conf“.

c-serv:/etc/sasl2 # cat smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login
c-serv:/etc/sasl2 #

Die obigen Zeilen sagen nur, wie sasl benutzt wird – nämlich über saslauthd .

Im Fall des Postfix-Service sind auch SASL-bezogene Zeilen in der “/etc/main.cf”
erforderlich. Z.B. (neben vielen anderen Optionen) :

Ausschnitt aus der /etc/main.cf:

# Auth-Mechanism for clients of the local SMTP-Server
# ———————–
——————————-
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = cyrus
# Postfix > 2.3
smtpd_sasl_path = smtpd
broken_sasl_auth_clients = yes
#
# Local SMTP server as a client for Relay servers
# ————————————————
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps =
smtp_sasl_security_options = noanonymous

Postfix sucht unter neueren Opensuse-Systemen die SASL-Konfiguration für SMTP-Authentifizierung automatisch unter “/etc/sasl2/smtp.conf“. Wie man das explizit beeinflussen kann, erläutert für verschiedene Postfix-Versionen u.a. der folgende Artikel:
http://www.postfix.org/SASL_README.html

Dass “saslauthd” wiederum PAM als Backend auch für Postfix benutzt, wird – wie bereits gesagt – über die Startoptionen von “saslauthd” geregelt.

Ausblick

Host-spezifische Beschränkungen
Die oben beschriebene Konfiguration resultiert darin, dass sich jeder User, für den es einen LDAP-Eintrag gibt, auf dem Host, auf dem die obige SSSD-Konfiguration vorgenommen wurde, einloggen darf. In einer ausgefeilteren Netzwerk-Umgebung soll sich aber natürlich nicht jeder User, der auf dem LDAP-System registriert ist, auch auf jedem Host des Netzes einloggen oder dessen Dienste nutzen dürfen. Dann muss man mehr Aufwand in die Konfiguration sowohl des LDAP-Server-Baums als auch in die Konfiguration der Hosts und ihrer Services investieren.

Wie man einen normalen Login-Prozess auf einem Host unterbindet, aber dennoch SASL, PAM, SSSD und LDAP für eine Authentifizierung zur Benutzung eines Services nutzen kann, stelle ich beispielhaft in einem kommenden Artikel dar. Siehe:
SASL mit PAM, SSSD, LDAP unter Opensuse – II

Wie man zusätzlich user- und server-bezogene Zugangsberechtigungen auf einfache Weise im LDAP-System hinterlegen kann, habe ich ursprünglich mal unter
Opensuse 12.1 – LDAP V
besprochen. Beide dort besprochenen Verfahren eignen sich im Prinzip auch für eine Kombination mit SSSD. Stichworte sind Filter bzw. Attribut-Untersuchungen, die sich über Einträge “ldap_access_filter“, “ldap_access_provider” und “ldap_access_order” in der “sssd.conf” einstellen lassen. Auch hierauf gehe ich kurz im Beitrag “SASL mit PAM, SSSD, LDAP unter Opensuse – II” ein.

Neugierigen sei ferner folgender Link empfohlen; der zugehörige Artikel gibt schon die wichtigsten Hinweise:
https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/config-sssd-domain-access.html

Viel Spaß nun beim Einsatz von PAM, SSSD und LDAP im eigenen Netz!

Bye, bye Open-Xchange

Habe vor kurzem ein laufendes Opensuse 12.3-System auf Opensuse 13.1 upgegradet. Das ging bis auf einige Schwierigkeiten mit der neuen Apache 2.4 Version relativ problemfrei – nur ein lokaler Open-Xchange 6.22 Server hat das nicht überlebt. Na ja, ganz stimmt das so nicht – eigentlich überlebte nur das vom Server bereitgestellte Web-Interface nicht. Aus welchen Gründen auch immer – das für OX6 reservierte Verzeichnis im Bereich “/srv/www/htdocs” war nach dem Update und einem Neustart von OX6 von allen relevanten Dateien befreit, obwohl die Verzeichnisstruktur erhalten geblieben war.

Ich konnte den ursprünglichen Zustand aus Backups zwar wieder restaurieren. Da das Problem mit Open-Xchange und Opensuse-Upgrades aber nicht zum ersten Mal aufetreten, freunde ich mich gerade mit dem Gedanken an, ganz auf diese Groupware-Lösung zu verzichten. Das hat neben der Anfälligkeit gegenüber System-Updates noch mehrere andere Gründe:

Grund 1: Keine Lizenz-Variante für SLES unter 25 User
Ich habe nicht vergessen, wie uneinsichtig sich OX bzgl. eines Upgrades von einer 5-User-Lösung unter SLES beim Wechsel von OX 5 auf OX 6 zeigte. Damals bekam ich klar Bescheid, dass ich entweder auf einen UC-Server umsteigen oder eben eine 25 User-Lizenz erwerben müsse. Dabei war mir der Umstieg auf eine 5-User-Lizenz von einer ursprünglichen 25 User umfassenden SLOX-Lösung von OX selbst empfohlen worden. OK, die Botschaft kam an – OX wollte ab den ersten Erfolgen mit 1&1 offenbar nur noch hinreichend große Kunden haben und entsprechend Geld verdienen. Das auch kleine Unternehmen einen SLES oder RHEL einsetzen, war den Strategen in den USA wohl egal. Als Konsequenz habe ich mit der Community-Version von OX6 dann sehr gut ein paar Jahre unter Opensuse und ohne jede Lizenzgebühr gelebt. Jetzt ist auch damit Schluss.

Grund 2: Verschwindender Support für die Community Edition
Wie wenig die Community Edition noch Bedeutung hat, kann man auch dem Inhalt und Aufbau der aktuellen OX-Website entnehmen. Eine spezielle Seite für die CE gibt es nicht mehr. Die Anzahl der CE-Forenbeiträge pro Zeiteinheit wird auch immer dünner. Am schlimmsten ist aber der aus meiner Sicht katastrophale Zustand der OX-Repositories für Opensuse. Dafür scheint sich wirklich niemand mehr zu interessieren.

Grund 3: Ausrichtung auf soziale Medien und weiter zunehmende Kommerzialisierung
Mir passt die zum Programm erhobene Ausrichtung von OX ≥ V7 auf die sogenannten “sozialen” Medien nicht. Das hat aus meiner Sicht in einer Firmen-Groupware schon aus Sicherheitsgründen wenig bis gar nichts zu suchen. Nicht alles, was populär ist und dem Kommerz – speziell von SaaS-Anbietern – dient, ist auch gut.

Grund 4: Unübersichtliches Backend
Technisch wirkt auch das Java/OSGI-Backend-Konstrukt zunehmend zu komplex bis unübersichtlich, um damit weiter in einer nicht kommerziellen Server-Umgebung herumzudoktern. Ich verstehe, dass man hochgradig skalierbare Lösungen für den Einsatz in großen Unternehmen und speziell für SaaS benötigt. Aber irgendwie wirkt der Einsatz einer vollen Java-Architektur wie ein Overkill für die Ansprüche kleiner, mittelständischer Firmen an eine Groupware.

Grund 5: Einarbeitungszeit
Die Zeit, die man typischerweise in eine funktionierende Installation unter Opensuse 12.3 für die 7-er Version des Open-Xchange-Servers stecken muss, ist nach meinem Gefühl genauso groß wie die, sich in Alternativen einzuarbeiten.

Grund 6: Fehlende Replikationsmöglichkeiten
Meine erste eingesetzte Groupware war Lotus Notes 5/6 unter Linux. Ein Riesenvorteil von Lotus war die Server-Replikationsfähigkeit. Etwas Entsprechendes habe ich bei Open-Xchange immer vermisst.

Vor kurzem ist Opensuse 13.1 erschienen. Diese soll einen deutlich längeren Support erhalten als andere Opensuse-Versionen. Ein Umstieg auf eine neue opensource-basierte
Groupware-Lösung, die unter OS 13.1 funktioniert, erscheint mir daher als ein vernünftiger Schritt.

Was werde ich an OX vermissen ? Vielleicht Info-Store, vielleicht auch das gut organisierte Web-Interface …. aber bzgl. der Organization und Versionierung von wichtigen Dokumenten setzen wir seit ca. einem Jahr mit gutem Erfolg SVN und ein Wiki ein. Und als Groupware-Interface haben wir meist Kontact und nicht das Web-Interface benutzt ….. Und Ajax können auch andere Groupware-Hersteller ….

Vermissen werde ich vielleicht auch die kritischen Kommentare vom aktuellen OX CEO Rafael Laguna zur zunehmenden Kontrolle des Internets – durch staatliche Institutionen, aber nicht zuletzt auch durch und mit Hilfe der zugehörigen großen Monopol-Firmen des Internets ….. Wie schreibt er so schön:

“Before you blame the government for the filthy roads, clean your own yard! ”

Stimmt ! Aber warum sollte ausgerechnet eine Firma, die ihre Entwicklungskapazitäten zunehmend genau an den Vorgaben der kritisierten Giganten ausgerichtet hat und vor allem große und landesweit bis länderübergreifende SaaS-Partner umwirbt, besonders glaubwürdig dafür sein, die Rechte und Interessen der am meisten betroffenen normalen Nutzer und kleiner Firmen zu vertreten ?

MariaDB, LibreOffice 4.x, Konnektoren – Performance Problem wg. Primary Keys

Vor einigen Tagen habe ich für ein Projekt verschiedene Varianten des direkten Zugriffs von Office-Anwendungen (MS Office, Libreoffice unter Windows und Linux) auf MariaDB -(MySQL-) Datenbanken eines Remote Linux-Server getestet. Dabei habe ich mir für LibreOffice [LO] unterschiedliche Konnektoren für den Datenbankzugriff angesehen – JDBC, ODBC und den direkten, nativen Zugriff über einen MySQL-Konnektor. Letzterer wird unter Opensuse -Linux mit dem LibreOffice RPMs mitgeliefert. Unter Windows steht der Konnektor dagegen als LO-“oxt”-Extension zur Verfügung. Siehe:
http://extensions.libreoffice.org/extension-center/mysql-native-connector-for-libreoffice-4.x/releases/1.0

Bei den Performance-Tests hatte ich dann ein Erlebnis der Sonderklasse, das sicher auch andere interessieren dürfte.

Testvoraussetzungen

Libreoffice habe ich mir in der Version 3.6, der Version 4.0.3 aus dem aktuellen LO Stable Repository des Build Services von Opensuse (12.3) unter Linux angesehen. Unter Windows die Versionen 3.6.7 und 4.0.6. Die Clients (Opensuse 12.3) und Windows 7 unter VMware liefen auf ein und demselben System mit einem i7 Quad 950 Prozessor und Raid-10-System. Der Server ist ein von Strato gehosteter V-Server mit 100Mbit -Anbindung ans Internet und 32Bit Opensue 12.3. Als RDBMS wurde eine MariaDB installiert, die bei Opensuse ja die Nachfolge des MySQL-RDBMS von Oracle angetreten hat.

Die Performance des Serversystems ist hinreichend – wir führen dort Simulationsrechnungen für industrielle Prozess- and Supply Chain Netze mit mehreren Zig-Tausend Knotenpunkten und mehreren zig-tausend Datenbanktransaktionen in wenigen Sekunden durch. Für das bisschen Transfer von Tabelleneinträgen im Bereich von 100 KByte bis zu wenigen MByte zu einem Client reicht die Serveranbindung völlig.

Alle Tests wurden mit SSH-Tunnelverbindungen zum Server durchgeführt. Wie man solche Verbindungen absichert, ist in einem vorhergehenden Artikel
https://linux-blog.anracom.com/2013/11/22/ssh-getunnelter-datenbankzugang-fur-gehostete-lamp-server-i/
ausführlich erläutert. Unter Windows wurden diese Verbindungen über PuTTY realisiert.

Die konkret untersuchten Tabellen hatten zwischen 200 und 220.000 Einträgen. Es handelte sich durchweg um MyISAM- und nicht um InnoDB-Tabellen.

Das Laden einer Datenbanktabelle erfolgt unter LibreOffice so, dass man über BASE Datenbankverbindungen zum RDBMS eines Remote-Servers definiert. Unter CALC läst man sich dann die definierten Datenquellen anzeigen (Taste F4), wählt eine Bank und eine zugehörige Tabelle aus. Deren Werte werden dann in einem besonderen oberen Bereich des CALC-Fensters zunächst als Base-Tabelle dargestellt, die man auch zum Ändern der DB-Werte verwenden kann. Der CALC-Schirm teil sich durch F4 also in einen oberen Bereich, der an Base angelehnt ist und einen unteren Bereich, der eine normale CALC-Spreadsheet-Tabelle enthält.

Der Import der Daten der DB-Tabelle erfolgt dann durch Drag und Drop der Tabelle aus der mittels F4 angezeigten Base-Tabellen-Liste in den darunter liegenden CALC-Spreadsheet-Bereich. Alternativ wählt man in der Base-Tabellen-Anzeige alle Werte aus, wählt ferner ein Zelle im CALC-Tabellen-Bereich als Startpunkt des Imports aus und betätigt dann eine Taste für den Import.

In der CALC-Spreadsheet-Tabelle wird dann ein mit der Datenbank assoziierter Bereich angelegt, der nach etwas Wartezeit mit den RDBMS-Tabellen-Daten gefüllt wird. Dieser mit der Datenbank verbundene Bereich kann später jederzeit mit den aktuellen Daten des RDBMS-Systems upgedated werden. Details hierzu findet man in der LO-Hilfe.
Ich gehe hierauf in diesem Artikel nicht weiter auf di CALC-Anbindung an ein Remote-RDBMS ein.

Erste Tests: Erhebliche Performance-Unterschiede zu MS Excel ??

Der Schock entstand über einen Befund, den ich erst gar nicht glauben wollte. Nach etlichen Stunden, viel Konfigurationsarbeit und vielen Tests mit Zeitmessungen hatte ich folgendes Ergebnis vor mir:

Das reine Laden großer Datenbanktabellen über einen ODBC-Treiber schien unter Excel viel, viel schneller zu funktionieren als unter dem Gespann LibreOffice/Base/Calc mit direktem SQL-Konnektor.

Ich spreche hier wie gesagt von Tabellen mit 10.000 bis 220.000 Einträgen. [Das ist für die Belange des Kunden nicht besonders viel.] Und “schneller” ist dabei so zu verstehen, dass die Kombination Excel 2010/ODBC unter Windows 7 (64Bit) in den Tests zunächst erheblich – d.h. um Faktoren – schneller lief als jede Connector-Variante (ODBC, Direct MySQL-Connector, JDBC) mit Libreoffice/Calc/Base.

Dabei läuft Win 7 bei mir nur unter VMware. Die Linux-Tests wurden auf demselben nativen Linux-Host durchgeführt, der auch VMware beherbergt.

Ich nenne ein paar Zahlen für Tabellen mit ca. 14 Zahlenspalten (Integer, Double) :

  • Laden/Importieren Tabelle mit 224 Records : ca. 1 Sek.
  • Laden/Importieren Tabelle mit 6000 Records : ca. 8 Sek.
  • Laden/Importieren Tabelle mit 60.000 Records : ca. 95 Sek.
  • Laden/Importieren Tabelle mit 138.000 Records : ca. 4:40 Min.

Updates dieser per Base nach CALC importierten Tabellen dauerten etwa genauso lange. Den Versuch, eine Tabelle mit 250.000 Records zu laden, habe ich nach mehr als 10 Minuten Wartezeit abgebrochen. Ich merke ausdrücklich an, dass diese Zeiten nicht durch die übertragene Datenmenge über eine evtl. schlechte Internetanbindung erklärbar sind. Ferner gilt/galt:

Dem gegenüber stand eine Zahl für das Laden einer Tabelle mit 138.000 Records nach Excel per ODBC Konnektor von nur ca. 6-8 Sekunden.

Ich empfand diese extreme Diskrepanz zu Linux wirklich als unakzeptabel.

Man muss dazu sagen, dass die genannten Zahlen für das Linux-System bereits optimale Werte darstellen. Typischerweise ergaben sich auch sehr seltsame Effekte, wenn man zwischen den Tests die LO-Versionen durch Neuinstallationen der RPMs wechselte und die Konfigurationsdateien des aktuellen Linux-Users nicht komplett löschte. Teils lief dann das Laden auch kleiner Tabellen unter Calc unendlich lang. Ich deute diese Instabilitäten im Zusammenhang mit Up- oder Downgrades der RPMs – auch bei Auflösung aller Abhängigkeiten. Vielleicht ist das ein Hinweis darauf, dass irgendwelche Überbleibsel und Konfigurationseinstellungen nach einer Neuinstallation noch zu Interferenzen führen.

Die oben genannten Werte stellten sich nur ein, wenn man die jeweiligen Konfigurationsverzeichnisse im Home-Verzeichnis des Linux-Users nach einem Up- oder Downgrade vollständig gelöscht hatte. Ich konnte sie ferner nur für die 4.0.x-Version erzielen. Die Zeiten unter der 3.6 Version waren z.T. noch erheblich länger.

Schlechte Performance-Werte auch unter Windows

Der wirklich frustrierende Befund für die Datenanbindung von LO an eine MySQL-Datenbank wurde leider durch nachfolgende Tests für die LO-Versionen 3.6 und 4.1.3 unter Windows voll bestätigt.

Einschränkend sei angefügt, dass die Philosophie dessen, was ein Load/Import von Datenbankdaten leisten muss, vermutlich in Excel etwas anders ist als in LO. Aber beide Systeme verankern Datenbank-Verbindungen – in BASE geschieht dies innerhalb der Applikation, unter Windows werden die ODBC-Verbindungen über die Systemsteuerungen im Betriebssystem hinterlegt.

Excel lädt
und importiert auf den ersten Blick eher passiv; auf der LO-Seite sind dagegen jederzeit Änderungen der DB-Inhalte und nachfolgende Updates aus der Datenbank für spezielle datenbank-assoziierte “Bereiche” von Calc-Tabellen möglich. Dennoch:

Schon beim Hantieren unter LO-BASE fallen die Geschwindigkeitsunterschiede ins Auge: BASE aktualisiert bereits beim Scrollen über große Tabellen die angezeigten Daten laufend im Hintergrund aus der angeschlossenen Datenbank. Ich habe keine Einstellung gefunden, das zu unterbinden. Vielleicht war ich dazu schlicht zu blöd.

Es zeigte sich unter Windows zudem, dass ein ODBC-Konnektor fast die gleichen Zeitwerte für den Datenbank-Import nach CALC lieferte wie die direkte MySQL-Anbindung durch den MySQL-Konnektor. Leider erwies sich die Performance einer JDBC-Anbindung noch deutlich schlechter als die der MySQL- und des ODBC-Konnektoren. Dass mindestens der ODBC-Konnektor aber eigentlich deutlich mehr leisten kann, beweisen gerade die hervorragenden Ladezeiten für Excel.

Performance-Problem des MySQL-Konnektors wegen Primary Keys?!

Die Frustration spornte mich zu weiteren Experimenten an. Ganz zufällig stieß ich dann bei weiteren Test unter Linux auf ein Tabelle mit 78.000 Einträgen. Überraschenderweise galt für diese Tabelle: Statt Minuten warten zu müssen, konnte ich die Tabellen-Daten in ca. 4-5 Sekunden über BASE/CALC in ein Calc-Spreadsheet laden.

Bei der weiteren Analyse stellte sich dann heraus, dass ich vergessen hatte, für diese Tabelle einen expliziten Primary Key festzulegen. Das führte zu dem Verdacht, dass explizit definierte Primary Keys evtl. mit verantwortlich für die schlechte Performance der LibreOffice-Anbindung waren – so idiotisch sich das auch anhören mag ….

Lösung: Ersetze Primary Keys durch Unique Keys !

Natürlich habe ich dann mal testweise auch in anderen Tabellen die explizit definierten PRIMARY Keys gedropt und durch schlichte UNIQUE-Keys ersetzt. Ja, das geht: MySQL oder Maria DB nehmen laut Doku stillschweigend den ersten passenden UNIQUE Key und setzen ihn als Primary Key ein. Große Probleme habe ich diesbzgl. bislang nicht erlebt.
Ergebnis meiner Versuche war:

Bei allen Tabellen, in denen der explizit gesetzte Primary Key durch einen reinen Unique Key ersetzt wurde, erfolgte der Daten-Import in LibreOffice-CALC mit annehmbaren Zeiten, die sich von denen von Excel nur noch wenig unterschieden (Faktor < 1,25).

Dabei ergab sich durch gleichzeitiges Beobachten der Datenbank und der Netzverbindung der begründete Eindruck, dass CALC nach dem eigentlichen Laden der Daten aus dem RDBMS noch erhebliche Zeit für den internen Aufbau der CALC-Tabelle aufwendet. Nurmehr Letzteres und nicht mehr das Laden der Daten aus der Bank selbst erwies sich für die vom Primary Index befreiten Tabellen als verantwortlich für die noch feststellbaren Zeit-Unterschiede gegenüber Excel beim Füllen der lokalen Spread-Sheet-Tabellen.

Konkret ergab sich für das Laden der Tabelle mit 138.000 Records eine Zeit von knapp unter 8 Sekunden – anstatt der früheren fast 5 Minuten.

In unserem Projekt habe ich nun in allen RDBMS-Tabellen explizit definierte Primary Keys durch Unique Keys ersetzt. Seitdem können die Anwender auch mit CALC prima auf der MariaDB-Datenbank arbeiten.

Offene Frage : Wieso behindern Primary Keys die LibreOffice Performance so drastisch?

Ich habe leider keine plausible Antwort. Diese Frage müssen die Entwickler der MariaDB klären. Auffällig ist die dauerhaft hohe Transaktionsrate auf dem Server von insgesamt über 200 Transaktion /sec, wenn ein Primary Key vorhanden ist.

Ich sollte abschließend noch betonen, dass ich den positiven
Befund für das Entfernen der Primary keys explizit nur für eine MariaDB getestet habe. Es wäre sicher interessant, das Performance-Verhalten auch unter einer nativen Oracle-MySQL-Datenbank zu untersuchen. Hierfür habe ich leider noch nicht genügend Zeit gefunden.