Mail Server Sicuro con Postfix: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
mNessun oggetto della modifica
 
(11 versioni intermedie di 5 utenti non mostrate)
Riga 1: Riga 1:
{{Versioni compatibili|Lenny|Squeeze|Wheezy}}
== Introduzione ==
Con questa guida intendo spiegare all'utente Debian come configurare un server mail basato su Postfix (http://www.postfix.org).
Postfix è un MTA abbastanza sicuro e di recente sviluppo, molto semplice da usare e per alcuni è considerato il successore di Sendmail per altro troppo complicato da gestire e con noti problemi di sicurezza.
== Installazione di Postfix ==
Prima di tutto abbiamo bisogno di due demoni: uno per la gestione del protocollo POP3 e uno per l'IMAP. Io consiglio ''popa3d'' e ''imapd''
<pre>
# apt-get update
# apt-get install popa3d uw-imapd
</pre>
fatto questo in <code>/etc/inetd.conf</code> verranno aggiunti i servizi per il POP3 e l'IMAP.
Procediamo all'installazione dell'MTA vero e proprio:
<pre>
<pre>
#!/bin/bash
# apt-get install postfix
##
</pre>
clear
 
##
== Configurazione base ==
####################
Quasi tutte le opzioni di configurazione di Postfix si trovano nel file <code>/etc/postfix/main.cf</code>.
VERSION="2003.06.11"
 
####################
Ecco i principali tag a cui conviene prestare attenzione:
##
 
## Interfaccia interna fidata 'settare la propria'
* <code>'''myhostname'''</code>: valore indica il nome che assumerà il vostro server mail (es: mail.nomedominio.it);
IIF="eth0"
* <code>'''myorigin'''</code>: valore indica il dominio usato per la posta inviata dal server, può essere anche un file che contiene il nome del dominio, es: /etc/mailname;
# IIF="eth1"
* <code>'''mydestination'''</code>: localhost, altri_valori indicano i domini che il server dovrà riconoscere come locali e che smisterà internamente;
##
* <code>'''mydomain'''</code>: valore indica il dominio a cui appartiene il server;
## Interfaccia esterna da proteggere 'settare la propria'
* <code>'''relayhost'''</code>: valore indica a quale server inoltrare le mail che non si riconoscono come locali;
## in genere l'interfaccia esterna e' configurata da un DHCP quindi ha indirizzo dinamico.
* <code>'''mailbox_size_limit'''</code>: <code>0</code> indica la dimensione massima delle caselle mail, <code>0</code> per nessun limite;
EIF="ppp0"
* <code>'''mynetworks'''</code>: valore altri_valori indica le reti nelle quali il server deve operare (es. 127.0.0.1/8 192.168.0.1/24);
# EIF="eth0"
* <code>'''mynetworks_syle'''</code>: <code>host/subnet/class</code>.
# EIF="eth1"
## Se l'interfaccia esterna ha un IP statico, dichiararlo
# EIP="xx.xx.xx.xx"
##
## Indirizzo macchina router (si presume che il firewall giri sulla macchina router
## in caso contrario correggere manualmente questo indirizzo)
##
## Se preferite utilizzare un indirizzo statico, decommentate la linea che indica un IP
## altrimenti se utilizzate un DHCP o non conoscete l'indirizzo
## usate il riconoscimento tramite ifconfig
## controllare comunque che lo script riconosca l'indirizzo IP (potrebbe non andare su macchine che
## utilizzano shell particolari o che formattano ifconfig diversamente.
##
SERVER=` ifconfig $IIF | grep inet | cut -d : -f2 | cut -d ' ' -f1`
# SERVER="192.168.10.2"
##
## Indirizzo macchina client da inserire a mano, se il server condivide la connessione
## internet, questa macchina sar� autorizzata ad accedere al firewall via eth0
## al posto di un singolo host e' possibile utilizzare una rete intera usando
## la notazione RETE/NETMASK
## attenzione alla banda disponibile perch� una rete genera parecchio traffico..;)
CLIENT="10.22.115.11"
# CLIENT"192.168.10.0/24"
##
## Loopback
LOCALHOST="127.0.0.1"
##
## Rete interna
## controllare che gli script ottengano i valori corretti
## o sostituire con valori statici.
net=` ifconfig $IIF | grep inet | cut -d : -f2 | cut -d ' ' -f1 | cut -d . -f1,2,3`
mask=` ifconfig $IIF | grep inet | cut -d : -f4 | cut -d ' ' -f1`
LOCALNET="$net.0/$mask"
##
## Broadcast
BROADCAST=` ifconfig $IIF | grep inet | cut -d : -f3 | cut -d ' ' -f1`
##
## Provider1 DNS 'inserire i propri dns'
# DNS1="212.216.172.62"
DNS1="195.130.224.18"
##
## Provider2 DNS
#DNS2="195.130.224.18"
DNS2="192.160.10.31"
##
## Local DNS
DNS3="212.245.255.2"
## questo potrebbe essere il DNS locale, in seguito sara' prevista la configurazione
## per il funzionamento di un dns locale.
##
## Per qualunque problema...;)
EMAIL="m.m.asciutti@email.it"
##
## PATH di iptables 'adattare alla propria macchina, se necessario'
IPT=` which iptables`
##
## NOTA:
## Dopo aver modificato i parametri base per adattare lo
## script alle proprie esigenze, salvarlo e renderlo eseguibile
## in particolare adattare l'indirizzo del client o della rete che
## verra' nattata
## verificare inoltre che lo script che preleva
## l'indirizzo IP da ifconfig sia funzionante
## sul proprio sistema.
##
## Decommentare se si desidera aggiungere lo script al PATH di sistema
# export PATH=$PATH:$NPATH
##
## Nome dello script e Posizione assoluta
NFILE="firewall"
NPATH="/etc/rc.d"
##
## NOTA:
## il percorso predefinito e' "/etc/rc.d/" ed
## il nome predefinito e' "firewall"
## ma e' possibile utilizzare qualsiasi nome / percorso
## avendo cura di modificare le variabili NFILE e NPATH'
##
## Setto permessi e proprietario
chown root $NPATH/$NFILE
chmod 700 $NPATH/$NFILE
##
## NOTA:
## questa funzione viene richiamata solo con
## l'opzione stop e serve a rimuovere i moduli
## caricati dal firewall
##
#ANSI COLOR
MAGENTA='\e[35m'
GREEN='\e[32m'
YELLOW='\e[33m'
WHITE='\e[37m'
BLUE='\e[34m'
CYAN='\e[36m'
RED='\e[31m'
NULL='\e[0m'
COLOR=$BLUE
##
case "$1" in
#**************************************************************START
start)
clear
COLOR=$RED
msg=" Attivo il firewall ..."
echo -e "$COLOR$msg$NULL\n"


##
## Politica INPUT
chain="DROP"
##
## Politica OUTPUT
outchain="ACCEPT"
##
## Routing
fw="ACCEPT"
CF="1"
##
## Opzioni diverse dalle standard
##
## Politica OUTPUT
## 'se si attiva, decommentare le regole relative all'uscita dei pacchetti'
## outchain="DROP"
##
## Non funziona da router
# fw="DROP"
# CF="0"
##
## Opzioni kernel
SC="1"
ER="1"
DE="1"
TW="1"
SR="0"
DR="0"
ASR="0"
ISR="1"
SAV="1"
LOG="1"
DSR="1"
##
## Solo cosmetico
SET="Abilito"
MSET="Abilito"
function netfilter()
{
exit 0
}
;;
#*******************************************************************STOP
stop)


clear
Su questi ultimi due punti è il caso di soffermarsi. Stiamo considerando ora quali IP considerare validi per l'invio della posta.
COLOR=$GREEN
msg=" Disattivo il firewall ..."
echo -e "$COLOR$msg$NULL\n"
##
## Politica INPUT
chain="ACCEPT"
##
## Politica OUTPUT
outchain="ACCEPT"
##
## Non funziona da router
fw="DROP"
CF="0"
##
## Opzioni kernel
SC="0"
ER="0"
DE="0"
TW="0"
SR="1"
DR="1"
ASR="1"
ISR="0"
SAV="0"
LOG="0"
DSR="0"
##
## Solo cosmetico
SET="Disabilito"
MSET="Disabilito"
##
function netfilter()
{
if [ -f /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_tables.o ]; then
( rmmod ip_contrackt \
ip_contrack_ftp \
ip_nat_ftp \
ip_queue \
ip_tables \
ipt_LOG \
ipt_MARK \
ipt_MASQUERADE \
ipt_MIRROR \
ipt_REDIRECT \
ipt_TCPMSS \
ipt_TOS \
ipt_limit \
ipt_mac \
ipt_mark \
ipt_multiport \
ipt_owner \
ipt_state \
ipt_tcpmss \
ipt_tos \
ipt_unclean \
iptable_filter \
iptable_mangle \
iptable_net
) > /dev/null 2> /dev/null


( rmmod ipfwadm; rmmod ipchains; modprobe ip_tables ) > /dev/null 2> /dev/null
Postfix non autorizza l'invio della posta da parte di client non autorizzati a farlo e/o di domini sconosciuti, ovvero non è un open-relay. Questo è un gran vantaggio perché impedisce che il vostro server possa essere usato per spam o peggio.


fi
Tramite il tag <code>mynetworks</code> abilito gli IP presenti nella lista a spedire mail, con <code>mynetworks_style</code> posso specificare uno tra i seguenti tre valori:
exit 0
}
;;
#*************************************************************ROUTER
router)


clear
; <code>host</code>: l'invio sarà consentito solo per la macchina locale;
COLOR=$YELLOW
; <code>class</code>: l'invio sarà consentito a tutti i client appartenenti al network di classe A, B o C a cui il server appartiene;
msg=" Attenzione, disattivo il firewall ed attivo il forwarding..."
; <code>subnet</code>: indica che Postfix autorizza alla trasmissione tutti i client che appartengono alla stessa sottorete locale del mailserver e costituisce il valore di default.
echo -e "$COLOR$msg$NULL\n"


##
== Gestione degli Alias ==
## Politica INPUT
In teoria ad ogni utente locale del vostro server corrisponde una sola casella mail.
chain="ACCEPT"
Si possono però creare degli alias che corrispondano ad un particolare utente, un secondo indirizzo a cui inviare mail per quel dato user.
##
Di default esiste il file <code>/etc/aliases</code> che contiene una lista di alias a sinistra e i rispettivi utenti ai quali appartengono a destra.
## Politica OUTPUT
In <code>/etc/postfix/main.cf</code> basta solo aggiungere:
outchain="ACCEPT"
 
##
<pre>
## Funziona da router
alias_maps = hash:/etc/aliases
fw="ACCEPT"
</pre>
CF="1"
##
## Opzioni kernel
SC="0"
ER="0"
DE="0"
TW="0"
SR="1"
DR="1"
ASR="1"
ISR="0"
SAV="0"
LOG="0"
DSR="0"
##
## Solo cosmetico
SET="Disabilito"
MSET="Abilito"
function netfilter()
{
exit 0
}
;;
#**************************************************************HELP
help)
clear
COLOR=$CYAN
msg=" Help..."
echo -e "$COLOR$msg"
echo ""
echo "$NFILE start "
echo " Setta il firewall secondo le opzioni"
echo " indicate, e' possibile modificare "
echo " gran parte dei parametri predefiniti"
echo " per utilizzare lo script secondo le"
echo " proprie esigenze."
echo ""
echo "$NFILE stop"
echo " Resetta il firewall, permette il passaggio"
echo " di tutti i pacchetti in ingresso su ogni "
echo " interfaccia disabilitando l'utilizzo "
echo " del PC come router;"
echo " navigate usando questa modalita' il meno possibile."
echo ""
echo "$NFILE router"
echo " Abilita il transito dei pacchetti"
echo " tra $IIF e $EIF senza nessun firewall"
echo " utilizzare esclusivamente per testare la rete"
echo " o usare un secondo firewall tra router e rete"
echo " molti settaggi del kernel non sono pensati per la sicurezza"
echo " ma solo per testare la rete senza perdita di nessun tipo di pacchetti,"
echo " e' PERICOLOSO. "
echo ""
echo "$NFILE info"
echo " Mostra il settaggio attuale dei parametri base"
echo " per controllare le personalizzazioni sullo script."
echo ""
echo "$NFILE policy"
echo " Mostra le politiche impostate con start"
echo " e le statistiche relative al funzionamento del firewall"
echo " i pacchetti ricevuti, droppati, loggati ecc."
echo ""
echo "$NFILE vsf"
echo " Verifica se il server e in presenza di "
echo " attacco Syn Flood."
echo " E' possibile settare alcuni parametri per diminuire "
echo " la vulnerabilita' all'attacco (indicati nel corpo dello script)."
echo " I tentativi di attacco sono comunque tutti loggati."
echo ""
echo "$NFILE help"
echo " Visualizza questo messaggio"
echo -e "$NULL\n"
echo "Per ogni suggerimento:$EMAIL"
echo ""
exit 0


;;
e per rendere questo file una mappa utilizzabile da Postfix lanciamo il comando:
#***************************************************************INFO
info)
clear
COLOR=$MAGENTA
msg=" Info ..."
echo -e "$COLOR$msg"
echo ""
##
echo ""
echo " il PATH di questo script e' $NPATH/$NFILE"
echo " il PATH di iptables e' $IPT"
echo " l'interfaccia interna e' la $IIF"
echo " l'interfaccia esterna e' la $EIF"
echo " l'indirizzo IP del pc server/router e' $SERVER "
echo " l'indirizzo IP del pc client fidato e' $CLIENT"
echo " la rete locale e' $LOCALNET"
echo " l'indirizzo broadcast e' $BROADCAST"
echo " il DNS primario e' $DNS1"
echo " il DNS secondario e' $DNS2"
echo ""
echo -e "$NULL\n"


exit 0
<pre>
# postalias /etc/aliases
</pre>


;;
== Multidominio, Virtual Domain e Sender Canonical ==
#***************************************************************INFO
Nel caso il vostro Server debba ricevere la posta per più domini non dobbiamo fare altro che modificare il tag <code>mydestination</code> come segue:
policy)
clear
COLOR=$WHITE
msg=" Politiche ..."
echo -e "$COLOR$msg"
$IPT -nvL
##
## espande la politica di netfilter
## visualizzando le catene e informazioni sulle
echo -e "$NULL\n"
##


exit 0
<pre>
mydestination = localhost, /etc/postfix/local-domain
</pre>


;;
creare il file <code>/etc/postfix/local-domain</code> e inserire lì i domini da considerare locali, uno per riga senza virgole.


#*********************************************************Verifica Syn Flood
Fatto questo conviene preparare un file per la gestione dei domini virtuali in modo tale da associare il giusto dominio al dato utente; creiamo allora il file <code>/etc/postfix/virtual</code>
vsf)
La sintassi da usare è la seguente:
clear
* <code>info@dominio1.it marco</code> -> le mail in arrivo per tale indirizzo sono redirezionate a marco;
COLOR=$YELLOW
* <code>webmaster@dominio2.it andrea@dominio4.it</code> -> le mail verranno inviate a andrea@dominio4.it;
msg=" Syn Flood ..."
* <code>@dominio3.com alessandro</code> -> tutte le mail inviate a qualsiasi indirizzo @dominio3.com sono inviate all'utente alessandro;
echo -e "$COLOR$msg"
echo ""
echo " Verifico se siamo in presenza di Syn Flood"
echo ""
echo " Oltre 20-30 tentativi di connessione da uno stesso"
echo " indirizzo, indicano un tentativo di flood, verificare comunque i Log"
echo " prima di attivare le contromisure"
##
netstat -npla | grep SYN_RECV
##
echo -e "$NULL\n"


exit 0
aggiungiamo in <code>/etc/postfix/main.cf</code>:


;;
<pre>
virtual_maps = hash:/etc/postfix/virtual
</pre>


#****************************************************************USO
e prepariamo la map con il comando:
*)
##
clear
COLOR=$BLUE
msg="Firewall ver. $VERSION - Utilizzo: $NFILE {start|stop|router|info|policy|vsf|help}"
echo -e "$COLOR$msg$NULL\n"
##


exit 0
<pre>
;;
# postmap /etc/postfix/virtual
##
</pre>
esac
##
#*******************************************************BLOCCO COMUNE
##
echo -e "$COLOR"
## Caricamento dei moduli necessari nel kernel
##
## Il vostro kernel potrebbe non avere
## tutti questi moduli, e' sufficiente ricompilare se le funzionalita'
## sono necessarie.
##
## NOTA: I seguenti moduli sono elencati solo per informazione
## Non e' necessario inserirli manualmente nel kernel
## a meno di casi particolari.
##
# echo "Caricamento moduli..."
##
# modulo base
modprobe ip_tables
##
# modulo necessario alla stateful connection tracking
modprobe ip_conntrack
##
# modulo filter, permette di droppare rifiutare o loggare i pacchetti
modprobe iptable_filter
##
# modulo mangle
# modprobe iptable_mangle
##
# modulo nat
modprobe iptable_nat
##
# modulo LOG, permette di registrare i pacchetti bloccati in base alle catene
modprobe ipt_LOG
##
# modulo utilizzato per limitare il numero di pacchetti per sec/min/hr
##
modprobe ipt_limit
##
# modulo masquerade
modprobe ipt_MASQUERADE
##
# modulo owner
# modprobe ipt_owner
##
# REJECT respinge il pacchetto restituendo una risposta ICMP
# configurabile, il default � "connection refused".
# modprobe ipt_REJECT
##
# modulo mark, permette di marcare pacchetti sulla catena mangle
# modprobe ipt_mark
##
# questo modulo permette di modificare il TCP MSS
##
modprobe ipt_tcpmss
##
# questo modulo permette di indicare porte multiple
# modprobe multiport
##
# questo modulo consente controlli sui flags TCP
# modprobe ipt_state
##
# controlli su flags invalidi
# modprobe ipt_unclean
##
# supporto ftp non-PASV
# modprobe ip_nat_ftp
##
# modulo per full ftp connection tracking
# modprobe ip_conntrack_ftp
##
# modulo per full irc connection tracking
# modprobe ip_conntrack_irc
##
#################
## area kernel ##
#################
##
echo "$SET forwarding... "
echo "$CF" >/proc/sys/net/ipv4/ip_forward
##
echo "$SET syn-cookies (protezione syn-flood attacks)..."
echo "$SC" >/proc/sys/net/ipv4/tcp_syncookies
##
echo "Riduco il numero di possibili SYN Floods..."
echo "1024" >/proc/sys/net/ipv4/tcp_max_syn_backlog
##
##
echo "$SET ICMP echo-request su indirizzi broadcast (Smurf amplifier)..."
# Questi parametri servono ad ignorare ogni ICMP echo requests
# inviato da indirizzi broadcast. Serve a prevenire
# un gran numero di attacchi smurfs e DoS.
echo "$ER" >/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
##
# Contromisure contro attacchi DoS
# echo "Disabilito ICMP echo-request (usare solo se si � sotto attacco Dos)"
# echo "1" >/proc/sys/net/ipv4/icmp_echo_ignore_all
# #sotto attacco syn incrementare il valore di tcp_max_syn_backlog e decrementare
# #il valore dei timeout_*
# echo "100" > /proc/sys/net/ipv4/vs/timeout_synack
# echo "10" > /proc/sys/net/ipv4/vs/timeout_synrecv
# echo "128" > /proc/sys/net/ipv4/tcp_max_syn_backlog
##
echo "$SET protezione defrag error... "
echo "$DE" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
##
echo "$SET time-wait assassination hazards in tcp (RFC 1337)..."
#echo "$TW" >/proc/sys/net/ipv4/tcp_rfc1337
##
echo "$SET sourcerouting and spoofing protection..."
for i in /proc/sys/net/ipv4/conf/*; do
##
echo "$SET politica per source-routed packets..."
# Questa politica e' usata per accettare o rifiutare pacchetti
# di tipo 'source routed'. E' attiva di default, ma � considerata
# un rischio per la sicurezza.
echo "$SR" >$i/accept_source_route
##
echo "$SET politica per ICMP Redirect accept/send..."
# Questa opzione disabilita la redirezione dei pacchetti ICMP.
# E' generalmente considerato un rischio per la sicurezza.
echo "$DR" >$i/accept_redirects
# Per questo motivo, e' preferibile accettare ICMP solo
# dal gateway di default (opzione secure_redirects).
echo "$ASR" >$i/send_redirects
echo "$SET secure ICMP redirects..."
echo "$ISR" >$i/secure_redirects
##
# echo "Disabilito Proxy ARP ..."
# # E' un'opzione utilizzata per la realizzazione di DMZ;
# # � disabilitata in quanto non rientra negli scopi di questo script.
# # per maggiorni info: http://www.sjdjweis.com/linux/proxyarp/
# echo "0" >$i/proxy_arp
##
echo "$SET source-address verification (prevent spoofing)..."
# Abilita i controlli previsti nel RFC1812.
# � raccomandato per sistemi basati su interfacce singole
# Disattivare se si hanno interfacce multiple collegate alla stessa rete.
# Questo controllo blocca i pacchetti che si presentano ad una interfaccia esterna
# con indirizzo forgiato per sembrare provenienti da interfaccia interna;
# il controllo e' comunque ripetuto in seguito.
echo "$SAV" >$i/rp_filter
##
done
##
echo "Applico settaggi controllo ..."
if [ -f /proc/sys/net/ipv4/icmp_destunreach_rate ]; then
echo "5" > /proc/sys/net/ipv4/icmp_destunreach_rate
fi
if [ -f /proc/sys/net/ipv4/icmp_echoreply_rate ]; then
echo "5" > /proc/sys/net/ipv4/icmp_echoreply_rate
fi
if [ -f /proc/sys/net/ipv4/icmp_paramprob_rate ]; then
echo "5" > /proc/sys/net/ipv4/icmp_paramprob_rate
fi
if [ -f /proc/sys/net/ipv4/icmp_timeexceed_rate ]; then
echo "10" > /proc/sys/net/ipv4/icmp_timeexceed_rate
fi
##
echo "$SET il Log su spoofed, source routed e redirect packets..."
# Questa opzione serve a loggare i pacchetti provenienti da indirizzi impossibili.
echo "$LOG" >/proc/sys/net/ipv4/conf/all/log_martians
##
echo "$SET dynamic socket address rewriting..."
# Utile se si utilizza un indirizzo dinamico assegnato da DHCP.
echo "$DSR" > /proc/sys/net/ipv4/ip_dynaddr
##
echo "Setto porte locali ..."
echo "56000:65096" > /proc/sys/net/ipv4/ip_local_port_range
##
##
#################################
## inizio competenza iptables ##
#################################
##
echo "Azzero le chain..."
##
for y in filter nat mangle ; do
$IPT -t $y -F
$IPT -t $y -X
done
##
## politica per la tabella filter
$IPT -P INPUT $chain
$IPT -P OUTPUT $outchain
$IPT -P FORWARD DROP
#NOTA: FORWARD e' su DROP in quanto il controllo e' lasciato a altre regole
##
## politica per la tabella mangle
for m in PREROUTING OUTPUT ; do
$IPT -t mangle -P $m ACCEPT
done
##
echo "Genero catene utente ..."
$IPT -N chain-log
$IPT -A chain-log -j LOG --log-level info
# NOTA: Senza --log-level "info", si ha la scrittura dei log in ogni
# vty. E' un p� troppo ...
$IPT -A chain-log -j $chain
##
# # Dynamic Address
# # La richiesta di assegnazione dell'indirizzo � di tipo broadcast
# # la risposta potrebbe non essere accettata
# # questa dichiarazione abilita il DHCP
# $IPT -A INPUT -p UDP --source-port 67 --destination-port 68 -j ACCEPT
# # DHCPd - abilitare in presenza di DHCP interno
# #$IPT -A INPUT -i $IIF -p tcp --sport 68 --dport 67 -j ACCEPT
# #$IPT -A INPUT -i $IIF -p udp --sport 68 --dport 67 -j ACCEPT
##
##
echo "Accetto connessioni da $LOCALHOST , $SERVER , $CLIENT ..."
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -i $IIF -s $CLIENT -j ACCEPT
$IPT -A INPUT -i $IIF -s $SERVER -j ACCEPT
# $IPT -A INPUT -i $IIF -s $LOCALNET -j ACCEPT
# $IPT -A OUTPUT -o lo -s $LOCALHOST -j ACCEPT
# $IPT -A OUTPUT -o lo -s $SERVER -j ACCEPT
##
echo "Controllo di sanita' dei pacchetti sulla tabella nat-PREROUTING..."
$IPT -t nat -A PREROUTING -i $EIF -s $LOCALNET -j $chain
$IPT -t nat -A PREROUTING -i $EIF -s $LOCALHOST -j $chain
$IPT -t nat -A PREROUTING -i $EIF -s $CLIENT -j $chain
$IPT -t nat -A PREROUTING -i $EIF -s $SERVER -j $chain
# # E' anche possibile bloccare e loggare tutti i pacchetti
# # provenienti da indirizzi privati (chiaramente forgiati per
# # tentare un'intrusione) e non solo quelli relativi a $LOCALNET
# # per una lista completa:
# # http://www.iana.org/assignments/ipv4-address-space
##
# # echo "Rifiuto pacchetti provenienti da indirizzi privati, multicast o riservati..."
##
# # NOTA - le variabili A_r,B_r,C_r,D_r devono essere dimensionate
# # leggendo le liste degli indirizzi da rifiutare (file esterno)
# # il metodo e' riportato , ma non e' implementato nessun controllo,
# # i pacchetti in ingresso sono comunque tutti droppati.
# # questo controllo potrebbe essere comunque comodo, ma non e'
# # nelle finalit� di questo script.
# # non
# for CL in A_r B_r C_r D_mc E_r ; do
# $IPT -A INPUT -i $EIF -s $CL -j chain-log
# done
##
# TCP & UDP
# Le porte standard sono elencate su:
# http://www.chebucto.ns.ca/~rakerman/port-table.html
# http://www.iana.org/assignments/port-numbers
##
echo "Accetto connessioni RELATED/ESTABLISHED..."
#in input
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "Accetto ICMP type 0,3,11..."
## codici ICMP - RFC 792
## 0 Echo Reply
## 3 Destination Unreachable, il router non ha trovato la destinazione del pacchetto.
## 4 Source Quench
## 5 Redirect, il router informa l'host che ha spedito il pacchetto di un qualche errore
## 8 Echo, messaggio utile per sapere se un host � presente oppure no (utilizzato in Ping)
## 11 Time Exceeded
## 12 Parameter Problem, campo dell'header non valido
## 13 Timestamp
## 14 Timestamp Reply
## 15 Information Request
## 16 Information Reply
# Visitare: http://www.ee.siue.edu/~rwalden/networking/icmp.html
# per altre informazioni relative ai tipi ICMP.
for ic in 0 3 11 ; do
$IPT -A INPUT -i $EIF -p icmp --icmp-type $ic -j ACCEPT
done
##
# Decommentare se si desidera che il proprio sistema risponda ai ping
$IPT -A INPUT -i $EIF -p ICMP --icmp-type 8 -j $chain
# $IPT -A INPUT -i $EIF -p ICMP --icmp-type 8 -j ACCEPT
##
echo "Accetto ICMP dalla rete locale..."
$IPT -A INPUT -i $IIF -s $LOCALNET -p icmp -j ACCEPT
##
echo "Accetto DNS replays"
$IPT -A INPUT -i $EIF -p udp -s $DNS1 --sport 53 -j ACCEPT
$IPT -A INPUT -i $EIF -p udp -s $DNS2 --sport 53 -j ACCEPT
# $IPT -A INPUT -i IIF -p tcp -s $DNS3 --sport 53 -j ACCEPT
$IPT -A INPUT -p udp --sport 53 -j ACCEPT
# il dns 3 si intende come locale, per questo si accettano le connessioni tcp
# $IPT -A INPUT -i $EIF -p tcp -s $DNS1 --sport 53 -j ACCEPT
# $IPT -A INPUT -i $EIF -p tcp -s $DNS2 --sport 53 -j ACCEPT
##
echo "Blocco ogni pacchetto broadcast"
$IPT -A INPUT -p ALL -d 255.255.255.255 -j $chain
# $IPT -A INPUT -s 10.128.0.0/255.255.0.0 -j DROP
##
echo "Attivo SYN-FLOODING protection..."
$IPT -N SYN-FLOOD
$IPT -A INPUT -p tcp --syn -j SYN-FLOOD
$IPT -t filter -A SYN-FLOOD -m limit --limit 1/s --limit-burst 4 -j chain-log
##
# echo "Sperimentale..."
# #NOTA - e' disattivato in quanto potrebbe generare molti falsi positivi.
# $IPT -t nat -A PREROUTING -i $EIF -m unclean -j chain-log
##
echo "Blocco le scansioni Xmas tree, i pacchetti senza flag, i flag irregolari, le scansioni..."
##Blocco le scansioni Xmas tree
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j chain-log
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK -j chain-log
##
##Blocco i pacchetti senza flags
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j chain-log
##
##Blocco i pacchetti SYN+RST e SYN+FIN
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j chain-log
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j chain-log
##
##Blocco le scansioni FIN
$IPT -A INPUT -p tcp --tcp-flags FIN FIN -j chain-log
##
##Elimino pacchetti broadcast netbios
$IPT -A INPUT -p udp --dport 135:139 -j $chain
##
echo "Dirotto pacchetti NEW e INVALID verso CHAIN..."
$IPT -A INPUT -i $EIF -m state --state NEW,INVALID -j chain-log
$IPT -A INPUT -i $IIF -m state --state NEW,INVALID -j chain-log
##
##
##################################################################
## Servizi aperti all'esterno 'decommentare i servizi desiderati, attenzione!!' ##
##################################################################
##
# echo "Accetto connessioni su shell criptate dall'esterno..."
# $IPT -A INPUT -p tcp --dport 22 -j ACCEPT
##
# echo "Accetto connessioni sendmail dall'esterno [pericoloso!!!]..."
# $IPT -A INPUT -p tcp --dport smtp -j ACCEPT
##
# echo "Accetto http e https dall'esterno [pericoloso!!]... "
# $IPT -A INPUT -p tcp -m multiport --destination-port 80,443 -j ACCEPT
##
# echo "Accetto POP3 dall'esterno [pericoloso!]..."
# $IPT -A INPUT -p tcp --sport 110 -j ACCEPT
##
# Questo esempio serve per usare il transparent proxy
# $IPT -t nat -A PREROUTING -p tcp -s $LOCALNET --destination-port 80 -j RETURN
# $IPT -t nat -A PREROUTING -p tcp -s $LOCALNET --destination-port 443 -j RETURN
# Redirezione HTTP
# $IPT -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-ports 3128
# Redirezione HTTPS
# $IPT -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-ports 3128


##
Può essere sempre utile, per la gestione di più domini, usare un file che associ ad un nome utente un indirizzo mittente particolare.
#######################
Creiamo perciò un file <code>/etc/postfix/sender_canonical</code> dove con la precedente sintassi associamo al nome utente l'indirizzo mittente da mostrare nelle mail inviate.
## regole in uscita ##
Aggiungiamo in <code>/etc/main.cf</code> la seguente riga:
#######################
##
## abilita servizio DNS per protocolli UDP
## (attivare per policy drop su output)
# $IPT -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
##
## abilita la navigazione WEB ed il traffico HTTPS
## (attivare per policy drop su output)
# $IPT -t filter -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
##
## abilita il traffico FTP
## (attivare per policy drop su output)
# $IPT -t filter -A OUTPUT -o $EIF -p tcp --dport ftp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
##
## abilita le connessioni SMTP e POP3 in uscita
## (attivare per policy drop su output)
# $IPT -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
# $IPT -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
##
## abilita connessioni SSH (SecureShell) con attivazione Log
## (attivare per policy drop su output)
# $IPT -t filter -A OUTPUT -p tcp --syn --dport 22 -m state --state NEW -j LOG --log-level info --log-prefix "---SSH from $EIF---"
# $IPT -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
##
# echo "Impedisco l'uscita di pacchetti netbios..."
# il traffico di questi pacchetti potrebbe attivare
# eventuali connessioni 'dial on demand' a internet.
# $IPT -A OUTPUT -p udp --destination-port 135:139 -j DROP
##
##
####################
## regole particolari ##
###################
##
##
##
# echo "Imposto le regole sulla tabella MANGLE..."
# # Setto il TTL su tutti i pacchetti in uscita a 128.
# # per nascondere la propria rete dietro al router,
# # convertire i pacchetti uscenti dalla LAN ad un TTL
# # uguale a quello dei pacchetti generati dal router.
# # TTL non e' inserito nelle versioni comunemente
# # distribuite (senza patch-o-matic)
# $IPT -t mangle -A FORWARD -o $EIF -j TTL --ttl-inc 1
##
echo "Risolvo il blocco derivante da ICMP fragmentation"
# Il target TCPMSS risolve i problemi di connessione derivanti da server
# che bloccano i pacchetti ICMP Fragmentation Needed.
# Tale blocco spesso blocca il trasferimento dati anche in presenza di connessioni stabilite.
$IPT -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu


##
<pre>
#############################
sender_canonical_maps = hash:/etc/postfix/sender_canonical
## regole su FORWARD e nat ##
#############################
##
##
##
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $EIF -m state --state NEW,INVALID -j $chain
$IPT -A FORWARD -o $EIF -j ACCEPT
echo "$MSET SNAT (MASQUERADE) su $EIF"
##
#usare su indirizzi dinamici (esempio connessioni dial-up)
$IPT -t nat -A POSTROUTING -o $EIF -j MASQUERADE
#usare solo su indirizzi statici
# $IPT -t nat -A POSTROUTING -o $EIF -j SNAT --to $EIP
##
##
###############
## fine del FW ##
###############
##
##
echo ""
echo "Da ora la politica per INPUT e' $chain"
echo "la politica per OUTPUT e' $outchain"
echo "IP forwarding e' settato su $fw "
echo ""
echo -e "$NULL\n"
##
netfilter
##
##The End..
</pre>
</pre>
ed infine prepariamo la map con:
<pre>
# postmap /etc/postfix/sender_canonical
</pre>
== Antivirus - Amavis e ClamaV ==
Passiamo ora alla configurazione dell'antivirus da installare sul vostro MTA.
Procediamo all'installazione:
<pre>
# apt-get install amavisd-new clamav clamav-daemon
</pre>
Dopo l'installazione dobbiamo dire a Postfix di far processare le mail dal vostro antivirus. Aggiungiamo a <code>/etc/postfix/main.cf</code> quanto segue:
<pre>
content_filter = amavis:[127.0.0.1]:10024
</pre>
mentre nel file <code>/etc/postfix/master.cf</code>:
<pre>
amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
</pre>
Di per sé non si richiedono altre modifiche per il corretto funzionamento, comunque può essere utile dare un occhiata al file <code>/etc/amavis/amavisd.conf</code> per eventuali modifiche.
Il Demone clamav-daemon (freshclam) tiene aggiornato il vostro antivirus aggiornandosi 12 volte al giorno, per eventuali modifiche <code>/etc/clamav/fresclam.conf</code> e <code>/etc/clamv/clamavd.conf</code>.
== Antispam - Spamassassin ==
Può essere utile installare un antispam che filtri le mail nel vostro server. Spamassassin è ciò che fa per voi. Installiamolo insieme a Procmail:
<pre>
# apt-get install spamassassin procmail
</pre>
a questo punto aggiungiamo in <code>/etc/postfix/main.cf</code> quanto segue:
<pre>
mailbox_command = /usr/bin/spamc | procmail -a "$EXTENSION"
</pre>
abilitiamo spamassassin modificando in <code>/etc/default/spamassassin</code>:
<pre>
ENABLE=1
</pre>
aggiungiamo al file <code>/etc/procmailrc</code> quanto segue:
<pre>
DROPPRIVS=yes
:0fw
| /usr/bin/spamassassin
</pre>
Per settaggi particolari di Spamassassin vi consiglio di dare un'occhiata al file <code>/etc/spamassassin/local.cf</code> oppure consultare il sito web http://www.yrex.com/spam/spamconfig.php che vi consente di creare un file di configurazione personalizzato rispondendo alle varie domande.
== WebMail - Openwebmail ==
Per poter usufruire del servizio di webmail è necessario usare un server web.
Io vi consiglio Apache con supporto PHP e CGI. In questa guida presumo che nel vostro server sia già presente Apache configurato a dovere.
Esistono diversi servizi di WebMail, io ho scelto ''openwebmail'', installiamolo dopo aver aggiunto il repository in <code>/etc/apt/sources.list</code>
<pre>deb http://people.debian.org/~srua/openwebmail/stable/ ./</pre>
<pre>
# apt-get install openwebmail
</pre>
Dopo l'installazione recatevi in <code>/etc/openwebmail</code> e date un occhiata al file <code>apache.conf</code> che contiene le specifiche per configurare Apache.
Apriamo ora <code>/etc/openwebmail/openwebmail.conf</code> e apportiamo le nostre personalizzazioni.
Attenzione alla voce <code>domainnames</code>, spesso <code>auto</code> può portare a dei problemi, vi consiglio di specificare il dominio di appartenenza.
Per altre modifiche consultate il file <code>/usr/share/openwebmail/configs/openwebmail.conf</code>.
== Gestione Mailing-List Mailman + Hypermail ==
Ogni mailserver che si rispetti ha anche un gestore di mailing-list. Io vi consiglio di installare Mailman che possiede un ottimo supporto web per le varie configurazioni:
<pre>
# apt-get install mailman hypermail
</pre>
Fatto questo modificate <code>/etc/postfix/main.cf</code> aggiungendo quanto segue:
<pre>
alias_maps = hash:/etc/aliases
hash:/var/lib/mailman/data/aliases
transport_maps = hash:/etc/postfix/transport
relay_domains = lists.vostrodominio.com
mailman_destination_recipient_limit = 1
</pre>
creiamo <code>/etc/postfix/transport</code> e trasformiamolo in una mappa:
<pre>
# echo lists.vostrodominio.com mailman: > /etc/postfix/transport
# postmap /etc/postfix/transport
</pre>
Modificate ora il file <code>/etc/postfix/master.cf</code>:
<pre>
mailman unix - n n - - pipe flags=FR user=list argv=/var/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}
</pre>
Modificate nel file <code>/etc/mailman/mm_cfg.py</code> i seguenti tag:
<pre>
DEFAULT_EMAIL_HOST = 'vostrodominio.com'
DEFAULT_URL_HOST = 'www.vostrosito.com'
MTA='Postfix'
PUBLIC_EXTERNAL_ARCHIVER = 'hypermail -L it -m /var/lib/mailman/archives/private/%(listname)s.mbox/%(listname)s.mbox -l %(listname)s -d /var/lib/mailman/archives/public/%(listname)s'
PRIVATE_EXTERNAL_ARCHIVER = 'hypermail -c -L it -m /var/lib/mailman/archives/private/%(listname)s.mbox/%(listname)s.mbox -l %(listname)s -d /var/lib/mailman/archives/private/%(listname)s'
PUBLIC_ARCHIVE_URL = '/archives/%(listname)s'
PRIVATE_ARCHIVE_URL = '/archives/%(listname)s'
ARCHIVE_TO_MBOX = 2
</pre>
Fate attenzione alle voci <code>PUBLIC_ARCHIVE_URL</code> e <code>PRIVATE_ARCHIVE_URL</code>.
Sono i link che in Mailman verranno associati all'archivio delle vostre mailing-list (www.vostrodominio.it/archives/nomelista). Di conseguenza un mio consiglio è creare un link simbolico nella DocumentRoot del server Apache in questione:
<pre>
# ln -s /var/lib/mailman/archives/public/ archives
</pre>
Create poi una lista Mailman di default per il server (altrimenti il suo demone si rifiuta di partire):
<pre>
# newlist mailman
</pre>
ed il gioco è fatto.
Per creare nuove mailing-list basta usare il comando <code>newlist</code> e per rimuoverle <code>rmlist</code>.
Per le altre configurazioni, Mailman crea nella vostra directory <code>cgi-bin</code> un programma che vi consente, tramite web, di accedere alle varie mailing-list per poter modificarne alcuni parametri, anche in questo caso si richiede una corretta configurazione di Apache.


----
----
Autore: debian
Per qualsiasi informazione
[[Categoria:Server]][[Categoria:Firewalling]][[Categoria:Script]]
 
www.giorgioravera.it
 
giorgio@giorgioravera.it
{{Autori
| Autore = [[Utente:TheNoise|TheNoise]]
}}
 
[[Categoria:Mail server]]
1

contributo

Menu di navigazione