Omdat dit een vrij lang verhaal is wil ik beginnen met de vraag: is er hier iemand die een werkende setup heeft waarbij Apache autoriseert met mod_dbd en prepared statements? En vervolgens: wat is er mis met mijn setup, of is het een bug in Apache?

Momenteel beheer ik een aantal Apache-servers waarop verschillende applicaties draaien. De toegang tot deze applicaties is beveiligd met wachtwoorden en een gebruiker heeft toegang tot een willekeurig aantal servers.

Omdat het niet handig is om op elke server een aparte passwordfile te hebben, ben ik de servers aan het configureren met mod_dbd. Om de context te schetsen:

De servers draaien onder CentOS 6.3 met de standaard daarbij horende Apache 2.2.15, alhoewel ik overweeg om alles te upgraden naar (niet-standaard) Apache 2.4.3 (die overigens dit probleem niet oplost). Als database wordt gebruik gemaakt van MariaDB 5.5.27.

Op de autorisatieserver heb ik een database aangemaakt waar ik de user-accounts in opsla. Apache configureer ik vervolgens als volgt:


DBDriver mysql
DBDParams "host=dummy.domain.nl dbname=auth user=httpd"
DBDMin  4
DBDKeep 8
DBDMax  20
DBDExptime 300
<Location />
    AuthType Basic
    AuthName "Applicatie"
    AuthBasicProvider dbd
    AuthDBDUserPWQuery "select pass from users where user = %s"
</Location>


Dit werkt prima. Echter, gezien het verwachte aantal autorisatieverzoeken wil ik gebruik maken van een prepared query. Dat zou moeten kunnen door een directive toe te voeren en een te wijzigen:


DBDPrepareSQL "select pass from users where user = %s" sqlcheckpasswd
AuthDBDUserPWQuery sqlcheckpasswd


En daar gaat het mis: Internal Server Error en het volgende stuk proza in de error_log:

[error] (20014)Internal error: DBD: failed to prepare SQL statements: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'sqlcheckpasswd' at line 1
[error] (20014)Internal error: DBD: failed to initialise
[crit] (20014)Internal error: DBD: child init failed!

Op basis van de eerste melding vermoed ik dat het label 'sqlcheckpasswd' als query naar de server wordt gestuurd tijdens het preparen. Experimenten met strace bevestigen dit vermoeden. Als ik echter in de source van mod_dbd en apr kijk, kan ik niet echt iets vinden waar het mis zou kunnen gaan. Ik heb zelfs SELinux al uitgezet om uit te sluiten dat de problemen daardoor worden veroorzaakt.

De afgelopen dagen heb ik me suf zitten googlen en ik kom verschillende discussies tegen waarin mensen een soortgelijk probleem aankaarten, maar óf de discussie leidt niet tot een oplossing, óf het probleem bleek iets te zijn wat in mijn situatie niet relevant of uitgesloten is.

Heeft iemand een idee?

Reageren