Indicizzare le e-mail con Solr FTS Engine

4 marzo 2024 by Roberto Puzzanghera 0 commenti

Solr è un server di indicizzazione basato su Apache Lucene. Dovecot communica con esso attraverso delle query HTTP/XML. Il server di indicizzazione consente di fare ricerche di testo in modo veloce nelle mail, compreso il corpo dei messaggi.

Aggiornamento alla versione 9.5.0

Prima di ogni cosa controllare che la propria versione di java sia almeno la 11.

Scaricare Solr:

SOLR_VER=9.5.0
wget https://www.apache.org/dyn/closer.lua/solr/solr/${SOLR_VER}/solr-${SOLR_VER}.tgz?action=download -O solr-${SOLR_VER}.tgz

Arrestare quindi il server Solr e lanciare l'aggiornamento con le opzioni -f (aggiornamento) e -n (non lanciare do not start the server when finished) options:

tar xzf solr-${SOLR_VER}.tgz solr-${SOLR_VER}/bin/install_solr_service.sh --strip-components=2
sudo bash ./install_solr_service.sh solr-${SOLR_VER}.tgz -f -n

Gli utenti Slackware invece dovranno procedere diversamente:

wget https://notes.sagredo.eu/files/qmail/solr/install_solr_slackware.sh
chmod +x install_solr_slackware.sh
./install_solr_slackware.sh solr-${SOLR_VER}.tgz -f -n

Scaricare e installare il nuovo schema e il file di configurazione per Dovecot

cd /var/solr/data/dovecot/conf
rm -f schema.xml managed-schema.xml solrconfig.xml
wget https://notes.sagredo.eu/files/qmail/solr/9.5/solr-schema-${SOLR_VER}.xml -O schema.xml 
wget https://notes.sagredo.eu/files/qmail/solr/9.5/solrconfig-9.5.0.xml -O solrconfig.xml
chown solr:solr solrconfig.xml schema.xml

Il nuovo file di configurazione sostituisce LRUCache con CaffeineCache e cambia la locazione delle librerie .jar (diff).

Configure your /etc/default/solr.in.sh file, as many options are changed. Then restart the Solr server.

Finally upgrade the indexes (edit the downloaded script to insert your Dovecot password)

wget https://notes.sagredo.eu/files/qmail/solr/solr_rescan_index.sh
chmod +x solr_rescan_index.sh
chown root:root solr_rescan_index.sh
chmod o-wrx solr_rescan_index.sh

./solr_rescan_index.sh
Stopping Dovecot 
. 
<?xml version="1.0" encoding="UTF-8"?> 
<response> 

<lst name="responseHeader"> 
 <int name="status">0</int> 
 <int name="QTime">20</int> 
</lst> 
</response> 
Starting Dovecot.

Se lo script non deve restituire errori (status=0). Se invece si ottengono degli errori è necessario ricontrollare le autorizzazioni di sicurezza e le credenziali dell'utente dovecot di Solr.

Installazione

Solr è un servlet java che richiede jdk v. 11 o successivo. E' testato fino ad almeno la versione 17.

# java -version
openjdk version "17.0.10" 2024-01-16 
OpenJDK Runtime Environment (build 17.0.10+7) 
OpenJDK 64-Bit Server VM (build 17.0.10+7, mixed mode, sharing)

E' necessario accertarsi che l'eseguibile java sia nel path e di aver definito la variabileJAVA_HOME:

PATH=$PATH:/usr/lib64/java/bin/
JAVA_HOME=/usr/lib64/java/

Scaricare i binari di Solr e installare

SOLR_VER=9.5.0
wget https://www.apache.org/dyn/closer.lua/solr/solr/${SOLR_VER}/solr-${SOLR_VER}.tgz?action=download -O solr-${SOLR_VER}.tgz

Estrarre l'installer dall'archivio e lanciarlo. L'installer funzioznaerà per la maggior parte delle distribuzioni Linux basate esu systemd.

tar xzf solr-${SOLR_VER}.tgz solr-${SOLR_VER}/bin/install_solr_service.sh --strip-components=2
sudo bash ./install_solr_service.sh solr-${SOLR_VER}.tgz

Il server verrà avviato da systemd all'avvio della macchina.

Installazione su Slackware

Su Slackware l'installer contenuto nell'archivio non funzionerà, perchè basato su systemd. Usare allora la mia versione modificata install_solr_slackware.sh dello script di installazione :

wget https://notes.sagredo.eu/files/qmail/solr/install_solr_slackware.sh
chmod +x install_solr_slackware.sh
./install_solr_slackware.sh solr-${SOLR_VER}.tgz

Configurazione

La locazione del server è /opt/solr, mentre i log sono in /var/solr/logs.

La configurazione del servers è nel file /opt/solr/bin/solr.in.sh.orig, che è stato convenientemente copiato in /etc/defaults/solr.in.sh di modo che ne manteniamo copia dopo ogni aggiornamento. Tenere presente che i doppi apici sono importanti in questo file.

SOLR_TIMEZONE="Europe/Rome"
SOLR_IP_ALLOWLIST="127.0.0.1, 10.0.0.0/24"
SOLR_JETTY_HOST="10.0.0.111"
SOLR_SECURITY_MANAGER_ENABLED=true
SOLR_OPTS="$SOLR_OPTS -Dsolr.allowUrls=http://solr.yourdomain.tld:8983"​

SOLR_IP_ALLOWLIST consente le connessioni dalla mia DMZ. Tenere presente che SOLR_IP_ALLOWLIST era SOLR_IP_WHITELIST prima della versione 9.

Settare SOLR_JETTY_HOST="10.0.0.111" (l'indirizzo IP del server Solr nella rete locale) è stato un po' complicato per me, in quanto ho il server Solr in un server virtuale separato rispetto a qmailapache. Questa opzione consente a Solr di accettare connessioni anche dalla rete esterna. In caso tutti questi server siano nello stesso host, si può tranquillamente lasciare SOLR_JETTY_HOST=127.0.0.1 commentato.

SOLR_PID_DIR="/var/solr/data" mi ha risolto un problema nel quale il file pid non poteva essere salvato in solr/bin a causa di problemi con i privilegi.

SOLR_HOME="/var/solr/data" farà in modo che Solr salvi i dati e la configurazione di dovecot in una directory separata. Questo faciliterà le operazioni di aggiornamento, che non dovranno prevedere spostamenti di questa cartella.

Impostare i limiti

Solr viene eseguito dall'utente solr:solr. Questo utente necessità che il limite del numero dei file aperti sia incrementato fino ad almeno 65000. Su Slackware il limite di default è 1024. Per aumentarlo per l'utente solr modificare il file /etc/security/limits.conf o creare un file solr.conf nella cartella limits.d con i seguenti contenuti:

solr    soft    nofile  65536 
solr    soft    nproc   65536 
solr    hard    nofile  65536 
solr    hard    nproc   65536

Nel mio caso solr vive in un container "unprivileged" LXC, per cui i limiti devono essere impostati non solo all'interno del container come già spiegato, ma anche nell'host per l'utente proprietario del container. Inoltre, è necessario aggiungere questa opzione nel file di configurazione:

lxc.prlimit.nofile = 65536

Avvio del server

Siamo pronti per (ri)avviare il server:

sudo systemctl stop solr
sudo systemctl start solr
sudo systemctl status solr

Gli utenti Slackware trovano lo script di avvio in /etc/init.d (lo script è già stato installato in rc.local)

/etc/init.d/solr start
sleep 5
/etc/init.d/solr status

E' conveniente creare un link simbolico allo script di avvio

ln -s /etc/init.d/solr /usr/local/bin/solrctl

Dovecot core

Per usare Solr con Dovecot, è necessario configurarlo in modo specifico come segue (dopo aver avviato il server):

sudo -u solr /opt/solr/bin/solr create -c dovecot

I file di configurazione per Dovecot sono nella cartella /var/solr/data/dovecot.

Installare i file di configurazione:

cd /var/solr/data/dovecot/conf
rm -f schema.xml managed-schema.xml solrconfig.xml
wget https://notes.sagredo.eu/files/qmail/solr/9.1/schema-${SOLR_VER}.xml     -O schema.xml
wget https://notes.sagredo.eu/files/qmail/solr/9.1/solrconfig-${SOLR_VER}.xml -O solrconfig.xml
chown solr:solr solrconfig.xml schema.xml

Il file managed-schema viene generato a partire dal file schema.xml.

Abbiamo già compilato Dovecotcon il supporto per Solr (--with-solr al momento della compilazione).

Abilitare il plugin dal file 10-mail.conf:

mail_plugins = $mail_plugins fts fts_solr

e aggiungere le opzioni di configurazionee nel blocco plugin{...} del file 90-plugin.conf file:

plugin {
fts = solr
fts_solr = url=http://solr.mydomain.tld:8983/solr/dovecot/
# eventualmente aggiungere l'opzione debug alla linea precedente

...
}

dove solr.mydomain.tld è il dominio dove Solr è raggiungibile, già definito nel file di configurazione.

Pannello di controllo

Le impostazioni generali del server sono disponibili anche attraverso un pannello di controllo web, allo stesso infirizzo http che abbiamo settato nel plugin di Dovecot. Questo è un esempio di configurazione di apache. Ho settato un proxy giusto connettermi a una normale porta 443 anzichè alla 8983, che è quella dove Solr è in ascolto.

<VirtualHost *:443>
       SSL stuff here
       ServerName solr.mydomain.tld

       ErrorLog ${LOGDIR}/solr_error.log
       LogLevel warn
       CustomLog ${LOGDIR}/solr_access.f2b.log combined

       SSLProxyEngine On
       ProxyRequests Off
       ProxyPass        / http://solr.mydomain.tld:8983/
       ProxyPassReverse / http://solr.mydomain.tld:8983/
</VirtualHost>

Quando si naviga su https://solr.mydomain.tld si noterà che il pannello di controllo è esposto a tutti e che lamenta  la mancanza di policy di sicurezza, che ora andiamo a impostare.

Sicurezza

Nella dashbord del pannello di controllo web, guardare qual è il valore della variabile di ambiente solr.home nella propria distribuzione:

Portarsi in quella directory e installare un file security.json che definisce i plugins authentication, authorization ed eventualmente auditlogging:

cat > /var/solr/data/security.json << __EOF__
{
"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"} 
}}

}
__EOF__

chown solr:solr /var/solr/data/security.json
chmod o-r /var/solr/data/security.json​

Ora riavviare il server e provare a loggarsi. L'utente è 'solr', con password temporanea 'SolrRocks', che cambieremo al primo login.

La sezione security suggerisce di risolvere alcuni problemi con i permessi. E' anche necessario creare un utente "dovecot" che servirà per le connessioni dal server IMAP e attribuire i privilegi read e update.

Questo è il mio setup:

Ho lasciato TLS disabilitato perchè la connessione tra il proxy di Apache e il server Solr è via http.

Ora che abbiamo creato l'utente dovecot, è necessario rritoccare il file 90-plugin.conf in modo che dovecot si connetta al server Solr con quelle credenziali:

plugin {
fts = solr
fts_solr = url=http://dovecot:password@solr.mydomain.tld:8983/solr/dovecot/ # eventualmente aggiungere l'opzione debug alla linea precedente ... }

dove solr.mydomain.tld è il dominio dove Solr è raggiungibile, già definito nel file di configurazione. Notare che ora l'accesso viene fatto attraverso le credenziali dovecot:password settate prima.

Test

# telnet 0 143 
Trying 0.0.0.0... 
Connected to 0. 
Escape character is '^]'. 
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready. 
a login user@mydomain.tld password
a OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NA
MESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY PREVIEW STATUS=SIZE SAVEDATE LI
TERAL+ NOTIFY SPECIAL-USE QUOTA] Logged in 
a select Inbox 
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk $MDNSent Junk $label3 $Forwarded) 
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft NonJunk $MDNSent Junk $label3 $Forwarded \*)] Flags permitted. 
* 308 EXISTS 
* 0 RECENT 
* OK [UIDVALIDITY 1285590712] UIDs valid 
* OK [UIDNEXT 19895] Predicted next UID 
* OK [HIGHESTMODSEQ 31675] Highest 
a OK [READ-WRITE] Select completed (0.001 + 0.000 secs). 
a SEARCH text "Dovecot"  
* SEARCH 35 50 51 55 56 57 58 62 63 74 75 76 77 121 129 130 146 150 151 158 163 164 165 173 196 201 202 203 213 225 226 227 228 230 231 232 249 250 262 263 264 289 
a OK Search completed (0.309 + 0.001 + 0.043 secs). 
a logout

Guardare il file log di dovecot e assicurarsi che non vi siano errori. Quindi guardare il file log di Solr. Questo è un esempio di file /var/solr/logs/solr.log senza errori:

2023-01-04 13:42:44.423 INFO  (qtp1141500277-21) [   dovecot] o.a.s.c.S.Request webapp=/solr path=/select params={q={!lucene+q.op%3DAND}(hdr:Dovecot+OR+body:Dovecot)&fl=uid,score&sort=uid+a sc&fq=%2Bbox:8af5d82b9ae4c94cbe610000364df272+%2Buser:user@mydomain.tld&rows=21842&wt=xml} hits=44 status=0 QTime=15 
2023-01-04 13:42:44.424 INFO  (audit-31-thread-1) [   ] o.a.s.s.SolrLogAuditLoggerPlugin type="COMPLETED" message="Completed" method="GET" status="200" requestType="SEARCH" username="dovecot" resource="/select" queryString="wt=xml&fl=uid,score&rows=21842&sort=uid+asc&q=%7b!lucene+q.op%3dAND%7d(hdr:Dovecot+OR+body:Dovecot)&fq=%2Bbox:8af5d82b9ae4c94cbe610000364df272+%2Buser:user@mydomain.tld" collections=[]

e questo è invece un esempio del file /var/solr/logs/YYYY_MM_DD.request.log regolare. Notare che la richiesta è stata servita correttamente con un codice finale 200:

10.0.0.4 - - [04/Jan/2023:13:42:44 +0000] "GET /solr/dovecot/select?wt=xml&fl=uid,score&rows=21842&sort=uid+asc&q=%7b!lucene+q.op%3dAND%7d(hdr:Dovecot+OR+body:Dovecot)&fq=%2Bbox:8af5d82b9ae 4c94cbe610000364df272+%2Buser:user@mydomain.tld HTTP/1.1" 200 4550

Se invece si ottiene un codice di errore 451 è necessario ricontrollare le autorizzazioni, specialmente riguardo all'account dovecot nel server Solr.

Aggiungi un commento