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 2 System härten
Wenn man einen Server betreibt, dann legt man normalerweise auch Wert auf Sicherheit (wenn nicht, dann diesen Abschnitt einfach überspringen). Hier zeige ich einige Mittel und Wege auf einen Server sicherer zu machen. Die Liste ist sicherlich nicht komplett und wird es wohl auch nie werden und selbst wenn ihr alles unternehmt, was ich hier aufführe, kann euer System immer noch gehackt werden - totale Sicherheit gibt es nicht - also schiebt die Schuld nicht auf mich, wenn euer System gehackt wurde. Und vor allem: installiert euer System komplett neu, wenn ihr gehackt wurdet!
Verzeichnisse härten
Das /tmp-Verzeichnis ist oft ein Einfalltor für Angreifer, deshalb werden wir dieses nun absichern. Zusätzlich wollen wir auch die Verzeichnisse /var und /home besser schützen, ... sowie / bei Fehlern read-only mounten:
/etc/fstab:
proc /proc proc defaults 0 0 none /dev/pts devpts gid=5,mode=620 0 0 /dev/md0 /boot ext2 defaults 0 0 # /dev/md1 belongs to LVM volume group 'vg0' /dev/vg0/root / ext3 defaults,errors=remount-ro 0 1 /dev/vg0/swap swap swap defaults 0 0 /dev/vg0/tmp /tmp ext3 rw,noexec,nosuid,nodev 0 0 /dev/vg0/home /home ext3 rw,nosuid,nodev 0 2 /dev/vg0/var /var ext3 rw,nosuid,nodev 0 2
Quelle: http://www.cromwell-intl.com/security/linux-hardening.html
sshd absichern
Voraussetzung dafür diesen Abschnitt zu implementieren ist, dass es neben root noch mindestens einen anderen Benutzer gibt, denn im folgenden wird root das direkte Anmelden über ssh verboten. Dies erschwert es einem Angreifer root-Rechte zu erlangen, da er erst das Passwort eines Benutzers knacken muss und dann zusätzlich noch das root-Passwort (oder aber er macht es sich einfach und benutzt einfach einen Exploit um sich root-Rechte zu verschaffen). Zudem kann man so immer über "/var/log/auth.log" herausfinden, wer sich als root angemeldet hat.
Als erstes erstellen wir eine Gruppe "sshusers". Nur Benutzer, die dieser Gruppe angehören, dürfen sich auch am ssh-Server anmelden:
addgroup --system sshusersDanach fügen wir unseren nicht-root Benutzer dieser Gruppe hinzu:
adduser <Benutzername> sshusers
Nun meine sshd_config:
# Package generated configuration file # See the sshd(8) manpage for details # What ports, IPs and protocols we listen for Port 22 # Use these options to restrict which interfaces/protocols sshd will bind to #ListenAddress :: #ListenAddress 0.0.0.0 ListenAddress 78.46.92.6 Protocol 2 # HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key #Privilege Separation is turned on for security UsePrivilegeSeparation yes # Lifetime and size of ephemeral version 1 server key KeyRegenerationInterval 3600 ServerKeyBits 768 # Logging SyslogFacility AUTH LogLevel VERBOSE # Authentication: LoginGraceTime 30 AllowGroups sshusers PermitRootLogin no StrictModes yes RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile %h/.ssh/authorized_keys # Don't read the user's ~/.rhosts and ~/.shosts files IgnoreRhosts yes # For this to work you will also need host keys in /etc/ssh_known_hosts RhostsRSAAuthentication no # similar for protocol version 2 HostbasedAuthentication no # Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication #IgnoreUserKnownHosts yes # To enable empty passwords, change to yes (NOT RECOMMENDED) PermitEmptyPasswords no # Change to yes to enable challenge-response passwords (beware issues with # some PAM modules and threads) ChallengeResponseAuthentication no # Change to no to disable tunnelled clear text passwords #PasswordAuthentication yes # Kerberos options #KerberosAuthentication no #KerberosGetAFSToken no #KerberosOrLocalPasswd yes #KerberosTicketCleanup yes # GSSAPI options #GSSAPIAuthentication no #GSSAPICleanupCredentials yes X11Forwarding no X11DisplayOffset 10 PrintMotd no PrintLastLog yes TCPKeepAlive yes #UseLogin no #MaxStartups 10:30:60 Banner /etc/issue.net # Allow client to pass locale environment variables AcceptEnv LANG LC_* Subsystem sftp /usr/lib/openssh/sftp-server UsePAM yes
Wer auf "security by obscurity" steht, kann auch noch den ssh-Port auf einen nicht Standardport verlegen. Im Grunde genommen bringt es nichts - außer vielleicht Verstimmungen bei den Benutzern, da die Benutzerfreundlichkeit stark leidet und die Tipparbeit steigt - da jeder Portscan, z.b. mit nmap, den ssh-Port preisgibt. Natürlich kann man auf der anderen Seite auch argumentieren, dass primitive DoS-Skripts nur den Standardport ausprobieren und das Umlegen des ssh-Ports doch einen gewissen Schutz bietet.
Zusätzlich kann man noch fail2ban installieren, um sich vor DoS-Attacken über ssh (und auch über viele andere Dienste) zu schützen. Dies wird in einem späteren Abschnitt behandelt und stellt meiner Meinung nach die bessere Alternative zu einem nicht-Standardport dar.
Quellen:
http://root-support.com/blog/?p=183
http://aymanh.com/tips-to-secure-linux-workstation
http://www.pro-linux.de/work/rootserver/teil2.html
forkbombs
Eine forkbomb ist ein DoS-Angriff, bei dem sehr viele Prozesse gestartet werden. So viele, dass der komplette Arbeitsspeicher vollgeschrieben wird und das System somit unbenutzbar wird. Ein Beispiel für eine forkbomb wäre (ACHTUNG: Nicht auf einem Produktivsystem ausführen!):
:(){ :|:& };:
Um diese Art eines Angriffs (zumindest teilweise) zu verhindern, ändern wir die Datei "/etc/security/limits.conf" dahingehend ab, dass jeder Nutzer der Gruppe "users" (in denen all unsere Konsolennutzer Mitglied sind) maximal 150 Prozesse starten darf:
/etc/security/limits.conf:
@users soft nproc 100 @users hard nproc 150
Quelle:
http://wiki.craz1.homelinux.com/index.php/Linux:Security:Forkbomb
http://aymanh.com/tips-to-secure-linux-workstation
rkhunter
Dieses Tool dient dem Aufspüren von rootkits. Es hat eine Datenbank mit Signaturen, welche wöchentlich aktualisiert wird und überprüfen täglich über einen cronjob, ob das System potentiell infiziert ist. Wird eine Infizierung/Gefahr festgestellt, verschickt rkhunter eine E-Mail.
Neben rkhunter gibts es auch noch chkrootkit, falls jemand will kann er zusätzlich auch noch dieses Tool installieren.
aptitude install rkhunter chkrootkit
Editieren der Datei "/etc/rkhunter.conf" (hier werden nur die Zeilen angezeigt, die geändert wurden):
DISABLE_TESTS="suspscan deleted_files packet_cap_apps" ALLOWHIDDENDIR=/etc/.java
/etc/default/rkhunter: (auch nur geänderte Zeilen):
DB_UPDATE_EMAIL="yes"
Diese Einstellungen nehmen einen erweiterten Test für versteckte Prozesse zu den Standardtests auf und nehmen das Verzeichnis "/etc/.java" auf die Whitelist mit auf, damit rkhunter sich nicht bei jedem Scan beschwert, dass er eine verdächtige Datei gefunden hat, nur weil Java installiert ist. Darüber hinaus bekommt man wöchentlich eine E-Mail über die Ergebnisse des Datenbank-Updates.
bastille
Bastille ist ein Tool, welches das Härten eines Systems drastisch vereinfacht. Bastille führt den Nutzer über eine Textberfläche durch verschiedene Fragen und anhand der Antworten des Benutzers wird das System am Schluss verändert. Das Besondere dabei ist, dass bastille alle Aktionen genau und ausführlich erklärt und man die Aktionen auch selbst ausführen kann, anstatt bastille die Ausführung zu überlassen. Bastille wird aktiv von vielen großen Firmen entwickelt und sollte eigentlich zu den Standardwerkzeugen eines jeden verantwortungsbewussten Linux-Administrators gehören, da es viel Arbeit abnimmt und auf Dinge aufmerksam macht, die man sonst evtl. übersieht.
aptitude install bastille
Da das bastille Paket in lenny von Haus aus nicht kompatibel mit lenny ist, muss die Konfigurationsdateien von bastille ändern werden, um bastille vorzugaukeln, dass es kompatibel mit lenny wäre (siehe hier und hier):
/usr/lib/Bastille/API.pm:
sub get_supported_OS_list () { my @list = ( "DB2.2", "DB3.0", "DB3.1", "DB4.0", "DB5.0",
/usr/lib/Bastille/IOLoader.pm:
my $supported_versions = 'DB2.2 DB3.0 DB3.1 DB4.0 DB5.0';
Die Fragen von bastille nach bestem Wissen und Gewissen beantworten und das System so seinen Wünschen nach anpassen.
Bastille legt ein ausführliches Log über die Änderungen an und bietet die Möglichkeit die vorgenommenen Änderungen später wieder rückgängig zu machen.
Quelle:
http://linux.com/feature/118353
/etc/passwd
In diesem Abschnitt geht es darum, die Shells von Systembenutzern auf "/bin/false" bzw. "/bin/nologin" umzustellen, denn die meisten Serverdienste brauchen keinen Konsolenzugriff und stellen in der Standardeinstellung eine gewisse Sicherheitsgefahr dar. Welche Diensten ohne Konsole zurechtkommen, muss man recherchieren oder ausprobieren. Nachdem man einen neuen Serverdienst installiert hat, bietet es sich an diese Datei erneut zu überprüfen und die Konsole der Benutzer ggf. zu ändern.
Beispielhaft zwei Zeilen, wie soetwas aussehen könnte:
man:x:6:12:man:/var/cache/man:/bin/false mail:x:8:8:mail:/var/mail:/bin/false
fail2ban
Fail2ban ist eine effektive Waffe gegen DoS-Angriffe jedweder Art - und nicht nur das: man kann auch gescheiterte Authentifizierungsversuche über PAM oder Overflow-Angriffe auf Apache eindämmen. Es bringt schon viele vordefinierte Filter (jails), z.B. für ssh und apache, mit und lässt sich zusätzlich über selbstgeschriebene jails erweitern. Es ist über die Datei "/etc/fail2ban/jail.local" anpassbar. Man sollte die Datei "/etc/fail2ban/jail.conf" nicht selbst verändern. Das stellt sicher, dass bei einem Update auch immer die neuesten Regeln und Anpassungen verwendet werden. Über jail.local lässt sich jede Einstellung in jail.conf überschreiben. Bitte genau abwägen, welche jails man aktiviert und welche nicht (falls postfix nicht auf dem Server nicht installiert ist, ist es unsinnig den jail dafür zu aktivieren).
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
/etc/fail2ban/jail.local:
# Fail2Ban jail.local file [DEFAULT] ignoreip = 127.0.0.1 bantime = 600 maxretry = 3 backend = polling destemail = root # # ACTIONS # banaction = iptables-multiport mta = sendmail protocol = tcp action = %(action_mwl)s # # JAILS # [ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log [ssh-ddos] enabled = true port = ssh filter = sshd-ddos logpath = /var/log/auth.log [pam-generic] enabled = true filter = pam-generic port = all banaction = iptables-allports port = anyport logpath = /var/log/auth.log [xinetd-fail] enabled = false filter = xinetd-fail port = all banaction = iptables-multiport-log logpath = /var/log/daemon.log maxretry = 2 # # HTTP servers # [apache] enabled = true port = http,https filter = apache-auth logpath = /var/log/apache*/*error.log [apache-noscript] enabled = true port = http,https filter = apache-noscript logpath = /var/log/apache*/*error.log [apache-overflows] enabled = true port = http,https filter = apache-overflows logpath = /var/log/apache*/*error.log maxretry = 2 # # Mail servers # [postfix] enabled = true port = smtp,ssmtp filter = postfix logpath = /var/log/mail.log [sasl] enabled = true port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s filter = sasl logpath = /var/log/mail.log
Quellen:
http://debianclusters.cs.uni.edu/index.php/Fail2Ban:_Preventing_Brute_Force_SSH
http://debaday.debian.net/2007/04/29/fail2ban-an-enemy-of-script-kiddies/
Intrusion Detection System
IDS-Systeme wie tripwire, aide oder fcheck helfen Manipulationen an Dateien festzustellen. Um das bewerkstelligen zu können, wird anfänglich eine Datenbank erstellt mit Hash-Werten der zu überwachenden Ordner und dann werden die Werte regelmäßig überprüft. Stimmen die Hash-Werte nicht mehr überein, wird man per E-Mail benachrichtigt. Der große Nachteil ist natürlich, dass man die Datenbank immer aktuell halten muss und z.B. nach jeden "aptitude update/install/purge/..." ist dies der Fall. Die große Frage ist: Zu welchem Zeitpunkt es interessant ist ein IDS aufzusetzen. Wenn man einen Server ganz neu hat, ändern sich fast täglich Konfigurationsdateien oder es werden neue Pakete installiert, zu einem späteren Zeitpunkt läuft man Gefahr, dass ein Angreifer schon Programme/Konfigurationsdateien ausgetauscht hat und dann ist das IDS bereits nutzlos.
Dieser Abschnitt wird zu einem späteren Zeitpunkt mit Inhalt gefüllt.
iptables
Früher oder später sollte man sich darüber Gedanken machen, ob man eine Firewall/Paketfilter einsetzen will oder nicht, bzw. ob es überhaupt Sinn macht.
Diese Sektion wird zu einem späteren Zeitpunk um Vorschläge für eine kleine Firewall-Konfiguration, bzw. über den Aufbau von iptables-Regeln erweitert.
Netzwerkscanner
Um von außen zu überprüfen, ob der Server sicher ist, kann man Tools wie nmap oder nessus einsetzen. nmap dient dabei dazu offene Ports aufzuspüren, damit man diese ggf. schließen kann. nessus hingegen überprüft, ob der Server anfällig für bestimmte Exploits ist, z.B. anhand der Versionsnummer eines Dienstes. Um es allgemeiner auszudrücken: nessus ist ein Vulnerability (Schwachstellen)-Scanner.
nmap -A -T4 <Serveradresse>
Die Bedienung von nessus ist etwas umfangreicher und an dieser Stelle sei deshalb auf google verwiesen und es wird zum Ausprobieren ermuntert.
Des Weiteren sollte man einen Blick auf netstat werfen. Mit diesem Tool kann man lokal auf dem Server herausfinden, welche Ports geöffnet sind und welcher Dienst sich hinter welchem Port versteckt.
Beispielhafter Aufruf:
netstat -tulpen
Weitere Möglichkeiten sich zu schützen
Dies sind nur einige grundlegende Schritte, die man unternehmen kann, um einen Server abzusichern. Die Liste ist keineswegs vollständig und erhebt auch nicht den Anspruch darauf. Falls jemand weitere Wege kennt, einen Server abzusichern, dann bitte ich um einen Kommentar, bzw. um eine E-Mail und ich werde dieses Howto erweitern.
Empfehlenswert ist natürlich auch das Eintragen in Mailinglisten zum Thema Sicherheit und sich allgemein über sicherheitsrelevante Themen auf dem Laufenden zu halten. Ein weiterer Schritt, um Schwachstellen zu vermeiden ist es, das System immer aktuell zu halten. Das Paketmanagement macht es einem unter Linux sehr einfach und deshalb empfehle ich es aktiv zu nutzen, anstatt Programme selbst zu kompilieren. Normalerweise ist jedes Programm, das man auf einem Server brauchen könnte in den Debian-Repositories enthalten (dass man auf einem Server nur mit den stable-Repositories arbeiten sollte und von testing tunlichst die Finger lassen sollte, brauche ich hier wohl kaum zu erwähnen).
Abschließend bleibt nur noch einmal zu wiederholen, dass es keine absolute Sicherheit gibt und dass man einen guten Kompromiss zwischen Sicherheit und Freiheit (der Nutzer) finden sollte (Hallo, Herr Innenminister).
