Opensuse: Upgrade von 11.4 auf 12.1

Dieser Artikel kommt um fast ein Jahr zu spät und ist eigentlich völlig veraltet. Ich habe über Monate hinweg schlichtweg vergessen, ihn zu veröffentlichen.

Ich mache dies nun aber trotzdem, weil er eigentlich einen guten Auftakt für kommende Artikel über die Installation des aktuellen “Opensuse 12.2” darstellt. Man kann dann schön vergleichen, wie sich die Dinge entwickelt haben. Ich verwende den originalen Wortlaut des Artikelentwurfs zu “Opensuse 12.1-Upgrades” aus dem Dezember letzten Jahres.

Erfahrungen beim Upgrade von Opensuse 11.4 auf 12.1 aus dem Dezember 2011

Anfang Dezember 2011 habe ich ein Upgrade eines meiner Arbeitsplatzsysteme von Opensuse 11.4 auf Opensuse 12.1 durchgeführt. Dies erwies sich als nicht unproblematisch; zunächst ging nämlich gar nichts mehr. Eine parallel durchgeführte reine Neu-Installation auf einer anderen Partition verlief nach Startschwierigkeiten dagegen besser.

Es kostete mich erhebliche Mühe, meine ursprünglichen 11.4-System unter 12.1 wieder zum Laufen zu bewegen. Hauptgrund war sicher die Umstellung des System-Startups von “System Init V” auf “systemd”:

Die automatische Umstellung durch das Upgrade-Programm von SuSE hat bei mir nicht sauber funktioniert und zu einem Quasistillstand des Systems während des Boot-Vorgangs geführt. Ursächlich waren vor allem Probleme mit dem Hochfahren des Netzwerks. Nach dem Upgrade ließ sich das System letztlich nur durch Deaktivieren von “systemd” in einen nutzbaren Zustand bewegen. In dem läuft es nach einigen Eingriffen nun aber völlig zufriedenstellend.

Nach meinen Erfahrungen würde ich aber jedem raten, 12.1 zunächst auf einer separaten Partition des Systems zu installieren und kein Upgrade auszuführen. Will man künftig mit “systemd” booten, ist es womöglich einfacher, die alte 11.4-Installation zu behalten, eine separate 12.1-Neuinstallation durchzuführen und sich dann systematisch ein neues System unter 12.1 aufzubauen.

Führt man dennoch ein Upgrade einer 11.4-Installation durch sollte man den Boot-Vorgang auf “sysvinit” umzustellen. Freundlicherweise hat SuSE in den Grub-Start-Screen eine Option zur Umstellung des Bootvorgangs eingebaut: Mit “F5” kann man die alte Bootvariante auswählen. Für eine dauerhafte Umstellung siehe den letzten Punkt dieses Artikels weiter unten.

Insgesamt mögen die aufgetretenen Probleme mit der relativen Komplexität meiner Arbeitsplatz-PCs zu tun gehabt haben. Dort laufen für Entwicklungsarbeiten und lokale Tests diverse Serverkomponenten mit – u.a. Apache2, Tomcat, MySQL, Samba, NFS, Open-LDAP, sowie ein OX6-Testserver. Hinzu kommen Dinge wie mehrere VMware Workstation-Instanzen, 2 Netzwerkkarten, ein Raid-System mit LVM-Partitionen, etc..

Der Vollständigkeit halber sei auch angemerkt, dass meine System Nvidia-Grafikkarten (9800GTX, Nvidia GTX 460, Nvidia GTX 560) hat. Die lassen sich aber mit Nvidias proprietären Treiber letztlich problemfrei zum Einsatz bringen (s.u.).

Wenn man denn so weit kommt ….

Nachfolgend also ein paar Hinweise zu Problemen, die während Upgrades von Opensuse 11.4-Systemen auftraten und evtl. auch für andere nützlich sind:

Probleme mit Grub 0.97 und großen Plattensystemen < 2 TB

Auf manchen meiner Systeme finden sich Raid-Arrays mit 2 TB Nettoplatz an einem 3ware-Raidcontroller 9650-SE-4LPML (Raid 10).

Auf dem System gibt es unterhalb der 1.5 TB-Grenze eine Vielzahl von regulären Sub-Partitionen einer erweiterten Partitionen sowie einen größeren LVM-Bereich. Nun habe ich versucht jenseits von 1,5 TB eine neue logische Partition für eine unabhängige Opensuse 12.1 Installation anzulegen. Das ging ohne Probleme; auch die Opensuse 12.1-Installation lief bis fast zum Schluß
erfolgreich durch.

Was dann jedoch nicht mehr funktionierte, war das abschließende Schreiben des Grub-Bootloaders. Nun weiss man ja, dass die von SuSE verwendete 0.97er-Version vom Grub Probleme mit dem Booten von LVM-Partitionen hat. Meine Partition lag aber außerhalb, genauer jenseits eines definierten LVM-Bereichs und jenseits von 1.5 TB. Dennoch quittierte Grub die Installationsversuche mit einem

Error 25: Disk Read Error

Weitere detaillierte Fehlermeldungen zeigen, dass die Grub-Installation die eben bespielte Partition auf der Platte nicht identifizieren kann.

Wählte ich dagegen eine Partition vor dem LVM-Bereich bei ca. 1.1 TByte als Installationsort, ging das Schreiben des Bootloaders anstandslos durch.

Das ganze Problem hat daher sicher nichts mit dem bekannten (alten) 128 GB Limit zu tun – mein PC ist dafür auch viel zu neu. Entweder hat das Legacy Grub, das bei Opensuse eingesetzt wird, Probleme mit Partitionen jenseits eines LVM-Bereichs auf dem Disk Array, oder aber es gibt oberhalb von 1.2 TB irgendeine weitere Grenze, ab der Adressierungsprobleme auftreten. Oder aber es gibt irgendwelche Probleme mit dem 3ware-Treiber …. Siehe auch:

http://forums.opensuse.org/english/get-technical-help-here/install-boot-login/468058-grub-error-25-during-installation-3.html
http://www.fedoraforum.de/viewtopic.php?f=4&t=21695
http://wiki.ubuntuusers.de/GRUB
http://askubuntu.com/questions/60273/2tb-harddrive-with-lvm-grub-error

Fazit zu diesem Punkt: Bei Partitionierung großer Platten zur Sicherheit immer eine Partition unterhalb von 1.5 TB oder aber eines LVM-Bereich für Neuinstallationen freihalten.

Probleme bei einer Neuinstallation mit Grub und großen Plattensystemen > 2 TB

Auf einigen Systemen habe ich Platten im Raid 10-Verbund mit Netto mehr als 3 GB-Plattenplatz. Hier muss GPT zum Einsatz kommen. Dies erledigt der Opensuse-Partitionierer seit Opensuse 11.4 auch relativ problemfrei.

Aber:
Je nach EFI oder BIOS des PCs oder aber bei vorgesehenen NTFS-Partitionen erstellt der Opensuse-Partitionierer einen “Hybrid-MBR”. Siehe hierzu:

http://www.rodsbooks.com/gdisk/hybrid.html.

Grub (z.T. aber auch best. Versionen von Grub2) erlauben dann ggf. keinen Boot-Vorgang von Partitionen mehr, die jenseits der ersten 3 Partitionen liegen. Das sollte man bei der Neuinstallation eines Opensuse 12.1-Systems in einer separaten Partition von vornherein bedenken – wenn auf dem System vorher bereits Opensuse 11.4 und/oder gar MS Windows in weiteren Partitionen installiert worden waren.

Herunterladen eines aktuellen Nvidia-Treibers als Vorsichtsmaßnahme

Beim Upgrade wird eine neuer Kernel installiert. Dies bedeutet, dass man evtl. vorhandene proprietäre Nvidia-Treiber neu kompilieren lassen muss. Es lohnt sich daher, im Vorfeld des Upgrades sich einen aktuellen Treiber-Installer von der Nvidia-Webseite herunterzuladen und an einem geeigneten Ort zu speichern. (Ich habe für solche Dinge immer eine separate Partition, de ich mir in das jeweilige System mounte.)

Für mein aktuelles System kann ich jedenfalls bestätigen, dass man den Treiber mit der Versionsnummer 290.10 mit einer Nvidia GTX 460 letztlich anstandslos zum Laufen bringt und dass unter KDE 4.7.4 keine Probleme auftreten. Zur konkreten Installation siehe den enstprechenden Punkt weiter
unten.

Große Schwierigkeiten werden jedoch alle bekommen, die auf einen 3D-Treiber für eine Geforce FX 5xxx angewiesen sind. Ich habe nämlich parallel versucht, einen Dell 8600C Laptop mit einer Geforce Go 5200 mit Opensuse 12.1 zu bestücken. Leider musste ich hier nach vielen Anläufen auf 3D-Desktop-Effekte, Compositing und 3D-Beschleunigung verzichten.

Der von Nvidia vorgesehene Treiber 173.14.31 funktioniert nämlich nicht mit der aktuellen Kombination aus KDE 4.7, QT-Bibliotheken und dem Polkit, das Opensuse 12.1 installiert. Zumindest nicht mit 3D-Beschleunigung und zugehörigem Compositing für KDE.

Das liegt weniger an Opensuse 12.1 als vielmehr an irgendeiner Inkompatibilität zwischen den aktuellen Qt-Bibliotheken, KDE 4.7 und dem Treiber. Das Ganze funktioniert nämlich schon ab KDE 4.6.5 unter Opensuse 11.4 nicht. Bereits unter Opensuse 11.4 mußte man für solche Installationen das Compositing von vornherein abschalten. Hierzu gibt es gehäuft Artikel in diversen Foren – nicht nur bei Suse.

http://forums.opensuse.org/english/get-technical-help-here/install-boot-login/469160-nvidia-geforce-5200-fx-not-working-no-driver-errors-seen.html
http://forums.opensuse.org/english/get-technical-help-here/install-boot-login/469962-black-screen-after-reboot-opensuse-12-1-a.html
http://forums.opensuse.org/english/get-technical-help-here/install-boot-login/468146-nvidia-drivers-hangs-opensuse-12-1-a.html

http://www.opensuse-forum.de/nvidia-treiber-problem-bildschirm-zerrupft-opensuse-installation/allgemeines-f17/t6243-f19/
http://www.opensuse-forum.de/blackouts-auf-dem-bildschirm-hardware-treiber/themen-f9/t5867-f11/
https://bugzilla.novell.com/show_bug.cgi?id=707110

http://newsodrome.com/hardware_news/nvidia-geforce-5200-fx-not-working-no-driver-errors-seen-28476333

http://www.adminscode.com/ubuntu-nvidia-geforce-5200-fx-drivers-messed-up-system.html

http://permalink.gmane.org/gmane.linux.suse.general.german/210818

Bislang sah sich aber wohl noch niemand genötigt, den Treiber für die FX 5xxxx Karten zu verbessern.

Probleme nach dem Upgrade auf 12.1 und dem Aufruf des neuen Kernels über “kexec”

Während des Upgrades von Opensuse 11.4 werden etliche zusätzliche Repositories, die ich für Opensuse 11.4 in die Yast-RPM-Verwaltung integriert hatte, abgehängt, wenn man nicht entsprechende Vorkehrungen trifft. Einige Pakete können dann ggf. nicht upgedatet werden. In meinem Fall war das aber nichts Essentielles.

Die erste Stufe des Upgrades lief auf vielen meiner Systeme daher entsprechend anstandslos durch – allerdings nur bis zum Neustart des Systems. Hierbei wird der neue Kernel quasi im laufenden Betrieb mittels “kexec” geladen. Das führte bei mir auf den meisten Systemen noch zur Meldung

“Shutting down Name Service Cache
Daemon”.

Danach kam es jedoch meist zum Stillstand des neu installierten Systems über mindestens 10 Minuten hinweg.

Ein erzungener Warmstart brachte mich dann wieder ins Grub-Menü. Hier erwies sich ein 12.1 Systemstart in der Failsafe-Variante mit einem zusätzlichen Systemstart ohne (!) systemd – also gemäß der alten System V Initialisierungsmethode – als segensreich. Das System lief dann (bis auf Postfix; s.u.) anstandslos hoch.

Danach habe ich zur Sicherheit für den nächsten Restart einen Check der Root-Partition erzwungen und den nächsten Bootvorgang mit der regulären 12.1-Variante – nun aber mit der alten Boot-Variante gemäß “sysvinit” und ohne systemd – herbeigeführt. Das ging denn auch problemfrei. Auch der von Suse standardmäßig installierte Nouveau-Treiber tat das, wozu er im Stande ist – und das ist deutlich weniger als der proprietäre Treiber.

Aber über Letzteres will ich nicht klagen; vielmehr bin ich froh, dass jemand versucht, einen freien Treiber zu entwickeln.

Installation des propritären Nvidia-Treibers

Nichtsdestoweniger will ich auf den proprietären Treiber nicht verzichten. Zur Installation sind folgende Schritte erforderlich:

Als erstes muss man das Laden von KMS beim Bootvorgang verhindern. Dies geht am schnellsten mittels des sysconfig-Editors von Yast. Man öffnet

YaST >> “etc/sysconfig”-Editor >> System >> Kernel

und setzt dort den Parameter

NO_KMS_IN_INITRD auf “Yes”

und – soweit vorhanden – den Parameter KMS_IN_INITRD auf “No”.

Danach ergänzt man zur Sicherheit den Eintrag für den Bootloader in “/boot/grub/menu.lst” um den Parameter “nomodeset”; in meinem Fall sieht der entsprechende Abscnhitt für Opensuse 12.1 dann so aus:

title openSUSE 12.1 – 3.1.0-1.2 (default)
 
root (hd0,5)
 
kernel /boot/vmlinuz-3.1.0-1.2-default root=/dev/disk/by-id/scsi-3600050e07e68a3005c9100008aa70000-part6 resume=/dev/disk/by-id/scsi-3600050e07e68a3005c9100008aa70000-part5 splash=silent quiet acpi_enforce_resources=lax showopts nomodeset vga=0x346
 
initrd /boot/initrd-3.1.0-1.2-default

Nach dem Reboot zeigt ein “lsmod | grep nouveau” aber, dass erneut der “nouveau”-Treiber geladen worden war. Dies war nach der Deaktivierung von KMS etwas überraschend. Ich habe die Einstellungen erneut mit dem sysconfig-Editor geprüft. Auch “/sbin/mkinitrd” wurde am Ende der Einstellungen im sysconfig-Editor korrekt aufgerufen. Dennoch wird also der Nouveau-Treiber geladen. Diese Ungereimtheiten kannte ich schon von Opensuse 11.4; siehe auch:

http://www.linuxforen.de/forums/archive/index.php/t-269600.html
und
http://de.opensuse.org/SDB:Probleml%C3%B6sungen-Grafiktreiber

Aus meiner Sicht reicht das Abstellen von KMS nicht; man muss den “nouveau”-Treiber zusätzlich “blacklisten”. Dafür gibt es mehrere Möglichkeiten – man findet einige in den Beiträgen unter folgendem Link :

http://www.linuxforen.de/forums/showthread.php?t=269600

Man kann das “Blackliste” aber auch der aktuellen Nvidia-Installationsroutine für den proprietären Treiber überlassen. Die setzt nämlich bei entdecktem “Nouveau”-Treiber auf Rückfrage beim User ebenfalls einen Blacklisting-Eintrag.

Nun zur eigentlichen Installation des Nvidia-Kernel-Moduls :

Die erste Frage, die sich stellt, ist: Welche Treiberversion ist für Opensuse 12.1 eigentlich Voraussetzung?

Hier ist darauf hinzuweisen, dass mit dem 3.1.0-Kernel von Opensuse 12.1 für neuere Grafikkarten nur
proprietäre Nvidia-Treiber ab der Version 290 kompatibel sind. Man lädt sich einen entsprechenden aktuellen Treiber aus dem Netz herunter (soweit man sein System nach evtl. Problemen mit systemd überhaupt netzwerkfähig bekommen hat; s.o.).

Ich boote danach zur Installation des Nvidia-Treibers in jedem Fall mal mit dem alten sysvinit – nur da ist ja der Runlevel 3 eindeutig definiert und sicher kein X-Server gestartet. (Ich rechne nicht damit, dass Nvidia seine Treiber bereits auf Eventualitäten von “systemd”-Installationen umgestellt hat). Dann testet man im Runlevel 3 mal mit

sh NVIDIA-Linux-x86_64-290.10.run

ob eine Installation möglich ist. In meinem Fall natürlich nicht, da der Nouveau-Treiber ja noch geladen ist! Den Vorschlag des Nvidia-Installers, einen entsprechend notwendigen Eintrag in Startup-Dateien vorzunehmen (Blacklisting des nouveau-Moduls), bestätige ich. Dann starte ich das System neu – nun auch noch zusätzlich mit dem Parameter “nomodeset”, also

linux 3 nomodeset init=/sbin/sysvinit

Danach probiere ich die Nvidia-Installation nochmals. Das funktioniert nun, der Nouveau-Treiber wird nicht mehr geladen. Ggf. zeigt der Nvidia-Installer während des Installationsvorgangs eine Warnmeldung wegen eines Symbolic-Links. Dies passiert oft, wenn zuvor ein anderer Nvidia-Treiber – aus einer anderen Quelle – geladen war. Der Nvidia-installer korrigiert selbständig den bemängelten Link. Dann ggf. zur Sicherheit die Treiber-Installation nochmals durchführen. Die Warnmeldung sollte dabei nicht mehr auftauchen.

Auf meinem System musste ich nach Abschluß des Nvidias-Installers das Modul “nvidia.ko” übrigens per

modprobe nvidia

selbst laden. Der 290-Installer hatte mit einem Laden während der Installation Probleme – und zwar auf mehreren Systemen – auch mit anderen Grakas. Das “modprobe”-Kommando läuft dann aber (interessanterweise) dennoch ohne Probleme.

Ein abschließendes “init 5” befördert uns schließlich vom Runlevel 3 in den Runlevel 5 – und dort wie erwartet endlich in den grafischen Login-Screen von kdm. Auch der nächste Reboot sowohl mit

nomodeset init=/sbin/sysvinit [>>> konventioneller System V Start]

als auch

nomodeset [>>> systemd – Start]

als Parametern läuft dann fehlerfrei bis auf den Runlevel 5 durch.

SSH- und Postfix-Probleme nach Deaktivierung von IPV6

Man sollte beim Einstellen der Netzwerkparameter im ersten Anlauf IPV6 nicht deaktivieren. Dies wäre unter

“Yast >> Netzwerkeinstellungen” im Bereich “Globale Optionen”

grundsätzlich möglich. Man läuft sonst in Schwierigkeiten beim Einsatz von “ssh -X” von Remotesystemen aus. Ferner entsteht ein kleines Problem bei Postfix, dass sich ggf. nicht mehr ordnungsgemäß starten läßt.

Zur Lösung des ssh/sshd-Problems siehe einen früheren Blog-Beitrag :

https://linux-blog.anracom.com/2012/01/03/opensuse-114121-problem-mit-ssh-x/

Dort wird auch einen Fehlermeldung beim Starten des “sshd”-Daemons bzgl. eines nicht gesetzten bzw. nicht ladbaren “DSA keys” behandelt.

Zum Postfix-Problem bei deaktiviertem IPV6 siehe dagegen die Kommentare unter

http://www.linux-club.de/viewtopic.php?f=5&t=114733

Probleme mit Pulseaudio

Ich hatte und habe immer wieder Schwierigkeiten mit Pulseaudio. Das Zeug taugt irgendwie nichts. Auf einem System mit einer unter Opensuse 11.4 voll funktionsfähigen Audigy
Platinum verweigerte der Sound nach dem Upgrade zu opensuse 12.1 den Dienst – und das völlig inklusive Mixer. Folgende Schritte halfen:

Pulse-Audio deinstallieren   >>   Soundkarte Audigy per Yast neu installieren   >>   alsasound neu starten   >>   aus KDE abmelden   >>   neu einloggen   >>   KMix funktioniert wieder   >>   als Sound-Backend über die KDE “system-settings” entweder “gstreamer” oder “xine”

Probleme mit LSI / 3ware 3DM2

Unter Opensuse 12.1 funktionierte nach dem Upgrade das graphische Tool “3DM2” von LSI / 3ware zur Administration von “3ware”-Raid-Controllern nicht mehr. Genauer muss man sagen: die Version 9.5.3 funktioniert nicht.

Ein Download einer neueren 9.5.4-Version von der Adresse
http://www.lsi.com/downloads/Public/SATA/SATA%20Common%20Files/3DM2_CLI-Linux_10.2.1_9.5.4.zip
sowie eine anschließende Installation über die Shell behoben das das Problem. Danach konnte man wieder auf den Controller zugreifen und den Status der Raid-Units wie Platten verfolgen. Auch unter Firefox 8.

VMware Workstation 7 funktioniert nicht

VMware in den Subversionen 7.X und auch 8.0 funktionierte bei mir unter Opensuse 12.1 überhaupt nicht mehr. Ein Upgrade auf die Version 8.1 löste die Probleme aber.

Dauerhafte Deaktivierung von systemd

Will man wegen permanenter Probleme mit systemd eine dauerhafte Rückkehr zu sysvinit vornehmen, so ist dies unter Opensuse 12.1 mittels einer Installation des Paketes “sysvinit-init” möglich. Man lese hierzu:

http://www.suse.com/releasenotes/i386/openSUSE/12.1/RELEASE-NOTES.en.html

Ob man eine Rückkehr zum alten “sysvinit” auf Dauer wird durchhalten können, steht auf einem anderen Blatt. Zur Zeit häufen sich bei mir Probleme mit shutdowns.

Kmail 4.9 – Datenverlust durch Spamfilterung

Bin letzte Woche unter Opensuse 12.1 auf KDE 4.9 umgestiegen, was mir generell ganz gut gefällt. Besonderes Augenmerk habe ich jedoch wieder mal auf KMail im Zusammenspiel mit IMAP-Servern und (OX-) Adressbüchern gelegt.

Hierzu erste Eindrücke:

Zuerst das Positive:

Mit etwas Mühe und viel Geduld kann man Kmail 4.9 im Gegensatz zu Kmail 4.8.2 – 4.8.4 x nun sogar davon überzeugen, dass die automatische Adress-Suche und -Vervollständigung beim Erstellen neuer Mails halbwegs funktioniert. (Als Linux Fan einen solchen Satz schreiben zu müssen, ist eigentlich peinlich!) Zur “address autocompletion” etwas mehr in einem späteren, separaten Beitrag.

An die Mängel bei der Adress-Autocompletion hatte man sich als Anwender ja schon seit einiger Zeit gewöhnt (siehe https://bugs.kde.org/show_bug.cgi?id=259949 ). Damit und zugehörigen Workarounds kann man leben

Nun aber das Negative:

Der Suchdialog funktioniert nach wie vor nicht:
Der Kmail-Suchdialog zum Suchen von Mails ist nach wie vor nicht benutzbar. Bei mir werden nun gar keine Treffer mehr angezeigt. Das ist fast besser als das, was früher am Schirm erschien. Also: Das Einzige, was bzgl. der Suche von Mails wirklich funktioniert, ist unter Kmail die Schnellsuchleiste oberhalb der Anzeige der Mailliste. Alles andere funktioniert nicht oder nicht richtig. Dieser Punkt allein disqualifiziert Kmail im Moment für den professionellen Einsatz.

Leider, leider, leider … Viel schlimmer ist aber noch Folgendes: Im Moment besteht die Gefahr eines (ggf. umfänglichen) Datenverlustes durch Spamfilterung an KDE’s E-Mail-Client.

Spamfilter eliminieren Mailinhalte:
Meine Frau hat gestern Abend Bogofilter für die Spam-Elimination auf ihrem Kmail eingerichtet. Hauptgrund ist, dass sie auch Mailkonten auf externen IMAP-Servern und nicht nur unserem eigenen benutzt. (Auf unserem eigenen Server werkelt Spamassassin und macht dort einen guten Job). Der Einsatz von Bogofilter unter Kmail sah anfänglich auch gut aus. Mails, die bereits als gelesen markiert waren und danach der Spamfilterung unterzogen wurden, wurden richtig und wie in den Filtereinstellungen vorgesehen behandelt. Die große Überraschung kam jedoch am nächsten Morgen:

Aus allen neuen Mails, die von Bogofilter als Spam eingestuft wurden, wurde der Mail-Body entfernt. Sprich: Diese Mails waren danach leer!

Dies betraf alle neuen ungelesen Mails – egal aus welcher IMAP-Quelle. Das ist keineswegs nur ein Darstellungsproblem am (K-)Mail-Client: Die Mails werden über Akonadi als leere Mails mit den jeweiligen IMAP-Server “abgeglichen”. Ein kurzer Test zeigte übrigens, dass das gleiche Problem unter Kmail auch bei Einsatz des Perl-basierten Spamassassin auftritt.

Irgendwie führt die Modifikation des Mailheaders durch Bogofilter/Spamassassin am Kmail-Client dazu, dass im Zusammenspiel von KMail – Akonadi – IMAP-Server die Mailinhalte von Mails gelöscht werden, die noch nicht als gelesen markiert wurden.

Nebenbei: Ein weiterer Bug ist der, dass diese derart malträtierten Mails nicht – wie in den Filterregeln vorgesehen – in einen SPAM-Ordner verschoben wurden. Und Spamassassin braucht beim Durchkämmen von größeren Verzeichnissen unglaublich viel CPU. Aber was solls … ich rege mich nicht mehr auf – sonst kommt gleich wieder ein Entwickler und macht mich mit Nachdruck darauf aufmerksam, dass seine Arbeit freiwillig ist und nicht bezahlt wird. (Das finde ich auch schlimm, meine aber trotzdem, dass SW-Qualität primär etwas mit vernünftigen Change Management und Release-Prozessen zu tun hat …)

Jedenfalls finde ich: Das Entfernen des Mailinhalts macht nicht nur keinen Spaß – das ist ein echtes Problem ! Und es ist keineswegs neu – wie ich nach ein wenig Recherche lesen musste:
https://bugs.kde.org/show_bug.cgi?id=295484

Ich habe die Spamfilterung bei meiner Frau jedenfalls vorläufig abgestellt. Sie hofft jetzt auf bessere Zeiten und sucht mal wieder nach Alternativen …

Um böse Überraschungen zu vermeiden, kann ich jedem Kmail-Anwender im Moment nur raten, Spam-Filter vor einem Einsatz wirklich ausführlich zu testen und auf umfängliche Trainingsläufe mit produktiven Mailfoldern zu verzichten – bis man sicher ist, dass nichts passiert.

Fazit:
Seit der Einführung von Akonadi, Nepomuk, Strigi reißen die Probleme mit Kmail für die Anwender leider immer noch nicht ab.

PDT 3.0./3.1 unter Eclipse 4.2 “Juno” langsam

Im Zuge eines neuen PHP-Projektes habe ich mal die neue Eclipse-Version 4.2 Juno zusammen mit den verfügbaren PDT-Modulen ausprobiert.

Sowohl mit dem alten PDT-Modul, das für Indigo bereitsgestellt wurde, als auch mit einer “Nightly Build”-Variante in der Version 3.1.X. Siehe http://wiki.eclipse.org/PDT/Installation_3.1.x. Leider gibt es ja im Moment noch keine offizielle neue PDT-Version für Juno (obwohl laut Release-Plan eigentlich vorgesehen). Daran arbeitet wohl noch das ZEND-Team.

Ich habe bei dem Experiment mit Juno meine PHP-Projekte nicht neu aufgebaut, sondern den entsprechenden Workspace statt unter Indigo einfach unter Juno geöffnet. Das führte erwartungsgemäß zu einem vollständigen Neuaufbau des Workspace sowie einer vollständigen Neuvalidierung aller Projekte.

Beim Arbeiten in der “PHP-Perspective” sind mir dann vor allem zwei Dinge aufgefallen:

1) Träge Reaktionen der Oberfläche beim Arbeiten mit Reitern: Die Reaktionen des Eclipse-UI auf Tab/Reiter-basierte Aktionen zu Dateien, die im PHP-Editor geöffnet wurden, sind im Vergleich zu Indigo sehr langsam. Dies gilt im Besonderen dann, wenn man bereits mehrere Sub-Windows für die gleichzeitige Ansicht mehrerer Dateien geöffnet hat. Auch der Aufbau neuer Subfenster ist trotz der nun farbigen Anzeige der Umrisse während der Aktion viel zu träge.

2) Extrem langsame PHP-Editor-Reaktionen bei gleichzeitig geöffnetem “Outline-View”: Vor allem aber gibt es unakzeptabel große Zeitverzüge, wenn man Zeilen in einer Datei markiert, für die gleichzeitig der Outline-View geöffnet ist. Beim Arbeiten mit Dateien zu Klassen, die viele Methoden aufweisen, ist das eine Standard-Situation. Irgendwie fühlt sich das Arbeiten mit der Eclipse-GUI dann jedoch leider so an, als ob Eclipse beim Markieren jeder Zeile eine vollständige Validierung der gesamten Datei vornimmt. Es dauert ewig, bis der Editor der Mausbewegung folgt.

Trotz vieler schöner Dinge scheint mir Eclipse Juno mit den aktuellen PDT-Varianten also noch nicht für die tägliche Entwicklungsarbeit einsetzbar.

Ich entwickle jetzt übergangsweise wieder mit Eclipse Indigo – und nach der Erfahrung mit Juno kommt mir die “alte” Umgebung wirklich wie ein Schnellzug vor.

Aber ich bin optimistisch und warte ein wenig ab – sicher sehe ich mir Eclipse Juno bald wieder mal an, sobald PDT in einer neuen Version bereitsteht.

Opensuse – Fehlermeldung zu ata_piix

Auf meinem Laptop fiel mir nach ein paar Updates auf, dass folgende Botschaft gleich am Anfang des Bootvorgangs erscheint:

FATAL: Module ata_piix not found
FATAL: Error running install command for ata_piix

Faktisch geschieht dies bereits während des ersten Ladens der Module von der “initrd”.

Die Meldung hört sich beunruhigend an, sie es in meinem Fall aber nicht. Denn trotz der Meldung läuft auf meinem Laptop, den ich nun schon ein paar Jahre unter Opensuse betreibe, alles ganz normal. Was also ist der Hintergrund der Fehlermeldung?

Checkt man auf dem gebooteten System die geladenen Module, so findet man, dass ein Modul “ata_piix” tatsächlich nicht geladen ist.

lap3lux64:~ # lsmod | grep ata_piix
lap3lux64:~ #

Dennoch zeigt ein Blick in die System-Konfiguration mittels “hwinfo” oder Yast2’s “Hardware-Information” sehr schnell, dass für die Harddisk und auch ein an Bord befindliches DVD-Laufwerk der benötigte Treiber “ata_piix” eingesetzt wird:

lap3lux64:~ # hwinfo | grep ata_piix

   0170-0177 : ata_piix
   01f0-01f7 : ata_piix
   0376-0376 : ata_piix
   03f6-03f6 : ata_piix
   bfa0-bfaf : ata_piix
   14:   244245    0    IO-APIC-edge    ata_piix
   15:   223066    0    IO-APIC-edge    ata_piix
   ata_piix: /devices/pci0000:00/0000:00:1f.2
   ata_piix: module = ata_piix
i/o:0 0x0170 – 0x0177 (0x08) “ata_piix”
i/o:0 0x01f0 – 0x01f7 (0x08) “ata_piix”
i/o:0 0x0376 – 0x0376 (0x01) “ata_piix”
i/o:0 0x03f6 – 0x03f6 (0x01) “ata_piix”
i/o:0 0xbfa0 – 0xbfaf (0x10) “ata_piix”
irq:0 14 ( 244245) “ata_piix”
irq:0 15 ( 223066) “ata_piix”
   ata_piix: /devices/pci0000:00/0000:00:1f.2
   ata_piix: module = ata_piix
   E: DRIVER=ata_piix
<7>[ 0.846528] ata_piix 0000:00:1f.2: version 2.13
<6>[ 0.846545] ata_piix 0000:00:1f.2: PCI INT B -> GSI 17 (level, low) -> IRQ 17
<6>[ 0.846551] ata_piix 0000:00:1f.2: MAP [ P0 P2 IDE IDE ]
<7>[ 0.846596] ata_piix 0000:00:1f.2: setting latency timer to 64
<6>[ 0.846951] scsi0 : ata_piix
<6>[ 0.847068] scsi1 : ata_piix
Driver: “ata_piix”
Driver Modules: “ata_piix”
Driver: “ata_piix”, “sd”
Driver Modules: “ata_piix”
Driver: “ata_piix”, “sr”
Driver Modules: “ata_piix”
lap3lux64:~ #

Die Ursache dafür ist, dass man bei dem aktuellen Kernel 3.1.10-1.16, den Opensuse anbietet, das benötigte “ata_piix”-Modul nicht mehr extra laden muss. Es ist bereits in den Kernel einkompiliert. Dies erkennt man an der Konfigurationsübersicht für den aktuellen Kernel. Unter Opensuse findet man die entsprechende Datei unter dem Verzeichnis “/boot” :

Die Datei “boot/config-KERNELVERSION” – in meinem Fall “/boot/config-3.1.10-1.16-default” – enthält Informationen zur aktuellen Kernelkonfiguration, die die Opensuse-Leute für das System vorgesehen haben. U.a. findet man:

#
# SATA SFF controllers with BMDMA
#
CONFIG_ATA_PIIX=y
CONFIG_SATA_MV=m
CONFIG_SATA_NV=m
CONFIG_SATA_PROMISE=m
CONFIG_SATA_SIL=m
CONFIG_SATA_SIS=m
CONFIG_SATA_SVW=m
nCONFIG_SATA_ULI=m
CONFIG_SATA_VIA=m
CONFIG_SATA_VITESSE=m

Der Treiber ist also bereits in den Kernel intergriert und nicht als nachzuladendes Modul vorgesehen.

Zur Beseitigung der ata_piix-Fehlermeldung genügt es deshalb, das Treibermodul aus der Datei

/etc/sysconfig/kernel

zu entfernen. Betroffen ist die Zeile:

INITRD_MODULES=”ata_generic processor fan ata_piix”

aus der man den Eintrag “ata_piix” schlicht löscht.

Am besten macht man das unter Opensuse allerdings mit YasT2’s “Editor für /etc/sysconfig”, da dabei gleich auch noch die “initrd” neu erstellt wird. Siehe im sysconfig-Editor die Einstellungen unter

“System >> Kernel >> INITRD_MODULES”

.
Ansonsten muss man den Befehl “SuSEconfig” ausführen und “auch noch den Befehl mkinitrd” absetzen.

Bei den anschließenden Bootvorgängen ist die Meldung dann verschwunden.

Ich denke, das ganze “Problem” ist dadurch entstanden, dass das Linux-System auf dem Laptop mehrere Male auf die neueste Opensuse-Version upgegradet wurde. Die ursprünglichen Einstellungen zur “initrd” aus einer Zeit, als das ata_piix-Modul noch separat nachgeladen wurde, bleiben dabei offenbar unverändert.

Also keine Panik, wenn die obige Meldung auftaucht !

Opensuse 12.1 – LDAP V

Im letzten Beitrag “Opensuse 12.1 – LDAP IV” hatten wir uns mit Password Policy Objekten auf dem LDAP Server befasst. Nun wollen wir einen weiteren Schritt in Richtung auf eine LDAP-basierte Userverwaltung in einem (kleinen) Opensuse-basierten Netzwerk gehen. Ich setze hierbei die Lektüre der früheren Beiträge “LDAP I” bis “LDAP IV” voraus.

Wir haben in den vorhergehenden Beiträgen erkundet, was man tun muss, um User mittels YaST2 auf dem LDAP-Server anzulegen und zu verwalten. Wir hatten auch gesehen, dass und wie wir uns über Binds vom LDAP-Server für einen Login auf anderen Hosts im Netzwerk authentisieren und autorisieren lassen können . Das lokale PAM auf dem jeweiligen Host sorgt dabei – wenn erforderlich – für die Anlage eines Home-Verzeichnisses bei einem initialen Login. Zudem hatten wir uns damit auseinandersetzt, wie eine zentrale LDAP Password Policy mit den lokalen PAM-Prüfmodulen auf den Netzwerk-Hosts zusammenwirkt.

Noch nicht geklärt haben wir dagegen, was wir tun müssen, um den Zugang von einzelnen Usern auf definierte Hosts im Netzwerk zu begrenzen. U.a. soll sich ja nicht jeder User auf dem sicherheitsrelevanten LDAP-Server einloggen können. Es geht uns also um eine host-bezogene Zugangsautorisierung über LDAP. Interessiert sind wir dabei an einer Politik, die nicht zulässt, was nicht explizit erlaubt ist.

In unserem Muster-Scenario gibt es   – wie in den früheren Beiträgen auch –   einen OpenLDAP-Server “vms2” auf Basis von Opensuse 12.1 und einen weiteren Opensuse 12.1-Host “vms1” im Netzwerk, auf dem unsere gewöhnlichen User arbeiten sollen. Das letztere System repräsentiert einen beliebigen Opensuse-Host in unserem Netzwerk. Das Setup der beiden Systeme hatten wir in den Beiträgen “LDAP I” bis “LDAP IV” ausführlich besprochen.

Ein simpler, aber unzureichender Ansatz für die Zugangsbeschränkung zum Server

Im Beitrag “LDAP II” hatten wir uns die Erweiterung der “/etc/passwd” um den Verweis auf NIS/LDAP-Accounts angesehen. Nun könnte man zum Schutz des LDAP-Servers “vms2” auf den Gedanken kommen, jeglichen Login von Usern, die über LDAP verwaltet werden, durch ein “/sbin/nologin” oder /bin/false” zu unterbinden, indem man aus der letzten Zeile der “/etc/passwd” auf “vms2”

+::::::

ein

+::::::/sbin/nologin

oder ein

+::::::/bin/false

macht.

Das ist sehr wirksam, aber eben auch nur auf diesen Server begrenzt und dort bzgl. der User nicht besonders selektiv. Ggf. will man auch einem über LDAP verwalteten User Zugriff auf den LDAP_Server gewähren. Wir belassen unsere “/etc/passwd”-Einträge daher lieber in der ursprünglichen Form.

Auf einem anderen Host als “vms2” nutzt uns das beschrieben Verfahren sowieso herzlich wenig:
Auf den normalen Hosts sollen sich ja gerade zumindest einige der über LDAP verwalteten User einloggen dürfen. Wenn auch vielleicht nicht alle …

Wir brauchen im Netz also ein Verfahren, bei dem userspezifisch entschieden werden kann, zu welchem Host ein User Zugang erhält und zu welchem nicht.

Zwei LDAP-basierte Standardverfahren zur Zugriffssteuerung

In diesem Artikel bespreche ich deshalb zwei einfache Methoden, mit deren Hilfe man es in einem kleinen Netzwerk schafft, Usern, die über einen zentralen LDAP-Server verwaltet werden, einen Zugang nur auf vordefinierte Hosts zu gewähren. Die Host-User-Relationen, die erlaubt sind, werden dabei auf dem LDAP-Server selbst hinterlegt.

Kennzeichnend für diese Verfahren ist Folgendes:

  • Verfahren 1: Im Verfahren 1 analysiert der LDAP-Server im Auftrag des “pam_ldap”-Moduls eines Netzwerk-Hosts den Inhalt eines Zusatzfeldes “host”, das man den Useraccounts auf dem LDAP-Server hinzufügen muss. Über diesen Feldtyp werden explizit alle Hosts aufgelistet, zu denen der User Zugang erhalten soll. Man baut in diesem Verfahren also eine (1:n)-Relation der Form “User >> hosts” auf und betrachtet die Zugangserlaubnis aus Sicht des Users.
  • Verfahren 2: Das zweite Verfahren basiert dagegen auf dem Aufbau einer Host-Verwaltung in einem dafür geeigneten Ast – z.B. ou=hosts – des LDAP-Verzeichnisbaum. Jedem Hosteintrag wird dann über ein spezielles Feld “uniquemember” eine Liste von registrierten Usern aus dem Zweig “ou=people” zugeordnet. Man baut in diesem Verfahren also eine (1:n)-Relation der Form “host >> user” auf und betrachtet die Zugangserlaubnis aus Sicht des Hosts.

Welches Verfahren man bevorzugt, ist mehr eine Frage der Philosophie und der Pflege-Technik. Die Anzahl der einzutragenden Sätze bleibt letztlich gleich:

Für jeden User und jeden Host, zu dem der Zugang erlaubt werden soll, muss in beiden Verfahren explizit ein Eintrag angelegt werden. Beim ersten Verfahren kann man die Host-Zuordnung jedoch bereits während der Useranlage mit erledigen. Im zweiten Verfahren muss der Administrator bei der Anlage neuer User dagegen explizit daran denken, den User danach auch bei ausgewählten Host-Objekten des LDAP-Baums explizit zu hinterlegen.

Ich persönlich finde die zweite Variante in einem kleinen Netzwerk etwas besser:

Erstens ist die Anlage einer Liste von Hosts auf dem LDAP-Server auch für andere Zwecke – wie etwa die LDAP-Unterstützung von Samba etc. – eine sehr gute Idee. Zweitens zwingt sie einen regelmäßig dazu, darüber nachzudenken, wer eigentlich auf welchem Rechner werkeln soll. Und wenn man tatsächlich mal einen Eintrag für einen Host vergessen sollte – es schadet nicht wirklich. Die User rühren sich bestimmt.

Bei beiden Verfahren ist es übrigens so, dass man die LDAP-Client-Konfiguration auf allen zu schützenden Hosts um bestimmte Einträge erweitern muss. Wir werden weiter unten zudem sehen, dass beide Verfahren dabei sogar kombiniert werden können.

Verfahren 1: Zugangskontrolle über das Attribut “pam_check_host_attr”

Der LDAP-Server soll in diesem Verfahren bei einem Login-Versuch auf einem Host von eben diesem Host aufgefordert werden, einen “host”-Eintrag in den LDAP-Daten des Users zu kontrollieren. Hierzu sind einerseits Änderungen an der Datei “/etc/ldap.conf” auf dem betroffenen Host erforderlich. Andererseits muss das “host”-Feld in den Userdaten des LDAP-Servers vorhanden und gefüllt sein.

Wie aber ergänzen wir nun auf dem LDAP-Server die User-Einträge unter dem Zweig   “ou=people”   um das benötigte “host”-Feld? Ein Blick mit dem YaST2-LDAP-Browser zeigt uns nämlich schnell, dass dieses Feld bisher leider nicht angelegt worden ist.

Bis zu diesem Zeitpunkt hatte uns YaST2 weitgehend von solchen “Niederungen” des Umgangs mit dem LDAP-Server abgeschirmt. Nutzen wir YaST2 zur Userverwaltung, so werden neue User-Einträge im Zweig “ou=people, dc=anracona,dc=de” unseres LDAP-Servers “vms2” fix und fertig aufbereitet angelegt. Nun sind wir auch als eventuelle LDAP-Beginner gezwungen, ein wenig über den Tellerrand von YaST hinausblicken.

Die Felder, die zu jedem Objekt im LDAP-Baum erfasst werden können, entsprechen den Möglichkeiten, die sich aus einer Kombination von “LDAP-Objektklassen” ergeben. Letztere werden wiederum über LDAP-Schemata bereitgestellt, die auf unserem LDAP-Server geladen sein müssen. Wie man sich mit YaST2 ein Übersicht über die auf dem LDAP-Server installierten Schemata verschaffen kann, hatte ich u.a. im Beitrag “LDAP IV” gezeigt.

Ein konkretes Objekt des LDAP-Baumes erhält seine Felddefinitionen also aus einer für das Objekt getroffenen Festlegung hinsichtlich seiner konstituierenden Objektklassen. Diese Festlegung wird im Objekt selbst hinterlegt. Die Felddefinitionen einer einzelnen Klasse sind dabei eindeutig. Es gibt unter den Feldern einer Objektklasse – wie in anderen Datenbanken auch – in der Regel einige Mussfelder, die man bei der Anlage eines konkreten Objektes mit einem Wert belegt muss.

Für ein neues, weiteres Feld muss man einem LDAP-Objekt daher eine neue Objektklasse zuordnen, die im Rahmen eines der auf dem Server geladenen Schemata definiert ist. Daneben gibt es noch die Möglichkeit, ein konkretes Objekt zu einem sog. “Extensible Object” zu machen. Einem solchen Objekt können dann einzelne weitere Felder aus dem Schema-Vorrat hinzugefügt werden.

In unserem Fall benötigen wir zusätzlich zu den Feldern, die unsere User-Einträge bisher aufweisen, nur noch genau ein Feld – nämlich eines des Typs “host”.

An dieser Stelle unserer Überlegungen prüfen wir über YaST2’s LDAP Browser mal, welche Objektklassen die YaST2 “User- und Gruppenverwaltung” unseren Usereinträgen bei deren Anlage im LDAP-Baum eigentlich zugewiesen hat:

ldap 97

Wir erkennen die Klassen

  • “top”,
  • “PosixAccount”,
  • “InetOrgPerson”.

Diese Kombination wurde sicher nicht ohne Grund von SuSE’s Entwicklern ausgewählt. Daran wollen wir vorsichtshalber auch nichts verändern. Allerdings kann ein Festhalten an einer Objektklassen-Kombination dann problematisch werden, wenn sich eine weitere, zusätzliche Objektklasse nicht mit den genannten vertragen sollte.

Das benötigte Feld “host” ist über das “cosine.schema” definiert und taucht in der Objektklasse “account” auf. Das “cosine.schema” ist bei der Anlage unseres OpenLDAP-Servers mittels YaST2 übrigens automatisch bereitgestellt worden.

Die Objektklasse “account” harmoniert gut mit der Klasse “PosixAccount”. Beide Klassen setzen das Feld “uid” ein und dieses ist im übrigen auch das einzige “Muss”-Feld der Klasse “account”. Leider ergeben sich jedoch Probleme zwischen den Klassen “InetOrgPerson” und “account”. Wie kann man das sehen ?

Nachfolgend werden wir bei Experimenten mit dem LDAP-Verzeichnisbaum statt YaST2’s “LDAP Browser” öfter mal den LDAP-Browser “gq” einsetzen, da wir nun langsam an die Grenzen der YaST-Tools geraten.

“gq” ist bei Opensuse schnell über ein RPM-Paket installiert. Die erforderliche Konfiguration des Zugangs zum Server über Binds (z.B. mit der rootdn – in unserem Testscenario: “cn=Administrator,dc=anracona,dc=de”) sollte zumindest auf dem LDAP-Server “vms2” einfach von der Hand gehen. Die notwendigen Default-Einträge macht unter dem Menüpunkt “File >> Preferences”.

Mit “gq” kann man in der Ansicht zu den Feldern eines Objektes im LDAP-Baum schnell weitere Einträge für bestimmte Feldtypen anlegen. Neue Einträge werden über die rechts außen liegenden größeren Tasten mit dem nach unten gerichteten Pfeil erzeugt. Feldinhalte wählt man ggf. über die Combobox-Tasten am rechten Rand der Felder aus.

Nachfolgend sieht man das Ergebnis eines Versuches auf dem “vms2”, mittels “gq” ein User-Objekt um die Objektklasse “account” zu erweitern.

Das ging so richtig schief !

Einige weitere Tests, bei denen wir systematisch mit LDIF-Dateien und dem Kommando “ldapmodify” neue Objekte mit unterschiedlichen Objektklassenkombinationen anlegen, zeigen, dass man entweder auf die Objektklasse “inetOrgperson” oder die Klasse “account” verzichten muss. Das hier im Einzelnen darzustellen, erspare ich mir. (Leser, für die der Umgang mit LDIF-Dateien etwas Neues darstellt, sollten bei dieser Gelegenheit anfangen, sich damit auseinanderzusetzen. Das Studium der zugehörigen “man”-Seiten hilft dabei.)

Um in unseren User-Objekten im Zweig “ou=people,dc=anracona,dc=de” trotz der Probleme mit der “account”-Klasse noch ein “host”-Feld unterzubringen, greifen wir zu dem oben bereits angedeuteten Umweg:

Wir machen versuchsweise unseren Test-User “tarja” zu einem “Extensible Object” ! Wir ergänzen dazu mit “gq” und seinen Tasten die Einträge des Feldtyps “objectClass” um eine weitere Objektklasse, nämlich die Klasse “extensibleObject”:

ldap 99

Wir drücken dann auf den “Apply”-Button und danach auf “Refresh”.

Im nächsten Schritt fügen wir unserem modifzierten Objekt mit einer weiteren “gq”-Methode unser gewünschtes “host”-Feld hinzu. Dazu drücken wir auf das “gelbe” Symbol links oberhalb der Felddarstellung. Dieses öffnet den Dialog für die Felderweiterung eines “Extensible Objects”:

ldap 100

Wir drücken in kleineren Dialog zunächst auf “OK” und danach auf “Apply” und erhalten tatsächlich unser neues Feld:

ldap 101

Dieses füllen wir durch Editieren gleich mit einem Host-Eintrag für unser System “vms1”. Hier gibt man den FQDN des Hosts an, unter dem der Host im Netzwerk gefunden werden kann.

Für diejenigen, die statt mit “gq” lieber mit LDIF-Dateien sowie “ldapadd” und “ldapmodify” arbeiten wollen, hier der Inhalt einer LDIF-Datei, die unserem “tarja”-Datensatz entspricht:

dn: uid=tarja,ou=people,dc=anracona,dc=de
cn: tarja Turunen
gidNumber: 100
givenName: tarja
homeDirectory: /home/tarja
loginShell: /bin/bash
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: extensibleObject
sn: Turunen
uid: tarja
uidNumber: 1010
userPassword: {ssha}PTvGho95jW9reNdggxgJUWRDxTBNQktKTg==
host: vms1.anracona.de

Für unseren Testuser “tarja” heißt das, dass wir ihm/ihr den Zugang zum Host “vms1” gewähren wollen.

Das ist zwar nett von uns, doch wir hatten ja im letzten Beitrag “LDAP IV” schon mehrfach von der Tatsache Gebrauch gemacht, dass “tarja” Zugang zu diesem Host hatte. Warum sollte sich daran jetzt etwas durch den zusätzlichen Eintrag auf dem LDAP-Server geändert haben verändert haben?

Hat sich auch nicht ! Der User “tarja” hat – wie im übrigen auch alle anderen User in unserem LDAP Zweig “ou=people” – nach wie vor Zugang zu “vms1”. Bislang ist der Zugang für unsere Accounts, die über LDAP verwaltet werden, ja in keiner Weise (außer über das Passwort) eingeschränkt. Das kann der Leser gerne selber testen.

Dieser Zustand ändert sich erst, wenn wir an der LDAP-Client-Konfiguration von “vms1” etwas ändern. Künftig soll der PAM-LDAP-Client auf “vms1” unser “host”-Feld durch den LDAP-Server abfragen lassen, bevor er einen Zugang gewährt. Welcher Eintrag ist dafür notwendig?

Ein Studium der Erläuterungstexte zu den vielen auskommentierten Statements in der Datei   “/etc/ldap.conf”   auf “vms1”
macht uns auf folgende Zeile aufmerksam, von der wir nach der Lektüre mutig den Kommentar entfernen:

# Check the "host" attribute for access control
# Default is no; if set to yes, and user has no
# value for the host attribute, and pam_ldap is
# configured for account management (authorization)
# then the user will not be allowed to login.
pam_check_host_attr    yes

Wenn dieser Eintrag tatsächlich das bewirkt, was sein Erläuterungstext verspricht, so sollte sich nun außer dem User “tarja” kein weiterer User, der auf dem LDAP-Server gepflegt ist, auf “vms1” einloggen können.

Wir machen diesen Negativtest mit dem User “tuxer”, den wir im letzten Beitrag schon öfter bemüht haben. In seinem LDAP-Eintrag existiert bislang ja nicht einmal ein zusätzliches Feld “host”. Das Ergebnis ist:

ldap 102

Genau so hatten wir uns das vorgestellt !

Analog geht es mit allen anderen Testusern unter “ou=people,dc=anracona,dc=de” – außer “tarja”.

Der Positivtest mit “tarja” verläuft dagegen, wie wir das erhofft haben, tatsächlich positiv:

ldap 103

Unser erstes Verfahren funktioniert also schon mal.

Wenn man nun dem User “tarja” Zugang zu mehreren Hosts gewähren will, so ergänzt man den Datensatz für “tarja” auf dem LDAP-Server z.B. per “gq” einfach um weitere Feldeinträge des Typs “host”:

ldap 104

Oder man nutzt eine LDIF-Datei der Form:

dn: uid=tarja,ou=people,dc=anracona,dc=de
cn: tarja Turunen
gidNumber: 100
givenName: tarja
homeDirectory: /home/tarja
loginShell: /bin/bash
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: extensibleObject
sn: Turunen
uid: tarja
uidNumber: 1010
userPassword: {ssha}PTYGho95jW9reNdxUdgJUWRDxTBNQktMTg==
host: vms1.anracona.de
host: vmsx.anracona.de
host: vmsy.anracona.de

Hinweis : Natürlich muss man dann auf den anderen Hosts auch die Dateien “/etc/ldap.conf” um den Eintrag

pam_check_host_attr    yes

ergänzen!

Das genannte Verfahren führt man dann sukzessive für alle User durch. Bei größeren Installatinen wird man dabei um ein wenig Scripting, den Einsatz von “ldapsearch” und “ldapmodify” nicht herumkommen.

Auf einen YaST2-Unterstützung können wir bei diesem Verfahren auf Opensuse-Systemen also nicht mehr zählen!

Verfahren 2 – Zugangskontrolle durch User-Einträge in “host”-Objekten des LDAP-Baums

Für unser zweites Verfahren müssen wir Host-Einträge im LDAP-Verzeichnisbaum unterbringen. YaST2 können wir hierfür abschreiben – mir ist zumindest keine Möglichkeit bekannt, mit YaST2’s LDAP-Tools eine Host-Verwaltung auf einem LDAP-Server vorzunehmen und damit auch noch Zugriffsberechtigungen für User zu organisieren.

Damit unsere “host”-Einträge im LDAP-Baum aufgeräumt sind, wollen wir einen neuen Zweig des LDAP-Baums eröffnen:

ou=hosts,dc=anracona,dc=de

In diesem Zweig wollen wir als ersten Eintrag gleich unseren LDAP-Server unterbringen. Hier stellt sich erneut die Frage der Objektklassen-Zuordnung für die gewünschten Einträge.

Ich greife zu folgenden Klassen, die aus meiner Sicht die notwendigsten Felder zur Beschreibung eines Hosts enthalten:

  • objectClass: posixGroup
  • objectClass: groupOfUniqueNames
  • objectClass: extensibleObject
  • objectClass: ipHost

Wie beim ersten Verfahren sehen wir hier aus Flexibilitätsgründen den Einsatz der Klasse “extensibleObject” vor. Zwingend erforderlich ist diese Klasse diesmal aber nicht.

Es ergibt sich folgende Struktur einer LDIF-Datei, die wir auf dem Server zur Ausführung bringen müssen:

LDIF-Datei für die Anlage des neuen Zweiges und eines Hosteintrags für “vms2”:

dn: ou=hosts,dc=anracona,dc=de
objectClass: organizationalUnit
ou: hosts

dn: cn=vms2,ou=hosts,dc=anracona,dc=de
objectClass: posixGroup
objectClass: groupOfUniqueNames
objectClass: extensibleObject
objectClass: ipHost
ipHostNumber: 192.168.0.12
cn: vms2.anracona.de
cn: vms2
gidNumber: 1
uniqueMember: uid=tuxer,ou=people,dc=anracona,dc=de

Man erkennt an der letzten Zeile, dass wir dem Host-Eintrag gleich auch noch einen ersten User mitgegeben haben !

Aufgrund unserer Objektklassenzusammenstellung ergeben sich in diesem Fall einige Muss-Felder, für die ein Eintrag zwingend vorzunehmen ist, nämlich:

  • cn    ( für die Bezeichnung des Hosts)
  • gidNumber    ( für die Zugehörigkeit zu einer Gruppe von Hosts)
  • ipHostNumber    ( für die IP-Adresse des Hosts)
  • uniqueMember    ( mindestens einen User des Hosts)

Wem diese Mussfelder zuviel sind oder wen im Besonderen das Mussfled “uniqueMember” stört, kann für die Hosteinträge auch folgende Alternative verwenden:

LDIF-Alternative für Host-Einträge :

dn: cn=vms2,ou=hosts,dc=anracona,dc=de
objectClass: device
objectClass: ipHost
objectClass: extensibleObject
ipHostNumber: 192.168.0.12
cn: vms2.anracona.de
cn: vms2
member: uid=tuxer,ou=people,dc=anracona,dc=de

Hinweise zur Alternative:

  • Um dem Host Feldeinträge vom Typ “member” zuordnen zu können, ist die Klasse “extensibleObject” zwingende Voraussetzung.
  • Das Feld “member” ist dann kein Mussfeld. Man kann es daher auch leer lassen.
  • Man muss bei Verwendung dieser Alternative weiter unten bei der Einrichtung der LDAP-Clients auf den Hosts aufpassen und als zu untersuchendes Feld “member” statt “uniqueMember” angeben.

Unsere Vorgaben bringen wir nun in einer Datei “host_vms2.ldif” in einem Verzeichnis unserer Wahl auf “vms2” unter. In diesem Verzeichnis führen wir nun diese Datei für den LDAP-Server aus:

vms2:~ # ldapadd -D "cn=Administrator,dc=anracona,dc=de" -w MY_LDAP_PASSWD -x -a -f hosts_vms2.ldif

Danach kontrollieren wir das Erreichte über “gq”:

ldap 106

Der aufmerksame Leser erkennt, das ich auf meinem Testserver “vms2” zwischenzeitlich schon mal dem User “rmo” Zugang gewährt hatte.

Gemäß des LDAP-Eintrags für unseren Server “vms2” dürfte sich jetzt also auch unser User “tuxer” dort einloggen.

Bisher ist auf dem Server der Zugang von Usern, die per LDAP erfasst wurden, aber noch gar nicht beschränkt worden, weil wir auf dem System “vms2” noch keine Änderung unserer ursprünglichen LDAP-Client-Konfiguration vorgenommen haben!

Für die Anwendung unseres Verfahrens 2 müssen die Einträge in der Datei “/etc/ldap.conf” auf “vms2” folgendermaßen aussehen:

# Group to enforce membership of
#pam_groupdn cn=PAM,ou=Groups,dc=example,dc=com
pam_groupdn cn=vms2,ou=hosts,dc=anracona,dc=de

# Group member attribute
#pam_member_attribute uniquemember
pam_member_attribute uniquemember

oder im Fall der angesprochenen Alternative:

# Group to enforce membership of
#pam_groupdn cn=PAM,ou=Groups,dc=example,dc=com
pam_groupdn cn=vms2,ou=hosts,dc=anracona,dc=de

#pam_groupdn - Eintrag
pam_member_attribute member

Nachdem wir unseren LDAP-Server hiermit ausgestattet haben, versuchen wir einen Positiv-Test mit dem User “tuxer”:

ldap 107

Hm, das ging so halb. Was soll aber die Meldung bzgl. des Home-Verzeichnisses? Hier bitte ich den Leser, noch einmal einen Blick in den Beitrag “LDAP IV” zu werfen. Aha, dort hatte ich die automatische Anlage von “home”-Verzeichnissen ja explizit ausgeschlossen ! Daher ist die Meldung nicht verwunderlich.

Für meinen User “tuxer” mache ich testweise mal eine Ausnahme :

vms2:~ # cp -r /etc/skel /home/tuxer
vms2:~ # chown -R tuxer.users /home/tuxer
vms2:~ #

Danach sieht die Sache schon besser aus:

ldap 108

Alles OK also mit unserem User “tuxer” ! Er hat nun die Ehre, sich auf unserem LDAP-Server einloggen zu dürfen. Unser Positiv-Test war offenbar erfolgreich.

Nun müssen wir aber noch einen Negativtest machen. Hierzu verwenden wir den User “tarja”:

ldap 109

Genauso wollen wir das !

Kombination beider Verfahren auf einem Host

Abschließend schauen wir uns interesserhalber an, was auf “vms1” passiert, wenn wir beide Verfahren kombinieren. Dazu erfassen wir den Host “vms1” zunächst mit Hilfe einer geeigneten LDIF-Datei “vms1.ldif” im Zweig “ou=hosts,dc=anracona,dc=de” des LDAP-Baums:

dn: cn=vms1,ou=hosts,dc=anracona,dc=de
# objectClass: device
objectClass: posixGroup
objectClass: groupOfUniqueNames
objectClass: extensibleObject
objectClass: ipHost
ipHostNumber: 192.168.0.11
cn: vms1.anracona.de
cn: vms1
uniqueMember: uid=tuxer,ou=people,dc=anracona,dc=de
gidNumber: 1

Diese Datei bringen wir auf “vms2” zur Anwendung:

vms2:~ # ldapadd -D "cn=Administrator,dc=anracona,dc=de" -w MY_LDAP_PASSWD -x -a -f hosts_vms1.ldif
adding new entry "cn=vms1,ou=hosts,dc=anracona,dc=de"

Der Check mit “gq” zeigt:

ldap 110

Auf “vms1” ändern wir nun die Datei “/etc/ldap.conf” so ab, dass (hoffentlich) auch Verfahren 2 zur
Anwendung kommt:

# Group to enforce membership of
#pam_groupdn cn=PAM,ou=Groups,dc=example,dc=com
pam_groupdn cn=vms1,ou=hosts,dc=anracona,dc=de

# Group member attribute
#pam_member_attribute uniquemember
pam_member_attribute uniquemember

Bislang war ein Login von “tarja” auf “vms1” zwar nach dem ersten Verfahren zugelassen, aber nicht nach dem zweiten ! Dagegen ist unser User “tuxer” zwar nach dem zweiten Verfahren zugelassen, nicht aber nach dem ersten !

Wir erwarten daher, dass sich keiner der beiden User mehr auf “vms1” einloggen darf. Und tatsächlich:

ldap 111

Tarja darf nicht mehr auf “vms1” zugreifen. Und “tuxer” ?

ldap 112

Der darf auch nicht ! Ganz offenbar werden bei einer Kombination beider Verfahren also beide Zugangsberechtigungen geprüft !

Nun fügen wir “tarja” auf dem LDAP-Server auch dem “vms1”-Host-Eintrag als “uniquemember” hinzu:

ldap 113

Dann versuchen wir erneut, “tarja” auf “vms1” einzuloggen :

ldap 114

Alles wieder OK !

Abschließende Anmerkungen

Ich hoffe, dieser Ausflug in die LDAP-Welt unter Opensuse hat gezeigt, was man mit Yast2’s Hausmitteln machen kann und was nicht mehr.

Ein Server ist schnell angelegt, Hosts lassen sich auch relativ schnell als LDAP-Clients konfigurieren. Bei einer einfachen Useranlage unterstützt YaST2 hinreichend. Ebenso hilft YaST2 beim Umgenag mit einer zentralen Password Policy.

Bei der Konfiguration von Zugangsbeschränkungen für Hosts beißt es dann aber aus! Hier würde ich mir wünschen, dass YaST2 erweitert wird, damit auch User, die keine LDAP-Profis sind, eine Chance haben, LDAP sinnvoll in einem kleinen Netz einzusetzen.