Ziel #
Installation eines Mail-Server der möglichst wenig Probleme macht, von daher wird mit iptables eigentlich alles geblockt, was nicht über PORT 80/443/25/456/993/22 läuft.Der Server soll möglichst wenig Aufwand zum Administrieren bereiten und ich bin kein Freund von adduser windowsNutzer also wird alles in einer Datenbank abgelegt, so vermeide ich einen echten Nutzer.
Da die Datenbank nicht von den üblichen IMAP Diensten verwendet werden kann muss entweder ein Frontend direkt für die Datenbank geschrieben werden oder dbmails interner IMAP Dienst verwendet werden.
Die Installation ist eigentlich einfach. Man muss aber die apt liste erweitern um das dbmail (aktuelle version)
# eine neue sourcelist /etc/apt/sources.list.d/dbmail.list deb http://debian.nfgd.net/debian stable main deb-src http://debian.nfgd.net/debian stable main
apt-get update && apt-get --no-install-recommends install dbmail postfix postfix-pgsql \ libpam-pgsql sasl2-bin libsasl2-modules postgresql-8.4 postgresql-client-8.4 \ amavisd-new clamav clamav-daemon clamav-freshclam spamassassin pyzor razor \ less mailutils postgrey postgresql
Dann kommt das nicht so schöne Konfigurieren und nach dem 3 Anlauf geht das unter 3Stunden
Wichtig es müssen die Gruppen angepasst werden, da sonst einige Dienste nur mit Fehlern laufen. sasl ist einer dieser Dienste
# /etc/group anpassen sasl:x:45:postfix,dbmail,amavis dbmail:x:108:amavis,clamav clamav:x:109:amavis,dbmail amavis:x:110:clamav,dbmail
Postfix #
Postfix unter Debian installieren
nichts Konfigurieren.
# die Datei main.cf # virtuelle Zustellung macht sonst probleme mydestination = localhost append_dot_mydomain = no # TLS parameters smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key smtpd_use_tls = yes smtpd_sasl_auth_enable = yes #plain login nur over tls smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymous smtpd_tls_auth_only = yes broken_sasl_auth_clients = yes smtpd_tls_security_level = may smtpd_data_restrictions = reject_unauth_pipelining smtpd_helo_required = yes mailbox_size_limit = 0 recipient_delimiter = + # gegen den spam smtpd_recipient_restrictions = # lokales netz / der server selbst permit_mynetworks, permit_sasl_authenticated, reject_invalid_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_pipelining, reject_unauth_destination, reject_rbl_client multi.uribl.com, reject_rbl_client dul.dnsbl.sorbs.net, reject_rbl_client proxies.blackholes.wirehub.net, reject_rbl_client sbl.spamhaus.org, reject_rbl_client dnsbl.njabl.org, reject_rbl_client sbl-xbl.spamhaus.org, reject_rbl_client bl.spamcop.net, reject_rbl_client dnsbl.sorbs.net, reject_rbl_client cbl.abuseat.org, reject_rbl_client rabl.nuclearelephant.com, reject_rbl_client psbl.surriel.com, # postgray prüfen check_policy_service inet:127.0.0.1:60000, permit smtpd_sender_restrictions = permit_sasl_authenticated, reject_unknown_sender_domain, reject_authenticated_sender_login_mismatch, reject_unauthenticated_sender_login_mismatch, reject_sender_login_mismatch, reject_unknown_recipient_domain, permit # alles über dbmail mailbox_transport = dbmail: virtual_transport = dbmail: #default_transport = dbmail-deliver: #relay_transport = error #transport_maps = hash:/etc/postfix/transport # dbmail virtual_mailbox_domains = pgsql:/etc/postfix/sql-virtual_mailbox_domains.cf virtual_mailbox_maps = pgsql:/etc/postfix/sql-virtual_mailbox_maps.cf # fehler werden auf hdd gespeichert virtual_mailbox_base = /opt/vmail # limit the spammer smtpd_error_sleep_time = 1s smtpd_soft_error_limit = 10 smtpd_hard_error_limit = 20 smtpd_client_message_rate_limit = 50 smtpd_client_connection_count_limit = 100 smtpd_client_connection_rate_limit = 100 smtpd_client_message_rate_limit = 30 smtpd_client_new_tls_session_rate_limit = 60 # spamfilter und virusscanner content_filter = amavis:[127.0.0.1]:10024 receive_override_options = no_address_mappings # all wenn man auch ipv6 haben will # muss man in testing setzen warum auch immer # inet_protocols = ipv4
#master.cf # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== smtp inet n - - - - smtpd #submission inet n - - - - smtpd # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING smtps inet n - - - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING #628 inet n - - - - qmqpd pickup fifo n - - 60 1 pickup cleanup unix n - - - 0 cleanup qmgr fifo n - n 300 1 qmgr #qmgr fifo n - - 300 1 oqmgr tlsmgr unix - - - 1000? 1 tlsmgr rewrite unix - - - - - trivial-rewrite bounce unix - - - - 0 bounce defer unix - - - - 0 bounce trace unix - - - - 0 bounce verify unix - - - - 1 verify flush unix n - - 1000? 0 flush proxymap unix - - n - - proxymap proxywrite unix - - n - 1 proxymap smtp unix - - - - - smtp # When relaying mail as backup MX, disable fallback_relay to avoid MX loops relay unix - - - - - smtp -o smtp_fallback_relay= # -o smtp_helo_timeout=5 -o smtp_connect_timeout=5 showq unix n - - - - showq error unix - - - - - error retry unix - - - - - error discard unix - - - - - discard local unix - n n - - local virtual unix - n n - - virtual lmtp unix - - - - - lmtp anvil unix - - - - 1 anvil scache unix - - - - 1 scache # dbmail dbmail unix - n n - - pipe flags= user=dbmail:dbmail argv=/usr/sbin/dbmail-deliver -d ${recipient} -r ${sender} amavis unix - - n - 5 smtp -o smtp_data_done_timeout=1200s -o disable_dns_lookups=yes -o smtp_send_xforward_command=yes #wiedereinliefern 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 receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes
#sql-virtual_mailbox_domains.cf user = dbmail password = dbmail # gehe über unix socket, sasl will hier kein unix: stehen haben hosts = unix:/var/run/postgresql dbname = dbmail query = SELECT DISTINCT 1 FROM dbmail_aliases WHERE SUBSTRING(alias FROM POSITION('@' in alias)+1) = '%s';
#sql-virtual_mailbox_maps.cf user = dbmail password = dbmail hosts = unix:/var/run/postgresql dbname = dbmail query = SELECT DISTINCT 1 FROM dbmail_aliases WHERE alias= '%s';
Hiermit ist postfix fertig, startet noch nicht.
Postgresql #
# pg_hba.conf # reihenfolge ist wichtig!!! local all postgres ident # "local" is for Unix domain socket connections only local all all trust # alles andere kann auskommentiert werden
#postgresql.conf # hier gibt es die socket information, # da postfix im chroot läuft muss hier ein wenig was angepasst werden # damit man auch über sockets reden kann. external_pid_file = '/var/spool/postfix/var/run/postgresql/8.4-main.pid' listen_addresses = 'localhost' # what IP address(es) to listen on; unix_socket_directory = '/var/spool/postfix/var/run/postgresql' # (change requires restart)
ich muste noch die Ordner erstellen mkdir -p /var/spool/postfix/var/run && chmod 777 /var/spool/postfix/var/run dann sollte das aber laufen.
DBmail #
Sollte version 3.0.2 installieren
dann muss die Datenbank angelegt werden.
$ cd /usr/share/doc/dbmail/examples $ su postgres $ createuser dbmail $ createdb dbmail $ psql $ SQL> GRANT ALL ON DATABASE dbmail TO dbmail; # wieder root werden STRG-D $ gunzip create_tables.pgsql.gz $ psql -U dbmail dbmail < create_tables.pgsql
Nun sind alle Daten Tabellen da, man kann nun mit psql nachsehen ob alles da ist,
in psql einfach mal \dt eingeben und dann sehen was ausgegeben wird.
schön an postgresql ist, das der consolen client *code-completion* kennt. Nun ist alles da, und man kann einen user anlegen, für mail.
# es muss dbmail laufen!! dbmail-users -a jens # hier bin ich noch dran, wie man digest-md5 unterstüzen kann. # bislang klappt es nur, wenn passwörter in plaintext gespeichert werden, # aber beim connect verschlüsselt gesentet werden (für imap) dbmail-users -c jens -w password -p plaintext dbmail-users -c jens -s jens@mail.edv-gutachter.info
Das schöne an dbmail ist dass nach einer kleine Einstellung des mx und A records im DNS auch subdomains ganz einfach einzustellen sind. für df.eu ist das
edv-gutachter.info -> IP *.edv-gutachter.info -> IP MX edv-gutachter.info -> IP MX *.edv-gutachter.info -> IP
das halt für alle domains, für die man Emails annehmen und versenden will. df.eu hat auch einen SPF Assistent, der Spammen verhindern sollte, so dass nur der eigene Mailserver mails versenden darf, die diese domain nutzen.
Da dbmail noch eine kleine Konfiguration hat,
# /etc/default/dbmail # comment out to disable the pop3 server #START_POP3D=true # comment out to disable the imapd server START_IMAPD=true # uncomment to enable the lmtpd server #START_LMTPD=true # wer es brauch! # uncomment to enable the timsieved server #START_SIEVE=true # comment out to enable the stunnel SSL wrapper #START_SSL=true # specify the filename for the pem file as # it resides in /etc/ssl/certs #PEMFILE="dbmail.pem"
ich mag kein pop3 also bleibt der deamon aus.
# Stunnel bruach man ab v.3 nicht mehr # SSL kann hier konfiguriert werden, dann muss aber bindip != localhost sein und # A file containing a list of CAs in PEM format tls_cafile = /etc/ssl/certs/ssl-cert-snakeoil.pem # A file containing a PEM format certificate tls_cert = /etc/ssl/certs/ssl-cert-snakeoil.pem # A file containing a PEM format RSA or DSA key tls_key = /etc/ssl/private/ssl-cert-snakeoil.key # leer lassen klappt besser als was eintragen ^^ #tls_ciphers = SSL_RSA_WITH_3DES_EDE_CBC_SHA hash_algorithm = SHA1 [IMAP] # You can set an alternate banner to display when connecting to the service # banner = imap 4r1 server (dbmail 2.3.x) # # Port to bind to. # #port = 143 tls_port = 993 # /etc/dbmail/dbmail.conf [DBMAIL] driver = postgresql authdriver = sql # wichtig host = localhost sqlport = # über sockel verbinden sqlsocket = /var/spool/postfix/var/run/postgresql user = dbmail # auch wenn da trust steht # ein pw will die bibliothek dennoch. # ich habe kein password dem dbmailuser zugeteilt. pass = dbmail db = dbmail table_prefix = dbmail_ encoding = utf8 default_msg_encoding = utf8 # logging kann man beeinflussen damit man alles sieht ;) # file_logging_levels = 511 # syslog_logging_levels = 511
SASL #
mit diesem hack sollte auch der testsalauthd laufen/etc/init.d/saslauthd stop rm -rf /var/run/saslauthd /etc/init.d/saslauthd start ln -s /var/spool/postfix/var/run/saslauthd /var/run/damit testsaslauthd -u jkapitza -p jens läuft.
# /etc/default/saslauthd START=yes OPTIONS="-m /var/spool/postfix/var/run/saslauthd" PWDIR="/var/spool/postfix/var/run/saslauthd" PIDFILE="/var/spool/postfix/var/run/${NAME}/saslauthd.pid"
postfix nutzt sasl über pam
# /etc/postfix/sasl/smtpd.conf pwcheck_method: saslauthd mech_list: login plain # leider das einzige was unterstüzt wird ;(
pam #
#/etc/pam_pgsql.conf #debug=1 database = dbmail user = dbmail table = dbmail_users user_column = userid pwd_column = passwd # später auf crypt ändern pw_type=clear
# /etc/pam.d/smtp auth sufficient pam_pgsql.so verbose=1 user=dbmail \ passwd=secret host=/var/spool/postfix/var/run/postgresql account required pam_pgsql.so verbose=1 user=dbmail \ passwd=secret host=/var/spool/postfix/var/run/postgresql
Amavis #
# /etc/spamassassin/updatechannels.txt sa.zmi.at updates.spamassassin.org sought.rules.yerp.org
# /etc/default/spamassassin # Change to one to enable spamd ENABLED=1 # Cronjob # Set to anything but 0 to enable the cron job to automatically update # spamassassin's rules on a nightly basis CRON=1
# /etc/spamassassin/local.cf #pyzor use_pyzor 1 pyzor_path /usr/bin/pyzor #pyzor_add_header 1 #razor use_razor2 1 razor_config /etc/razor/razor-agent.conf #bayes use_bayes 1 bayes_auto_learn 1 bayes_path /opt/bayes #bayes_use_chi2_combining 1 bayes_auto_expire 0 bayes_journal_max_size 15000000 bayes_expiry_max_db_size 20000000 bayes_ignore_header Return-Path bayes_ignore_header Received bayes_ignore_header X-Spam-Flag bayes_ignore_header X-Spam-Status bayes_ignore_header X-Spam-Flag bayes_ignore_header X-Spam-Level bayes_ignore_header X-purgate bayes_ignore_header X-purgate-ID bayes_ignore_header X-purgate-Ad bayes_ignore_header X-GMX-Antispam bayes_ignore_header X-Resent-For bayes_ignore_header X-Resent-By bayes_ignore_header X-Resent-To bayes_ignore_header Resent-To bayes_ignore_header Sender bayes_ignore_header Precedence bayes_ignore_header X-Antispam bayes_ignore_header X-Sieve bayes_ignore_header X-Spamcount bayes_ignore_header X-Spamsensitivity bayes_ignore_header To bayes_ignore_header X-Sieve bayes_ignore_header X-Bogosity # Save spam messages as a message/rfc822 MIME attachment instead of # modifying the original message (0: off, 2: use text/plain instead) # report_safe 1
Von hand freshcalm aufrufen und sa-update
sa-update --channelfile /etc/mail/spamassassin/updatechannels.txt --nogpg freshclam
So noch eine schöne Woche ;)
TODO Webserver mit
- http://roundcube.net/
- nginx oder apache2
- mailman oder phplist
- postfix dann als relay-smtp
- http://www.dbmail.org/dokuwiki/doku.php/sieve dbmail-sievecmd -u USERNAME -i MYSCRIPT sieve.script dbmail-sievecmd -u USERNAME -a MYSCRIPT