Sajnos nem tudom, hogy mi a CentOS alapértelmezett levelező programja, a szervert előretelepített állapotban Exim MTA (Mail Transfer Agent) kaptam, amely helyett a Postfix szervert szeretem használni, ezért feltelepítettem egy Postfix-et, eltávolítottam egy Exim-et és tudattam a CentOS-sal, hogy új MTA van, beállítottam a feltelepített programok futási szintjét és el is indítottam a Postfix-et:
# yum install postfix.x86_64 postfix-perl-scripts.x86_64 spamass-milter-postfix.noarch postgrey.noarch
# yum erase exim
# chkconfig postfix on
# chkconfig postgrey on
# chkconfig spamass-milter on
# chkconfig spamassassin on
# alternatives --config mta
# service postfix restart
Ezek után a Postfix üzemkész, akár tesztelhetjük is:
# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 javaforum.hu ESMTP Postfix
helo localhost
250 javaforum.hu
mail from: auth.gabor@javaforum.hu
250 2.1.0 Ok
rcpt to: auth.gabor@javaforum.hu
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: Test
Test
.
250 2.0.0 Ok: queued as CF459E1FFC
quit
221 2.0.0 Bye
Connection closed by foreign host.
#
#
# su - auth.gabor
[auth.gabor@javaforum ~]$ mail
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/auth.gabor": 1 message 1 new
>N 1 auth.gabor@javaforum Sun Jun 24 21:41 15/519 "Test"
& 1
Message 1:
From auth.gabor@javaforum.hu Sun Jun 24 21:41:36 2012
Return-Path: <auth.gabor@javaforum.hu>
X-Original-To: auth.gabor@javaforum.hu
Delivered-To: auth.gabor@javaforum.hu
Subject: Test
Date: Sun, 24 Jun 2012 21:41:23 +0200 (CEST)
From: auth.gabor@javaforum.hu
To: undisclosed-recipients:;
Status: R
Test
& q
Held 1 message in /var/spool/mail/auth.gabor
Működik.
Domain név beállítások
Levelezésnél fontos tudatni a levelezőszerverrel, hogy mely domain nevek tartoznak hozzá, illetve mi az ő saját domain neve, ezért írjuk a /etc/postfix/main.cf fájl végére az alábbiakat:
# Own options
inet_interfaces = all
myhostname = mail.javaforum.hu
mydomain = mail.javaforum.hu
myorigin = javaforum.hu
mydestination = mail.javaforum.hu
mynetworks = 127.0.0.0/8, [::1]/128, 193.178.119.31/32
relay_domains = $mydestination
Az inet_interfaces mondja meg, hogy minden interfészen hallgatózzon a Postfix, a második blokk megmondja, hogy mi a szerver neve, illetve azok a domain tartományok, amelyek ehhez a szerverhez tartoznak, mint kliens.
Alapvető alias beállítás
A telepítés után még egy viszonylag hosszadalmas konfiguráció következik, kezdjük rögtön a /etc/aliases szerkesztésével, a fájl végére vegyünk fel az alias-t:
# Person who should get root's mail
root: root@javaforum.hu
Majd generáljuk le a fájlból az adatbázist:
# newaliases
LDAP beállítás
A Postfix remekül együtt tud működni a feltelepített és egyelőre üres OpenLDAP adatbázissal, s a felhasználók kezelése sokkal egyszerűbb LDAP-ban, mint fájlokban… főleg akkor, ha több domain nevet is kiszolgálunk levelezéssel.
LDAP alapú aliases
Az előző szekcióban a /etc/aliases fájlt szerkesztettük, de erre a feladatra az LDAP is megfelelő, ehhez hozzunk létre egy /etc/postfix/ldap-aliases.cf nevű állományt:
server_host = localhost
search_base = ou=Aliases,ou=Mail,dc=javaforum, dc=hu
query_filter = (mailLocalAddress=%s)
result_attribute = mailRoutingAddress
Az állományban megmondtuk, hogy az LDAP fa melyik ágát kérdezzük, s ott milyen keresés alapján melyik attribútum hordozza a választ, ám ez még nem működik, a Postfix-el is tudatnunk kell, ezért írjuk a /etc/postfix/main.cf fájl végére az alábbiakat:
alias_maps = hash:/etc/aliases
virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf
A két sor mondja meg a Postfix-nek, hogy honnan vegyen információkat, amikor az alias-neveket keresi. Indítsuk újra a szolgáltatást, majd próbáljuk ki a működését:
# service postfix restart
# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 javaforum.hu ESMTP Postfix
helo localhost
250 javaforum.hu
mail from: root
250 2.1.0 Ok
rcpt to: root
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject: test
test
.
250 2.0.0 Ok: queued as 81DB5E1FD6
quit
221 2.0.0 Bye
Connection closed by foreign host.
Látszólag működik, nézzünk utána a /var/log/maillog állományban is:
Jun 24 21:58:37 2619 postfix/smtpd[12933]: connect from localhost[::1]
Jun 24 21:58:46 2619 postfix/smtpd[12933]: 81DB5E1FD6: client=localhost[::1]
Jun 24 21:58:52 2619 postfix/cleanup[12937]: 81DB5E1FD6: message-id=<20120624195846.81DB5E1FD6@javaforum.hu>
Jun 24 21:58:52 2619 postfix/qmgr[12891]: 81DB5E1FD6: from=<root@javaforum.hu>, size=332, nrcpt=1 (queue active)
Jun 24 21:58:52 2619 postfix/local[12939]: 81DB5E1FD6: to=<root@javaforum.hu>, orig_to=<root>, relay=local, delay=9.3, delays=9.2/0.01/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Jun 24 21:58:52 2619 postfix/qmgr[12891]: 81DB5E1FD6: removed
Működni látszik, próbáljuk ki olyan felhasználóval is, amely még nem létezik:
# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 javaforum.hu ESMTP Postfix
helo localhost
250 javaforum.hu
mail from: root
250 2.1.0 Ok
rcpt to: testroot
550 5.1.1 <testroot>: Recipient address rejected: User unknown in local recipient table
quit
221 2.0.0 Bye
Connection closed by foreign host.
Noigen, ilyet nem talál sehol, tehát kétségbe esett, ezért adjunk hozzá néhány bejegyzést az LDAP fához (a hozzáadás módját lásd az OpenLDAP bejegyzésnél):
dn: ou=Mail,dc=javaforum,dc=hu
objectClass: organizationalUnit
ou: Mail
dn: ou=Users,ou=Mail,dc=javaforum,dc=hu
objectClass: organizationalUnit
ou: Users
dn: ou=Groups,ou=Mail,dc=javaforum,dc=hu
objectClass: organizationalUnit
ou: Groups
dn: ou=Aliases,ou=Mail,dc=javaforum,dc=hu
objectClass: organizationalUnit
ou: Aliases
dn: uid=testroot,ou=Aliases,ou=Mail,dc=javaforum,dc=hu
objectClass: inetOrgPerson
objectClass: inetLocalMailRecipient
uid: testroot
mailLocalAddress: testroot
mailRoutingAddress: root
sn: testroot
cn: testroot
Nézzünk egy újabb próbát (nem szükséges semmit újraindítani, mert az LDAP mindig friss adatokat tud nyújtani a Postfix-nek):
# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.javaforum.hu ESMTP Postfix
helo localhost
250 mail.javaforum.hu
mail from: root
250 2.1.0 Ok
rcpt to: testroot
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Subject: Test
Test
.
250 2.0.0 Ok: queued as 4D4DDDF96D
quit
221 2.0.0 Bye
Connection closed by foreign host.
Nézzünk hozzá naplórészletet:
Jun 24 22:13:40 javaforum postfix/smtpd[23009]: connect from localhost[::1]
Jun 24 22:13:49 javaforum postfix/smtpd[23009]: 4D4DDDF96D: client=localhost[::1]
Jun 24 22:14:00 javaforum postfix/cleanup[23017]: 4D4DDDF96D: message-id=<20120629195349.4D4DDDF96D@mail.javaforum.hu>
Jun 24 22:14:00 javaforum postfix/qmgr[1309]: 4D4DDDF96D: from=<root@javaforum.hu>, size=346, nrcpt=1 (queue active)
Jun 24 22:14:00 javaforum postfix/virtual[23023]: 4D4DDDF96D: to=<root@javaforum.hu>, orig_to=<testroot>, relay=virtual, delay=16, delays=16/0.01/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Jun 24 22:14:00 javaforum postfix/qmgr[1309]: 4D4DDDF96D: removed
Jun 24 22:14:01 javaforum postfix/smtpd[23009]: disconnect from localhost[::1]
Működik…
LDAP alapú felhasználókezelés
Az LDAP igazi haszna a felhasználók kezelése, illetve a Postfix-hez tartozó domain nevek megadása. Kezdésképp adjuk hozzá a /etc/postfix/main.cf fájl végére az alábbi részletet:
virtual_mailbox_domains = ldap:/etc/postfix/ldap-domains.cf
virtual_mailbox_base = /
virtual_mailbox_maps = ldap:/etc/postfix/ldap-mailbox.cf
virtual_minimum_uid = 89
virtual_uid_maps = static:89
virtual_gid_maps = static:89
Itt meghivatkoztunk kettő – még nem létező – állományt, illetve megadtunk egy varázslatos számot – a 89-et – amely a postfix felhasználó azonosítója, ezt meg tudjuk nézni a /etc/passwd állományban. Lássuk a két LDAP konfigurációs állomány tartalmát:
server_host = localhost
search_base = ou=VirtualUsers,ou=Mail,dc=javaforum,dc=hu
query_filter = (ou=%s)
result_attribute = ou
server_host = localhost
search_base = ou=VirtualUsers,ou=Mail,dc=javaforum,dc=hu
query_filter = (mailLocalAddress=%s)
result_attribute = homeDirectory
Nem túl összetett konfigurációk, megadják azt az LDAP ágat, ahol a felhasználók (VirtualUser) vannak, megadjunk a keresési feltételt, illetve a szükséges válasz helyét. Hozzuk létre a levelek helyét, állítsuk be a jogokat, illetve indítsuk újra a Postfix kiszolgálót:
# mkdir /home/mails/
# chown postfix:postfix /home/mails/
# ls -l /home/mails/
drwxr-xr-x. 5 postfix postfix 4096 Jun 26 21:37 /home/mails/
# service postfix restart
Virtuális domain-ek létrehozása
Készítsük el az alábbi LDIF állományt, majd adjuk hozzá az LDAP fához:
dn: ou=VirtualUsers,ou=Mail,dc=javaforum,dc=hu
objectClass: top
objectClass: organizationalUnit
ou: VirtualUsers
dn: ou=javaforum.hu,ou=VirtualUsers,ou=Mail,dc=javaforum,dc=hu
objectClass: top
objectClass: organizationalUnit
ou: javaforum.hu
dn: ou=javakocsma.hu,ou=VirtualUsers,ou=Mail,dc=javaforum,dc=hu
objectClass: top
objectClass: organizationalUnit
ou: javakocsma.hu
A fenti eredményeképp lesz kettő virtuális domain nevünk (javaforum.hu és javakocsma.hu), amelyeket a Postfix magáénak érez. Már csak egy felhasználó hiányzik, hozzunk létre egyet:
dn: uid=auth.gabor@javaforum.hu,ou=javaforum.hu,ou=VirtualUsers,ou=Mail,dc=javaforum,dc=hu
objectClass: account
objectClass: top
objectClass: inetLocalMailRecipient
objectClass: posixAccount
uid: auth.gabor@javaforum.hu
uidNumber: 0
gidNumber: 0
mailRoutingAddress: maildir:/home/mails/javaforum.hu/auth.gabor/
homeDirectory: /home/mails/javaforum.hu/auth.gabor/
mailHost: javaforum.hu
cn: Gabor Auth
userPassword:: YmRjNzgyNxViYTNig2MxODYzdjgzYzByMzczEjA0NTgN
mailLocalAddress: auth.gabor@javaforum.hu
mailLocalAddress: @javakocsma.hu
Észre kell vennünk, hogy a dn fejlécben valamelyik fentebb meghatározott domain ág alá hozunk létre egy uid levelet az LDAP fában, egy-egy ilyen bejegyzés lesz egy-egy felhasználói fiók, amelyet az email cím és a jelszó azonosít. A megadott paraméterek nagyjából magukért beszélnek, a végén a mailLocalAddress hordozza azt az információt, hogy milyen címzett esetén kell ebbe a fiókba dobni a levelet:
- auth.gabor@javaforum.hu – egy szimpla email cím
- @javakocsma.hu – egy úgynevezett catchall cím, amely minden olyan levelet elkap, amely a javakocsma.hu domain számára érkezett és nincs hozzá pontos email cím rendelve
Próbáljuk ki, hogy működik-e a fenti koncepció:
# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.javaforum.hu ESMTP Postfix
helo localhost
250 mail.javaforum.hu
mail from: root
250 2.1.0 Ok
rcpt to: auth.gabor@javaforum.hu
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject: test
test
.
250 2.0.0 Ok: queued as 20C33E2006
quit
221 2.0.0 Bye
Connection closed by foreign host.
Látszólag működik, nézzünk logot:
Jun 24 22:47:47 2619 postfix/smtpd[22038]: 20C33E2006: client=localhost[::1]
Jun 24 22:47:50 2619 postfix/cleanup[23024]: 20C33E2006: message-id=<20120624204747.20C33E2006@mail.javaforum.hu>
Jun 24 22:47:50 2619 postfix/qmgr[22025]: 20C33E2006: from=<root@javaforum.hu>, size=361, nrcpt=1 (queue active)
Jun 24 22:47:50 2619 postfix/virtual[22964]: 20C33E2006: to=<auth.gabor@javaforum.hu>, relay=virtual, delay=5.5, delays=5.5/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Jun 24 22:47:50 2619 postfix/qmgr[22025]: 20C33E2006: removed
Észre kell vennünk azt, hogy ebben az esetben a relay az virtual, illetve a leghosszabb sor végén a delivered to maildir szavakat, amelyek azt jelentik, hogy a levél nem rendszerfelhasználónak került kézbesítésre, illetve a mailbox helyett maildir lett a cél, ahogy azt jeleztük az LDAP attribútumban is (maildir:/home/mails/javaforum.hu/auth.gabor/). Nézzük meg, hogy jó helyre került-e a levél:
# cat /home/mails/javaforum.hu/auth.gabor/new/1340570870.Vca01I11f190M920683.javaforum.hu
Return-Path: <root@javaforum.hu>
X-Original-To: auth.gabor@javaforum.hu
Delivered-To: auth.gabor@javaforum.hu
Received: from localhost (localhost [IPv6:::1])
by mail.javaforum.hu (Postfix) with SMTP id 20C33E2006
for <auth.gabor@javaforum.hu>; Sun, 24 Jun 2012 22:47:45 +0200 (CEST)
subject: test
Message-Id: <20120624204747.20C33E2006@mail.javaforum.hu>
Date: Sun, 24 Jun 2012 22:47:45 +0200 (CEST)
From: root@javaforum.hu
To: undisclosed-recipients:;
test
Tökéletes…
SSL vagy TLS beállítása
Mint azt már írtam volt az Apache Httpd szekcióban: “a mai világban nem nevezhető biztonságosnak, ami nincs titkosítva”, ezért konfiguráljuk be a Postfix esetén is a titkosítást, amelyet két állományban kell megtennünk. Egyrészt a /etc/postfix/main.cf állomány végére az alábbiakat:
smtpd_tls_cert_file = /etc/pki/tls/certs/javaforum.pem
smtpd_tls_key_file = /etc/pki/tls/certs/javaforum.key
smtpd_use_tls = yes
Másrészt a /etc/postfix/master.cf állományban a kommentezett blokk elől szedjük ki a # jeleket:
smtps inet n - 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
A szerver újraindításán túl más feladatunk nincs.
Felhasználók azonosítása (AUTH)
Gyakori igény, hogy az azonosított felhasználók használhassák az SMTP szervert levelek küldésére, s erre lehetőség szerint az SMTPS portot használják. Az azonosítás megoldására két út létezik, az egyik hosszú, a másikhoz szükséges egy POP3 szerver, tehát először az ott leírtakat kell elvégeznünk, majd visszatérni ehhez a szekcióhoz. Alternatív lehetőségképp adjuk hozzá az alábbiakat a /etc/postfix/main.cf fájl végéhez, de ne indítsuk újra a Postfix szolgáltatást, amíg a Dovecot-ot nem konfiguráltuk be az ott leírtak szerint:
smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
A Postfix újraindítása után már lehetőségünk van a saját SMTP szerverünket levélküldésre is felhasználni bármilyen SMTP protokollt ismerő programból az internet bármely pontjáról… 🙂