dc.fjfi.cvut.cz
definovat platnost emailové adresy (zatím, když se někdo dostane do o=Odpad, tak se mu tím zruší i email na mailgw)
Synchronizace - periodicky + na vyžádání
amavis
exe & spol - doručit jako příponu s upozorněním
dspam
vyhodnotit výsledky ze 14 denního testování (korelace s výsledky spamassassinu)
otestovat s MySQL databázovým backendem
CentOS4 (klon RHEL4), aby bylo možno v případě nutnosti odmigrovat přímo na RHEL. Balíky jsou pokud možno přímo z distribuce případně překompolované src.rpm z externích repozitářů (amavis, ....). Preferovány jsou "oficiání" zdroje pro pro Fedoru Core 3 a Fedora Extra pro FC3, které by měli být bez problemů kompatibilní s RHEL4.
Po instalaci bylo nutné provést ještě následující upravy:
konfigurace firewallu v /etc/sysconfig/iptables
FIXME: konfigurace VLAN v /etc/sysconfig/network-scripts/ifcfg-*
Potřebné komponenty pro chod mailové brány:
Postfix
Amavis
kav
spamassassin
dspam
OpenLDAP
IMP Horde
Apache
certifikáty
Umístění /etc/postfix
, upraveny následující soubory:
main.cf
- hlavní konfigurační soubor s hromadou nastavení (komentované)
master.cf
- konfigurace amavis content-filtru, počtu běžících daemonů, spam a nospam adresy k učení
canonical-ldap.cf
- pro přepisování @fjfi, @br, @kmat, @km1, @troja na oficiální adresy
helo_access
- odmítnutí strojů, které zdraví "mým" jménem (fjfi.cvut.cz, IP, localhost)
recipient_access
- nastavena verifikace příjemců z .fjfi.cvut.cz
transport
- pro přeposílání na cílové mailservery za mailovou branou na FJFI
aliases
- přidány aliasy spam a nospam (nebo je potreba jinak zajistit, aby verifikace těchto adres prošla)
mx_access
- odmítání MXek z privátních a podobných sítí
vygenerovat klíče
openssl gendh -out /etc/postfix/dh_1024.pem -2 -rand /dev/random 1024 openssl gendh -out /etc/postfix/dh_512.pem -2 -rand /dev/random 512
konfigurace pro učení spamových filtrů
spam_client_access
- povolení klientů pouze z .fjfi.cvut.cz
spam_recipient_access
- vyfiltrování adres, které jsou určeny pouze pro mailovou bránu
spam_recipient_filter
- přesměrování mailů k doučení spam filtrů
spam-learn.py
- skript pro distribuci mailu k přeučení na všechny mailové brány, vlastní doučení spamových filtrů
Navíc upraven startovací skript /etc/init.d/postfix
, aby při startu, restartu a reloadu automaticky přegeneroval "db" soubory pomocí Makefile
umístěného v /etc/postfix
.
nastavit ověřování v main.cf
a rozběhnout SSL daemony v master.cf
ověřování hesel
/etc/pam.d/smtp
- nastavení ověřování proti LDAP
/etc/ldap.conf
- nastavení ověřovacího zdroje (Usermap)
certifikáty - viz. kapitola OpenSSL
autentizační daemon saslauthd
/etc/sysconfig/saslauthd
- nastavit ověřování proti pam modulům
/usr/lib/sasl2/smtpd.conf - podporované mechanizmy nastavit na
pwcheck_method: saslauthd mech_list: plain login
(je to nutné/vhodné?)
/etc/fstab
- mountovat /var/spool
s parametrem noatime
upravit konfigurační soubor /etc/amavisd.conf
úpravy provedené při kompilaci ze src.rpm balíku
amavis-new 2.3.2 vyžaduje novější verzi některých perl modulů: Net::LDAP + závislosti (IO::Socket::SSL, Net::SSLeay, Authen::SASL) - vesměs převzaty/překompilovány z Fedora Core/Extra
nahrazení X-Spam resp. X-Amavis hlaviček v amavisd za X-CTU-FNSPE-Spam resp. X-CTU-FNSPE-Amavis
perl -p -i -e 's/append_header\((.)X-(Spam|Amavis)/append_header($1X-CTU-FNSPE-$2/g' /usr/sbin/amavisd
ošetření situace, kdy dojde ke ztrátě spojení s OpenLDAP (amavisd-new-2.3.2-ldap_reconnect.patch
)
přidání bodů do Subject, odstranění vícenásobného výskytu ***SPAM*** (amavisd-new-2.3.2-subject_hits.patch
)
úprava X-DSPAM hlaviček a přidání výsledků dspam ke globálnímu obodování (amavisd-new-2.3.2-dspam_hits.patch
)
přidání hlavičky duplicitní X-Spam-Status hlavičky, která je využívána novellem v Trojance (amavisd-new-2.3.2-all_header.patch
)
spamy
značkovány pomocí spamassassinu a dspamu (výsledky zkombinovány dohromady)
značkovat od určité hranice, ale žádné neodmítat
adresy <spam@fjfi.cvut.cz>
, <nospam@fjfi.cvut.cz>
pro učení bayes filtrů
přijímat pouze z .fjfi.cvut.cz pomocí pravidel v master.cf
+ spam_client_access
, spam_recipient_access
, spam_recipient_filter
rozdistribuovat na všechny mailgw spam-learn.py
+ master.cf
viry
KAV daemon použit jako primární nástroj pro kontrolu virů, pokud daemon umře, je spuštěn pro každý mail nový proces. V případě nefunkčnosti se maily hromadí ve frontě nezkontrolovaných mailů (dalo by se vyřešit druhým záložním antivirem - např. clamav).
zahazovat, neinformovat
filtrování (přípony, `file`, MIME)
TODO: spustitelné doručit jako přílohu s varováním
bad headers
nepoužívá se
standardní OpenLDAP z distribuce nepodporuje multimaster replikaci
pro zakompilovaní příslušné podpory je potřeba:
nainstalovat zdrojový balík z distribuce přípdaně updatů
rpm -Uvh openldap-2.2.x-x.src.rpm
zkopírovat openldap-2.2.13-multimaster.patch
do /usr/src/redhat/SOURCES
aplikovat openldap.spec.patch
na /usr/src/redhat/SPECS/openldap.spec
, který upraví kompilační skript tak, aby aplikoval multimaster patch
patch < opeldap.spec.patch
je nutné zakázat automatické updaty OpenLDAP např. přidáním následujícího řádku do /etc/yum.conf
exclude=openldap*
konfigurační soubory uloženy v /etc/openldap
slapd.conf
- hlavní konfigurace OpenLDAP serveru
slapd.access.conf
- přístupová práva (includován do slapd.conf)
slapd.auth.conf
- globální autentizační služba (ověřování proti NDS, ADS, Usermap, ...)
ldap.conf
- konfigurační parametry pro OpenLDAP klientské API
schemata v /etc/openldap/shema
fjfi.schema
- schema obsahující atributy specifické pro FJFI
viz. prezentace o mailové bráně
komentáře ve zdrojových souborech
SyncLdap.py
- vlastní synchronizační skript (více lze najít ve zdrojácích a příslušných komentářích), cli a web interface
SearchLdap.py
- skript pro vyhledávání v ČVUT LDAP adresářích, generování formátovaných výstupů, cli a web interface
CvutLdap.py
- obalení standardních LDAP funkcí pro jednodušší přístup k LDAP adresářům na ČVUT
Config.py
- všeobecné konfigurační parametry (např. jména LDAP strojů, parametry pro připojení, konstanty - CvutConst.py
, CvutConstPhones.py
, CvutConstRooms.py
)
GAN.py
- ručně zadaná rodná čísla pro položky, u nichž je nelze zadat přímo do LDAPu (NDS, AD)
/etc/sysconfig/saslauthd - nastavení autentizace proti LDAP
MECH=ldap
/etc/saslauthd.conf
- konfigurace LDAP pro SASL autentizaci
ldap_servers: ldap://ldap1.fjfi.cvut.cz ldap://ldap2.fjfi.cvut.cz ldap_search_base: ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz ldap_filter: (&(uid=%u)(dc=%d))
/usr/lib/sasl2/slapd.conf
- konfigurace ověřování pomocí SASL k OpenLDAP
pwcheck_method: saslauthd
/etc/openldap/AuthSASL.py
- přepisování LDAP filtru pocházejícího z saslauthd.conf
na virtuální DN uid=username,ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz
/etc/openldap/slapd.auth.conf
- konfigurace autentizace proti několika různým autentizačním zdrojům, nutné includovat do slapd.conf
# OpenLDAP 2.3: authz-regexp UID=([^,]*),CN=.* uid=$1,ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz sasl-regexp "uid=(.*)@(ldap|openaldap),cn=.*" "ldap:///ou=Person,dc=fjfi,dc=cvut,dc=cz??sub?(fjfiLdapUid=$1)" sasl-regexp "uid=(.*)@(nds|novell|km1|tjn|troja|km1\\.fjfi\\.cvut\\.cz|tjn\\.fjfi\\.cvut\\.cz|troja\\.fjfi\\.cvut\\.cz),cn=.*" "ldap:///ou=Person,dc=fjfi,dc=cvut,dc=cz??sub?(fjfiNovellUid=$1)" sasl-regexp "uid=(.*)@(ad|ads|win|windows),cn=.*" "ldap:///ou=Person,dc=fjfi,dc=cvut,dc=cz??sub?(fjfiWindowsUid=$1)" sasl-regexp "uid=(.*)@(usermap|cvut|cvut\\.cz),cn=.*" "ldap:///ou=Person,dc=fjfi,dc=cvut,dc=cz??sub?(fjfiUsermapUid=$1)" sasl-regexp "uid=(.*)@fjfi.cvut.cz,cn=.*" "ldap:///ou=Person,dc=fjfi,dc=cvut,dc=cz??sub?(fjfiUsername=$1)" sasl-regexp "uid=([^,]*),cn=.*" "ldap:///ou=Person,dc=fjfi,dc=cvut,dc=cz??sub?(fjfiUsername=$1)" #database shell #suffix "ou=Auth,dc=fjfi,dc=cvut,dc=cz" ##subordinate # Restrict access to this subtree otherwise all searches go here #bind /etc/openldap/ShellBind.py #search /etc/openldap/ShellSearch.py database shell suffix "ou=UnknownSASL,ou=Auth,dc=fjfi,dc=cvut,dc=cz" #subordinate # Restrict access to this subtree otherwise all searches go here search /etc/openldap/AuthSASL.py # Create flat authentication namespace with support for realm suffix database ldap suffix "ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz" #subordinate uri ldap:/// suffixmassage "ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz" "" rewriteEngine on rewriteMap ldap attr2LdapDN "ldap:///ou=People,dc=fjfi,dc=cvut,dc=cz?fjfiLdapDN?sub" rewriteMap ldap attr2NovellDN "ldap:///ou=People,dc=fjfi,dc=cvut,dc=cz?fjfiNovellDN?sub" rewriteMap ldap attr2WindowsDN "ldap:///ou=People,dc=fjfi,dc=cvut,dc=cz?fjfiWindowsDN?sub" rewriteMap ldap attr2UsermapDN "ldap:///ou=People,dc=fjfi,dc=cvut,dc=cz?fjfiUsermapDN?sub" rewriteMap ldap attr2PreferedDN "ldap:///ou=People,dc=fjfi,dc=cvut,dc=cz?fjfiAuthorizationSource?sub" rewriteContext bindDN rewriteRule "^uid=(.*)@(ldap|openaldap),ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz$" "%{attr2LdapDN(fjfiLdapUid=%1)},ou=Ldap,ou=Auth,dc=fjfi,dc=cvut,dc=cz" ":@" rewriteRule "^uid=(.*)@(nds|novell|km1|tjn|troja|km1\\.fjfi\\.cvut\\.cz|tjn\\.fjfi\\.cvut\\.cz|troja\\.fjfi\\.cvut\\.cz),ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz$" "%{attr2NovellDN(fjfiNovellUid=%1)},ou=Novell,ou=Auth,dc=fjfi,dc=cvut,dc=cz" ":@" rewriteRule "^uid=(.*)@(ad|ads|win|windows),ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz$" "%{attr2WindowsDN(fjfiWindowsUid=%1)},ou=Windows,ou=Auth,dc=fjfi,dc=cvut,dc=cz" ":@" rewriteRule "^uid=(.*)@(usermap|cvut|cvut\\.cz),ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz$" "%{attr2UsermapDN(fjfiUsermapUid=%1)},ou=Usermap,ou=Auth,dc=fjfi,dc=cvut,dc=cz" ":@" rewriteRule "^uid=(.*)@fjfi\\.cvut\\.cz,ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz$" "%{attr2PreferedDN(fjfiUsername=%1)}" ":@" rewriteRule "^uid=([^@]*),ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz$" "%{attr2PreferedDN(fjfiUsername=%1)}" ":@" rewriteRule "^.*,ou=Unknown,ou=Auth,dc=fjfi,dc=cvut,dc=cz$" "%0" ":#" # Create agregated directory from other LDAP sources database ldap suffix "ou=Ldap,ou=Auth,dc=fjfi,dc=cvut,dc=cz" #subordinate uri "ldaps://ldap1.fjfi.cvut.cz ldaps://ldap2.fjfi.cvut.cz" suffixmassage "ou=Ldap,ou=Auth,dc=fjfi,dc=cvut,dc=cz" "" database ldap suffix "ou=Novell,ou=Auth,dc=fjfi,dc=cvut,dc=cz" #subordinate uri "ldaps://km1.fjfi.cvut.cz ldaps://tjn.fjfi.cvut.cz ldaps://fjfi-troja.fjfi.cvut.cz" suffixmassage "ou=Novell,ou=Auth,dc=fjfi,dc=cvut,dc=cz" "" database ldap suffix "ou=Windows,ou=Auth,dc=fjfi,dc=cvut,dc=cz" #subordinate uri "ldap://beta.fjfi.cvut.cz" suffixmassage "ou=Windows,ou=Auth,dc=fjfi,dc=cvut,dc=cz" "" database ldap suffix "ou=Usermap,ou=Auth,dc=fjfi,dc=cvut,dc=cz" #subordinate uri "ldaps://usermap.cvut.cz" suffixmassage "ou=Usermap,ou=Auth,dc=fjfi,dc=cvut,dc=cz" ""
potřebné perl moduly lze dohledat na wiki stránkách - překompilovat vše ze src.rpm balíků (většina je jich součástí Fedora Extra).
k otestování funkčnosti všech modulů spamassassinu je možné použít následující příkaz:
spamassassin -D < sample-spam.txt
nastavení standardních parametrů v /etc/mail/spamassassin/local.cf
přidání custom pravidel
pravidla stahována automaticky pomocí RulesDuJour skriptu a rules_du_jour_my
kofigurací
automatický update z cronu, po update se automaticky restartuje amavis, aby si spamassassin načetl nová pravidla
Učení probíhá automaticky a je voláno přímo z Amavisu pokud se výsledek dspam a spamassassinu neschoduje a navíc je daný mail označen spamassassinem jako "velký" spam resp. "jistý" ham.
Pro uložení natrénovaných dat lze využít různé databáze. Nyní je použita SQLite vzhledem k tomu, že krom úpravy několika parametrů v dspam.conf
pro dosahnutí optimálního výkonu nebylo potřeba nic dalšího konfigurovat. Pro optimání výkon by však měla být MySQL ještě o něco lepší volba.
SQLite databáze během 14 denního nabobtnala na 0.5GB a stala se prakticky nepoužitelná.
KAV antivirus for linux mailservers
KAV antivirus for linux mailservers (kav4mailservers-linux-5.5-2)
konfigurace /etc/kav/5.5/kav4mailservers/kav4mailservers.conf
vytvořit link pro spravne fungovani amavisu
cd /opt/kav ln -s 5.5/kav4mailservers/bin .
spustit daemona
chkconfig aveserver on /etc/init.d/aveserver start
nastavit automatické updatování z cronu /etc/cron.d/kav
/etc/httpd/conf.d/ssl.conf
- nastavit cesty ke správným certifikátům
/var/www/html/robots.txt
- tenhle web nemá cenu prohledávat...
Pro přístup k mailům přes www rozhraní je naistalován IMP Horde. Instalace byla provedena z oficiálních tar.gz balíků (jedná se jen o php skripty) a dále bylo nutné upravit pár konfiguračních souborů (např. přidat seznam IMAP serverů). Konfigurace jsou umístěny v config
adresáři jednotlivých balíků.
Pro správnou funkci bylo nutné doinstalovat/nakonfigurovat:
PEAR moduly: Log, Mail_Mime, File, Services_Weather, Console_Table, File_Find, Date, Net_URL, Net_Socket, HTTP_Request (více se dá zjistit na testovací stránce)
PECL modul fileinfo, který však není dostupný, ale naštěstí není nutný
vytvořit databáze pomocí SQL skriptů z */scripts/sql
zkopírovat *.conf.dist
soubory v adresářích config na *.conf, zbytek se dá s příslušnými pravy dokonfigurovat přes web
for f in *.dist; do cp $f `basename $f .dist`; done
upravit konfigurace IMAP a LDAP serverů pro IMP resp. Turba
zabezpečit apache pomocí /etc/httpd/conf.d/horde.conf
TODO: replikace konfigurací v MySQL mezi mailgw1 a mailgw2
nutné nastavit SELinux tak, aby umožnil odesílání mailů pomocí postfixu (převzato z Fedory Core 3, kde je to již ošetřené)
selinux-postfix.patch
- patch vytvořený na základě změn CentOS4 proti FC3
yum install selinux-policy-targeted-sources cd /etc/selinux/targeted/src/policy patch -p2 < selinux-postfix.patch make load restorecon -R -v /usr/sbin/sendmail.postfix /var/spool
aby nebyla přidána hlavička odesilatele do mailu (což nemusí dělat dobře některým spam filtrům, když má odesilatel např. dynamickou adresu), je dobré aplikovat patch horde-imp-received.patch pro IMP, který zavede možnost změnit toto chování v konfiguračním souboru pro IMP.
$conf['msg']['received_for_browser'] = false;
konfigurace viz. /etc/raddb
konfigurace se liší na radius1 a radius2 v certifikátech a secretech k národním radius serverům
vytvořit SQL databázi
TODO: vyřešit testovacího uživatele
/usr/share/ssl/certs/cca.pem.crt
- kořenový certifikát pro Cesnet CA
/usr/share/ssl/certs/cca.pem.crl
- revokační list od Cesnet CA (stáhne se automaticky skriptem certs.sh
)
/usr/share/ssl/certs/ndsca.pem.crt
- kořenový certifikát pro Novell NDS na FJFI (dokud tam někdo nedá certifikáty od Cesnet CA)
přidat podepsané certifikáty
mailgwX.fjfi.cvut.cz.pem
- klíč + certifikát
mailgwX.fjfi.cvut.cz.key
- link na .pem
mailgwX.fjfi.cvut.cz.pem.private
- link na .key
mailgwX.fjfi.cvut.cz.crt
- link na .pem
mailgwX.fjfi.cvut.cz.
pem.public - link na .crt
nastavit ACL tak, aby k privátním klíčům mohli příslušné aplikace (nutné mountovat příslušný svazek s parametrem acl, viz. /etc/fstab
)
for h in mailgw1 mailgw2; do for u in ldap radiusd apache; do setfacl -m u:$u:r $h.fjfi.cvut.cz.pem; done; done
/root/bin/certs.sh
- automatické updatování crl listů a generování linků na certifikáty dle jejich hashů
daemon fingerprint
6b:76:05:73:9f:15:01:93:b7:b6:f1:06:f6:9d:3c:ea
key fingerprint
92:ca:f3:73:a9:21:dc:46:0e:ff:9b:58:42:56:40:57 root@mailgw1.fjfi.cvut.cz a4:fd:a7:6d:34:81:da:79:7b:e5:2a:84:b8:f1:a3:f7 root@mailgw2.fjfi.cvut.cz
/etc/sysconfig/network-scripts/ifcfg-ipsec1
- konfigurace IPSec k radius1.eduroam.cz
/etc/sysconfig/network-scripts/ifcfg-ipsec2
- konfigurace IPSec k radius2.eduroam.cz
/etc/racoon/racoon.conf
- cesty k SSL certifikátům
ifup-ipsec.patch
- nenastavovat AH (pak spojení na některých linkách nefunguje)
upravit konfigurace v /etc/snmp/snmpd.conf
system description
povolit monitorování růných služeb
nastavit přístupová práva
využívá se pro remote monitorování zdrojů (místo na discích, load, procesy, tcp spojení, ...)
remote logování na centrální log server (nelze po IPv6, nutné zadata IP pro stroje s AAAA záznamy)
logovat jen informace, které mohou jít přes nezabezpečený kanál (logy mailserveru)
syslog.conf
- konfigurace
MRTG
- skript pro generování konfigurací pro servery a switche
GENERAL_comp
- šablona pro generovaní load, mem, user, conn, ... statistik pro servery
mrtg-rrd.cgi - skript pro výtupy na obrazovku resp. jeho mírně upravená verze
amavis-stat
mailgraph - dost vytěžuje (ale vypadá to spíš tak, že se občas začne nějak cyklit)
awstat - při velkých log souborech také docela vytěžuje, protože si musí celý soubor nejdřív přeformátovat
pro zálohování použita bacula
fd - file daemon (běží na každém stroji, který má být zálohován)
sd - storage daemon (stará se o ukládání backupovaných dat)
dir - řídí co a kdy se ma zálohovat
/etc/bacula - konfigurační soubory
Pokud dojde k výpadku mailové brány na níž směřují aliasy smtp.fjfi.cvut.cz resp. webmail.fjfi.cvut.cz je nutné provést následující:
provést změny v DNS (přehození aliasů)
data pro horde by měla být automaticky replikována na druhý stroj
mysqldump --extended-insert=FALSE --add-drop-table --user=root horde | ssh mailgwX.fjfi.cvut.cz 'mysql -u root horde'
při delším výpadku je nutné, aby byla data po nahození primáního zreplikována zpět
Změna standardních konfigurací pro příslušnou mailovou bránu (první, druhou, ...) se provádí skriptem change_mx_order.sh
. Nedoporučuji ho však spouštět přímo (není dostatečně odladěn), ale lepší je vykopírovat si pouze potřebné části přímo na příkazovou řádku.
OpenLDAP má občas po nekorektním ukončení (např. při pádu celého systému) problém znovu nastartovat. Většinou se jedná o poškozenou databázi a stačí ji opravit:
cd /var/lib/ldap slapd_db_recover
Dalším častým důvodem, který neumožní start slapd daemona jsou nesprávná práva na datových a konfiguračních souborech. Vlastníkem dat v /var/lib/ldap
by měl být ldap:ldap a vlastníkem konfiguračních souborů v /etc/openldap
by měl být root:ldap.
Pro detekci dalších problémů je vhodné spustit slapd v debug módu, kde číslo za parametrem -d
udává debug level:
/usr/sbin/slapd -u ldap -h ldap:/// ldaps:/// -d 1