Mailgw.fjfi.cvut.cz

From NMS
Jump to: navigation, search
Servery / Služby
Přístupné komukoliv
windows
srk
linux / unix
kmlinux
Omezený/individuální účet
linux / unix
bimbo · buon(KF) · km(KM) · lenochod(KJR) · linux · node(KM) · sunrise(KF) · unixlab(KFE) · vkstat(KM)
Služby
backup · DHCP · DNS · doména FJFI · eduroam · fileserver · IdM · forum · gitlab · lists · moodle · indico · mailgw · K4 · mailserver · NMS · openvpn · skolniftp · ssh · videokonference · VoIP · video · VPN · wififjfi · wiki · www
Učebny
e-sklipek · KFE unixlab · KFE pclab · PD1 · KM 105 · KM 115
Ostatní
Network · Blokované porty
[edit] · [view]

Základní informace

Správce 
Petr Vokáč
HW 
IBM System x iDataPlex dx340 Server -[638922X], 2x Intel(R) Xeon(R) CPU E5440 @ 2.83GHz, 16GB DDR2 533MHz, 300GB SAS
OS 
CentOS7
Využití 
mailová brána (antivir+antispam) + SMTP AUTH server smtp.fjfi.cvut.cz, RADIUS server pro Eduroam
Konto 
pro autentizované odesílání mailů přes smtp.fjfi.cvut.cz použijte hlavní uživatelské jméno/heslo, pro Eduroam je potřeba nadefinovat samostatné heslo

Informace pro správce

Zpracování mailů na mailgw

Změna MX záznamů

Pokud chcete změnit MX záznamy v DNS tak, aby maily procházely přes mailgw, nestačí (ve většině případů) jen upravit přísušné záznamy v DNS, ale je potřeba změnit i konfiguraci postfixu na mailgw. Ten se musí dozvědět, na jaký stroj má maily fyzicky doručovat - je potřeba přídat správné rádky do /etc/postfix/transport a provést postmap /etc/postfix/transport.

Další dokumentace

Použitý software

Základní instalace

  • standardní (minimální) instalace operačního systému
  • standardní puppet konfigurace pro server (certifikáty, logging, monitoring, ...)
rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum install puppet
# use mailgw puppet client certificates from backup
# of the /var/lib/puppet/ssl
cat >> /etc/puppet/puppet.conf <<EOF
[main]
    # puppet server name must be in config file, because new puppet
    # client doesn't support passing this information from environmet
    # of the startup script
    server = puppet.fjfi.cvut.cz

    # distribute custom facts and types from
    # the server to managed clients automatically
    pluginsync = true
EOF
# apply puppet configuration
puppet agent --test --debug --waitforcert=120
# enable and start puppet daemon
systemctl enable puppet
systemctl start puppet

mailgw

  • instalace EPEL repository

postfix

  • používá se opatchovaná verze postfixu umožňující specifikovat jiný limit na velikost mailů pro lokální stroje
    • zkompilovaná ze src.rpm balíčku + postfix-2.11.0-local_message_limit.patch
    • aktuálně používána verze 3.0 (podpora SMTPUTF8 z RFC 6531..6533)
    • instalace
      yum install libicu pam_krb5 perl-Date-Calc
      rpm -Uvh postfix-3.0.1-2.el7.centos.x86_64.rpm postfix-pcre-3.0.1-2.el7.centos.x86_64.rpm postfix-perl-scripts-3.0.1-2.el7.centos.x86_64.rpm
  • konfigurace v /etc/postfix
    • postfix klade důraz na zachování kompatibility konfiguračních souborů
    • pokud není potřeba měnit chování mailserveru stačí zkopírovat konfigurační soubory
    • z cronu jsou automaticky updatovány některé konfigurační soubory dle informací z AD
    • z cronu jsou automaticky updatovány dh_512.pem a dh_1024.pem
      openssl dhparam -out dh_512.pem 512 && openssl dhparam -out dh_1024.pem 2048
    • povolení dalších portů v SELinuxu
      semanage port -a -t amavisd_recv_port_t -p tcp 10022
      semanage port -a -t amavisd_send_port_t -p tcp 10023
      semanage port -a -t amavisd_recv_port_t -p tcp 9998
      semanage port -a -t smtp_port_t -p tcp 10028
      semanage boolean --modify --on antivirus_can_scan_system
    • přidat aliasy "root" a "spam" do /etc/aliases a spustit newaliases
  • konfigurace SASL autentizace
    • instalace potřebných knihoven
      yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-gssapi
      systemctl enable saslauthd
      systemctl start saslauthd
    • nutná správná konfigurace kerbera v /etc/krb5.conf
    • postfix autentizace proti kerberu v /etc/pam.d/smtp.postfix

milter pluginy

  • opendkim
    • instalace
      yum install opendkim
    • konfigurace /etc/opendkim a /etc/opendkim.{sign,verify}.conf
    • SELinux
      semanage port -a -t milter_port_t -p tcp 10039
      semanage port -a -t milter_port_t -p tcp 10040
    • podpora více instancí OpenDKIM v systemd /root/etc/systemd/system/opendkim@.service
      systemctl enable opendkim@sign.service
      systemctl enable opendkim@verify.service
  • srs-milter
    • instalace
      rpm -Uvh srs-milter-0.0.2-1.x86_64.rpm libspf2-1.2.10-0.el7.centos.x86_64.rpm libsrs2-1.0.18-1.x86_64.rpm
    • SELinux
      semanage port -a -t milter_port_t -p tcp 10043
      semanage port -a -t milter_port_t -p tcp 10044
    • start služby
      systemctl enable srs-milter@forward
      systemctl enable srs-milter@reverse
  • sid-milter
    • instalace
      rpm -Uvh sid-milter-1.0.0-0.el7.centos.x86_64.rpm
    • start služby
      systemctl enable sid-milter

policy delegation

  • postfix poskytuje policy delegation protokol pro zpracovaní mailů na základě jejich envelope (CONNECT, HELO, MAIL FROM, RCPT TO, DATA)
  • použitá implementace ppolicy (Python Postfix Policy Server)
    • umožňuje psát pravidla pro zpracování mailu v pythonu
    • využívá python-twisted framework a dle konfigurace závisí i na dalších python balíčcích
      yum install python-twisted-core MySQL-python python-dns python-GeoIP
    • instalace z připraveného RPM
      rpm -Uvh ppolicy-2.7.0-0beta19.noarch.rpm
      systemctl enable ppolicy
    • konfigurace resp. python script řídící chování ppolicy /etc/postfix/ppolicy.conf
    • před prvním startem je nutné vytvořit MySQL databázi a zpřístupnit ji uživateli z konfiguračního souboru (detaily v ppolicy.sql)
    • nutné vytvořit databázi změn
      CREATE TABLE `changes` (`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00')

trénování spamu

  • učící adresy spam a nospam
  • při zpracování příchozího mailu zavolány přes pipe skripty pro učení
  • je potřeba nastavit správný SELinux kontext
# FIXME: tohle nestačí, protože ten skript potřebuje číst/zapisovat do /var/spool/amavisd
#        dočasně "vyřešeno" tak, že logování ve skriptu se provádí do /tmp
semanage fcontext -a -t postfix_pipe_exec_t /etc/postfix/spam-learn.py
restorecon -v /etc/postfix/spam-learn.py
# FIXME: jako dočasné řesení lze převést postfix_type_t do permissive módu
semanage permissive -a postfix_pipe_t

amavis

  • používá se opatchovaná verze nejnovější verze
    • přidává specifické hlavičky X-CTU-FNSPE s informacemi o běhu amavisu/spamassassinu
    • vylepšená podpora CRM114
    • několik bugfixů týkajících se LDAP
    • přidáno RPM pro p0f (systemd service file, script wrapper)
    • detaily ve zdrojovém balíčku amavisd-new-2.xx.xx.src.rpm
  • závislost na řadě balíčků z EPEL + dalších potřebných (perl) modulů zkompilovaných z Fedora src.rpm balíčků
yum install spamassassin
yum install altermime arj bzip2 cabextract clamav-server clamav-server-systemd \
    freeze lrzip lzop lz4 nomarch p7zip p7zip-plugins tmpwatch unzoo
yum install perl-Archive-Tar perl-Archive-Zip perl-Authen-SASL perl-BerkeleyDB \
    perl-Convert-TNEF perl-Convert-UUlib perl-DBD-SQLite perl-DBI perl-Digest-SHA \
    perl-Digest-SHA1 perl-Mail-DKIM perl-Mail-SPF perl-Net-DNS perl-Net-Server \
    perl-NetAddr-IP perl-Socket6 perl-Time-HiRes perl-Unix-Syslog perl-Razor-Agent \
    perl-LDAP perl-Image-Info
# missing CentOS7+EPEL packages
rpm -Uvh perl-File-LibMagic-1.00-4.el7.centos.x86_64.rpm unrar-4.0.7-1.el7.centos.x86_64.rpm
# install and enable amavisd
rpm -Uvh amavisd-new-2.10.1-1.el7.centos.noarch.rpm amavisd-new-p0f-2.10.1-1.el7.centos.noarch.rpm
systemctl enable amavisd.service
systemctl enable amavisd-p0f.service
  • konfigurace /etc/amavisd/
  • konfigurace správného síťového rozhraní pro p0f v /etc/sysconfig/amavisd-p0f (+ disablování samostatné služby p0f)
  • informace o mailech zpracovaných amavisem se ukládají do MariaDB
    • nutné vytvořit příslušnou databázi
    • potřebné informace v nainstalovaném README.sql-mysql
    • pro zjednodušení práce s databází jsou tabulky v ppolicy databázi
karanténa
  • ukládány všechny zablokované maily
    • detekovaný vir
    • detekovaný spam při nastavené hladině pro zahazování spamu (uživatel musí explicitně povolit)
  • všechny ostatní maily
    • veškeré zpracované maily jsou na mailgw dva týdny zálohovány, aby je bylo možné znovu doručit v případě problémů s mailboxy

spamassassin

  • lokální pravidla v /etc/mail/spamassassin/99_zzzz_my.cf
  • FuzzyOCR
yum install giflib-utils netpbm-progs transfig libjpeg-turbo-utils pango libwebp
rpm -Uvh spamassassin-FuzzyOcr-3.6.0-6.el7.centos.noarch.rpm \
         perl-String-Approx-3.27-6.el7.centos.x86_64.rpm \
         ocrad-0.24-1.el7.centos.x86_64.rpm \
         gifsicle-1.87-1.el7.centos.x86_64.rpm \
         gocr-0.50-3.el7.centos.x86_64.rpm \
         tesseract-3.03-0.2.rc1.el7.centos.x86_64.rpm \
         tesseract-osd-3.03-0.2.rc1.el7.centos.x86_64.rpm \
         leptonica-1.71-2.el7.centos.x86_64.rpm
  • Mail::SpamAssassin::Plugin::RelayCountry
rpm -Uvh perl-IP-Country-utils-2.26-4.el7.centos.noarch.rpm \
         perl-IP-Country-2.26-4.el7.centos.noarch.rpm \
         perl-Geography-Countries-2009041301-13.el7.centos.noarch.rpm
  • Mail::SpamAssassin::Plugin::DCC
rpm -Uvh DCC-1.3.158-0.el7.centos.x86_64.rpm
chown amavis -R /etc/dcc

CRM114

yum install tre
rpm -Uvh crm114-0-8.14.20100106.el7.centos.x86_64.rpm

antivir

  • KAV
    rpm -Uvh klms-8.0.1-705.i386.rpm; yum install glibc.i686
    • (první) konfigurace pomocí /opt/kaspersky/klms/bin/klms-setup.pl
    • pro přístup amavisu k soketům klms je potřeba přidat amavis uživatele do skupiny klusers
      usermod -G klusers amavis
      usermod -G amavis kluser
    • je nutné zabránit promazávání tmp adresářů klms pomocí konfigurace tmpfiles v /usr/lib/tmpfiles.d/klms.conf
      X /tmp/klmstmp
      X /tmp/klms_filter
    • každoročně je nutné importovat nový licenční soubor
      /opt/kaspersky/klms/bin/klms-control --licenser --install-additional-key "license".key
  • ESET Mail Security
    • instalace
      rpm -Uvh esets-4.0.10.x86_64.rpm
    • licence
      /opt/eset/esets/sbin/esets_lic --import=ess_business_edition.lic
    • konfigurace /etc/opt/eset/esets/esets.cfg uživatelského jména/hesla (av_update_username/av_update_password) pro updaty
    • lze spouštět i přímo přes systemd přidáním service souboru do /etc/systemd/system/eset.service
    • licence
      • licence na webu ČVUT jsou pouze pro stanice, tj. ESET File Security, které pro každé scanování přes amavis spouští nový proces a je to tim pádem nepoužitelně pomalé
      • na požádání lze získat i licenční soubory ESET Mail Security
      • pro fungování amavisu resp. esets_cli je nutné použít tu druhou licenci (ale je take dobré nainstalovat i první licenci, aby fungoval i esets_scan)
  • clamav
    • instalace
      yum install clamav-server-systemd clamav-update
    • aktivace updatu vykomentováním posledního řádku v /etc/sysconfig/freshclam a "Example" na začátku /etc/freshclam.conf

rspamd

Bude integrováno jako řešení sloužící k odmítání spamu ještě během SMTP konverzace.

certifikáty

  • postfix je aktuálně zkonfigurován s podporou DANE/TLSA
  • TLSA záznám je vázán na veřejný klíč (zbylý obsah certifikátu se muže měnit, např. platnost)
  • při změně veřejného (privátního) klíče je nutné postarat se o změnu TLSA záznamu v DNS
    • před vyměnou certifikátu je potřeba přidat nový TLSA otisk
    • vlastní výměnu certifikátu je možné udělat až po uplynutí TTL TLSA DNS záznamu
    • po výměně certifikátu je možné odmazat starý TLSA otisk z DNS

ostatní

  • mariadb
    • databáze využívána amavisem, ppolicy a radius serverem
    • instalace
yum install mariadb-server
systemctl enable mariadb.service
systemctl start mariadb.service
    • konfigurace v /etc/my.cnf.d (per database innodb file, SSL connection support)
mysql -B  mysql -e 'UPDATE `user` SET `host` = "%" WHERE `user` = "root" AND `host` = "mailgw1.fjfi.cvut.cz"'
mysql -B  mysql -e 'UPDATE `user` SET `password` = PASSWORD("secret") WHERE `user` = "root"'
# some additional cleanup
mysql -B  mysql -e 'DELETE FROM `user` WHERE `host` = "localhost" AND `user` = "ppolicy"'
mysql -B  mysql -e 'DELETE FROM `user` WHERE `host` = "localhost" AND `user` = ""'
mysql -B  mysql -e 'DELETE FROM `user` WHERE `host` = "mailgw1.fjfi.cvut.cz"'
mysql -B  mysql -e 'DELETE FROM `user` WHERE `host` != "%" AND `user` = "root"'
mysql -B  mysql -e 'FLUSH PRIVILEGES'
  • unbound
    • mailserver provádí hodně DNS dotazů a tak je rozumné provozovat cachovací DNS lokálně
    • cachovací DNS server s forwardery na oficiální FJFI/ČVUT DNS servery
    • instalace
      yum install unbound
    • konfigurace /etc/unbound/unbound.conf
      • poslouchat na veřejných interface
      • zkonfigurovat access-control pouze pro ČVUT adresy
      • nastavit forward-zone "." na naše (cachovací) DNS
    • pro spolehlivé startování služeb vyžadujících DNS je nutné disablovat 127.0.0.1 jako cachovací nameserver dokud unbound neběží
      • nutné disablovat update DNS konfigurace v /etc/NetworkManager/NetworkManager.conf
        dns=none
      • vytvořit novou systemd "oneshot" service /etc/systemd/system/dns-cache-disable.service startovanou před network targetem, která disabluje použivání (nenastartované) lokální DNS cache
        ExecStart=/usr/bin/sed -i 's/^\(nameserver *127.0.0.1\)/#\1/' /etc/resolv.conf
      • vytvořit novou systemd "oneshot" service /etc/systemd/system/dns-cache-enable.service startovanou po startu cachovacího DNS (vyžadující běžící službu DNS), která enabluje použivání lokální DNS cache
        ExecStart=/usr/bin/sed -i 's/^#\(nameserver *127.0.0.1\)/\1/' /etc/resolv.conf
      • do unbound.service přidat skript po startu služby
        ExecStartPost=/usr/bin/sed -i 's/^#\(nameserver *127.0.0.1\)/\1/' /etc/resolv.conf
      • přidat jako první řádek /etc/resolv.conf
        nameserver 127.0.0.1
  • dinfo
    • lokální daemon poskytující remote rozhraní pro různé služby
    • aktivní modul "mail" v /etc/sysconfig/dinfo
    • služba
      systemctl enable dinfo
    • (do budoucna v plánu nahradit nejakým standardním nástrojem, např. mcollective, RESTful API, ...)
  • snmp
    • pro export základních informací o postfix frontě (počet mailů, velikost, ...)
    • používáno Nagiosem pro monitoring
    • instalace
      yum install net-snmp
    • konfigurace v /etc/snmp
    • služba
      systemctl enable snmpd
  • bacula-client
yum install bacula-client
# konfigurace /etc/bacula
systemctl enable bacula-fd

relay

Aktuálně je používáno jako outbound relay pro odchozí maily, aby bylo možné jednoduše měnit adresu např. pro případ, kdy současná adresa z nějakého důvodu dostane "poor reputation". Celá služba běží na stejném hardware jako mailgw, ale je v samostatném kontejneru s přidělenou IPv4+IPv6 adresou. Aktuálně je instalace řešena jako nspawn kontejner, ale do budoucna se počítá s nějakým vhodnějším řešením buď s využitím podman (aktualně nemá rozumnou podporu IPv6) nebo např. kuberentes.

instalace

konfigurace

radius

freeradius

  • instalace
    yum install freeradius freeradius-utils freeradius-ldap freeradius-mysql
  • konfigurace /etc/raddb dle Eduroam návodu resp. aktuálních FJFI konfigurací
  • SELinux konfigurace
semanage fcontext -a -t radiusd_exec_t /etc/raddb/RadiusPostAuth.py
restorecon -v /etc/raddb/RadiusPostAuth.py
  • nutné výtvořit MariaDB databázi podle /etc/raddb/mods-config/sql/main/mysql
mysql -e 'CREATE DATABASE radius'
mysql radius < schema.sql
mysql radius < setup.sql
mysql -B  mysql -e 'GRANT SELECT,LOCK TABLES ON radius.* TO "radius_reader"@"%" IDENTIFIED BY "secret"'
  • služba
    systemctl enable radiusd
  • skripty pro registraci zařízení přihlášených přes Eduroam potřebují další python moduly
    yum install python-ldap MySQL-python

radsecproxy

  • při použití FreeRadius 3.x již není potřeba, protože podpora radsec je do FreeRadiusu integrována
  • vytvořen RPM balíček radsecproxy-1.6.6-0.el7.centos.x86_64.rpm
  • konfigurace /etc/radsecproxy.conf
  • služba
    systemctl enable radsecproxy

firewall

  • služba
    systemctl enable firewalld
  • konfigurace
# trusted hosts
firewall-cmd --permanent --zone=trusted 
firewall-cmd --permanent --zone=trusted --add-source=147.32.9.2
firewall-cmd --permanent --zone=trusted --add-source=2001:718:2:1900::2
firewall-cmd --permanent --zone=trusted --add-source=147.32.9.3
firewall-cmd --permanent --zone=trusted --add-source=2001:718:2:1900::3
firewall-cmd --permanent --zone=trusted --add-source=147.32.9.67
firewall-cmd --permanent --zone=trusted --add-source=2001:718:2:1800::3
# internal (FNSPE) network
#firewall-cmd --permanent --zone=internal --add-source=147.32.4.0/22
#firewall-cmd --permanent --zone=internal --add-source=147.32.8.0/22
#firewall-cmd --permanent --zone=internal --add-source=147.32.22.0/24
#firewall-cmd --permanent --zone=internal --add-source=147.32.25.0/24
#firewall-cmd --permanent --zone=internal --add-source=2001:718:2:1800::/56
#firewall-cmd --permanent --zone=internal --add-source=2001:718:2:1900::/56
#firewall-cmd --permanent --zone=internal --remove-servce=ipp-client
#firewall-cmd --permanent --zone=internal --remove-servce=mdns
#firewall-cmd --permanent --zone=internal --remove-servce=dhcpv6-client
#firewall-cmd --permanent --zone=internal --remove-servce=samba-client
# work (CTU) network
firewall-cmd --permanent --zone=work --add-source=147.32.0.0/16
firewall-cmd --permanent --zone=work --add-source=2001:718:2::/48
firewall-cmd --permanent --zone=work --add-service=dns
firewall-cmd --permanent --zone=work --remove-service=ipp-client
firewall-cmd --permanent --zone=work --remove-service=dhcpv6-client
# public services
firewall-cmd --permanent --zone=public --add-service=smtp
firewall-cmd --permanent --zone=public --add-port=465/tcp
firewall-cmd --permanent --zone=public --add-port=587/tcp
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="147.32.4.0/26" service name="radius" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="147.32.7.0/26" service name="radius" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="147.32.22.224/27" service name="radius" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="195.113.233.246" service name="radius" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="195.113.187.22" port port="2083" protocol="tcp" accept'
# apply changes in firewall configuration
firewall-cmd --reload