Der neue Server: Teil 6 Spambekämpfung

Nachfolgend wird erklärt, wie man policyd-weight, amavisd-new, clamav, spamassassin, dspam installiert, konfiguriert und in das bestehende Setup integriert.

policyd-weight

policyd-weight ist ein effektives Tool zur Spambekämpfung schon vor der Annahme einer E-Mail. Es überprüft das “Envelope” und gleicht die Absenderadresse gegen mehrere DNS-Blacklists ab.

aptitude install policyd-weight

Danach erstellen wir noch eine Standardkonfiguration für policyd-weight:

policyd-weight defaults > /etc/policyd-weight.conf

Folgende Zeile in “/etc/postfix/main.cf” ändern:

###  check_policy_service inet:127.0.0.1:12525,

… zu:

check_policy_service inet:127.0.0.1:12525,

Jetzt muss die postfix-Konfiguration neu geladen werden und policyd-weight neu gestartet werden:

/etc/init.d/policyd-weight restart
postfix reload

amavisd-new

Amavisd-new ist ein Content-Filter, der sich in fast jeden MTA integrieren lässt. Über amavisd-new lassen sich viele verschiedene Tools, wie z.B. ClamAV zur Virenprüfung, Spamassassin zur Spamfilterung oder dspam – ebenfalls zu Spamfilterung – integrieren.
Wenn eine E-Mail in postfix ankommt, wird diese an amavis weitergeleitet, überprüft und wieder – mit zusätzlichen Headern – an postfix zur Auslieferung zurückgesendet. Natürlich kann man amavis auch so konfigurieren, dass bestimmte Nachrichtentypen, z.B. Virusmails oder Spammails, sofort geblockt werden. Sobald die Nachricht von amavis an postfix zurückgegeben wurde, kann eine automatische Einsortierung in Ordner über sieve folgen (z.B. Spam-Mails nach Junk).

Installation:
Zu “/etc/apt/sources.list” hinzufügen:

# volatile repository (e.g. for clamav)
deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free
aptitude install amavisd-new spamassassin clamav clamav-daemon clamav-freshclam pax lha arj bzip2 unrar zoo nomarch cpio lzop cabextract apt-listchanges libauthen-sasl-perl libdbi-perl dspam libmail-dkim-perl razor pyzor dcc-client libdbd-pg-perl

Nun folgt die Konfiguration von amavis (Konfigurationsdateien sind unter “/etc/amavis/conf.d/” zu finden). Ich führe jeweils nur geänderte Zeilen auf:

01-debian:

$unrar      = ['rar', 'unrar']; #disabled (non-free, no security support)
#$unrar         = undef;
$lha    = 'lha'; #disabled (non-free, no security support)
#$lha   = undef;

05-domain_id:

@local_domains_acl = ( "." );

05-node_id:

$myhostname = "mail.domain.tld";

15-content_filter_mode:

@bypass_virus_checks_maps = ( 
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

20-debian_defaults:

$final_virus_destiny      = D_DISCARD;  # (data not lost, see virus quarantine)
$final_banned_destiny     = D_PASS;   # D_REJECT when front-end MTA
$final_spam_destiny       = D_PASS;
$final_bad_header_destiny = D_PASS;     # False-positive prone (for spam)
 
# $sa_spam_subject_tag = '***SPAM*** ';
$sa_tag_level_deflt  = undef;

50-user:

$max_servers = 2;
 
$policy_bank{'MYNETS'} = {   # mail originating from @mynetworks
  originating => 1,  # is true in MYNETS by default, but let's make it explicit
  os_fingerprint_method => undef,  # don't query p0f for internal clients
};
 
$recipient_delimiter = '+';
 
$warnvirusrecip = 1;
 
$mailfrom_notify_admin = "postmaster\@$mydomain";
$mailfrom_notify_recip = "postmaster\@$mydomain";
$mailfrom_notify_spamadmin = "postmaster\@$mydomain";

Jetzt fügen wir noch den clamav-Nutzer der amavis-Gruppe hinzu:

adduser clamav amavis

Danach müssen wir Änderungen an der postfix-Konfiguration vornehmen:

Zu main.cf hinzufügen:

content_filter = amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings

Zu master.cf hinzufügen:

amavis       unix  -       -       n       -       2       lmtp 
    -o lmtp_data_done_timeout=1200
    -o lmtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=20
127.0.0.1:10025 inet n  -       n       -       -       smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_delay_reject=no
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -o mynetworks=127.0.0.0/8    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

Zuletzt werden postfix, amavis und clamav neu gestartet:

/etc/init.d/postfix restart
/etc/init.d/amavis restart
/etc/init.d/clamav-daemon restart

Testen der Konfiguration

Zum Testen genügt es eine Mail an den Mailserver zu schicken und sich danach die Header-Informationen anzuschauen. Finden sich ähnliche Header wie die folgenden in der Mail wieder, so wird amavis aufgerufen.

X-virus-scanned: Debian amavisd-new at domain.tld
X-spam-flag: NO
X-spam-score: 2.898
X-spam-level: **
X-spam-status: No, score=2.898 required=6.31 tests=[SPF_PASS=-0.001, TVD_SPACE_RATIO=2.899]

Des Weiteren kann man mit folgendem Befehl testen, ob Spam erkannt wird:

sendmail john@example.com < /usr/share/doc/spamassassin/examples/sample-spam.txt

… oder Viren:

telnet localhost 25
HELO localhost
MAIL FROM: <user@change_to_my_domain.tld>
RCPT TO: <user@change_to_my_domain.tld>
DATA
From: virus-tester
To: undisclosed-recipients:;
Subject: amavisd test - simple - spam test pattern
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
.
 
quit

Spamassassin Konfiguration

Ans Ende der Datei “/etc/spamassassin/local.cf” anfügen:

use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1
bayes_auto_expire 0
 
# pyzor
use_pyzor 1
pyzor_path /usr/bin/pyzor
 
# razor
use_razor2 1
razor_config /etc/razor/razor-agent.conf

/etc/spamassassin/v312.pre:

loadplugin Mail::SpamAssassin::Plugin::DKIM

/etc/spamassassin/v320.pre:

loadplugin Mail::SpamAssassin::Plugin::Shortcircuit
loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody

Razor konfigurieren:

su - amavis
razor-admin -create

Spamassassin-Regeln neu laden:

sa-update

Automatische Updates

Um spamassassin voll auszureizen, richten wir einen cronjob ein über welchen jede Nacht die Regeln auf den neuesten Stand gebracht werden (als root ausführen!):

/usr/local/sbin/updateSpamassassin:

#!/bin/bash
 
sa-update &> /dev/null
sa-compile &> /dev/null
 
exit 0
crontab -e
42 3 * * * /usr/local/sbin/updateSpamassassin &> /dev/null

Ham/Spam aus /var/vmail lernen

Nun erstellen wir noch ein Skript, welches Spam, bzw. Ham aus den Mailboxen der Benutzer lernt (aus den Ordnern “INBOX” und “Junk”). Dieses Skript rufen wir wöchentlich über einen Cronjob auf.

/usr/local/sbin/trainSpamassassin:

#!/bin/bash
 
VMAILDIR="/var/vmail"
SADIR="/var/lib/amavis/.spamassassin"
DBPATH="/var/lib/amavis/.spamassassin/bayes"
 
cd $VMAILDIR
for domain in $(find ./ -maxdepth 1 -not -name "." -type d); do
        domaindir="$VMAILDIR/$domain"
        cd $domaindir
        for user in $(find ./ -maxdepth 1 -not -name "." -type d); do
                maildir="$domaindir/$user/maildir"
                inbox="$maildir/cur"
                junk="$maildir/.Junk/cur"
 
                echo "Learning ham from $inbox"
                sa-learn --ham --showdots --dbpath $DBPATH $inbox
                echo "Learning junk from $junk"
                sa-learn --spam --showdots --dbpath $DBPATH $junk
        done
done
 
chown -R amavis:amavis $SADIR

Nun noch das Skript in die crontab aufnehmen (als root ausführen!):

crontab -e
33 4 * * 0 /usr/local/sbin/trainSpamassassin &> /dev/null

Globale sieve-Regeln

Um dem Benutzer das Erstellen von sieve-Regeln für Spam zu ersparen, fügen wir in die Datei “/var/vmail/default.sieve” folgende Zeile ein, um Spam-Mails automatisch in den Ordner “Junk” zu verschieben (sieve wurde schon in Teil 5 dieser Serie konfiguriert):

require ["fileinto"];
# Move spam to spam folder
if header :contains "X-Spam-Flag" ["YES"] {
  fileinto "Junk";
  stop;
}

dspam

Die Konfiguration von dspam wird nachgereicht.

Quellen:

http://workaround.org/articles/ispmail-etch/#step-5-deliver-emails-through-the-dovecot-lda

http://www200.pair.com/mecham/spam/spamfilter20090215.html#amavisconfig

http://wiki.rootforum.de/mailserver/postfix/clamav_amavisd

http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-debian-lenny-p3

http://www.tuxj0b.de/HOWTO_Mailserver_mit_Postfix_Dovecot_Antispam_und_PostgreSQL_Backend

Der neue Server: Teil 5 postfix

Hier wird erklärt wie man postfix mit postgreSQL-Backend installiert, dovecot inkl. sieve konfiguriert, sowie postfixadmin einrichtet, um postfix bequem über ein Webinterface verwalten zu können.

Datenbank anlegen

Als Erstes legen wir einen Datenbankbenutzer inkl. Datenbank für postfix an:

su - postgres
psql template1
CREATE USER postfix WITH PASSWORD 'password';
CREATE DATABASE postfix WITH OWNER postfix ENCODING 'UNICODE';
\q

Verzeichnis anlegen

Später werden alle Mailboxen unter “/var/vmail/DOMAIN/BENUTZERNAME/maildir/” liegen, deshalb erstellen wir nun den Ordner “/var/vmail” und vergeben entsprechende Rechte. Die Einsortierung nach “/var/vmail/DOMAIN/BENUTZERNAME/maildir/” geschieht später über SQL-Queries automatisch.

useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c 'Virtual mailbox' vmail
mkdir /var/vmail
chmod 770 /var/vmail/
chown vmail:mail /var/vmail/

postfixadmin

postfixadmin installieren wir direkt aus deren svn-Repository, um mit der aktuellste Version zu arbeiten. Sollte es zu Problemen kommen, kann man über http://postfixadmin.sourceforge.net/ die neueste stabile Version herunterladen.

cd /var/www/
svn co https://postfixadmin.svn.sourceforge.net/svnroot/postfixadmin/trunk postfixadmin-svn
ln -s postfixadmin-svn postfixadmin

Danach passt man die Konfigurationsdatei “/var/www/postfixadmin/config.inc.php” an seine Wünsche und Anforderungen an. Nach Ausführen des “setup.php”-Skripts im Browser (und anschließendem Löschen/Umbenennen) ist postfixadmin einsatzbereit.

postfix

postfix installieren:

aptitude install postfix postfix-pgsql postfix-pcre

Während der Installation von postfix wird man gefragt, wie man postfix konfigurieren will, dort wählt man “Internet Site” aus (wobei dies später irrelevant ist, da wir die Konfiguration komplett selbst schreiben).

Datenbankverbindung konfigurieren

Damit postfix mit den Accounts, die in postfixadmin angelegt werden zusammenarbeitet, müssen wir verschiedene SQL-Queries anlegen:

relay-domains.cf:

user            = postfix
password        = xxxxxxx
dbname          = postfix
hosts           = localhost
query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = true

virtual-alias-maps.cf:

user             = postfix
password         = xxxxxxxx
dbname           = postfix
hosts            = localhost
query = SELECT goto FROM alias WHERE address='%s' AND active = true

virtual-domain-maps.cf:

user             = postfix
password         = xxxxxxxx
dbname           = postfix
hosts            = localhost
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = false AND active = true

virtual-mailbox-limit-maps.cf:

user             = postfix
password         = xxxxxxxx
dbname           = postfix
hosts            = localhost
query = SELECT quota FROM mailbox WHERE username = '%s' AND active = true

virtual-mailbox-maps.cf:

user             = postfix
password         = xxxxxxxx
dbname           = postfix
hosts            = localhost
query = SELECT maildir || 'maildir' || '/' FROM mailbox WHERE username='%s' AND active = true

recipient checks

Mit recipient checks kann man E-Mailadressen anhand von regulären Ausdrücken prüfen und dadurch Mails entweder annehmen oder ablehnen. Hier werden invalide E-Mailadressen, bzw. welche mit “seltsamer” Syntax abgewiesen und E-Mails an postmaster, hostmaster, webmaster und abuse immer angenommen.

/etc/postfix/recipient_checks.pcre:

/^\@/             550 Invalid address format.
/[!%\@].*\@/      550 This server disallows weird address syntax.
/^postmaster\@/   OK
/^hostmaster\@/   OK
/^webmaster\@/    OK
/^abuse\@/        OK

mx access

Über diese Datei werden E-Mails von Gegenstellen aus privaten IP-Blöcken, bzw. von Broadcast- und Multicast-Netzen von vorneherein abgewiesen, da diese im Internet prinzipiell nicht geroutet werden und es sich dabei mit extrem hoher Wahrscheinlichkeit um Spam handelt.

/etc/postfix/mx_access:

0.0.0.0/8         REJECT Domain MX in broadcast network
10.0.0.0/8        REJECT Domain MX in RFC 1918 private network
127.0.0.0/8       REJECT Domain MX in loopback network
169.254.0.0/16    REJECT Domain MX in link local network
172.16.0.0/12     REJECT Domain MX in RFC 1918 private network
192.0.2.0/24      REJECT Domain MX in TEST-NET network
192.168.0.0/16    REJECT Domain MX in RFC 1918 private network
224.0.0.0/4       REJECT Domain MX in class D multicast network
240.0.0.0/5       REJECT Domain MX in class E reserved network
248.0.0.0/5       REJECT Domain MX in reserved network

Nun muss daraus noch eine postfix-lookup table erstellt werden:

postmap /etc/postfix/mx_access

main.cf

Nun müssen wir noch postfix konfigurieren und alle Teilkonfigurationen, die wir gerade erstellt haben zusammenfügen. Dies geschieht über die Datei “/etc/postfix/main.cf“:

# -------------------- GENERAL PART START --------------------
allow_percent_hack = no
biff = no
disable_vrfy_command = yes
 
mydestination = $myhostname, $mydomain, localhost
mydomain = domain.tld
myhostname = mail.domain.tld
mynetworks_style = host
myorigin = $mydomain
 
#home_mailbox = Maildir/
#mailbox_size_limit = 2147483648
#message_size_limit = 209715200
local_transport = dovecot
masquerade_exceptions = root
recipient_delimiter = +
# -------------------- GENERAL PART END --------------------
 
# -------------------- VIRTUAL PART START --------------------
virtual_mailbox_base = /var/vmail
relay_domains = proxy:pgsql:/etc/postfix/pgsql/relay-domain-maps.cf
virtual_mailbox_maps = proxy:pgsql:/etc/postfix/pgsql/virtual-mailbox-maps.cf
virtual_mailbox_domains = proxy:pgsql:/etc/postfix/pgsql/virtual-domain-maps.cf
virtual_alias_maps = proxy:pgsql:/etc/postfix/pgsql/virtual-alias-maps.cf
virtual_minimum_uid = 150
virtual_uid_maps = static:150
virtual_gid_maps = static:8
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
unknown_local_recipient_reject_code = 550
# -------------------- VIRTUAL PART END --------------------
 
# -------------------- RESTRICTIONS PART START --------------------
smtpd_delay_reject = yes
smtpd_helo_required = yes
 
smtpd_client_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unknown_reverse_client_hostname,
  permit
smtpd_data_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unauth_pipelining,
  permit
smtpd_helo_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_invalid_helo_hostname,
  reject_non_fqdn_helo_hostname,
  permit
smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,
  check_recipient_mx_access cidr:/etc/postfix/mx_access,
  reject_unauth_destination,
  check_recipient_access pcre:/etc/postfix/recipient_checks.pcre,
###  check_policy_service inet:127.0.0.1:12525,
  permit
smtpd_sender_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_non_fqdn_sender,
  reject_unknown_sender_domain,
  permit
# -------------------- RESTRICTIONS PART END --------------------
 
# -------------------- SASL PART START --------------------
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl2_auth_enable = yes
smtpd_sasl_local_domain = 
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
# -------------------- SASL PART END --------------------
 
# -------------------- TLS PART START --------------------
smtpd_use_tls = yes
smtpd_tls_security_level = may
#smtpd_tls_auth_only = yes
smtpd_tls_CAfile = /etc/postfix/ssl/demoCA/cacert.pem
smtpd_tls_cert_file = /etc/postfix/ssl/server-crt.pem
smtpd_tls_dh1024_param_file = /etc/postfix/ssl/dh_1024.pem
smtpd_tls_dh512_param_file = /etc/postfix/ssl/dh_512.pem
smtpd_tls_key_file = /etc/postfix/ssl/server-key.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
# -------------------- TLS PART END --------------------

master.cf

Ans Ende der “/etc/postfix/master.cf” anhängen:

# Dovecot LDA
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d ${recipient}

Will man auch smtps (Port 465) zulassen, so entfernt man die Raute-Zeichen vor den untenstehenden Zeilen, damit sie wie folgt aussehen (die Leerzeichen vor der zweiten Zeile sind essentiell):

smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_wrappermode=yes

smpts kann nützlich sein, wenn Port 25 aus irgend einem Grund gesperrt sein sollte, denn es operiert auf Port 465, welcher seltener gesperrt ist (zumindest in Studentenwohnheimen und Universitäten), zusätzlich bietet es einen höheren Schutz als plaintext-smtp (doch einen geringeren als smtp+tls).

dovecot

Nun folgt die Konfiguration des dovecot E-Mail-Servers. Zunächst wird dovecot über aptitude:

aptitude install dovecot-imapd dovecot-pop3d

Jetzt wird dovecot noch konfiguriert:

/etc/dovecot/dovecot.conf:

## Dovecot configuration file
 
base_dir = /var/run/dovecot/
 
# imap imaps pop3 pop3s (use imaps and pop3s if configured for SSL)
protocols = imaps imap pop3s pop3 managesieve
 
# Uncomment the ssl_listen statements and comment out listen if using SSL
protocol imap {
  listen = *:143
  ssl_listen = *:993
}
 
protocol pop3 {
  listen = *:110
  ssl_listen = *:995
}
 
protocol managesieve {
  listen = *:2000
}
 
log_timestamp = “%Y-%m-%d %H:%M:%S ”
syslog_facility = mail
 
# Where the mailboxes are located
mail_location = maildir:/var/vmail/%d/%n/maildir
mail_access_groups = vmail
mail_debug = yes
first_valid_uid = 150
last_valid_uid = 150
maildir_copy_with_hardlinks = yes
 
protocol imap {
  login_executable = /usr/lib/dovecot/imap-login
  mail_executable = /usr/lib/dovecot/imap
  imap_max_line_length = 65536
  mail_plugins = quota imap_quota
  imap_client_workarounds = outlook-idle delay-newmail
}
 
protocol pop3 {
  login_executable = /usr/lib/dovecot/pop3-login
  mail_executable = /usr/lib/dovecot/pop3
  pop3_uidl_format = %08Xu%08Xv
  mail_plugins = quota
  pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
 
protocol lda {
  postmaster_address = postmaster@ibutho.de
  sendmail_path = /usr/lib/sendmail
  auth_socket_path = /var/run/dovecot/auth-master
  mail_plugins = quota cmusieve
  sieve_global_path = /var/vmail/default.sieve
  log_path = /var/log/dovecot-deliver.log
  info_log_path = /var/log/dovecot-deliver.log
}
 
protocol managesieve {
  sieve = /var/vmail/%d/%n/dovecot.sieve
  sieve_storage = /var/vmail/%d/%n/sieve
}
 
auth_verbose = no
auth_debug = yes
#auth_debug_passwords = yes
 
auth default {
 mechanisms = plain login
 
 passdb sql {
   args = /etc/dovecot/dovecot-sql.conf
 }
 
 userdb sql {
   args = /etc/dovecot/dovecot-sql.conf
 }
 
 userdb prefetch {
 }
 
 user = nobody
 
 socket listen {
  master {
    path = /var/run/dovecot/auth-master
    mode = 0660
    user = vmail
    group = mail
  }
 
  client {
    path = /var/spool/postfix/private/auth
    mode = 0660
    user = postfix
    group = postfix
  }
 }
}
 
dict {
}
 
plugin {
  acl = vfile:/etc/dovecot/acls
  sieve = /var/vmail/%d/%n/dovecot.sieve
}
 
# Uncomment these if using SSL
ssl_cert_file = /etc/ssl/certs/ibutho_server.pem
ssl_key_file = /etc/ssl/private/ibutho_privatekey.pem
ssl_ca_file = /etc/ssl/certs/root.pem
ssl_parameters_regenerate = 168
verbose_ssl = no
# If you want client certificates, use these lines
# ssl_verify_client_cert = yes
# ssl_require_client_cert = yes
# ssl_username_from_cert = yes

Damit das logging nach “/var/log/dovecot-deliver.log” funktioniert, muss die Datei mit entsprechenden Rechten ausgestattet sein:

touch /var/log/dovecot-deliver.log
chmod 640 /var/log/dovecot-deliver.log
chown vmail:mail /var/log/dovecot-deliver.log

/etc/dovecot/dovecot-sql.conf:

driver = pgsql
connect = host=localhost dbname=postfix user=postfix password=xxxxxxxx
default_pass_scheme = MD5
 
user_query = SELECT '/var/vmail/' || maildir AS home, 'maildir:/var/vmail/' || maildir || 'maildir' AS mail, 150 AS uid, 8 AS gid, 'maildir:storage=' || quota AS quota FROM mailbox WHERE local_part = split_part('%n', '+', 1) AND domain = '%d'  AND active = true
 
password_query = SELECT username AS user, password, '/var/vmail/' || maildir AS userdb_home, 'maildir:/var/vmail/' || maildir || 'maildir' AS userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = true

Testen der Konfiguration

Zuerst kann man serverseitig mittels “netstat -tulpen” testen, ob der Server auf allen beabsichtigten Ports lauscht (110, 143, 993, 995, 2000). Danach kann man mittels “telnet SERVER_IP 143“, bzw. “telnet SERVER_IP 110” testen, ob man eine Verbindung bekommt. Ist dies der Fall, bietet es sich an auszuprobieren, ob man mit einem Mailprogramm auf das Postfach zugreifen kann (es muss natürlich eins in postfixadmin angelegt sein), bzw. ob man auch Mails empfangen und versenden kann.
Ein weiterer wichtiger Test, den man durchführen sollte, ist, ob der Mailserver als “open relay” missbraucht werden kann (kurz und knapp heißt das, ob der Server möglicherweise eine “Spam-Schleuder” ist). Dies kann man u.a. hier testen: http://www.abuse.net/relay.html. Sollten alle Tests Erfolg haben, hat man einen funktionsfähigen Mailserver.

Quellen:
postfixadmin/DOCUMENTS/POSTFIX_CONF.txt

http://blog.schalanda.name/archives/178-EUserv-vServer-Active-Installation-des-Mailsystems.html

http://codepoets.co.uk/postfixadmin-postgresql-courier-squirrelmail-debian-etch-howto-tutorial

http://wiki.rootforum.de/mailserver/postfix

http://wiki.rootforum.de/mailserver/postfix/postfix-admin

http://forum.rootforum.de/viewtopic.php?f=111&t=46643

http://www.postfix.org/postconf.5.html

http://wiki.dovecot.org/MainConfig

http://wiki.dovecot.org/ManageSieve

http://wiki.dovecot.org/LDA/Sieve

http://wiki.dovecot.org/HowTo/DovecotLDAPostfixAdminMySQL

Der neue Server: Teil 1 Installation und Basiskonfiguration

Seit ca. November letzten Jahres war klar, dass ein neuer Server her muss – nicht zuletzt, weil einige Leute bei ibutho ausgestiegen sind und ibutho doch etwas zu schwach ist für unsere Ansprüche. Die Planungen liefen auch schon seit Ende letzten Jahres und nun haben sie alle Gestalt angenommen. Die Domains werden alle zentral über inwx.de verwaltet. Dies hat den Vorteil, dass wir unabhängig vom Provider des Root-Servers sind und später ohne Probleme wechseln können. Beim Server haben wir uns für einen DS3000 von Hetzner entschieden. Dieser sagte uns sowohl von den Hardware-Daten als auch vom Preis-/Leistungsverhältnis zu (AMD Athlon 64 X2 5600+, 2GB RAM, 2 x 400GB Festplatte, 100MBit Anbindung ans Internet, 7 IP-Adressen, unbegrenzter Traffic).

Im Weiteren will ich auf die Grundinstallation eingehen und in den folgenden Teilen auf die beispielhafte Installation und Konfiguration verschiedenster Server-Dienste. Ich hoffe, dass diese Beiträge für den ein oder anderen nützlich sind, wenn sie ihren eigenen Server konfigurieren und absichern wollen. Ich bitte um rege Diskussionen, damit die Beiträge sinnvoll erweitert und Fehler beseitigt werden können.

Installation des Systems

Hetzner vereinfacht dem Administrator die Installation eines eigenen Betriebssystems über das Rescue-System sehr. Es wir ein Skript installimage angeboten, über welches man z.B. die Festplatte partitionieren kann, ein LVM einrichten kann oder einen Software-RAID konfigurieren kann.

Bei meiner Installation entschied ich mich für ein RAID1-System mit LVM. Für RAID1 entschied ich mich aufgrund der gesteigerten Ausfallsicherheit und der gesteigerten Lese-Performance. Für LVM entschied ich mich, da dies mehr Flexibilität mit sich bringt als ein starres Partitionsschema. Sollte man später bemerken, dass eine Volume zu groß oder zu klein ist, kann man es einfach verkleinern/vergrößern. Versierte Leser mögen sich hier fragen, warum ich nicht komplett auf ein LVM-Setup setze und dem LVM auch das Mirroring überlasse. Der Grund ist einfach: über ein Software-RAID erhalte ich höhere Leseraten (siehe auch: http://www.joshbryan.com/blog/2008/01/02/lvm2-mirrors-vs-md-raid-1/, insbesondere auch die Kommentare). Beim Dateisystem setze ich auf ext3 bzw. ext2 für “/boot”, da sich ext3 im LVM problemlos im laufenden Betrieb vergrößern bzw. verkleinern lässt.

Hier mein Partitionslayout:

Mountpunkt Dateisystem Größe
/boot ext2 256M
vg0 lvm all
swap swap 2G
/ ext3 5G
/home ext3 15G
/tmp ext3 4G
/var ext3 50G

Sowohl “/boot”, als auch “vg0″ sind jeweils eine RAID1-Partition. Die ganze Arbeit das RAID einzurichten und danach das LVM hat mir das hetzner-Skript abgenommen.

Erste Schritte

aptitude-Mirror konfigurieren

Hetzner stellt einen eigenen aptitude-/apt-Mirror und diesen werden wir als allererstes ändern. Die Vorteile liegen auf der Hand: hohe Übertragungsraten und es handelt sich um internen Traffic, wird als nicht berechnet.

/etc/apt/sources.list:

# Packages and Security Updates from the Hetzner Debian Mirror
deb ftp://mirror.hetzner.de/debian/packages  lenny          main contrib non-free
deb ftp://mirror.hetzner.de/debian/security  lenny/updates  main contrib non-free

Und nun ein erstes Update&Upgrade:

aptitude update &amp;&amp; aptitude dist-upgrade

postfix Installation

Da postfix der Mailserver meiner Wahl ist und ich nicht will, dass irgend ein Programm exim oder ähnliches installiert, werden wir jetzt gleich postfix installieren, jedoch noch nicht konfigurieren. Die Konfiguration folgt ausführlich in einem weiteren Teil.

aptitude install postfix

Systemtools

apticron

apticron ist ein Tool, welches einen per Mail informiert, wenn es Updates gibt. Dies ist besonders hilfreich, da das Tool die Paketquellen im Hintergrund updated, aber die Updates nicht einspielt; so bleibt es dem Administrator immer selbst überlassen, welche Pakete er einspielt und welche nicht, bzw. welche er erst ausführlicher testen will, da die Funktionalität des Systems evtl. erheblich beeinträchtigt werden könnte.

aptitude install apticron

mdadm

Mit mdadm wurde bereits das Software-RAID erstellt. Doch mdadm kann mehr: es kann den Benutzer auch per E-Mail informieren, wenn es Probleme mit dem RAID gibt. Dies wollen wir hier einstellen:

dpkg-reconfigure mdadm

smartmontools

Mit den smartmontools kann man den Status des Festplatten abfragen und bekommt E-Mails, wenn die Festplatte kurz vor ihrem Lebensende ist.

aptitude install smartmontools

/etc/default/smartmontools:

# uncomment to start smartd on system startup
start_smartd=yes
 
# uncomment to pass additional options to smartd on startup
smartd_opts="--interval=1800"

/etc/smartd.conf:

DEVICESCAN -m root -M exec /usr/share/smartmontools/smartd-runner

htop

htop ist eine erweiterte Version von top und bietet eine ncurses-Oberfläche, sowie Farben und “grafische” Anzeigen.

aptitude install htop

lsof

lsof kann anzeigen, wer gerade auf einen Ordner/Gerät zugreift. Das Tool kann nützlich sein, wenn man einen Ordner unmounten will, aber noch jemand/etwas darauf zugreift.

aptitude install lsof

mc

Wer DOS noch kennt, kennt auch den Norton Commander. mc (ausgeschrieben: midnight commander) ist ein Norton Commander-Klon und vereinfacht einem das Leben in vielen Situationen. Einfach mal ausprobieren:

aptitude install mc

locate

Mit locate kann man schnell nach Dateien suchen. Es baut einen Index über Dateien und Ordner des Dateisystems auf und aktualisiert diesen mittels eines Cronjobs regelmäßig. Sucht man eine Datei, so gibt man einfach folgendes ein:

locate <Dateiname>

Das Paket kann mit folgendem Befehl installiert werden:

aptitude install locate

Nach der Installation sollte als Erstes der Index aufgebaut werden (dies wird später automatisch gemacht):

updatedb

Benutzer anlegen

Meine Anforderung an die Home-Laufwerke der einzelnen Benutzer ist, dass sie nicht von jedem gelesen werden können, aber dass man trotzdem Ordner/Dateien unterhalb des eigenen Home-Laufwerks für andere zugänglich machen kann, um z.B. einen “Briefkasten” zu implementieren, wo andere Benutzer Dateien für einen ablegen können, aber nicht sehen können, was sich sonst noch darin befindet. Deshalb wird mit folgenden Befehl die Sichtbarkeit der Home-Verzeichnisse geändert:

dpkg-reconfigure adduser

Außerdem hätte ich gerne, dass jeder Benutzer standardmäßig in der Gruppe “users” ist (man weiß ja nie, wozu das noch gut sein könnte). Dazu fügen wir an die Datei “/etc/default/useradd” am Ende folgendes an – bzw. an die Datei “/etc/adduser.conf” (je nachdem, ob man adduser oder useradd zum Hinzufügen von Benutzern verwendet):
/etc/default/useradd:

GROUPS=users

/etc/adduser.conf:

EXTRA_GROUPS="users"
ADD_EXTRA_GROUPS=1

Die “Briefkasten”-Erweiterung:

cd /etc/skel/
mkdir public
chmod 755 public/
mkdir public/dropbox
chmod 753 public/dropbox/
chown root: public/ -R

Nun legen wir noch eigene Versionen der Dateien .vimrc, .bashrc, .bash_aliases in “/etc/skel/“:
.vimrc:

sy on
se nu
set incsearch
set hlsearch
colorscheme slate

.bashrc:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
 
export PS1='\h:\w\$ '
umask 022
 
# If not running interactively, don't do anything
[ -z "$PS1" ] &amp;&amp; return
 
# don't put duplicate lines in the history. See bash(1) for more options
# don't overwrite GNU Midnight Commander's setting of `ignorespace'.
export HISTCONTROL=$HISTCONTROL${HISTCONTROL+,}ignoredups
# ... or force ignoredups and ignorespace
export HISTCONTROL=ignoreboth
 
# append to the history file, don't overwrite it
shopt -s histappend
 
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
 
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
 
# make less more friendly for non-text input files, see lesspipe(1)
#[ -x /usr/bin/lesspipe ] &amp;&amp; eval "$(SHELL=/bin/sh lesspipe)"
 
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "$debian_chroot" ] &amp;&amp; [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi
 
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac
 
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes
 
if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] &amp;&amp; tput setaf 1 &gt;&amp;/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi
 
if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
 
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac
 
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
 
if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi
 
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    eval "`dircolors -b`"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'
 
    #alias grep='grep --color=auto'
    #alias fgrep='fgrep --color=auto'
    #alias egrep='egrep --color=auto'
fi
 
# some more ls aliases
#alias ll='ls -l'
#alias la='ls -A'
#alias l='ls -CF'
 
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

.bash_aliases:

alias l='ls -lA'
alias ll='ls -l'
alias la='ls -a'
alias lla='ls -la'
alias lal='ls -la'

Zusätzlich installieren wir noch das Paket “bash-completion”, um eine komplexere Code- und Befehlsvervollständigung zu bekommen (wird erst nach erneutem Anmelden an der Konsole aktiv):

aptitude install bash-completion

Nun können wir mittels adduser einen Benutzer anlegen:

adduser <Benutzername>