Indicizzare le e-mail con Solr FTS Engine

21 aprile 2022 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.

Installazione

Solr è un servlet java che richiede jdk v. 8 o successivo. E' necessario accertarsi che l'eseguibile java sia nel path:

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

Scaricare i binari di Solr e installare

cd /usr/local/src
wget https://www.apache.org/dyn/closer.lua/lucene/solr/8.11.1/solr-8.11.1.tgz?action=download -O solr-8.11.1.tgz

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

tar xzf solr-8.11.1.tgz solr-8.11.1/bin/install_solr_service.sh --strip-components=2
sudo bash ./install_solr_service.sh solr-8.11.1.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/dovecot/install_solr_slackware.sh
./install_solr_slackware.sh solr-8.11.1.tgz

Configurazione

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

Ho abilitato le seguenti opzioni. La prima consente la connessione dalla mia DMZ:

SOLR_IP_WHITELIST=127.0.0.1, 10.0.0.0/24
SOLR_SECURITY_MANAGER_ENABLED=true

A questo punto la documentazione ufficiale di Dovecot raccomanda di sostituire alcuni file di configurazione:

cd /var/solr/data/dovecot/conf
rm -f schema.xml managed-schema solrconfig.xml
wget https://raw.githubusercontent.com/dovecot/core/master/doc/solr-config-7.7.0.xml -O solrconfig.xml
wget https://raw.githubusercontent.com/dovecot/core/master/doc/solr-schema-7.7.0.xml -O schema.xml
chown solr:solr solrconfig.xml schema.xml

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

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 (ricordarsi di modificare anche il proprio rc.local)

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

Plugin Dovecot

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.

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

Abilitare il plugin dal file 20-imap.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=https://solr.mydomain.tld:8983/solr/dovecot/

...
}

Apache control panel

Le impostazioni generali del server sono disponibile 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.mydmain.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 dashpord 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 definisca 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. Questo è il mio setup:

Ho lasciato disabilitato TLSperchè la connessione tra il proxy di apache e il server Solr è via http.

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

Aggiungi un commento