Кратък предговор
Целта на тази документация е да документира подробно инсталацията и необходимите настройки за пускане в употреба на пощенски сървър (mail server) за целите на малка до средно голяма органзация.
Тъй като управлението на повече от десетина потребители струва много работно време на системните администратори стремежа към централизация на управлението е съвсем обоснован. Има няколко варианта за изграждане на общо хранилище за потребителските данни (като потребителско име (username), парола, принаглежност към групи), което ще осигури до известна степен комфорт и оптимизиране на времето на служителите занимаващи се със управлението на системните ресурси. В този случай съм избрал за такова хранилище да ползвам LDAP.
LDAP -a представлява йерархична база от данни, оптимизирана за четене. Което го прави удачен избор за основа на системи да идентификация и оторизация, както и за адресни книги и пр. системи при който се налага често четене на данните и сравнително рядката им промяна.
Има достатъчно голям избор как да бъде настроен пощенският сървър, но аз ще се спра върху един точно определен модел, който според мен е най - удачен за целта.
Естествено ще наблегна на сигурност, гъвкавост и възможно най - лесна администрация.
Работна схема (схема на директорията - LDAP)
Преди всичко, ще упомена, че в този случай, всички услуги са инсталирани на един и същи физически сървър. При възможност е желателно част от тях да бъдат отделени.
Работната схема която ще осъществим, трябва да бъде съобразена със структурата на организацията, чиито нужди ще обслужва пощенският сървър.
Инсталирането и конфигурирането на директорията (LDAP -a) е обект на друга документация, затова тук само ще упомена, че са ни необходими няколко структури от него:
dc=organization,dc=org
|
|___ ou=People,dc=organization,dc=org -> Място за съхраняване на информацията за потребителите
|
|___ ou=Aliases,dc=organization,dc=org -> Място за съхраняване на информацията за пренасочване на пощите
|
|___ ou=Group,dc=organization,dc=org -> Място за съхраняване на групите от потребители
Към директорията се свързват и останалите услучи, участващи в изграждането на това решение:
Използвано ПО:
Използвания софтуер е изцяло с отворен код и са посочени адресите на които може да бъде намерен и изтеглен за употреба.
Документацята описва конкретно използването на [[http://www.centos.org|CentOS]] операционна система, но е приложима за всички съвременни и/или по - нови версии на операционната система Linux.\
При по - новите версии на изполваните софтуери, настройките дават по - голяма гъвкавост и повече възможност. Но моята цел е да използвам дистрибуция максимално близка до утвърдилите се като сигурни и надеждни дистрибутиви на Linux (моя избор е [Hat]).
- Операционна система CentOS 4.4
- Пощенски сървър postfix 2.2
- IMAP сървър Cyrus IMAP 2.2.12
- Директориен сървър OpenLDAP 2.2.13
- Удостоверителен софтуер OpenSSL 0.9.7a
Инсталиране на ПО
В този случай използвам минимална инсталация на CentOS и добавям необходимия софтуер, като за целта използвам yum и стандартното хранилище на CentOS.
# yum install cyrus-imapd cyrus-imapd-utils postfix openldap-servers openldap-clients
Конфигуриране на LDAP
Директорийната услуга (LDAP) -а е основата не само за пощенските услуги, но и за цялата инфраструктура на организацията. Затова е много важно тя да бъде планирана правилно и да бъде обезпечена срещу откази. В това ръководство ще наблегнем само на най - важните моменти, необходими пощенските услуги да работят добре. За по-подробна информация относно настройките на OpenLDAP, засега потърсете на сайта на проекта [[http://www.openldap.org]].
Схеми на LDAP
Тъй като се стремя към възможно най - ясни и изчистени схеми, за да ползвам само тези възможности, които ми трябват, се наложи да напиша собствена схема за директорийната услуга. Тя все още е в процес на разработка, но за конкретния случай ще свърши добра работа. Схемата можете да бъде свалена от [http://yyovkov.wikidot.com/local--files/postfix-cyrus-imap-ldap-auth/postfix.schema тукщ и да бъде поставена при другите схеми на OpenLDAP сървъра - в директорията /etc/openldap/schema/.
postfix.schema -та е помощна и неможе да съществува отделно. А и нашата цел е директорията да бъде колкото се може по - гъвкава и стандартна.
Другите използвани схеми са част от пакета openldap-servers.
Конфигурационен файл
Конфигурационния файл на OpenLDAP сървъра е /etc/openldap/slapd.conf/. В него има няколко важни за нашия случай секции:
- използвани схеми
- начин на автентификация
- сертификати
- описание на базата
- контрол на достъпа до информацията в директорията
- индексиране
Използвани схеми
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/postfix.schema
Начин на автентификация
Тъй като LDAP v2 е остарял и носи рискове за сигурността, то ще използваме само LDAP v3 протокола. Реда #allow bind_v2 трябва да бъде коментиран.
#allow bind_v2
Сертификати
В текущия проек, за издаване на сертификати е използван [[http://www.openssl.org|OpenSSL]]. Повече информация относно издаването и управлението на сертификати с OpenSSL прочети [Certificate Authority|тук]
TLSCACertificateFile /usr/share/ssl/certs/ca-bundle.crt
TLSCertificateFile /usr/share/ssl/certs/slapd.pem
TLSCertificateKeyFile /usr/share/ssl/certs/slapd.pem
Описание на базата
database bdb
suffix "dc=organization,dc=org"
rootdn "cn=Manager,dc=organization,dc=org"
rootpw {SSHA}VMDignv4+qFWeuesDq6b/SvIteVYurC+
directory /var/lib/ldap
Контрол на достъпа до информацията в директорията
Трябва да бъдат описани правила за достъп до информацията в директорията. Правилата за достъп и типа на достъпа се описва в slapd.conf файла. Ето кратък пример:
...
access to attrs=userPassword
by self write
by anonymous auth
...
Индексиране
За подобряване работата на LDAP услугата, трябва да бъдат индексирани атрибутите които най - често ще бъдат използвани. Индексите се описват във файла slapd.conf
...
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
...
Конфигуриране saslauthd
SASL е програмата, която ще проверява в директорията за съществуващите потребител и ще дава тази информация на IMAP сървъра. Благодарение на тази информация, Cyrus ще позволява схраняването на пощата и ще осигурява достъпа на потребителите до техните пощенски кутии.
Информацията, която postfix ще получава от SASL се отнася до:
- достъпа до LMTP услугата, служеща да пренесе получената и обработена от postfix поща до Cyrus
- Оторизацията на потребителите по SMTP за изпращане на електронна поща
/etc/sysconfig/saslauthd
# Directory in which to place saslauthd's listening socket, pid file, and so
# on. This directory must already exist.
SOCKETDIR=/var/run/saslauthd
# Mechanism to use when checking passwords. Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled to use.
#MECH=shadow
MECH=ldap
# Additional flags to pass to saslauthd on the command line. See saslauthd(8)
# for the list of accepted flags.
FLAGS=
/etc/saslauthd.conf
ldap_servers: ldap://127.0.0.1/
ldap_version: 3
ldap_timeout: 10
ldap_time_limit: 10
ldap_cache_ttl: 30
ldap_cache_mem: 32768
ldap_scope: sub
ldap_search_base: ou=People,dc=organization,dc=org
ldap_auth_method: custom
ldap_bind_dn: cn=Manager,dc=organization,dc=org
ldap_password: password
ldap_filter: uid=%U
Конфигуриране на postfix
Следващата стъпка е конфигурирането на пощенския сървър.
/etc/postfix/main.cf
Следните редове трябва да бъдат добавени или променени по следния начин в /etc/postfix/main.conf:
...
alias_maps = hash:/etc/aliases
# Указател за търсене на алтернативни пощ. адреси в LDAP директорията
virtual_alias_maps = ldap:/etc/postfix/ldapfiles/ldap_MailAlternateAddress.cf
...
# Получените писма да бъдат предавани за съхранение през LMTP.
mailbox_transport = lmtp:localhost
...
# Таблица с адресите за получаване, за които се грижи сървъра:
local_recipient_maps =
ldap:/etc/postfix/ldapfiles/ldap_LocalRecipientMaps.cf
$alias_maps
...
# Списък със сертификатите, на които им е позволено да изпащат писма от сървъра
relay_clientcerts = ldap:/etc/postfix/ldapfiles/ldap_relay-clientcerts.cf
...
# Тази проверка трябва да бъде направена, ако искате оторизацията на потребителите
# да бъде чрез сертификати
smtpd_recipient_restrictions =
permit_tls_clientcerts
...
Връзка с LDAP
След като са направени промените в /etc/postfix/main.conf, трябва да бъде осигурен достъпа на услугата до LDAP директорията. За целта в директорията назначаваме потребител, който да има правата да чете определени записи (атрибути) от потребителската информация. Ето примерен ldif файл, който създава този потребител:
# filename: postfix_user.ldif
# С този файл създаваме потребител за postfix услугата, който
# ще бъде използван за доставяне на информация от LDAP дървото
dn: uid=postfix, ou=People, dc=organization,dc=org
userPassword:: e0NSWVBUfWxyUXdwVVdwZjMxNWc=
loginShell: /sbin/nologin
uidNumber: 89
gidNumber: 89
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
uid: postfix
shadowLastChange: 13358
cn: postfix
homeDirectory: /var/spool/postfix
Сигурност
Не е желателно пощенския сървър да бъде разрешен за достъп от неоторизирани потребители за изпращане. За целта в /etc/postfix/main.conf записахме оторизацията за изпращане на писма от сървъра да се базира на сертификати. Това означава, че за да може потребителя да изпрати писмо, той трябва да представи пред системата (да има инсталиран на програмата с която изпраща електронни писма) валиден сертификат. Повече по този върпос [[http://www.openssl.org|тук]]. Има и други варианти с които можете да предотварите нежелан достъп до услугата - за тях проверете на сайта на postfix.
Сертификати
- Издаване на openssl сертификати за postfix - прочети тук.
- Издаване на клиентски сертификати - прочети тук.
Инсталриането на клиентските сертификати няма да бъде засегнато от това ръководство.
Инсталирането на сертификатите и настройките свързани с тях от гледа точка на пощенския сървър се извършват в /etc/postfix/main.conf:
...
smtpd_tls_CAfile = /usr/share/ssl/certs/cacert.yyovkov.net.crt
smtpd_tls_ask_ccert = yes
smtpd_tls_auth_only = no
smtpd_tls_ccert_verifydepth = 5
smtpd_tls_cert_file = /usr/share/ssl/certs/sion.yyovkov.net.crt
smtpd_tls_cipherlist = DEFAULT
smtpd_tls_dkey_file = $smtpd_tls_dcert_file
smtpd_tls_key_file = /usr/share/ssl/private/sion.yyovkov.net.key
smtpd_tls_loglevel = 1
smtp_tls_note_starttls_offer = no
smtpd_tls_received_header = yes
smtpd_tls_req_ccert = yes
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_wrappermode = no
smtpd_use_tls = yes
...
Помощни файлове за връзка с LDAP
Запитванията, които ще бъдат отправяни към LDAP сървъра са записани във файлове в директорията /etc/postfix/ldapfiles/
Алиаси
Алиасите, които насочват пощата към потрбителите също се съхранява в LDAP директорията.
ldap_Aliases.cf
bind = yes
bind_dn = uid=postfix,ou=People,dc=organization,dc=org
bind_pw = secret
server_host = 127.0.0.1
server_port = 389
scope = sub
timeout = 30
version = 3
start_tls = no
search_base = ou=Aliases,dc=organization,dc=org
query_filter = (cn=%u)
result_attribute = rfc822MailMember
Крайни получатели
В този файл се описва заявката която ще провери дали съществува получател със съответното име:
ldap_LocalRecipientMaps.cf
bind = yes
bind_dn = uid=postfix,ou=People,dc=organization,dc=org
bind_pw = secret
server_host = 127.0.0.1
server_port = 389
scope = sub
timeout = 30
version = 3
start_tls = no
search_base = ou=People,dc=organization,dc=org
query_filter = (&(uid=%u)(mailAccountStatus=TRUE))
result_attribute = mail
Конфигуриране на cyrus-imapd
/etc/imapd.conf
configdirectory: /var/lib/imap
defaultpartiotion: /var/spool/imap
partition-default: /var/spool/imap
admins: cyrus
sievedir: /var/lib/imap/sieve
sendmail: /usr/sbin/sendmail
lmtpsocket: /var/lib/imap/socket/lmtp
lmtp_admins: lmtpadmin
lmtp_downcase_rcpt: 1
hashimapspool: true
sasl_pwcheck_method: saslauthd
sasl_mech_list: PLAIN
autocreateinboxfolders: Sent Items|Drafts|Trash|Spam
autocreatequota: 10240
quotawarn: 90
createonpost: 1
timeout: 600
altnamespace: 1
tls_cert_file: /usr/share/ssl/certs/server.crt
tls_key_file: /usr/share/ssl/private/server.key
tls_ca_path: /usr/share/ssl/certs/ca.crt
allowplaintext: yes
servername: ldap.organization.org
/etc/cyrus.conf
# standard standalone server implementation
START {
# do not delete this entry!
recover cmd="ctl_cyrusdb -r"
# this is only necessary if using idled for IMAP IDLE
# idled cmd="idled"
}
# UNIX sockets start with a slash and are put into /var/lib/imap/sockets
SERVICES {
# add or remove based on preferences
imap cmd="imapd" listen="imap" prefork=1
# imaps cmd="imapd -s" listen="imaps" prefork=1
# pop3 cmd="pop3d" listen="pop3" prefork=3
# pop3s cmd="pop3d -s" listen="pop3s" prefork=1
sieve cmd="timsieved" listen="sieve" prefork=1
# these are only necessary if receiving/exporting usenet via NNTP
# nntp cmd="nntpd" listen="nntp" prefork=3
# nntps cmd="nntpd -s" listen="nntps" prefork=1
# at least one LMTP is required for delivery
# lmtp cmd="lmtpd" listen="lmtp" prefork=0
lmtp cmd="lmtpd" listen="localhost:lmtp" prefork=0
lmtpunix cmd="lmtpd" listen="/var/lib/imap/socket/lmtp" prefork=1
# this is only necessary if using notifications
# notify cmd="notifyd" listen="/var/lib/imap/socket/notify" proto="udp" p
refork=1
}
EVENTS {
# this is required
checkpoint cmd="ctl_cyrusdb -c" period=30
# this is only necessary if using duplicate delivery suppression,
# Sieve or NNTP
delprune cmd="cyr_expire -E 3" at=0400
# this is only necessary if caching TLS sessions
tlsprune cmd="tls_prune" at=0400





