Solr Authentication

Aus der beliebten Serie „ein paar unsortierte Notizen mit Computerkram für mich selbst“ hier wie man in Solr 8.1 die Authentifizierung einschaltet (und anschließend aus Python heraus mir urllib abfragt). Quellen sind die Doku von Solr und die Doku von urllib.

Standardmäßig ist es bei Solr so, dass ohne jede Authentifizierung über die Admin-Oberfläche alles gemacht werden kann, insbesondere auch Dokumente aus dem Korpus löschen und so weiter! Die hier beschriebene Basic Authentication ist wenigstens ein Minimum an Zugriffsschutz, aber nach heutigen Maßstäben ist es nicht so sicher, jedenfalls nicht wenn man es nicht mit HTTPS kombiniert. Es ist empfehlenswert, zusätzlich dafür zu sorgen, dass der Solr-Server nicht aus dem Internet erreichbar ist.

Ins Verzeichnis solr-8.10.1/server/solr kommt in die Datei security.json folgender Inhalt:

{
"authentication":{ 
   "blockUnknown": true, 
   "class":"solr.BasicAuthPlugin",
   "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}, 
   "realm":"My Solr users", 
   "forwardCredentials": false 
},
"authorization":{
   "class":"solr.RuleBasedAuthorizationPlugin",
   "permissions":[{"name":"security-edit",
      "role":"admin"}], 
   "user-role":{"solr":"admin"} 
}}

Was bei credentials hinter dem Usernamen steht ist nicht so gut dokumentiert, offenbar wird erwartet, dass man das solr-Skript mit dem Kommando auth benutzt. Das nölt aber immer rum, wenn man nicht den ZooKeeper sondern eine Standalone-Installation verwendet. In der Beispieldatei ist das Passwort „SolrRocks“, der abgelegte String ist im Prinzip ein salted sha256, aber die Methode, wie das zustande kommt, ist etwas dubios. Auf github habe ich ein Skript gefunden, mit dem man den credentials-String erzeugen kann. Evtl. sind dafür noch Packages nachzuinstallieren, z.B. pwgen. Der Salt wird automatisch erzeugt und muss nicht angegeben werden.

#!/bin/bash
PW=$1
SALT=$(pwgen 48 -1)
echo "hash    : $(echo -n "$SALT$PW" | sha256sum -b | xxd -r -p | sha256sum -b | xxd -r -p | base64 -w 1024) $(echo -n "$SALT" | base64 -w1024)"

Mehrere credentials bestehend aus Usernamen und salted hashs können JSON-mäßig mit Komma hintereinander gehängt werden.

Und hier noch wie man in Python bei urllib die HTTP-Authentication benutzt:

    # Create an OpenerDirector with support for Basic HTTP Authentication...
    auth_handler = urllib.request.HTTPBasicAuthHandler()
    auth_handler.add_password(realm='My Solr users',
                              uri='http://localhost:8983/',
                          user='solr',
                          passwd='SolrRocks')
    opener = urllib.request.build_opener(auth_handler)
    # ...and install it globally so it can be used with urlopen.
    urllib.request.install_opener(opener)

Das Passwort steht dann halt im Klartext da drin. Das billige Authentication-Modul von Solr wird sicherheitsmäßig eh nicht für jeden Bedarf ausreichen und sollte für den Produktivbetrieb jedenfalls nicht als einzige Zugriffsbeschränkung benutzt werden.

Um mit dem Solr-Skript von der Kommandozeile Dinge zu erledigen (z.B. einen neuen Core anlegen) müssen bei eingeschalteter Basic Authentication noch folgende Variablen gesetzt werden (wie bei allem gilt, den Usernamen und das Passwort durch die eigenen zu ersetzen). Folgendes ist in die bin/solr/solr.in.sh einzusetzen bzw. die im Beispiel schon vorhandenen entsprechenden Zeilen auszukommentieren:

SOLR_AUTH_TYPE=basic
SOLR_AUTHENTICATION_OPTS="-Dbasicauth=solr:SolrRocks"