[L]ash in BackGround

Postfix + Mysql + TLS + Saslauth [Sarge]

with 6 comments

Qualche appunto su come mettere su un sistema di posta con virtual domain su mysql, connessioni crittate e autenticazione.
Il tutto ovviamente su Debian Sarge

I pacchetti che ci servono sono: postfix postfix-tls postfix-mysql mysql-client mysql-server sasl2-bin libsasl2-modules pam-mysql

Iniziamo creando il databse con le tabelle che ci servono su mysql:

CREATE DATABASE mailserver;

#
# Table structure for table alias
#
USE mailserver;
CREATE TABLE alias (
address varchar(255) NOT NULL default '',
goto text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (address)
) TYPE=MyISAM;

#
# Table structure for table domain
#
USE mailserver;
CREATE TABLE domain (
domain varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
aliases int(10) NOT NULL default '0',
mailboxes int(10) NOT NULL default '0',
maxquota int(10) NOT NULL default '0',
transport varchar(255) default NULL,
backupmx tinyint(1) NOT NULL default '0',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (domain)
) TYPE=MyISAM;

#
# Table structure for table mailbox
#
USE mailserver;
CREATE TABLE mailbox (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
maildir varchar(255) NOT NULL default '',
quota int(10) NOT NULL default '0',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (username)
) TYPE=MyISAM;

Ora creiamo l’utente che dovrà accedere al db:

GRANT insert,update,select ON mailserver.* TO mailuser@127.0.0.1 IDENTIFIED BY 'password'

Bisogna creare i file di configurazione di postfix per accedere a mysql, mettiamoli in /etc/postfix/mysql/

virtual_alias_maps.cf

user = mailuser
password = password
hosts = 127.0.0.1
dbname = mailserver
table = alias
select_field = goto
where_field = address

virtual_domains_maps.cf

user = mailuser
password = password
hosts = 127.0.0.1
dbname = mailserver
table = domain
select_field = domain
where_field = domain
# la direttiva 'additional_conditions' permette di aggiungere delle clausole
# alla ricerca all'interno del database, nel caso seguente (che consiglio di non
# decommentare, richiede che la il dominio non sia di backup e che sia attivo.
#additional_conditions = and backupmx = '0' and active = '1'

virtual_mailbox_maps.cf

user = mailuser
password = password
hosts = 127.0.0.1
dbname = mailserver
table = mailbox
select_field = maildir
where_field = username
#additional_conditions = and active = '1'

virtual_mailbox_limit_maps.cf

user = mailuser
password = password
hosts = 127.0.0.1
dbname = mailserver
table = mailbox
select_field = quota
where_field = username
#additional_conditions = and active = '1'

relay_domains_maps.cf

user = mailuser
password = password
hosts = 127.0.0.1
dbname = mailserver
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '1'

Ora che abbiamo finito di trafficare con query e sql passiamo a configurare saslauthd e pam per l’autenticazione.
Bisogna creare i file /etc/postfix/sasl/smtpd.conf e /etc/pam.d/smtp :

smtpd.conf

pwcheck_method: saslauthd
mech_list: plain login

smtp

auth required pam_mysql.so user=mailuser passwd=password host=127.0.0.1 db=mailserver table=mailbox usercolumn=username passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mailuser passwd=password host=127.0.0.1 db=mailserver table=mailbox usercolumn=username passwdcolumn=password crypt=1

Ora visto che postfix gira in un chroot dobbiamo fare in modo che possa vedere il soket creato da saslauth:
Creiamo la cartella per saslauthd all’interno del chroot postfix:

mkdir -p /var/spool/postfix/var/run/saslauthd

facciamo in modo che appartenga al gruppo sasl:

chgrp sasl /var/spool/postfix/var/run/saslauthd

e aggiungiamo l’utente postfix al gruppo sasl:

addgroup postfix sasl

rimuoviamo la cartella /var/run/saslauthd/ e al suo posto creiamo un collegamento a /var/spool/postfix/var/run/saslauthd/ :

rm -r /var/run/saslauthd/
ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd

Come ultima cosa dobbiamo editare il file /etc/default/saslauthd, bisogna decommentare:

#START=yes

il meccanismo di autenticazione deve essere pam:

MECHANISMS="pam"

e aggiungiamo:

PARAMS="-r"

in questo modo verrò considerato in sede di autenticazione non solo l’username ma anche il dominio cosi da non creare conflitti.
Possiamo ora riavviare saslauthd:

/etc/init.d/saslauthd restart

Ultima cosa da fare prima di configurare postfix è creare l’utente vmail, che sarà l’utente proprietario di tutte le mail dei nostri virtual domain, che saranno memorizzate in /var/spool/mail/vmail

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/spool/mail/vmail -m

per sicurezza ho anche dato:

passwd -l vmail

che impedisce all’utente vmail di loggarsi e gli ho messo come bash: /bin/false nel file /etc/passwd

E’ giunta l’ora di configurare postfix!!!!!!!!!!
Aggiungiamo al file /etc/ppostfix/main.cf:

virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf

# vengono assegnate all'utente che gestirà e mailbox un uid e gid statici
# cosa da evitare di dover creare un utente reale per ogni utente virutale
virtual_gid_maps = static:5000
virtual_uid_maps = static:5000

# questa direttiva indica dove verranno collocate le mailbox virtuali
virtual_mailbox_base = /var/spool/mail/vmail

# indica con quale backend (mysql) e dove trovare la lista dei domini gestiti
# dal server
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_domains_maps.cf
virtual_mailbox_limit = 51200000

# indica in quale file di configurazione sono presenti i parametri per ottenere la
# lista delle mailbox presenti nel sistema
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf
virtual_minimum_uid = 5000
virtual_transport = virtual

# Per la gestione delle quote delle mailbox
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
# dove trovare i limiti di dimensione della mailbox e come comportarsi
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes

# indica i domini per cui il server deve accettare la posta in ingresso
relay_domains = mysql:/etc/postfix/mysql/relay_domains_maps.cf

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_option = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient

smtpd_use_tls = yes
smtpd_tls_cert_file = /path/chiavi/ssl/certificato.key
smtpd_tls_key_file = /path/chiavi/ssl/chiave.key
smtpd_tls_auth_only = yes
smtpd_tls_loglevel = 2
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Queste aggiunte le ho fatte al file che l’installazione mette di default scegliendo all’installzione “Solo locale”
Nello stesso file vanno ancora modificati due valori:

myhostname = pippo.esempio.it

dove pippo.esempio.it è un FQDN valido; e aggiungere il vostro ip esterno a

inet_interfaces = 127.0.0.1, ipesterno

L’ultima modifica da fare è decommentare in /etc/postfix/master.cf:

tlsmgr fifo - - n 300 1 tlsmgr
smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

Ora possiamo riavviare postfix!!!!!!!!!!!!!!!!!!!!!!!!

/etc/init.d/postfix restart

Il nostro server di posta ora è attivo e funzionante!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Nel riempire il database bisogna tenere conto che l’autenticazione viene fatta da pam quindi il record password va riempito con la password crittografata con la funzione crypt; php, perl, python dovrebero avere una funziona apposita, oppure scrivete un programmino in C.

Link:
http://guide.debianizzati.org/index.php/Postfix-mysql
http://www.howtoforge.com/virtual_postfix_mysql_quota_courier

Annunci

Written by lashbg

gennaio 17, 2007 a 22:28

Pubblicato su Debian, Howto, Linux

Tagged with , , , ,

6 Risposte

Subscribe to comments with RSS.

  1. avrei solo una domanda… nel database come riempio i campi??? cioè a cosa servono tutte quelle voci, come le usa postfix?
    grasie

    gecko

    agosto 7, 2007 at 18:09

  2. puoi usare phpmyadmin che è un interfaccia web a mysql o usare postfixadmin che è un interfaccia web scritta in php che ti permette di creare domini, email, alias in modo molto semplice; ti consiglio di usare quest’ultimo.

    il nome dei vari campi è abbastanza esplicativo di quello che deve contenere, magari fai qualche dominio con postfixadmin e poi vai a vedere cosa ha riempito; perché a spiegarli tutti diventa lunga :)

    Ciao

    lashbg

    agosto 11, 2007 at 12:08

  3. :D si,grazie sapevo phpmyadmin è uno strumento che uso già da tempo, volevo solo sapere le singole voce che ruolo avessero per postfix, cioè l’username deve contenere anche @dominio? e perchè esiste un campo dominio allora? cosa server specificare la maildir, non si può fare una substring e concatenazione di stringhe direttamente in query per recuperare dal campo ‘username’ (del tipo user@dominio) e trasformarlo in /dominio/user ?

    gecko

    agosto 13, 2007 at 15:56

  4. qualcosa così:

    select_field = CONCAT(SUBSTRING_INDEX(email,’@’,-1),’/’,SUBSTRING_INDEX(email,’@
    ‘,1),’/’)

    gecko

    agosto 13, 2007 at 15:57

  5. esiste una parte dedicata solo al dominio perchè cosi puoi gestire alcuni aspetti solo del dominio, come se abilitarlo o meno o il numero massimo di alias o email; anche se questi ultimi due non sono strettamente legati a postfix. Credo che il dominio sia presente anche nell’indirizzo per sveltire le ricerche visto che comunque uno si logga con user@dominio. Per quanto riguarda la maildir, non conosco come funzioni postfix internamente ma non credo proprio che si posso inserire una query nel campo select_field e generare dinamicamente la maildir; dovresti provare :)
    Io non sono un grande esperto di postfix, se vuoi sapere le scelte tecniche che hanno portato a questa struttura per il db ti conviene chiedere nella mailing di sviluppo.
    Ciao

    lashbg

    agosto 18, 2007 at 11:04

  6. ho appena visto qui:
    http://workaround.org/articles/ispmail-etch/
    che al posto di dirgli quali sono i campi da a postfix direttamente la query da usare, ma gai può esserti utile.

    Ciao

    lashbg

    agosto 18, 2007 at 11:08


Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...