Close Connection mit https auf Apache 2.2

Vor kurzem konnte ich ein Problem mit einem Client-Programm nachvollziehen, welches SSL gesicherte Verbindungen mit einem Apache 2.2 herstellte.

Dabei wurde ein Programmteil mit einem „Connection Closed“ Signal verbunden welches der Apache Server aber nie sendetet.

Folgende Einstellungen in der ssl.conf brachten dann den gewünschten Erfolg (wobei der erste Parameter wohl der wichtigere war).

SetEnv nokeepalive set-accurate-shutdown

Linken und C++ Exceptions

Solange ein reines C++ Programm den C++ Exception Mechanismus verwendet gibt es keine Probleme, bei Mischprogrammen kann es aber zum Abbruch des Programms kommen wenn eine Exceptions geworfen wird, da ein stack-unwinding nicht mehr möglich ist.

Solange man C++ mit C vermischt und mit g++ linkt ist alles in Ordnung.

Wenn man aber C++ mit C und/oder Fortran vermischt und mit Intels ifort Befehl (compiler/linker-frontend) zusammenlinkt wird es zur Runtime zu einem Abbruch kommen.

Lösung ist dort die Fortran und C Dateien mit dem Compilerflag -fexceptions zu übersetzen.

GNU Tools auf Solaris

Essentiell für das bequemere Arbeiten auf einer Solaris Maschine ist das Vorhandensein der GNU Tools.

Dazu installiert am am besten das Coreutils Paket (SMCCoreu) von www.sunfreeware.com

Die Utilities installieren sich in /usr/local/bin weswegen ich diesen Pfad in /etc/profile vorangestellt habe.

Das Resultat ist dass bspw. das GNU ls Kommando in /usr/local/bin vor dem SUN ls Kommando in /usr/bin gefunden und verwendet wird. Wer die ganzen Optionen der GNU Kommandos kennt wird dies sicher zu schätzen wissen.

bash Einstellungen

Im Prinzip sollte es ja nicht schwer sein mit den Voreinstellungen der Shells:

/etc/profile beherbergt die systemweiten Shell Voreinstellungen

~/.profile dagegen die lokalen

~/.bash_profile oder ~/.bash_login beinhalten die lokalen Einstellungen nur für eine bash login-shell
~/.bashrc dagegen die lokalen Einstellungen für eine allg. bash-shell (nicht-login).

Das schwierige ist, dass Solaris bspw. keine globale bashrc kennt, SuSE Linux aber schon, dort heisst Sie aber /etc/bash.bashrc(.local) – bei RedHat Linux wiederum /etc/bashrc
Oftmals werden diese zusätzlichen Dateien auch nur eingelesen, weil Sie andere Dateien (bspw. die lokalen Dateien) inkludieren.

Hat man die Notwendigkeit Skripte portabel zu schreiben, sollte man nur mit den zuerst genannten Arbeiten. Dazu hat man ja die Möglichkeit eine lokale .bashrc Datei im Skeleton Ordner für neue Homeverzeichnisse zu erstellen.

Apache + LDAP + require group

ist ein Albtraum 🙁
Während die Bereitstellung von Gruppeninformationen via openLDAP über die PAM-Module nur den Eintrag objectClass: posixGroup in der LDAP Datenbank benötigte, ignoriert Apache (alle Versionen) bei der Gruppenidentifizierung diesen Eintrag und verlang stattdessen objectClass: groupOfNames.

Dieses Problem hat man sich sofort eingehandelt wenn der Zugriff auf den Webserver via WebDAV – oftmals bei subversion Repositories – erfolgt. Folgendes Beispiel wird niemanden aus der Gruppe mygroup authentifizieren, solange diese in der LDAP Datenbank nur von objectClass: posixGroup abgeleitet ist.

...
DAV svn
SVNPath /var/svn/test1
...
AuthName "Subversion Repository test1"
AuthType Basic
AuthLDAPURL ldap://myhost/o=myorg,c=de?uid?sub
require group cn=mygroup,ou=groups,o=myorg,c=de
... ...

Folgende rot gekennzeichnete Änderungen sind in der LDAP db nötig (hier ein .ldif Auszug):

dn cn=mygroup,ou=groups,o=myorg,c=de
objectClass top
objectClass groupOfNames
objectClass posixGroup
member cn=mymember,ou=people,ou=mydepartment,o=myorg,c=de
memberUid mymember
cn mygroup
gidNumber 600

Leider meldet die LDAP Datenbank beim einfügen/modifizieren eine „class violation“.
Der Grund ist dass anstatt des nis.schema das rfc2307bis.schema geladen werden muss. Beide sind inkompatibel zueinander. Nach dem Wechsel des Schemas müssen aber alle Gruppen sofort angepasst werden. Siehe dazu auch

Und wenn man alles umgestellt hat wird die Frage nach den Neueinträgen bleiben, denn ein beliebiges LDAP-Frontend wird bei der Gruppenverwaltung nicht beide objectClass Einträge verwalten. So zumindest auch GOSA.
Es soll aber laut Nabble – LDAP & Benutzergruppen ein Patch existieren, den ich bislang noch nicht ausprobieren konnte.

Apache 2.0 auf Solaris 10

Im Rahmen einer Solaris 10 Installation kann auch der HTTP Server Apache2 installiert werden. Wer allerdings WebDAV mit LDAP-Authentifizierung benötigt, der wird enttäuscht werden. Das seit Version 2.0.41 zum Lieferumfang gehörende mod_auth_ldap Modul ist nicht dabei.
In diesem Fall hilft nur ein manuelles Übersetzen des Apache Webservers.

Das Kommando

pkginfo | grep apch

ergibt, dass zwei Pakete installiert wurden:

  • SUNWapch2u (usr)
  • SUNWapch2r (root)

Ein

pkgchk -l SUNWapch2u | grep Pathname

ergibt dass der usr-Anteil von Apache nach /usr/apache2 installiert wurde. Der root-Anteil wurde respektive nach /etc/apache2 und /var/apache2 installiert. Theoretische könnte man diese Apache2 Installation auf dem Rechner belassen und zusätzlich eine nach /usr/local installieren – der Übersicht wegen habe ich aber diese Pakete entfernt, habe aber zwei Dateien aus den Paketen nach /tmp kopiert.

  • /lib/svc/method/http-apache2
  • /var/svc/manifest/network/http-apache2.xml
    • Die zweite Datei ist das SMF Manifest welches das erste Skript zum Starten/Stoppen des Daemons benötigt.Jetzt kann’s losgehen. Als Vorraussetzungen müssen einige SMC Pakete von hier.Danach den aktuellen tarball herunterladen und auspacken. Es folgt der configure Schritt

      ./configure --prefix=/usr/local/apache2 --enable-mods-shared=all
      --enable-ssl=shared --enable-ssl --with-ssl=/usr/local/ssl
      --enable-proxy --enable-proxy-connect --enable-proxy-ftp
      --enable-proxy-http --enable-ldap --enable-auth-ldap

      Bei meiner, unabsichtlich unvollständigen, Installation lief dies sofort auf einen Fehler:

      Checking for C compiler default output file...
      configure: error: C compiler cannot create executables

      Das Problem ist, dass der von Sunfreeware installierte gcc Compiler alle SUNW Entwicklerpakete benötigt, die normalerweise nach /usr/ccs installiert werden, siehe dazu folgenden Kommentar. Ergänzend muss noch erwähnt werden dass natürlich PATH und LD_LIBRARY_PATH für den make Vorgang um die Entwicklerpfade ergänzt werden müssen.
      Danach lief der configure Schritt ohne Probleme, aber make blieb nach einiger Zeit hängen:

      util_ldap.c:43:2 #error mod_ldap requires APR-util to have
      LDAP support built in

      Das Problem ist hier dass die APR (Apache Portable Runtime) entweder schon auf dem Rechner war (bei mir durch svn) oder zuvor durch den autoconfigure Schritt ohne LDAP Support erstellt wurde.
      Daher müssen folgende Schritte durchgeführt werden:

      1. APR mit LDAP erstellen (bspw. nach /usr/local/apache2-apr)
      2. APR-util mit LDAP erstellen (ins gleiche Verzeichnis)
      3. Apache2 gegen diese APR linken

      Auch diese Schritte sind nochmals hier (Apache Mailinglist) erklärt.
      Diese Schritte führten dann endlich zu einem Apache2 Webserver unter /usr/local/apache2

      Man könnte den Webserver jetzt schon durch das Startscript apachectl in /usr/local/apache2/bin starten, jedoch sollten wir die zwei am Anfang nach /tmp kopierten Files anpassen, zurückkopieren und unseren Apache2 über das Solaris10 eigene Service Management Facility starten. Im einzelnen war dies

        im Skript /lib/svc/method/http-apache2 die Pfade anpassen und ein switch restart einfügen
        in /var/svc/manifest/network/http-apache2.xml den Namen im Abschnitt service_bundle auf „http-apache2“ ändern und einen Abschnitt „restart“ einführen

    Abschliessend wird dass Manifest geprüft, in das SMF Repository eingefügt und der Dienst gestartet. Die Kommandos lauten

    svccfg validate http-apache2.xml
    svccfg import http-apache2.xml
    svcadm enable svc:/network/http:apache2

daemon handling unter Solaris 10

In der klassischen System V Welt, d.h. auch unter Linux aber nicht unter Mac OS X, gibt es verschiedene Runlevels zu denen es jeweils ein Unterverzeichnis unterhalb /etc gibt mit Start- und Stopscripten von Diensten.
Startet also der init Prozess (pid 1) auf einem System V UNIX System arbeitet er sukzessive die Startskripte dieser Verzeichnisse ab, wobei zumindest unter Linux einen Nummerierung der Startskripte die Reihenfolge der Abarbeitung festlegt.
Ein nachträglicher Neustart oder das Stoppen ist jederzeit mit solch einem Skript möglich.

Dieses Konzept hat aber mindestens zwei Schwachstellen.

  1. Das einfügen eines neuen Dienstes ist aufwändig. Neben dem allg. Start-/Stopskript muss in jedem passenden runlevel Unterverzeichnis ein link gesetzt werden, wobei die Nummerierung oftmals nicht eindeutig sein kann.
  2. Es gibt keinen Supervisor über die Dienste der im Fehlerfall eine Aktion auslösen könnte. Normalerweise wird lediglich im log Bereich protokolliert. Eine respawn Direktive kann diese Situation noch leicht verbessern.

Sun führte deshalb die sog. Service Management Facility (SMF) ein:
Die Skripte der SMF basieren auf XML und lösen die /etc/init.d Skripte ab.
Ein Starten (enable) oder Stoppen (disablen) eines Dienstes ist persistent, es überlebt einen reboot des Systems. Daher ist ein seperater Eintrag in einer inittab/runlevel obsolet.
Alle so gestarteten Dienste werden von einer Art Service Masterdaemon überwacht, dem Holderprozess svc.startd . Die Basis hierfür ist ein Contract System bei der ein zu startender Dienst nebem einer klassischen PID auch eine Contract ID (CTID) bekommt, die direkt dem Holder Prozeß unterstellt ist.
Auch Dämonen die von inetd gestartet werden, besitzen einen SMF Eintrag und werden wie ein stand-alone Dienst gestartet – der Prozess Holder ist dann allerdings inetd, der wiedersum svc.startd untersteht.
Alle Laufzeitinformationen werden in einer sqlite Datenbank gehalten, die einerseits effizient arbeitet andererseits eine mögliche Quelle für einen Totalausfall des Systems darstellt.

Folgender genauerer Überblick über die SMF:

  • /lib/svc beinhaltet Administrationsprogramme für die SMF sowie unter „method“ auch die Start-/Stopsckripte zum einmaligen einlesen
  • /var/svc beinhaltet die eigentlichen XML Servicebeschreibungen (Manifeste). Das Manifest beinhaltet v.a. Abhängigkeiten gegenüber anderen Diensten und Resourcen, das Fehlerhandling sowie die Start-/Stop Anweisungen die wiederum oft auf ein klassisches Skript in /lib/svc/method verweisen
  • /etc/svc beinhalet überraschenderweise das sqlite Repository, welches nicht unter /var/svc angesiedelt ist, sowie logs zum repository.

Beschreibung eines Dienstes, das Manifest:

  • beinhaltet den Header
  • beschreibt Art und Grad der Abhängigkeit von anderen Diensten/Resourcen
  • enthält Start-/Stop Methoden (stop meist mittels :kill definiert)
  • definiert spezielle Eigenschaften
  • Hinweise zu Dokumentationen

Administration von SMF:

  • svcs Service Status, listet alle Dienste des Repositories und Ihren Status auf
  • svcs -l detaillierte Ausgabe eines Services incl. CTID der Servicename, bzw. der FRMI (Fault Managed Resource Identifier), kann in der Langform, oder in einer verkürzten Form, falls eindeutig möglich, angegeben werden, bspw: svc:/network/ssh oder auch nur ssh
  • svcadm enable/disable ein-/auschalten (online/offline) eines Services
  • svcadm restart/refresh durchstarten/erneuern (bei leichten Konf.änderungen)
  • svcprop liest die Eigenschaften aus dem Manifest aus
  • svccfg Sobald ein XML Manifest einmal in das SMF Repository eingelesen ist (svccfg import) ist diese File unerheblich und nur noch das sqlite Repository maßgebend. svccfg ist ein Tool zur Manipulation dieses Repositories.

SOFiSTiK bei lanana registriert

Endlich ist SOFiSTiK bei Linux Assigned Names And Number Authority registriert. Genauer sind die Paketverwaltung (/opt/sofistik) und ein init-daemon (sofistikpsd) registriert.

Die nächste große Major release (version 25) wird dann auf einem LSB aufsetzen – wahrscheinlich LSB 3.2 oder 4.0. Gleichzeitig wird auch eine Paketverwaltung eingeführt, mit der das Updatetool SONAR ebenfalls umgehen kann.

suid-bit und chgrp

Ein kurioses Phänomen tritt bei suid-Programmen auf, wenn jenes mit chgrp einer anderen Gruppe zugewiesen wird. Nach der chgrp Operation wird das suid-bit entfernt!
Dieses Verhalten tritt bei SuSE und RedHat Linux auf. Andere Distributionen hab ich nicht getestet weswegen ich mal davon ausgehe, dass es ein distributionsübergreifender Effekt ist.
Nachvollziehen kann ihn allerdings nicht, denn das suid-bit darf ja nur root oder der owner des binaries setzen. Ein chgrp kann aber auch nur von diesen beiden Identitäten veranlasst werden. Eine mögliche Sicherheitslücke, die hier ev. chgrp schliessen soll, kann ich nicht erkennen.

Sei’s drum. Man muss jedenfalls nach ändern des chgrp das suid-bit nochmals setzen.