Configurazione di un webserver Debian Sarge

Da Faber Libertatis.

Questa guida tratta della configurazione di un webserver con installato il sistema operativo Debian GNU/Linux "Sarge".

Il webserver trattato ha la peculiarità d'essere quello che ospita, tra le altre cose, il sito dell'Associazione, con tutti i vari servizi (database, posta elettronica, ecc.): naturalmente quanto qui riportato può essere utile come esempio reale da applicare in altri casi.

Indice della pagina

Visione d'insieme

Il server è una macchina virtuale acquistata presso VPScube, con 10GB di disco fisso, 256 MB di RAM e due indirizzi IP. Il software di virtualizzazione utilizzato dal provider è Xen.

Il server è di proprietà di alcuni soci, che l'utilizzano per dei propri scopi privati. All'Associazione è stato però donato dello spazio, sufficiente per allestire il sito nonché tutti i servizi correlati.

Configurazione del sistema operativo

Questa sezione tratta della configurazione del sistema operativo in generale, con il tuning necessario per renderlo sicuro e correttamente utilizzabile.

Utenti

La configurazione standard del server rilasciato da VPScube non prevede un utente diverso da root, per cui la prima attività riguarda la creazione di un utente non di sistema:

# adduser nomeutente

Da segnalare come questo server verrà utilizzato da più persone, per cui progressivamente verranno aggiunti i vari utenti corrispondenti.

Rete

Alla macchina virtuale che ospita il sito dell'Associazione sono stati assegnati due indirizzi IP. Il primo viene attivato in automatico direttamente dal software di virtualizzazione, Xen, mentre il secondo è stato attivato modificando opportunamente il file /etc/network/interfaces:

auto eth0:0
iface eth0:0 inet static
address 194.177.96.xxx
netmask 255.255.254.0

Da notare come il secondo indirizzo IP sia stato definito su un alias, eth0:0, dell'interfaccia di rete primaria, che invece è semplicemente eth0.

Per evitare problemi con i vari programmi, è utile sincerarsi che esista l'opportuna voce relativa all'indirizzo di loopback (il famoso 127.0.0.1 che si riferisce alla macchina stessa):

auto lo
iface lo inet loopback

Se la voce precedente è assente, si provveda ad inserirla, riavviando la rete con

# /etc/init.d/networking restart

Accesso remoto (ssh)

Inizialmente, come detto, è attivo solo l'utente root e pertanto è possibile collegarsi alla macchina utilizzando ssh solo come root. Una volta aggiunto un utente, però, è conveniente disabilitare l'accesso per root, modificando opportunamente il file /etc/ssh/sshd_config affinché vi si trovi scritto:

PermitRootLogin no

Se si suppone inoltre che in futuro servirà poter accedere a delle applicazioni grafiche via tunnel ssh, dev'essere presente nel file citato la seguente riga:

X11Forwarding yes

Ovviamente bisogna poi riavviare ssh, col comando

/etc/init.d/ssh restart

A questo punto l'accesso come root è impedito, mentre è consentito l'accesso all'utente.

Come ulteriore configurazione per ssh, per quanto non propriamente di sistema, è possibile fare in modo che sia possibile accedere ad un dato utente via chiave: l'utente sul server, cioè, deve disporre della chiave pubblica di un client, su cui questa verrà generata nel seguente modo:

ssh-keygen -t dsa -N ''

Questo comando genererà una coppia di chiavi, ~/.ssh/id_dsa (chiave privata) e ~/.ssh/id_dsa.pub (chiave pubblica), con la seconda che dovrà essere integralmente copiata nel file ~/.ssh/authorized_keys2 dell'utente prescelto sul server. Si tenga presente che lo switch -N '' genera una chiave senza password, ma come ulteriore sicurezza è possibile immettere una password, possibilmente diversa da quella dell'utente sul server.

Applicazioni

Bind9

Bind9 è un server DNS molto utilizzato, tuttavia la configurazione predefinita non è sufficientemente sicura, per cui bisogna chrootare il DNS. Si sono utilizzati i consigli presenti sul Bind-Chroot-Howto per Debian.

Installazione di Bind9

Per prima cosa bisogna installare il software necessario:

apt-get install bind9-host bind9 dnsutils

La procedura d'installazione andrà ad aggiungere utente e gruppo bind e ad avviare il servizio named.

Creazione del chroot

Per prima cosa, si spenga il servizio named già attivo:

/etc/init.d/bind9 stop

Il chroot si creerà in /var/lib/named e bind9 dev'essere istruito ad utilizzare questa directory. Per far questo, si provvede a modificare il file /etc/default/bind9 provvedendo ad inserire quanto segue:

OPTIONS="-u bind -t /var/lib/named"

Successivamente si deve creare l'intero albero di directory necessario per il chroot:

mkdir -p /var/lib/named/etc
mkdir /var/lib/named/dev
mkdir -p /var/lib/named/var/cache/bind
mkdir -p /var/lib/named/var/run/bind/run

I file di configurazione generati dall'installazione di default di bind9 devono essere spostati nel chroot:

mv /etc/bind /var/lib/named/etc

Per evitare successivi problemi, si deve creare un link simbolico dalla nuova collocazione verso la vecchia:

ln -s /var/lib/named/etc/bind /etc/bind

Devono essere inoltre creati dei file speciali:

mknod /var/lib/named/dev/null c 1 3
mknod /var/lib/named/dev/random c 1 8

Si devono naturalmente sistemare i permessi delle directory e dei file appena creati:

chmod 666 /var/lib/named/dev/null /var/lib/named/dev/random
chown -R bind:bind /var/lib/named/var/*
chown -R bind:bind /var/lib/named/etc/bind

Infine, affinché vengano intercettati dei messaggi importanti dal logger di sistema, si deve modificare il file /etc/init.d/sysklogd, modificando una riga già esistente affinché riporti:

SYSLOGD="-a /var/lib/named/dev/log"

A questo punto, si può riavviare syslogd e bind9, con quest'ultimo che utilizzerà il chroot:

/etc/init.d/sysklogd restart
/etc/init.d/bind9 start

Definizione delle zone

La configurazione di bind9 è un po' cervellotica, perché fa delle assunzioni un po' strane e, inoltre, i suoi file di configurazione utilizzano delle convenzioni non standard; tuttavia, con un po' di studio e soprattutto di pratica, è possibile configurare a puntino il DNS.

Attenzione: al momento (05/11/2006) le configurazioni seguenti non sono ancora presenti!

Per prima cosa bisogna modificare il file /var/lib/named/etc/bind/named.conf.local affinché includa gli opportuni richiami ai file delle cosidette zone, come da esempio:

zone "faberlibertatis.org" {
        type master;
        file "/etc/bind/faberlibertatis.org";
};

zone "96.177.194" {
        type master;
        file "/etc/bind/96.177.194";
};

Le due zone precedenti sono necessarie allo stesso modo (per quanto la seconda zona, quella numerica, sia utile più che altro per il reverse DNS); si ricordi inoltre che bind è chrootato, per cui dove si legge /etc/bin/nomefile, in verità si deve leggere /var/lib/named/etc/bind/nomefile!

Il primo file di zona, /var/lib/named/etc/bind/faberlibertatis.org, ha la seguente struttura:

$TTL 3D
@       IN      SOA     205-96-177-194.servervirtuali.vpscube.it. root.205-96-177-194.servervirtuali.vpscube.it. (
                        200611051       ; serial
                        86400           ; refresh
                        3600            ; retry
                        604800          ; expire
                        86400 )         ; minimum
                NS      ns1.sevagram.org.
                MX      10      mail.faberlibertatis.org.
                TXT     "Faber Libertatis"

localhost       A       127.0.0.1

mail            A       194.177.96.205
www             A       194.177.96.205
old             A       194.177.96.205
faberlibertatis.org.    A       194.177.96.205

Si rimanda ovviamente all'opportuna documentazione di bind9 per i dettagli del file, comunque i punti salienti, quelli che successivamente potranno essere variati più di frequente, sono:

  • il serial, ovvero un numero composto da anno (2006), mese (11), giorno (05) e un progressivo (1) in modo da determinare quali informazioni sono quelle correttamente aggiornate;
  • il record NS, che indica il DNS server di riferimento;
  • il recordo MX, che indica il mail server di riferimento, cui mandare le mail quando queste sono indirizzate a (esempio) pippo@faberlibertatis.org;
  • i vari record A, ovvero l'associazione tra un nome quale www.faberlibertatis.org ed un indirizzo IP, 194.177.96.205.

Si ricordi che nei file di configurazione di bind quando si deve scrivere un indirizzo completo di dominio bisogna terminare la stringa con un . (ad esempio, faberlibertatis.org.), mentre invece quando si vuole che il nome venga composto col dominio basta evitare di aggiungere il . finale (ad esempio www che viene completato automaticamente in www.faberlibertatis.org).

L'altro file di zona, /var/lib/named/etc/bind/96.177.194, riporta invece le associazioni tra indirizzo IP numerico e indirizzo mnemonico: si noti infatti che il nome del file è il rovesciamento di 194.177.96, ovvero i primi tre segmenti dell'indirizzo IP del server.

$TTL 3D
@       IN      SOA     205-96-177-194.servervirtuali.vpscube.it. root.205-96-177-194.servervirtuali.vpscube.it. (
                        200611051       ; serial
                        86400           ; refresh
                        3600            ; retry
                        604800          ; expire
                        86400 )         ; minimum
                NS      ns1.sevagram.org.
                MX      10      mail.sevagram.org.
                TXT     "Sevagram"

205     PTR     ns1.sevagram.org.
205     PTR     vps.sevagram.org.
205     PTR     mail.sevagram.org.
205     PTR     faberlibertatis.org.
205     PTR     www.faberlibertatis.org.
205     PTR     mail.faberlibertatis.org.
205     PTR     old.faberlibertatis.org.

Questo file è molto simile a quello precedente, infatti le uniche vere differenze sono i tipi di record, in questo caso PTR, che fanno sì che esista anche l'associazione inversa tra l'IP 194.177.96.205 e l'indirizzo mnemonico a scelta.

Ovviamente, alla fine della configurazione delle zone, deve essere riavviato bind col comando:

/etc/init.d/bind9 restart

MySQL

MySQL è uno dei principali database relazionali open source disponibili al momento sul mercato.

Il suo utilizzo in questo caso sarà per due scopi:

  1. gestione delle utenze locali (soprattutto per il mail server);
  2. database per i siti (un database per dominio).

Ovviamente si cercherà di fare in modo che l'installazione MySQL (e soprattutto i dati contenuti nei database) sia sicura.

Installazione di MySQL

L'installazione di MySQL richiede la presenza di un SMTP server, per cui si installerà postfix, per l'appunto un server di posta, la cui installazione e configurazione verrà spiegata più in dettaglio successivamente.

Il comando per procedere con l'installazione è il seguente:

apt-get install mysql-server-4.1 mysql-client-4.1

Ovviamente verranno scaricate anche tutte le dipendenze necessarie. Il server verrà avviato in automatico alla conclusione dell'installazione, eventualmente se serve riavviare si può dare il comando

# /etc/init.d/mysql restart

Inizialmente il server è configurato in un modo poco sicuro, senza alcuna password preimpostata per l'utente amministratore. Per prima cosa bisogna pertanto impostarne una:

# /usr/bin/mysqladmin -u root password 'passwordsegretissima'

quindi è necessario ricaricare le tabelle dei permessi

# /usr/bin/mysqladmin -u root -p reload

A questo punto, dando il comando

# mysql -p

e immettendo la password appena impostata, si dovrebbe accedere al prompt di MySQL.

È possibile configurare un file locale, ~/.my.cnf, affinché sia possibile accedere senza immettere ogni volta la password; il file dovrà avere permessi in lettura e scrittura solo per il proprietario del file. Il contenuto del file è il seguente:

[mysql]
user=root
password=passwordsegretissima

Si dia quindi un

chmod 600 .my.cnf

A questo punto MySQL è praticamente pronto, ci si sinceri che sia in ascolto solo in locale, che è poi l'impostazione predefinita:

netstat -autn | grep LIST | grep 3306
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

Si può ora inizia a creare i database necessari.

Postfix

Postfix è uno dei più utilizzati SMTP server, ovvero quel tipo di software indispensabile per l'invio della posta elettronica. Postfix è molto apprezzato per la sua sicurezza, per la potenza, per la facilità di configurazione e, non ultimo, per l'abbondanza di documentazione ed esempi che lo vedono protagonista.

Installazione di Postfix

L'installazione iniziale di Postfix è banale:

apt-get install postfix

A questo punto verranno richieste un po' di informazioni all'utente:

  1. si indichi come tipo di configurazione Internet Site;
  2. si indichi il nome dell'utente che deve ricevere le e-mail di root;
  3. si indichi il nome con cui il server dev'essere conosciuto (la parte dopo nomeutente@ dell'indirizzo e-mail), ad esempio vps.sevagram.org;
  4. si indichino le destinazioni del server (in questo caso e momentaneamente vps.sevagram.org, sevagram.org, faberlibertatis.org, localhost);
  5. si lasci in stato off l'aggiornamento sincrono della coda di posta.

A questo punto si deve procedere con un po' di tuning.

Configurazione post-installazione di Postfix

La configurazione predefinita di Postfix è abbastanza ben fatta, per cui il tuning da fare è minimo. In particolare, vanno aggiunte le seguenti configurazioni al file /etc/postfix/main.cf:

mailbox_command = procmail -a "$EXTENSION"

Questo permette l'utilizzo dell'utilissimo procmail per lo smistamento della posta degli utenti locali. Si installi quindi procmail e si riavvi Postfix

apt-get install procmail
/etc/init.d/postfix restart

e si facciano dei test d'invio della posta agli utenti locali:

telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 vps.sevagram.org ESMTP Postfix (Debian/GNU)
helo test
250 vps.sevagram.org
mail from: root@localhost
250 Ok
rcpt to: root@localhost
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
Subject: prova

ciao!

.
quit
250 Ok: queued as A3A9AC254
221 Bye
Connection closed by foreign host.

Per controllare la posta ricevuta localmente, s'è installato il magnifico client Mutt:

apt-get install mutt

Lanciando mutt l'utente locale destinatario della posta di root potrà leggere, se non vi sono stati problemi, la mail sopra inviata.

Integrazione di Postfix con MySQL

Normalmente, nei piccoli sistemi, per gestire l'invio della posta è sufficiente modificare opportunamente il file /etc/aliases, con l'unica avvertenza di dare i comandi

postalias /etc/aliases
/etc/init.d/postfix reload

ad ogni modifica. Un normale file di aliases è strutturato nel seguente modo, con l'indirizzo cui inviare l'e-mail a sinistra e l'effettivo destinatario a destra:

# Required aliases
postmaster:     root
MAILER-DAEMON:  postmaster
# Common aliases
abuse:          postmaster
spam:           postmaster
root:           utente

Si noti come la posta di root e quindi anche quella di abuse, spam, MAILER-DAEMON e postmaster, venga tutta rediretta all'utente.

Per un grosso sistema, oppure in caso servano delle configurazioni più spinte, conviene appoggiarsi ad un database, ad esempio MySQL, su cui creare dei virtual user: si vedano ad esempio i consigli presenti nel tutorial ISP-style Email Service with Debian-Sarge and Postfix 2.1.

La prima cosa da fare è la creazione di un database dedicato per la gestione degli utenti di Postfix, cosa che si può fare col comando

mysqladmin -u root -p create virtualmail

Si deve poi creare un utente di MySQL per l'utilizzo, in sola lettura, dell'appena creato database:

mysql -u root -p
grant select on virtualmail.* to virtualmail@localhost identified by 'passwordcrittata';
flush privileges;

A questo punto è possibile procedere con la creazione delle tabelle necessarie, ovvero domains (che contiene l'elenco dei domini gestiti da Postfix), forwardings (che contiene l'elenco degli alias degli indirizzi, praticamente la trasposizione del file /etc/aliases), infine users (con l'elenco degli utenti, con password). Si proceda come segue:

mysql -u root -p virtualmail

CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;

CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;

CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
PRIMARY KEY (email)
) TYPE=MyISAM;
show tables;
desc domains;
desc forwardings;
desc users;

A questo punto, bisogna istruire Postfix affinché provveda ad utilizzare il database MySQL in aggiunta al file /etc/aliases e questa cosa si fa innanzitutto creando quattro file, con proprietario l'utente root e gruppo postfix e permessi in lettura e scrittura per root, ma sola lettura per postfix.

ls -l /etc/postfix/mysql*
-rw-r-----  1 root postfix 148 Nov  5 19:41 /etc/postfix/mysql-virtual_domains.cf
-rw-r-----  1 root postfix 141 Nov  5 19:42 /etc/postfix/mysql-virtual_email2email.cf
-rw-r-----  1 root postfix 154 Nov  5 19:42 /etc/postfix/mysql-virtual_forwardings.cf
-rw-r-----  1 root postfix 211 Nov  5 19:42 /etc/postfix/mysql-virtual_mailboxes.cf

Il file /etc/postfix/mysql-virtual_domains.cf istruisce Postfix su quali sono i domini che deve gestire:

user = virtualmail
password = passwordcrittata
dbname = virtualmail
table = domains
select_field = 'virtual'
where_field = domain
hosts = 127.0.0.1

Il file /etc/postfix/mysql-virtual_email2email.cf serve ad evitare dei problemi in caso di presenza di un indirizzo e-mail in grado di intercettare le e-mail con destinatario sbagliato, cosa che con l'utilizzo delle virtual maps di Postfix rischia di far giungere al suddetto indirizzo tutte le e-mail, comprese quelle con indirizzo corretto:

user = virtualmail
password = passwordcrittata
dbname = virtualmail
table = users
select_field = email
where_field = email
hosts = 127.0.0.1

Il file /etc/postfix/mysql-virtual_forwardings.cf è, come detto, l'analogo del file /etc/aliases:

user = virtualmail
password = passwordcrittata
dbname = virtualmail
table = forwardings
select_field = destination
where_field = source
hosts = 127.0.0.1

Infine, il file /etc/postfix/mysql-virtual_mailboxes.cf presiede alla gestione delle virtual mailbox per gli utenti:

user = virtualmail
password = passwordcrittata
dbname = virtualmail
table = users
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
where_field = email
hosts = 127.0.0.1

In previsione della definizione di varie virtual mailbox per corrispettivi utenti virtuali che non avranno definito un analogo utente locale sul sistema, ci creerà quindi un utente che sarà il proprietario di tutte le virtual mailbox:

groupadd -g 5000 virtualmail
useradd -g virtualmail -u 5000 virtualmail -d /home/virtualmail -m

L'ultimo passo da compiere è infine la riconfigurazione opportuna del file /etc/postfix/main.cf in modo che sia in grado di utilizzare i file appena creati, per cui devono essere inserite le seguenti righe:

### mysql
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/virtualmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

A questo punto si riavvia Postfix

/etc/init.d/postfix restart

e l'integrazione con MySQL (senza però ancora dati) è conclusa.

Antispam senza l'uso di filtri esterni

Esistono dei metodi che permettono un minimo di protezione dallo spam senza necessitare di filtri esterni quali spamassassin.

Basta inserire queste righe in /etc/postfix/main.cf

disable_vrfy_command = yes
# disabilita il comando VRFY, che permetterebbe ad uno spammer di capire
# in anticipo quali sono le caselle e-mail valide

smtpd_helo_required = yes
# richiede che il client si identifichi con un comando HELO o EHLO

smtpd_client_restrictions =
  permit_mynetworks, 
  reject_rbl_client relays.ordb.org,
  reject_rbl_client list.dsbl.org,
  reject_rbl_client sbl.spamhaus.org,
  reject_rbl_client cbl.abuseat.org,
  reject_rbl_client dul.dnsbl.sorbs.net,
  reject_rbl_client bl.spamcop.net,
  permit
# un po' di controlli su varie blacklist

smtpd_sender_restrictions = reject_unknown_sender_domain
# non accetta mail da un dominio inesistente
Il primo morto

Ecco il primo morto ;-)

Nov 14 19:51:50 vps postfix/smtpd[9751]: connect from 200-153-129-206.dsl.telesp.net.br[200.153.129.206]
Nov 14 19:51:50 vps postfix/smtpd[9751]: NOQUEUE: reject: RCPT from 200-153-129-206.dsl.telesp.net.br[200.153.129.206]:
  554 Service unavailable; Client  host [200.153.129.206] blocked using list.dsbl.org; http://dsbl.org/listing?200.153.129.206;
  from=<deborahsp@calinvestmentfund.com> to=<faber- -AT- -faberlibertatis.org> proto=ESMTP helo=<thiago-bbc47a62>
Nov 14 19:51:51 vps postfix/smtpd[9751]: lost connection after DATA from 200-153-129-206.dsl.telesp.net.br[200.153.129.206]
Nov 14 19:51:51 vps postfix/smtpd[9751]: disconnect from 200-153-129-206.dsl.telesp.net.br[200.153.129.206]

Greylisting

Si veda Greylisting: Postfix con Postgrey

Integrazione antispam e antivirus in Postfix

... lavori in corso ...

Dovecot

Dovecot è un potente POP3/IMAP server, semplice da configurare.

... lavori in corso ...

Apache 2

Apache è il principale server HTTP, secondo le famose statistiche di Netcraft. Per questo server, poiché fornirà anche contenuto accedibile via browser, si utilizzerà la versione 2 di Apache, con le opportuni estensioni (per PHP4, soprattutto).

Installazione di Apache 2

L'installazione di Apache è banale, in quanto è sufficiente dare il seguente comando, che scaricherà anche le necessarie dipendenze:

apt-get install apache2-mpm-prefork apache2-utils

Da notare ch'è possibile decidere se avviare o meno Apache impostando in modo opportuno la variabile NO_START nel file /etc/default/apache2.

Configurazione di Apache 2

Poiché si hanno a disposizione solo due indirizzi IP, mentre invece i siti che dovranno essere attestati su Apache dovranno essere più di due, si devono utilizzare i VirtualHost. Gli esempi sotto riportati si riferiscono solo ad un IP, ma ovviamente vanno ripetuti anche per l'altro.

Per cominciare, bisogna configurare il file /etc/apache2/ports.conf affinché Apache ascolti all'indirizzo IP prescelto con le porte necessarie, l'80 per l'http e la 443 per l'https (http sicuro):

Listen 194.177.96.205:80
Listen 194.177.96.205:443

Si modificherà quindi il file /etc/apache2/apache2.conf in modo da istruire Apache sul fatto che si utilizzeranno per l'IP e le porte specificate i VirtualHost col riconoscimento tramite il nome utilizzato (l'indirizzo immesso nel browser, per intenderci):

NameVirtualHost 194.177.96.205:80
NameVirtualHost 194.177.96.205:443

Si può a questo punto riavviare Apache, ignorando eventuali errori sui VirtualHost mancanti, perché verranno configurati in seguito:

/etc/init.d/apache2 restart

Installazione di moduli aggiuntivi per Apache 2

Al momento attuale, Apache è in grado di fornire praticamente solo pagine HTML statiche, mentre invece l'obiettivo è di fornire pagine dinamiche scritte con vari linguaggi di programmazione web oriented.

Si installa quindi sia il modulo PHP4 che il modulo Perl:

apt-get install libapache2-mod-perl2 libapache2-mod-php4

Ovviamente il comando succitato scaricherà ed installerà anche le dipendenze necessarie.

Un minimo di hardening

E' meglio dare il minor numero di informazioni possibili ad un attaccante... ad esempio possiamo nasconderli la versione del server e dei moduli installati con le direttive

ServerSignature Off
ServerTokens Prod

Squirrelmail

Mailman

Mailman è un noto software di gestione delle mailing list, con un supporto anche per i virtualhost, per quanto l'implementazione non sia banalissima.

Per installarlo

apt-get install mailman listadmin

In fasi di configurazione indicare per quali lingue serve il supporto: selezionare en ed it, selezionando quest'ultimo come linguaggio predefinito.

Inizialmente mailman non s'avvia, perché ha bisogno di una prima lista amministrativa, che si può generare invocando il comando:

newlist mailman

A questo punto basta seguire le istruzioni, indicando il nome del gestore della lista (ad esempio root@nomemacchina) e la password iniziale. Bisogna inserire in /etc/aliases le seguenti definizioni

## mailman mailing list
mailman:              "|/var/lib/mailman/mail/mailman post mailman"
mailman-admin:        "|/var/lib/mailman/mail/mailman admin mailman"
mailman-bounces:      "|/var/lib/mailman/mail/mailman bounces mailman"
mailman-confirm:      "|/var/lib/mailman/mail/mailman confirm mailman"
mailman-join:         "|/var/lib/mailman/mail/mailman join mailman"
mailman-leave:        "|/var/lib/mailman/mail/mailman leave mailman"
mailman-owner:        "|/var/lib/mailman/mail/mailman owner mailman"
mailman-request:      "|/var/lib/mailman/mail/mailman request mailman"
mailman-subscribe:    "|/var/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe mailman"

e lanciare newaliases, in modo che postfix sappia indirizzare a mailman le mail a lui indirizzate. A questo punto si può avviare mailman

/etc/init.d/mailman start

e andare a vedere la mail arrivata.

Integrazione di mailman in Apache 2

Mailman utilizza una comoda interfaccia web, che però ha degli indirizzi spiacevolmente lunghi. Per renderli più umani, è possibile modificare la direttiva di Apache che punta a mailman.

ScriptAlias /mailman/ /usr/lib/cgi-bin/mailman/

Bisogna tuttavia modificare /etc/mailman/mm_cfg.py per correggere le seguenti variabili:

DEFAULT_URL_PATTERN = 'https://%s/mailman'
PRIVATE_ARCHIVE_URL = '/mailman/private'

Si verifichi inoltre che effettivamente sia stata impostata la lingua preferita:

DEFAULT_SERVER_LANGUAGE = 'it'

Ci si ricordi di inserire in Apache anche le seguenti due direttive:

Alias /images/mailman/ /usr/share/images/mailman/
Alias /pipermail/ /var/lib/mailman/archives/public/

La prima serve al caricamento delle immagine predefinite di mailman, mentre la seconda punta agli archivi delle liste.

Tuttavia la modifica di cui sopra, seguita ovviamente da un

/etc/init.d/apache2 restart

non è sufficiente a far digerire a mailman la nuova sintassi dell'URL, perché la lista mailman creata inizialmente possiede nella sua configurazione dei puntamenti statici ai vecchi URL! Bisogna pertanto lanciare un comando proprietario di mailman:

/usr/lib/mailman/bin/withlist -l -r fix_url mailman

A questo punto gli URL sono corretti.

Esempio completo di configurazione per Virtual Host Apache 2 di Mailman

Per motivi legati all'utilizzo di Suexec, che si è verificato essere incompatibile con l'allestimento di mailman del server, è necessario slegare il pannello di Mailman dai Virtual Host normali, creandone uno specifico ad hoc, col suffisso lists.

Come esempio, si riporta il completo /etc/apache2/sites-available/lists.faberlibertatis.org:

<VirtualHost lists.faberlibertatis.org:80>
        ServerAdmin webmaster@lists.faberlibertatis.org
        ServerName lists.faberlibertatis.org
        ServerAlias lists.*
        DocumentRoot /var/www/faberlibertatis.org/lists

        RewriteEngine on
        RewriteCond %{SERVER_PORT} !443 [NC]
        RewriteRule ^/(.*)$ https://lists.faberlibertatis.org/$1 [R=301,NC,L]

        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/faberlibertatis.org/lists>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /mailman/ /usr/lib/cgi-bin/mailman/
        Alias /images/mailman/ /usr/share/images/mailman/
        Alias /pipermail/ /var/lib/mailman/archives/public/

        <Directory "/usr/lib/cgi-bin/mailman">
                AllowOverride None
                Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        Alias /cgi-bin/mailman/ /mailman/

        ErrorLog /var/log/apache2/lists.faberlibertatis.org-error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/lists.faberlibertatis.org-access.log combined
        ServerSignature Off

</VirtualHost>

Integrazione di Mailman con Postfix

... Lavori in corso ...

Modificare /etc/mailman/mm_cfg.py per rendere presente la seguente variabile:

MTA = 'Postfix'

A questo punto bisogna inizializzare gli alias di mailman:

cd /var/lib/mailman
bin/genaliases

Bisogna quindi assegnare gli alias così generati all'utente list di gruppo daemon:

cd /var/lib/mailman
chown list:daemon data/aliases*

Bisogna quindi modificare le direttive alias_maps e virtual_alias_maps di Postfix, nel file /etc/postfix/main.cf:

alias_maps = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases
virtual_alias_maps = hash:/var/lib/mailman/data/virtual-mailman,
                     mysql:/etc/postfix/mysql-virtual_forwardings.cf,
                     mysql:/etc/postfix/mysql-virtual_email2email.cf

In relazione alla direttiva virtual_alias_maps, bisogna sincerarsi che non vi siano riferimenti diretti alle liste nel database MySQL, perché così facendo si lascia fare tutto all'integrazione di Mailman con Postfix. Ci si ricordi solo di dare il comando

postmap /var/lib/mailman/data/virtual-mailman

qualora si modificasse il file sopra indicato.

Da ricordarsi di ricaricare Postfix ad ogni aggiunta/rimozione di liste:

/etc/init.d/postfix reload

Predisposizione di mailman per i virtual domain di Postfix

... Lavori in corso ...

Questa funzionalità predispone all'utilizzo dei virtual domain di Postfix (ed ai virtual host di Apache).

I virtual domain vengono gestiti da mysql.

Inserire in /etc/mailman/mm_cfg.py la seguente variabile, che elenca i domini gestiti da mailman via Postfix.

POSTFIX_STYLE_VIRTUAL_DOMAINS=['lists.sevagram.org', 'lists.faberlibertatis.org']

In questo modo i dati andranno posizionati in /var/lib/mailman/data/virtual-mailman.

Configurazione del webserver

Questa parte tratta della configurazione più applicativa, nel senso di configurazione atta a definire e a rendere fruibili i siti, gli indirizzi di posta, ecc.

Si prenderà un dominio come esempio, ma poi ovviamente tutto quanto può essere replicato per altri domini.

Configurazione del sito in Apache2

Permessi e Directory per i Virtual Host

Directory

Si è deciso di posizionare i virtual host con questa struttura directory:

/var/www/virtualhost/subvirtualhost

Ad esempio, il sito principale di faberlibertatis.org risiede sotto

/var/www/faberlibertatis.org/www

mentre il vecchio sito, raggiungibile a http://old.faberlibertatis.org risiede in

/var/www/faberlibertatis.org/old

In origine l'idea era di utilizzare /home/www come spazio per i siti, ma l'utilizzo di suexec risulta essere pienamente fattibile solo posizionando le DocumentRoot dei VirtualHost in /var/www, causa compilazione statica del pacchetto Debian.

Permessi

E' stato creato un gruppo www-* per ogni utilizzatore del server, e un utente per ogni dominio gestito. Ad esempio, il dominio faberlibertatis.org, gestito da Manu, ha il seguente proprietario:

# ls -l /var/www/ | grep faberlibertatis.org
drwxr-s---  4 faberlibertatis www-manu 4096 Nov  9 02:08 faberlibertatis.org

Ai gruppi www-* verranno in seguito applicate delle quote.

Dati i permessi qui indicati, bisognerà assegnare l'utente con cui gira Apache 2, ovvero www-data ai vari gruppi:

# adduser www-data www-manu
# groups www-data
www-data: www-data www-manu

PHP Safe Mode

L'engine PHP è stato abilitato in modalità "safe", che consente agli script php di accedere solamente ai file il cui owner (UID) è uguale a quello dello script stesso. Questo evita che un utente smaliziato crei uno script che possa accedere a file di altri utenti web.

Non è molto difficile abilitare la "safe mode", ma è necessario conoscere approfonditamente quello che ciò comporta. Infatti, la "safe mode" non solo interdisce l'accesso a determinati file, ma modifica l'uso di alcune syscall. Ad esempio sarà possibile eseguire solo i comandi esterni residenti in una determinata directory.

Per abilitare la "safe mode" è necessario apportare le seguenti modifiche al file /etc/php4/apache2/php.ini

safe_mode = On
; abilita la modalità safe
safe_mode_gid = Off
; se safe_mode_gid fosse abilitato i controllo sarebbero "rilassati". infatti si confronterebbero i GID anzichè gli UID
safe_mode_include_dir = "/usr/share/phpmyadmin/"
; questo dice a php di fregarsene dei proprietari se gli script risiedono in una cartella indicata.
safe_mode_exec_dir = 
; specifica la directory in cui risiedono i comandi esterni che possono essere chiamati da script php.
; lasciando vuoto non sarà possibile chiamare nessun comando esterno (o di sistema)
safe_mode_allowed_env_vars = PHP_
; spefifica i prefissi delle variabili env che possono essere modificate o create da uno script che usi la famiglia di funzioni putenv()
safe_mode_protected_env_vars = LD_LIBRARY_PATH
; specifica quali variabili env non possono essere toccate
disable_functions =
; si può disabilitare l'uso di alcune funzioni inserendole qui
disable_classes =
; si può disabilitare l'uso di alcune classi inserendole qui

a questo punto riavviamo apache

# /etc/init.d/apache2 restart

Uso di MediaWiki

MediaWiki, con il file LocalSetting.php, cerca di sovrascrivere il parametro php memory_limit a 20M.

PHP in "safe mode" inibisce l'uso di tale funzione, quindi se si pensa di utilizzare mediawiki in un proprio sito si può chiedere agli amministratori di portare memory_limit a 20M per la cartella in cui risiede MediaWiki.

Gli amministratori inseriranno quindi le seguenti righe nel file di configurazione del virtual host

<Directory /var/www/faberlibertatis.org/www/w>
    # /var/www/faberlibertatis.org/www/w è la cartella dove risiede MediaWiki
    php_value "memory_limit" "20M"
</Directory>

Abilitazione del sito all'HTTPS

Per consentire un po' di sicurezza, è opportuno attivare dei siti col supporto al protocollo HTTPS, che consente la crittazione della comunicazione tra client e server, quest'ultimo riconosciuto da un certificato.

Per un limite di Apache, non è possibile creare tanti certificati quanti sono i Virtual Host, perché in ogni caso verrà utilizzato il certificato caricato per primo.

Posizionandosi nella directory /etc/apache2/ssl è possibile lanciare il comando

apache2-ssl-certificate -days n

dove n è il numero di giorni per cui si vuol mantenere in vigore il certificato. Dopo un nutrito numero di domande cui è abbastanza semplice rispondere, verrà creato un file apache.pem che dovrà essere caricato dai vari Virtual Host con le seguenti direttive:

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.pem
SSLOptions +StdEnvVars +StrictRequire

Per convenienza, queste direttive possono essere poste in un file di configurazione di Apache che replica quello del protocollo HTTP, ma con l'estensione -ssl; ovvero a fronte del file /etc/apache2/sites-available/www.faberlibertatis.org abilitato all'esclusiva gestione del protocollo HTTP, vi sarà anche il file /etc/apache2/sites-available/www.faberlibertatis.org-ssl dedicato al protocollo HTTPS ed in cui sono incluse le direttive citate poc'anzi. Naturalmente nel file che presiede al caricamento del Virtual Host in HTTPS sarà necessario correggere la direttiva d'apertura:

<VirtualHost www.faberlibertatis.org:443>
 ...
</VirtualHost>

Per concludere, si verifichi che la porta 443 sia tra quelle abilitate in ascolto per Apache 2, come dal seguente esempio di direttive incluse nel file /etc/apache2/ports.conf:

Listen 194.177.96.205:443

Si riavvi infine il server Apache 2 per caricare la definizione del Virtual Host in HTTPS:

/etc/init.d/apache2 restart

Si ricordi comunque della limitazione di Apache 2 nella gestione dei certificati con i Virtual Host, ovvero che tutti i domini in HTTPS avranno il certificato SSL con la descrizione riferentesi al primo certificato caricato, che a questo punto si consiglia di creare con il nome della macchina.

Attivazione di mailman

Mailman consente il supporto dei virtualhost, ma non facilmente.

... da scrivere ...

/usr/lib/mailman/bin/withlist -l -r fix_url nomelista -u dominio.tld