Postfix Cyrus Imap Ldap Auth

Кратък предговор

Целта на тази документация е да документира подробно инсталацията и необходимите настройки за пускане в употреба на пощенски сървър (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 и добавям необходимия софтуер, като за целта използвам 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.

Сертификати

  1. Издаване на openssl сертификати за postfix - прочети тук.
  2. Издаване на клиентски сертификати - прочети тук.

Инсталриането на клиентските сертификати няма да бъде засегнато от това ръководство.
Инсталирането на сертификатите и настройките свързани с тях от гледа точка на пощенския сървър се извършват в /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
page_revision: 5, last_edited: 1210468158|%e %b %Y, %H:%M %Z (%O ago)
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License