Fórum Ubuntu CZ/SK

Ostatní => Ubuntu Server => Téma založeno: vojak 09 Října 2014, 13:40:27

Název: Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 09 Října 2014, 13:40:27
Zdravím, mám server s dostupnou veřejnou IP. Nakonfiguroval jsem posfix+postfixadmin+dovecot na posílání a příjem pošty. Bohužel to má chybu, poštu lze odeslat i bez ověření. Odesílání pošty mám zatím nezabezpečené(port 25), příjem je přes IMAP SSL(port 993).
Uživatele mam uložené v databázi společně s hash heslem. Ověřování bych chtěl udělat přes dovecot. Lepší způsob mi nenapadá. Aktuální konfigurace postfixu je:
Kód: [Vybrat]
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_alias_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
virtual_mailbox_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_transport = dovecot
 
virtual_minimum_uid = 999
virtual_uid_maps = static:999permit_mynetworks,
virtual_gid_maps = static:999

smtpd_helo_restrictions =
smtpd_client_restrictions =
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination
smtpd_data_restrictions = reject_unauth_pipelining
smtpd_sender_restrictions = check_recipient_access mysql:/etc/postfix/sql/mysql_virtual_recipient_access_maps.cf
smtpd_recipient_restrictions = check_sender_access mysql:/etc/postfix/sql/mysql_virtual_recipient_access_maps.cf,
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unauth_destination

smtpd_soft_error_limit=5
smtpd_hard_error_limit=10
smtpd_helo_required=yes
smtpd_delay_reject=no
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = noanonymous
smtpd_sasl_authenticated_header = yes
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
broken_sasl_auth_clients = yes

default_destination_concurrency_limit = 1
local_destination_concurrency_limit = 1
dovecot_destination_concurrency_limit = 1
dovecot_destination_recipient_limit = 1

disable_vrfy_command=yes
strict_rfc821_envelopes=yes

maximal_queue_lifetime = 6d
delay_warning_time = 8h
biff = no
enable_original_recipient = yes
append_at_myorigin = yes

append_dot_mydomain = no

readme_directory = no

myhostname = localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = domena.cz

mydestination =
relayhost =
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
Nyní by ověřování mělo fungovat přes script "/etc/postfix/sql/mysql_virtual_recipient_access_maps.cf".
Jeho obsah je:
Kód: [Vybrat]
user = postfix
password = heslo1234
dbname = postfixadmin
hosts = 127.0.0.1
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
Ale bohužel poštu to odešle i bez ověření.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 09 Října 2014, 14:23:22
Kód: [Vybrat]
SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

Ono tohle vrací maildir k uživateli, který je aktivní, neověřuje to heslo.
Celá ta konfigurace je vůbec jakási divoká ...
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 09 Října 2014, 14:26:41
Ono tohle vrací maildir k uživateli, který je aktivní, neověřuje to heslo.
Celá ta konfigurace je vůbec jakási divoká ...
Ano je divoká, vím o tom, bohužel nemohu nalézt rozumné, funkční řešení. Tohle ověřování jsem vyčet v několika forech. A myslím, že i kdybych napsal "SELECT password" tak si moc nepomohu. Proto jsem se obrátil s dotazem o řešení sem.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 09 Října 2014, 15:49:40
Celé řádky
Kód: [Vybrat]
check_sender_access mysql:/etc/postfix/sql/mysql_virtual_recipient_access_maps.cf

bych hodil do kopru. Od toho je tam přeci permit_sasl_authenticated který to bude ověřovat proti DB přes SASL.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 09 Října 2014, 19:48:55
Tak jsem oba dva řádky smazal. Také se mi tam nelíbili. Výsledek:
Při pokusu o doručení emailu na server localhost není nutná autentizace. Při pokusu o doručení na jiný server: Relay access denied. V logu je
Kód: [Vybrat]
postfix/smtpd[24377]: NOQUEUE: reject: RCPT from unknown[10.200.10.2]: 454 4.7.1 <prijemce@seznam.cz>: Relay access denied; from=<postmaster@mojedomena.cz> to=<prijemce@seznam.cz> proto=ESMTP helo=<abcdefg>
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 09 Října 2014, 21:20:31
To je v pořádku.
Na lokální to jde logicky bez auth.

A na klientu je autentizace nastavená?
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 09 Října 2014, 21:40:57
Špatně jsem se vyjádřil. Z jiného PC v síti, jde odesílat v rámci serveru bez autentizace i když je nastaveno mynetworks = 127.0.0.0/8. Očekával bych, že pokud mám schránky box1@domain.com a box2@domain.com, nepůjde mezi nimi bez autentizace odesílat email. Pouze u vyjímek nastavených v mynetworks.

Odesílal jsem přes telnet - bez autentizace a přes outlook - nastavená autentizace.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 09 Října 2014, 21:44:23
Ale kdepak!!!

Přece server, pokud je určený pro příjem zpráv na doménu domain.com logicky MUSÍ přijmout tyto zprávy i bez autentizace.
Jak jinak by se pak domluvil s cizím MX serverem, který o nějakém hesle těžko mohl někdy někde slyšet.

Jiná situace nastává, pokud chceme poslat něco na jinou doménu. Pak nastupuje SASL. A pokud nenastoupil, bude chyba vypíchnutá někde v logu.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 09 Října 2014, 21:53:02
Přece server, pokud je určený pro příjem zpráv na doménu domain.com logicky MUSÍ přijmout tyto zprávy i bez autentizace.
A jak teda zabránit útoku:
Kód: [Vybrat]
telnet mail.gmail.com 25
helo cokoliv
mail from:<cokoliv@gmail.com>
rcpt to:<adresat@gmail.com>
To pak přece můžu zvesela šířit spam po celé cizí doméně.

Výpis z logu je o pár řádků výš - " Relay access denied"
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 09 Října 2014, 21:56:57
Ano! Přesně takto to funguje! :)
I proto máme třeba amavis, spamassassin, RBL, GBL a jiné *BL

Důležité je, aby (ne)fungovalo:
Kód: [Vybrat]
telnet mail.gmail.com 25
helo cokoliv
mail from:<cokoliv@gmail.com>
rcpt to:<adresat@ubuntu.com>
554 5.7.1 <adresat@ubuntu.com>: Relay access denied

Jak jinak by to mohlo fungovat? Jakože by se MX servery mezi sebou prokazovali nějakým heslem?

Výpis je značně zkrácen. Taky bych se podíval do auth.log, jestli SASL něco neblije.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 09 Října 2014, 22:10:14
Jasný, po odeslání mi to napadlo, že je to třeba řešit jinak  ;). V auth.log se nezobrazí nic při neúspěšném odeslání. Mail.err také nic neobsahuje a v mail.log je pouze:
Kód: [Vybrat]
Oct  9 22:08:16 ubuntu postfix/smtpd[2800]: connect from unknown[10.200.10.2]
Oct  9 22:08:16 ubuntu postfix/smtpd[2800]: NOQUEUE: reject: RCPT from unknown[10.200.10.2]: 454 4.7.1 <prijemce@seznam.cz>: Relay access denied; from=<postmaster@mojedomena.cz> to=<prijemce@seznam.cz> proto=ESMTP helo=<abcdefg
Oct  9 22:08:16 ubuntu postfix/smtpd[2800]: disconnect from unknown[10.200.10.2]

EDIT:
Je potřeba nějak nastavovat dovecot? Aby jsme nehledali chybu jinde. Poštu ale předává normálně a v logu nic není.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 09 Října 2014, 22:15:58
To vypadá jakoby SASL vůbec neproběhl.
Je správně nakonfigurovaný dovecot pro postfix?
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 09 Října 2014, 22:26:48
Jestli stačí oddíl service auth tak je nastaven:
Kód: [Vybrat]
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }
  unix_listener auth-userdb {
    group = vmail
    mode = 0600
    user = vmail
  }
}
cesta /var/spool/postfix/private/auth existuje a uživatel vmail také
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 09 Října 2014, 22:33:00
Vypadá to vlastně ok, ale nejde mi do hlavy, proč nikde nevidím informaci, že selhalo ověření uživatele.
Skutečně je na mailovém klientu zapnutá autentizace proti SMTP?

Zkus mrknout sem a ověřít to telnetem:
http://networking.ringofsaturn.com/Protocols/howtotestsendmailauthentication.php
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 09 Října 2014, 22:47:59
Outlook mám nastaven na port 25, bez zabezpečeného SSL. Pokud do mynetworks uvedu IP klienta, email odeslat jde.

Když zkusím odeslat email přes telnet, tak:
Kód: [Vybrat]
220 localhost ESMTP Postfix (Ubuntu)
ehlo abcdef
250-localhost
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN
250-AUTH=PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH LOGIN name
535 5.7.8 Error: authentication failed: Invalid authentication mechanism
A v mail.log je stejná hláška. V ostatních logach nic.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 09 Října 2014, 22:57:37
Abych mohl vyzkoušet testsaslauthd musel jsem nainstalovat balíky db-util db5.3-util sasl2-bin. Když ale zadam na serveru autentizační údaje, dostanu hlášku connect() : No such file or directory
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 10 Října 2014, 08:08:51
Co máš v /etc/default/saslauthd
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 10 Října 2014, 11:26:05
Co máš v /etc/default/saslauthd
Kód: [Vybrat]
START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="pam"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/run/saslauthd"
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 10 Října 2014, 14:58:19
Ještě mi vlezlo na oči toto:
Kód: [Vybrat]
virtual_uid_maps = static:999permit_mynetworks,

Další věc:
/etc/postfix/main.cf:
Kód: [Vybrat]
    # Postfix 2.3 and later
    smtpd_sasl_path = smtpd

    # Postfix < 2.3
    smtpd_sasl_application_name = smtpd

A do třetice:
/etc/default/saslauthd
Kód: [Vybrat]
...
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 10 Října 2014, 19:01:21
Citace
Ještě mi vlezlo na oči toto:
Kód: [Vybrat]
virtual_uid_maps = static:999permit_mynetworks,
Ano, toho jsem si nevšiml, nějaký úklep. permit_mynetworks, jsem tedy odmazal. Hodnotu smtpd_sasl_path jsem změnil na smtpd.
Citace
A do třetice:
/etc/default/saslauthd
Kód: [Vybrat]
...
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
S tím nevim co mám dělat, taková cesta u mě neexistuje, není to překlep?

Po připojení telnetem mam pak v logu mail.log:
Kód: [Vybrat]
postfix/smtpd[9335]: connect from unknown[10.200.10.2]
postfix/smtpd[9335]: warning: SASL: Connect to smtpd failed: No such file or directory
postfix/smtpd[9335]: fatal: no SASL authentication mechanisms
postfix/master[1677]: warning: process /usr/lib/postfix/smtpd pid 9335 exit status 1
postfix/master[1677]: warning: /usr/lib/postfix/smtpd: bad command startup -- throttling
Tyto chyby to píše jen pokud je smtpd_sasl_path nastaven na smtpd. Pokud změním zpátky na
private/auth tak v logu je opět Error: authentication failed: Invalid authentication mechanism. A v auth.log nic nového.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 10 Října 2014, 19:09:57
http://www.howtoforge.com/postfix-dovecot-warning-sasl-connect-to-private-auth-failed-no-such-file-or-directory
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 10 Října 2014, 19:43:53
Takže dovecot mi nevzal parametr client {..}. V komentářích je řešení, nastavené jsem to měl. Akorát mode = 0600 jsem změnil na 0666. Soubor main.cf jsem doplnil o queue_directory. Bohužel výsledek pořád stejný.
A cesta /var/spool/postfix/private/auth existovala i před změnou.
Celá konfigurace dovecotu je:
Kód: [Vybrat]
# dovecot -n
# 2.2.9: /etc/dovecot/dovecot.conf
# OS: Linux 3.13.0-36-generic x86_64 Ubuntu 14.04.1 LTS ext4
auth_socket_path = /var/run/dovecot/auth-userdb
first_valid_gid = 999
first_valid_uid = 999
hostname = server
last_valid_gid = 999
last_valid_uid = 999
lda_mailbox_autocreate = yes
lda_mailbox_autosubscribe = yes
log_path = /var/log/dovecot.log
mail_gid = vmail
mail_location = maildir:/home/mail/%d/%n/Maildir
mail_uid = vmail
mbox_write_locks = fcntl
namespace inbox {
  inbox = yes
  location =
  prefix =
}
passdb {
  driver = pam
}
passdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
postmaster_address = postmaster@domena.cz
protocols = imap pop3
rejection_reason = Your message to < %t> was automatically rejected:%n%r
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }
  unix_listener auth-userdb {
    group = vmail
    mode = 0666
    user = vmail
  }
}
service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service imap {
  process_limit = 1024
}
service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
service pop3 {
  process_limit = 256
}
ssl_cert = </etc/dovecot/ssl/cert.pem
ssl_key = </etc/dovecot/ssl/key.pem
userdb {
  driver = passwd
}
userdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
protocol lda {
  postmaster_address = postmaster@domena.cz
}
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 10 Října 2014, 20:02:18
Po restartu dovecotu, je něco v adresáři /var/spool/postfix/private/auth ?
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 10 Října 2014, 20:16:36
není. a název je s rovnítkem.
Kód: [Vybrat]
srw-rw-rw- 1 root    root    0 říj 10 19:47 auth=
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 10 Října 2014, 20:18:45
To je ok.

Mrkni sem>
http://wiki2.dovecot.org/HowTo/PostfixAndDovecotSASL

Myslím, že to máš zbytečně moc přeplácané a popravdě se v té Tvé konfiguraci těžko orientuju :(
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 10 Října 2014, 20:28:51
Nastavoval jsem to podle článku http://blog.bcvsolutions.eu/mailserver-postfix-dovecot-a-mysql/ (http://blog.bcvsolutions.eu/mailserver-postfix-dovecot-a-mysql/).
Zkusim to podle toho článku, ovšem nevím co čim nahradit. Přece tam nenecham jen tich pár řádků.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 10 Října 2014, 20:37:58
SSL certifikáty jsou vygenerované a na místě?
Nevím, fakt střílím od boku, musel bych se na to podívat.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 10 Října 2014, 21:04:10
Certifikáty snad nepotřebuji. Nemám nastavenou TLS podporu. Zabezpečené spojení mám zatím pouze u IMAPu a tam funguje. Podíval jsem se do toho návodu, soubor master.cf jsem doplnil o
Kód: [Vybrat]
submission inet n - - - - smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
  -o smtpd_sender_restrictions=reject_sender_login_mismatch
  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
Nevím co s tim dál, několikrát jsem konfiguraci smazal a začal stavět od nuly. A nemohu ani najít žádný příklad, kde je všechno nastaveno tak jak potřebuji a je pro nové verze postfixu a dovecotu.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: Petr Merlin Vaněček 10 Října 2014, 21:14:30
Nevím co s tim dál, několikrát jsem konfiguraci smazal a začal stavět od nuly. A nemohu ani najít žádný příklad, kde je všechno nastaveno tak jak potřebuji a je pro nové verze postfixu a dovecotu.

Výše uvedené je akorát pro změnu portu. Osobně bych zálohoval, co mám → k tomu se mohu vrátit kdykoliv.
A zase začal od nuly a hlavně postupně tj. prvě bych rozjel dovecot + postfix a ověřoval proti systémovému uživateli. Pak teprve bych na to balil mysql a virtuály. Tupě okopírovat cosi velmi málokdy vede ke spolehlivému řešení.
Název: Re:Postfix zabezpečení veřejného serveru.
Přispěvatel: vojak 10 Října 2014, 21:44:16
Takže po tomto testování jsem zjistil, že přes telnet lze odeslat zprávu pouze na místní server. Ven odeslat nejde, autentizace přes AUTH LOGIN nejde. Ale zato je funkční odesílání pošty kamkoliv z outlooku. Při odesílání se ale v auth.log objeví hláška:
Kód: [Vybrat]
auth: pam_unix(dovecot:auth): check pass; user unknown
auth: pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=postmaster@domena.cz rhost=10.200.10.2

V mail.log:
Kód: [Vybrat]
postfix/smtpd[6329]: connect from unknown[10.200.10.2]
postfix/smtpd[6329]: D6AA7120031D: client=unknown[10.200.10.2], sasl_method=LOGIN, sasl_username=postmaster@domena.cz
postfix/cleanup[6342]: D6AA7120031D: message-id=<EDA57A780D1C40858DF9E8F06A499454@vojaknb>
postfix/qmgr[3568]: D6AA7120031D: from=<postmaster@domena.cz>, size=1392, nrcpt=1 (queue active)
postfix/smtpd[6329]: disconnect from unknown[10.200.10.2]
postfix/smtp[6343]: D6AA7120031D: to=<vojak@seznam.cz>, relay=mx1.seznam.cz[77.75.76.42]:25, delay=12, delays=0.17/0.01/11/0.85, dsn=2.0.0, status=sent (250 2.0.0 Mail 1344871411 queued for delivery in session 5586000001ba.)
postfix/qmgr[3568]: D6AA7120031D: removed

 Při zadání špatného hesla, se pošta neodešle.