Installation réalisée sur bulbe.nos-oignons.net le 8 juin 2013.
Une installation sérieuse de Request Tracker nécessite une base de données SQL. On commence donc par mettre en place PostgreSQL.
Installation des logiciels
On installe les paquets Debian :
apt-get install request-tracker4 rt4-db-pgsql
Ensuite, on nous demande quel nom doit avoir l'instance de RT.
rt.nos-oignons.net
semble un bon choix.
On laisse le soin au paquet de gérer les permissions de RT_SiteConfig.pm
.
Pour la base de données, on va aussi demander au paquet de s'en occuper. Il fera ça, très bien.
Une fois l'installation finie, on va déplacer les quelques donnés qui ne sont
dans la base SQL vers /srv
:
mv /var/lib/request-tracker4 /srv
ln -ns /srv/request-tracker4 /var/lib/request-tracker4
Interface web
Parmis les divers modes d'intégration possible avec le serveur web, on va utiliser FCGI. Il faut donc installer le paquet Perl qui va bien :
apt-get install libfcgi-perl
Pour configurer l'accès à l'interface web, on va modifier la
configuration de notre VirtualHost Apache
/etc/apache2/sites-available/default-ssl
pour ajouter :
Include /etc/request-tracker4/apache2-fcgid.conf
La configuration qui s'y trouve par du principe qu'on accède à l'interface via
un chemin en /rt
ce qui est exactement ce que nous voulons.
Par contre, il va falloir modifier dans ce fichier les autorisations pour l'interface mail. À la fin du fichier, on se retrouve avec :
<Location /rt/REST/1.0/NoAuth>
Order Allow,Deny
Allow from 127.0.0.1 ::1
Allow from 91.224.149.171 2a01:6600:8081:ab00::1
</Location>
On peut ensuite se connecter à l'interface web. Yeah. :)
Configuration de base
Pour ajuster les réglages généraux, on
modifie /etc/request-tracker4/RT_SiteConfig.d/50-debconf
. Le fichier
devient :
# THE BASICS:
Set($rtname, 'rt.nos-oignons.net');
Set($Organization, 'nos-oignons.net');
Set($CorrespondAddress , 'rt@nos-oignons.net');
Set($CommentAddress , 'rt-comment@nos-oignons.net');
# THE WEBSERVER:
Set($WebPath , "/rt");
Set($WebDomain , "nos-oignons.net");
Set($WebPort, 443);
Set($WebBaseURL , "https://nos-oignons.net");
Pour regénérer ensuite le fichier de configuration après cette modification, il faut faire :
update-rt-siteconfig
Il faut aussi changer l'URL à laquelle le client en ligne de commande se
connecte. Dans /etc/request-tracker4/rt.conf
:
server https://nos-oignons.net/rt
Interface avec les mails
Request Tracker envoie et reçoit des e-mails. On va donc lui
créer les adresses nécessaires (histoire qu'il puisse ensuite gérer les
bounces). Pour cela, on ajoute dans /etc/aliases
les lignes :
rt: "|/usr/bin/rt-mailgate --queue General --action correspond --url https://nos-oignons.net/rt/"
rt-comment: "|/usr/bin/rt-mailgate --queue General --action comment --url https://nos-oignons.net/rt/"
Ne pas oublier de mettre à jour la version binaire de la base :
newaliases
Filtres anti-spam
/!\ Nous n'utilisons plus spamassassin et sa clique, mais rspamd. /!\
Afin de prémunir RT des spams, il nécessaire de faire analyser les messages à SpamAssassin, de déterminer que faire en fonction des résultats de l'analyse et de disposer d'un mécanisme d'apprentissage pour entraîner les filtres baysiens.
Divers solutions sont présentées sur le wiki de RT.
On va baser notre système sur le fonctionnement du plugin .
Ce dernier ajoute au ticket un attribut SpamReports
lorsque ces
derniers sont du spam. On marquera donc automatiquement les messages
reconnus comme étant du spam avec cet attribut, et on utilisera
également la présence de cet attribut pour identifier les messages à
apprendre.
Il faut s'assurer que le groupe a bien le droit de supprimer les tickets dans la file qui peut recevoir des spams. Ainsi le message passera en état « effacé » lorsqu'on le rapportera comme spam via le bouton ajouté par l'extension ReportSpam.
La procédure d'installation de l'extension est décrite plus bas.
Analyse des messages par SpamAssassin
Afin de faire analyser les messages entrant par SpamAsssasin, on va
utiliser le plugin RT::Interface::Email::Filter::SpamAssassin
. Ce
dernier n'est plus diffusé officiellement avec RT. Plusieurs versions
non-officielles circulent mais aucune n'est compatible avec la nouvelle
interface de RT 4.4. On bricole donc un plugin en
utilisant le hook BeforeDecode
qu'on installera dans
/usr/local/share/request-tracker4/lib/RT/Interface/Email/Filter/SpamAssassin.pm
.
Reste ensuite à configurer le filtre dans
/etc/request-tracker4/RT_SiteConfig.d/10-local-plugins.pm
en
ajoutant :
Set(@MailPlugins, 'Filter::SpamAssassin', 'Auth::MailFrom');
On va aussi indiquer au plugin d'ignorer les messages pour lesquels on
n'a aucun doute. Dans le fichier
/etc/request-tracker4/RT_SiteConfig.d/13-spamassassin.pm
:
Set($RT::SpamAssassinDropThreshold, 5);
Filtrage des messages en fonction du score de SpamAssassin
On va créer un nouveau Scrip
afin de filtrer les messages en fonction
du score de SpamAsssasin. Concrêtement, si le score est suffisant
(supérieur à 2), on marque le ticket comme étant un spam, et on le
le passe en statut résolu.
Les détails :
- Description : 10. Add SpamReports attribute to messages detected as spam
- Condition : On Create
- Action : User Defined
- Template : Blank
- Stage : Normal
Custom action preparation code :
# if no message attachment - assume web UI return 0 unless $self->TransactionObj->Attachments->First; my $spam_level = $self->TransactionObj->Attachments->First->GetHeader('X-Spam-Level'); # exit if there's no spam header return 0 unless $spam_level; return 1 if $spam_level =~ /^\*\*/; return 0;
Custom action commit code :
my $reports = $self->TicketObj->FirstAttribute('SpamReports'); $reports = $reports->Content if $reports; $reports ||= []; push @$reports, 0; # default uid $self->TicketObj->SetAttribute( Name => 'SpamReports', Content => $reports, ); $self->TicketObj->SetStatus('rejected')
Note : Les Scrips sont executés par ordre alphabétique. On peut donc éviter d'envoyer un message de notification pour un message qui a été classé comme spam en s'assurant que les traitements sont faits dans le bon ordre.
Entraînement du filtre baysien
Il est nécessaire de nourrir SpamAssassin de mails légitimes (ham) et de spam afin qu'il puisse affiner ses critères de tri. Pour les mails légitimes, on pendra tous les mails arrivés pour lesquels le ticket est en état « résolu ». Pour les spams, tous les tickets ayant été rapportés comme spam et dont le rapport a été fait par au moins un autre utilisateur de RT que SpamAssassin (uid 0).
Dupliquer les messages reçus
Une fois un message dans la base de données de RT, il n'est plus possible de reconstituer l'original. Afin de pouvoir communiquer les emails à SpamAssassin pour l'apprentissage, on va donc dupliquer tous les messages reçus par RT dans un Maildir dédié.
Pour cela, on commence par créer un compte qui n'aura comme seul et unique but que de recevoir les messages via Postfix :
sudo adduser --system --group --home /srv/rtmailarchive rtmailarchive
On va créer un Maildir pour recevoir les emails :
sudo -u rtmailarchive mkdir -p /srv/rtmailarchive/Maildir/{cur,new,tmp}
sudo chmod 710 /srv/rtmailarchive/Maildir
sudo chmod 700 /srv/rtmailarchive/Maildir/{cur,new,tmp}
Il faut ensuite créer un fichier /srv/rtmailarchive/.procmailrc
pour
configurer la livraison des emails :
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
On peut ensuite modifier /etc/aliases
pour ajouter rtmailarchive
en
copie des messages pris en charge par RT :
rt: rtmailarchive,"|/usr/bin/rt-mailgate --queue General --action correspond --url https://nos-oignons.net/rt/"
rt-comment: rtmailarchive,"|/usr/bin/rt-mailgate --queue General --action comment --url https://nos-oignons.net/rt/"
Il ne faut pas oublier de lancer newaliases
après la modification.
Tri des messages à apprendre
Le script d'apprentissage sort-rtmailarchive-spams sera installé dans
/usr/local/bin
. Ce dernier regarde les messages qui ont été réçus par
le compte rtmailarchive
et pour chacun d'eux, regarde la base de
données de RT afin de déterminer si c'est un ham ou un spam
(selon les critères définis plus haut). Les messages identifiés
sont déplacés dans des dossiers dédiés afin d'entraîner SpamAssassin.
Pour les messages identifiés comme ham, on va également modifier
la base de données pour qu'ils n'apparaissent plus dans la liste des
spams.
Ce script sera executé en tant que rtmailarchive
afin de pouvoir
travailler directement sur les fichiers.
On va donc créer de nouveaux Maildirs pour stocker les messages en attente (on donne accès au groupe pour la phase d'apprentissage) :
sudo -u rtmailarchive mkdir -p /srv/rtmailarchive/Maildir/.{spam,ham}-tolearn/{cur,new,tmp}
sudo chmod 710 /srv/rtmailarchive/Maildir/.{spam,ham}-tolearn
sudo chmod 770 /srv/rtmailarchive/Maildir/.{spam,ham}-tolearn/{cur,new,tmp}
Il faut également donner l'autorisation au compte d'accéder à la base de données :
sudo -u postgres psql rtdb
CREATE ROLE rtmailarchive LOGIN;
GRANT CONNECT ON DATABASE rtdb TO rtmailarchive;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO rtmailarchive;
GRANT UPDATE ON Attributes TO rtmailarchive;
On peut ensuite exécuter le script pour voir s'il fonctionne :
sudo -u rtmailarchive sort-rtmailarchive-spams
Apprentissage par SpamAssassin
Une fois les messages destinés à entraîner SpamAssassin triés dans des
dossiers distincts, l'apprentissage lui-même sera fait par le script
train-rtmailarchive-spams. Ce dernier doit tourner en tant que
debian-spamd
afin de pouvoir toucher à la base de SpamAssassin.
Il est nécessaire de pouvoir lire les messages en attente en tant que
debian-spamd
. On ajoute donc le compte au groupe rtmailarchive
:
adduser debian-spamd rtmailarchive
Reste ensuite à créer un nouveau Maildir où seront conservés les messages après l'apprentissage :
sudo -u rtmailarchive mkdir -p /srv/rtmailarchive/Maildir/.{spam,ham}-learned/{cur,new,tmp}
sudo chmod 710 /srv/rtmailarchive/Maildir/.{spam,ham}-learned
sudo chmod 770 /srv/rtmailarchive/Maildir/.{spam,ham}-learned/{cur,new,tmp}
On peut tester le script via :
sudo -u rtmailarchive train-rtmailarchive-spams
Lancement régulier
Histoire de profiter des capacités d'orchestration de systemd, on définit plusieurs units qui lançeront régulièrement nos deux scripts dans le bon ordre et dans le bon environnement :
- Un timer pour l'éxécution périodique.
- Une cible (target) afin de démarrer nos deux scripts.
- Un service pour chacun des scripts. L'ordre des scripts est assuré
par une directive
After=
.
Le timer dans /etc/systemd/system/train-spamfilters.timer
:
[Unit]
Description=Train spam filters every hour
[Timer]
Unit=train-spamfilters.target
OnBootSec=30m
OnUnitActiveSec=1h
[Install]
WantedBy=timers.target
La cible, dans
/etc/systemd/system/train-spamfilters.target
:
[Unit]
Description=Train spam filters
StopWhenUnneeded=true
Le service pour le script de tri, dans
/etc/systemd/system/sort-rtmailarchive-spams.service
(créer le répertoire) :
[Unit]
Description=Sort hams and spams received by Request Tracker for future
training
Requisite=postgresql@9.6-main.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/sort-rtmailarchive-spams
User=rtmailarchive
Group=rtmailarchive
IOSchedulingClass=idle
[Install]
WantedBy=train-spamfilters.target
Le service pour le script d'apprentissage, dans
/etc/systemd/system/train-rtmailarchive-spams.service
:
[Unit]
Description=Train spam filters using hams and spams received by Request
Tracker
After=sort-rtmailarchive-spams.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/train-rtmailarchive-spams
User=debian-spamd
Group=debian-spamd
IOSchedulingClass=idle
[Install]
WantedBy=train-spamfilters.target
Pour activer tout ça :
systemctl enable sort-rtmailarchive-spams.service train-rtmailarchive-spams.service
systemctl enable train-spamfilters.timer
Et on démarre le timer :
systemctl start train-spamfilters.timer
Le journal enregistrera le déroulement des différents scripts pour nous.
On peut voir que le timer fonctionne bien via :
systemctl list-timers
Extensions
On va installer deux plugins supplémentaires qui nous seront bien utiles :
Pour ça, on va utiliser le CPAN. Comme c'est la première fois, il faut le configurer. Attention, ça se lance avec un compte non privilégié :
cpan
Would you like to configure as much as possible automatically? [yes]
Would you like me to automatically choose some CPAN mirror
sites for you? (This means connecting to the Internet) [yes]
cpan> o conf make_install_make_command '/usr/bin/sudo /usr/bin/make'
cpan> o conf mbuild_install_build_command '/usr/bin/sudo ./Build'
cpan> o conf prerequisites_policy follow
cpan> o conf commit
Ensuite, on peut installer nos modules :
cpan> install RT::Extension::ReportSpam
Path to directory containing your RT.pm: /usr/share/request-tracker4/lib/RT.pm
cpan> install RT::Extension::RepeatTicket
Path to directory containing your RT.pm: /usr/share/request-tracker4/lib/RT.pm
Une fois cela fait, on les active en créant un nouveau
fichier /etc/request-tracker4/RT_SiteConfig.d/10-local-plugins
dans lequel on
met :
Set(@Plugins, qw{RT::Extension::ReportSpam RT::Extension::RepeatTicket});
On regénère une nouvelle fois la configuration :
update-rt-siteconfig