2007/06/27

Собираем кластер. Часть 1: Heartbeat

Кластер - это прежде всего система повышенной готовности (high availability - HA), построеная с учетом того, что она продолжает работать безотказно, даже если какая-то ее часть выходит из строя.
Heartbeat - продукт проекта Linux-HA, позволяющий реализовать механизм безотказной работы отдельных частей кластера. Первый, кому необходим этот механизм в кластере - это распределитель нагрузки (load balancer, или director).
Допустим, у нас есть два сервера (loadb1, loadb2), которые выделены для того, чтобы стать распределителями нагрузки в будущем кластере. Но прежде чем устанавливать на них программное обеспечение для управление кластером, необходимо настроить и оттестировать механим безотказной работы - когда какой-либо из серверов (loadb1 или loadb2) выходит из строя, второй, благодаря heartbeat, заменяет его. В данном случае условием того, что сервер вышел из строя будет считаться, что он не отвечает на broadcast запросы, т.е. проблемы в сетевом интерфейсе. Сервера loadb1 и loadb2 будут эмулировать ip-адрес кластера - 195.46.64.21, т.е. он будет "поднят" на сетевом интерфейсе как дополнительный (alias).

Настройка heartbeat в Debian 4.0 (Etch)
1. Установить пакет heartbeat-2 и все зависимости, которые он за собой тянет.
apt-get install heartbeat-2
В конце установки сервис heartbeat не сможет запуститься, потому как не созданы основные конфигурационные файлы - ha.cf, authkeys, haresources.
ha.cf - основной конфигурационный файл, содержащий массу различных параметров того, как будет осуществляться heartbeat-механизм. За основу можно взять файл, идущий в пакете (расположен в /usr/share/doc/heartbeat-2). Перед использованием достаточно установить 3 параметра (директивы):
bcast eth0
node loadb1
node loadb2
Указав таким образом использовать heartbeat-механизм через eth0 интерфейсы на основе broadcast-запросов. Имена loadb1, loadb2 должны быть hostname-именами серверов, команда uname -a должна возвращать такие же значения.
authkeys - файл для взаимной аутентификации серверов loadb1 и loadb2. Можно использовать sha, md5, но чтобы не расходовать ресурсы достаточно использовать crc. После создания файл, необходимо установить права доступа к нему только для root
# cat > authkeys
auth 1
1 crc
[Ctrl+C]
# chmod 600 authkeys
haresources - файл, описывающий ресурсы, контролируемые серверами loadb1 и loadb2. Ресурсы представляют собой обычные стоп/старт скрипты, похожие чем-то на сценарии из/etc/init.d. В директории /etc/ha.d/resource.d можно посмотреть доступные (уже готовые к использованию) сценарии. В данном примере будет использован ресурс IPaddr для активации дополнительного ip-адреса на интерфейсе eth0.
loadb1 IPaddr::195.46.64.21/24/eth0
Данные конфигурационные файлы должны быть помещены на обоих серверах в директорию /etc/ha.d и должны быть идентичны. После того, как все подготовлено, запустить heartbeat-сервис на обоих серверах:
# /etc/init.d/heartbeat start
Starting High-Availability services:
2007/06/28_10:14:21 INFO: IPaddr Resource is stopped
Done.
Спустя пару секунд на сервере loadb1 будет поднят дополнительный ip-адрес - 195.46.64.21.
loadb1# ifconfig
eth0 Link encap:Ethernet HWaddr 00:60:08:04:09:0D
inet addr:195.46.64.15 Bcast:195.46.64.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1119456 errors:0 dropped:0 overruns:0 frame:0
TX packets:96462 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:79824340 (76.1 MiB) TX bytes:18991729 (18.1 MiB)
Interrupt:10 Base address:0xe000

eth0:0 Link encap:Ethernet HWaddr 00:60:08:04:09:0D
inet addr:195.46.64.21 Bcast:195.46.64.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:10 Base address:0xe000
Если что-то случается с loadb1 (можно сэмулировать аварию, отправив его на перезагрузку), loadb2 поднимает данный ip-адрес на своем eth0 интерфейсе и принимает на себя основную роль.
loadb2# ifconfig
eth0 Link encap:Ethernet HWaddr 00:10:5A:BF:2B:8C
inet addr:195.46.64.16 Bcast:195.46.64.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1256304 errors:0 dropped:0 overruns:0 frame:0
TX packets:93726 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:99944699 (95.3 MiB) TX bytes:19336953 (18.4 MiB)
Interrupt:9 Base address:0xec00

eth0:0 Link encap:Ethernet HWaddr 00:10:5A:BF:2B:8C
inet addr:195.46.64.21 Bcast:195.46.64.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:9 Base address:0xec00
В /var/log/messages можно проследить происходящее - всё очень подробно и понятно.

Ссылки:
  1. Программное обеспечение повышенной готовности промежуточного уровня в Linux, часть 1: Heartbeat и Web-сервер Apache
  2. How To Set Up A Loadbalanced High-Availability Apache Cluster
  3. The High Availability Linux Project

2007/06/20

Индексы в OpenLDAP

Для увеличения производительности LDAP-сервиса на основе OpenLDAP, можно воспользоваться индексацией (index), которая помогает ускорить обработку поисковых запросов.
Для этого в основном конфигурационном файле (/etc/ldap.slapd.conf) предусмотрен параметр index. Формат следующий:
index {attrlist | default} [pres,eq,approx,sub,none]
где
  • attrlist - список атрибутов (через запятую), для которых будет включена индексация
  • default - используется для указания всех явно не указанных, но используемых в базе, атрибутов
  • pres (present) - индекс для более быстрого определения установлен ли указанный атрибут
  • eq (equality) - индекс для точного поиска указанного значения атрибута (cn=Roman Sozinov)
  • approx (approximate) - индексация для быстрого поиска созвучных (по фонетике) значений (cn=smith и cn=smit)
  • sub (substring) - индексация при поиске по неполным строкам (cn=Roma*)
Пример использования:
index cn
index sn,uid,mail eq,sub
index default none
В данном случае для cn-атрибута будут включены все методы индексации; для sn, uid и mail только eq и sub. Для всех остальных атрибутов индексация будет отключена (default none).

Чтобы внести изменения в индексы, необходимо остановить работающий ldap-сервис (чтобы получить rw-контроль над базой) и запустить утилиту slapindex, обновляющую индексы, установленные для базы. В некоторых источниках советуют перед переиндексацией сделать копию базы "на всякий пожарный".
# /etc/init.d/slapd stop
Stopping OpenLDAP: slapd.
# slapindex -v
...
# /etc/init.d/slapd start
Starting OpenLDAP: slapd.
Не стоит слишком увлекаться индексацией, так как она требует дополнительного использования памяти и ресурсов процессора.

Литература:
  1. LDAP Implementation Cookbook (IBM, 1999)
  2. LDAP System Administration (O'Reilly, 2003)

2007/06/12

Знакомство с Linux-VServer

Статья "Зонная Защита Solaris 10" замечательно описывает подход и возможности виртуализации на уровне операционной системы на примере зон в Solaris. Она также содержит ссылки на подобные решения в Linux-среде - Linux-Vserver, OpenVZ. Так как я использую преимущественно Debian (а он уже содержит в себе поддержку linux-vserver), то вопрос выбора для меня стоял недолго, хотя желание ознакомиться с OpenVZ не пропало.
Linux-vserver - это отличное решение для хостинга и тестирования в различных окружениях - на одном физическом сервере используется одно для нескольких виртуальных серверов Linux-ядро. Главный (MAIN) сервер используется для контроля за виртуальными серверами, каждый из которых находится в закрытой адресной среде, не видя остальных. Разработчики указывают около 3-4% падения производительности системы при использовании VServer, но это настолько маленькие цифры, что их можно не учитывать - система работает как обычно - шустро.
В репозитарии Debian 4.0 уже есть пропатченное linux-ядро, готовое к работе. Минусом является отсутствие отдельного патча linux-vserver, чтобы иметь возможность наложить его на собранное своими руками ядрышко.
Установка и использование linux-vserver очень проста.
# apt-get install linux-image-2.6-vserver-686 util-vserver vserver-debiantools debootstrap
Пример команды для создания виртуального сервера
# newvserver --vsroot /var/lib/vservers/ --hostname srv002 --domain domain.ru --ip 192.168.1.102/24 --dist etch --mirror http://ftp.at.debian.org/debian --interface eth0
# uname -a
Linux srvmain 2.6.18-4-vserver-686 #1 SMP Thu May 10 01:37:59 UTC 2007 i686 GNU/Linux
Стартуем виртуальный хост
# vserver srv002 start
Входим в виртуальный хост
# vserver srv002 enter
# uname -a
Linux srv002 2.6.18-4-vserver-686 #1 SMP Thu May 10 01:37:59 UTC 2007 i686 GNU/Linux
Сейчас можно настроить виртуальный хост для требуемых нужд, установить все необходимое/дополнительное. Всё, как на обычном хосте.
Выходим из виртуального хоста
# vserver srv002 stop
Возможные проблемы могут возникнуть с Apache, если на main-хосте уже запущен Apache и не привязан к конкретному ip-адресу. В этом случае, пытаясь запустить apache на виртуальном хосте, в error.log можно встреить ошибку:
[crit] (98)Address already in use: make_sock: could not bind to port 80
Решение: привязать main-сервер к конкретному ip-адресу.

Проблема с Bind 9 решается не так просто:
cd /usr/src
apt-get build-dep bind9
apt-get source bind9
cd bind9-x.x.x
vi debian/rules
...
--disable-linux-caps \
--disable-threads \
...
dpkg-buildpackage
...
cd ..
dpkg -i *.deb
echo "bind9 hold" | dpkg --set-selections # чтобы заморощить автоматическое обновление
На официальном сайте есть отдел, посвященный "проблемному" soft'у. Проблем с OpenLDAP, Exim, Proftpd не наблюдалось - всё работает как обычно - как часы.

Для автозапуска виртуального сервера при перезагрузке необходимо выполнить следующее:
echo "default" > /etc/vservers/SERVERNAME/apps/init/mark
Чтобы сделать копию уже сконфигурированного виртуального хоста srv002 (например web-сервера).
vserver srv003 build --hostname srv003 --interface eth0:192.168.1.103/24 -m rsync -- -s /var/lib/vservers/srv002/
Если необходимо ограничить ресурсы (процессор, память) виртуальных хостов, linux-vserver и тут не подведет.
Пример (взят из FAQ) того, как избежать ситуации "Out of memory"
1. Проверить размер страниц (pagesize) в памяти (обычно 4Кб)
2. Создать директорию rlimits
mkdir /etc/vservers/srv002/rlimits
3. Установить значения максимума для резидентной памяти (rss) и максимума для всего объема виртуальной памяти (as). Хранимые значения указывают на число страниц памяти - например, чтобы установить предел в 200Мб при размере страницы 4Кб, нужно указать значение 50000.
echo 50000 > /etc/vserver//rlimits/rss # 200Mb
echo 100000 > /etc/vserver//rlimits/as # 400Mb
4. Чтобы изменения вступили в силу, необходимо перезапустить виртуальный хост.

В комплекте пакета util-vserver идут замечательные утилиты для наблюдения за виртуальными хостами. Вот как это выглядит:
# vserver-stat
CTX PROC VSZ RSS userTIME sysTIME UPTIME NAME
0 59 197.9M 43.7M 36m51s32 9m37s35 5d22h45 root server
49166 9 137M 20.2M 0m02s98 0m03s40 4d00h03 srv008
49169 9 137M 20.2M 0m39s41 0m06s62 3d23h59 srv009
49170 13 174.3M 102.6M 16m30s91 1m03s46 3d20h57 srv002
49171 3 21.1M 4.6M 0m00s40 0m00s10 3h22m13 srv001
49176 9 137M 20.2M 0m00s80 0m00s20 1h28m18 srv007
#
#
# vps ax
PID CONTEXT TTY STAT TIME COMMAND
1 0 MAIN ? Ss 0:01 init [2]
...
1045 0 MAIN ? S< 0:12 [md1_raid1]
1049 0 MAIN ? S< 0:00 [md2_raid1]
1126 0 MAIN ? S< 0:00 [kjournald]
1611 0 MAIN ? S< 0:00 [kedac]
1662 0 MAIN ? S< 0:00 [kpsmoused]
1922 0 MAIN ? S< 0:00 [kmirrord]
1970 0 MAIN ? S< 0:00 [kjournald]
1972 0 MAIN ? S< 0:15 [kjournald]
2259 0 MAIN ? Ss 0:02 /sbin/syslogd
2265 0 MAIN ? Ss 0:00 /sbin/klogd -x
2617 0 MAIN ? Ss 0:00 /usr/sbin/inetd
2632 0 MAIN ? Ss 0:00 /usr/sbin/sshd
2874 0 MAIN ? Ss 0:00 /sbin/mdadm
2905 0 MAIN ? Ss 0:00 /usr/sbin/cron
2922 0 MAIN ? Ss 0:00 /usr/sbin/apache
2949 0 MAIN tty1 Ss+ 0:00 /sbin/getty 38400 tty1
2950 0 MAIN tty2 Ss+ 0:00 /sbin/getty 38400 tty2
2951 0 MAIN tty3 Ss+ 0:00 /sbin/getty 38400 tty3
2952 0 MAIN tty4 Ss+ 0:00 /sbin/getty 38400 tty4
2953 0 MAIN tty5 Ss+ 0:00 /sbin/getty 38400 tty5
2954 0 MAIN tty6 Ss+ 0:00 /sbin/getty 38400 tty6
22845 0 MAIN ? Ss 0:00 /usr/sbin/exim4 -bd -q30m
26097 0 MAIN ? S 0:00 /usr/sbin/apache
26098 0 MAIN ? S 0:00 /usr/sbin/apache
26099 0 MAIN ? S 0:00 /usr/sbin/apache
26100 0 MAIN ? S 0:00 /usr/sbin/apache
26101 0 MAIN ? S 0:00 /usr/sbin/apache
15571 49166 srv008 ? Ss 0:00 /sbin/syslogd
15590 49166 srv008 ? Ss 0:00 proftpd: (accepting connections)
15596 49166 srv008 ? Ss 0:00 /usr/sbin/cron
15606 49166 srv008 ? Ss 0:00 /usr/sbin/apache
16397 49169 srv009 ? Ss 0:00 /sbin/syslogd
16416 49169 srv009 ? Ss 0:00 proftpd: (accepting connections)
16422 49169 srv009 ? Ss 0:00 /usr/sbin/cron
16432 49169 srv009 ? Ss 0:00 /usr/sbin/apache
17970 49170 srv002 ? Ss 0:08 /sbin/syslogd
17982 49170 srv002 ? Ss 0:00 /usr/sbin/named -u bind
17989 49170 srv002 ? Ss 0:00 /usr/sbin/lwresd
18005 49170 srv002 ? Ss 15:58 /usr/sbin/clamd
18088 49170 srv002 ? Ss 0:00 /usr/bin/freshclam -d --quiet
18233 49170 srv002 ? Ss 0:06 /usr/sbin/exim4 -bd -q30m
18259 49170 srv002 ? Ss 0:00 /usr/sbin/cron
6387 49169 srv009 ? S 0:00 /usr/sbin/apache
6388 49169 srv009 ? S 0:00 /usr/sbin/apache
6389 49169 srv009 ? S 0:00 /usr/sbin/apache
6390 49169 srv009 ? S 0:00 /usr/sbin/apache
17469 0 MAIN ? Ss 0:00 sshd: root@pts/0
17471 0 MAIN pts/0 Ss+ 0:00 -bash
18505 49171 srv001 ? Ss 0:00 /sbin/syslogd
18515 49171 srv001 ? Ssl 0:00 /usr/sbin/slapd -g openldap -u openldap
18531 49171 srv001 ? Ss 0:00 /usr/sbin/cron
19505 0 MAIN ? Ss 0:00 sshd: root@pts/2
19507 0 MAIN pts/2 Ss 0:00 -bash
20434 0 MAIN pts/2 S+ 0:00 mc
20436 0 MAIN pts/3 Ss 0:00 bash -rcfile .bashrc
21026 49176 srv007 ? Ss 0:00 /sbin/syslogd
21045 49176 srv007 ? Ss 0:00 proftpd: (accepting connections)
21051 49176 srv007 ? Ss 0:00 /usr/sbin/cron
21061 49176 srv007 ? Ss 0:00 /usr/sbin/apache
21083 49176 srv007 ? S 0:00 /usr/sbin/apache
21084 49176 srv007 ? S 0:00 /usr/sbin/apache
21846 49170 srv002 ? S 0:00 /usr/sbin/exim4 -bd -q30m
21847 1 ALL_PROC pts/3 S+ 0:00 vps ax
21848 1 ALL_PROC pts/3 R+ 0:00 ps ax
Ссылки:
  1. Installing Linux-VServer
  2. Howtos Linux-Vserver Debian Sarge
  3. Problematic Programs - Linux-VServer
  4. Vserver DRBD - Linux-VServer
  5. The /etc/vservers directory
  6. "Системный администратор" (октябрь 2006)

2007/06/11

SSL соединение при использовании LDAP-сервиса

Данная заметка вышла как дополнение к постам StartTLS - безопасный LDAP и cvs->ldif.
При использовании общей для всех сотрудников LDAP-адресной книги за пределами офиса, условия использования безопасного LDAP-соединения становятся обязательными. Но существующие на данный момент почтовые клиенты не умеют использовать функцию StartTLS, вместо этого они требуют отдельного SSL-соединения на отдельном порту (для ldaps это порт 636).
В этом случае в дополнение к уже определенным в конфигурационном файле опциям TLSCertificateFile, TLSCertificateKeyFile, TLSCACertificateFile, в запускном скрипте необходимо открыть дополнительный безопасный порт - ldaps. В Debian это делается просто - в начало скрипта /etc/init.d/slapd необходимо добавить строку:
SLAPD_SERVICES="ldap:/// ldaps:///"
После перезапуска сервиса, убедиться, что ldaps порт открыт:
# /etc/init.d/slapd restart
Stopping OpenLDAP: slapd.
Starting OpenLDAP: slapd.
# netstat -an | grep 636
tcp 0 0 0.0.0.0:636 0.0.0.0:* LISTEN
tcp6 0 0 :::636 :::* LISTEN
Теперь остается только протестировать безопасное соединение из почтовой программы (галочка "secure connection (SSL)", порт 636). Thunderbird и Evolution прекрасно срабатывают сразу же. С Outlook'ом придется добавлять сертификат LDAP-сервера (или CA'я, который выдал данный сертификат) в Windows-хранилище сертификатов, иначе он будет отказываться работать, говоря при этом многозначительное "The specified directory service could not be reached".

2007/06/08

Solaris LDAP Authentication with OpenLDAP

Продолжая тему интеграции работающих сервисов с единой директорией каталогов (LDAP), реализовал аутентификацию пользователей в Solaris 10 через PAM-модуль pam_ldap.

План следующий:
  1. Подготовить LDAP-каталог для хранения данных о пользователях
  2. Подготовить систему для работы с LDAP-каталогом
  3. Настроить PAM-конфигурацию для работы с LDAP
  4. Протестировать работоспособность
Перед тем как приступать к сборке всего этого "конструктора", советую ознакомиться (освежить в памяти) с документацией по PAM-модулям.
1. Подготовка LDAP-каталога
В LDAP-директории должны существовать записи о пользователях, которые будут иметь доступ к системе. Пример записи:
dn: uid=user3,ou=People,o=Organization,c=lt
uid: user3
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
gecos: Ivan Ivanov
sn: Ivanov
telephoneNumber: 37070022722
mail: user3@organization.lt
homeDirectory: /export/home/user3
loginShell: /usr/bin/bash
uidNumber: 1010
cn: user3
userPassword: {CRYPT}$1$Gw4bZGoA$cv7sLoqjquhfZiHIx5Hwi0
gidNumber: 1100
Также в LDAP-директории должен быть определен пользователь, имеющий доступ к "ветке" со всеми пользователями (доступ к паролям пользователей ему необязателен) - он будет использоваться для доступа к LDAP от имени системы. В рассматриваемом примере такой пользователь - cn=manager, o=Organization,c=lt (с паролем 'neskazu').
2. Подготовка операционной системы для работы с LDAP-директорией
В Solaris 10 (и прежних, как оказалось, версиях) есть команда ldapclient, которая все сделает сама - нужно только правильно сформировать запрос. Если указываемые значения содержат пробелы, их необходимо обрамлять одинарными скобками. Например, на моей системе это выглядело так:
ldapclient manual -v -a credentialLevel=proxy -a authenticationMethod=simple -a 'proxyDN=cn=manager,o=My Organization,c=lt' -a proxyPassword=neskazu -a 'defaultsearchbase=o=My Organization,c=lt '195.44.44.3
Команда создаст в системе необходимые для работы с LDAP файлы и кое-что изменит не совсем верно - это касается файла /etc/nsswitch.conf. В данном файле нужно будет поправить строку, добавив запись возможность использовать dns для преобразования dns-имен хостов (resolving)
hosts: dns ldap [NOTFOUND=return] files
Если все прошло без ошибок, то по команде getent passwd
# getent passwd
root:x:0:0:Super-User:/:/sbin/sh
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
lp:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
smmsp:x:25:25:SendMail Message Submission Program:/:
listen:x:37:4:Network Admin:/usr/net/nls:
gdm:x:50:50:GDM Reserved UID:/:
webservd:x:80:80:WebServer Reserved UID:/:
nobody:x:60001:60001:NFS Anonymous Access User:/:
noaccess:x:60002:60002:No Access User:/:
nobody4:x:65534:65534:SunOS 4.x NFS Anonymous Access User:/:
user3:x:1010:1100:Ivan Ivanov:/export/home/user3:/usr/bin/bash
...
Не забыть создать в системе домашние директории для пользователей из LDAP-директории
mkdir /export/home/user3
chown 1010:1100
/export/home/user3
3. Настроить PAM-модуль pam_ldap
В файле /etc/pam.conf внести следующие изменения:
other auth requisite pam_authtok_get.so.1
# other auth required pam_dhkeys.so.1
other auth required pam_unix_cred.so.1
other auth sufficient pam_unix_auth.so.1
other auth required pam_ldap.so.1

other account requisite pam_roles.so.1
other account sufficient pam_unix_account.so.1
other account required pam_ldap.so.1
С включенным модулем pam_dhkeys система отказывалась аутентифицировать LDAP-пользователей. Поинтересовавшись, что это за модуль и поняв, что я его не использую, закомментировал зверя.
Если в pam.conf какая-то служба описана отдельно (например xscreensaver), то для нее необходимо также указать использование модуля pam_ldap как и для 'other'.

После проделывания вышеприведенных процедур все должно заработать. Если что-то не так, то на помощь приходит Syslog-система, правда прежде чем ею воспользоваться, её конфигурационный файл (/etc/syslog.conf) тоже требует доработки - например, такой:
auth.debug /var/log/authlog
причем, если файл /var/log/authlog не создан, создать пустышку и заставить syslog перечиать свой файл конфигурации
# touch /var/log/authlog
# svcadm enable svc:/system/system-log:default

Ссылки:
  1. LDAP Authentication in Solaris 10
  2. Solaris 10 and Active Directory Integration
  3. Подключаемые Модули Аутентификации (PAM)
  4. PAM Administration (pdf)
  5. Manual Page for ldapclient

2007/06/01

Установка Dovecot IMAP сервиса с поддержкой LDAP в FreeBSD 5.4

Что есть: внутренний IMAP-сервер для переписки между сотрудниками (локальная сеть)
Что необходимо сделать: научить IMAP-сервер аутентифицировать пользователей через единую LDAP-директорию.
# cd /usr/ports
# make update
# cd /usr/ports/mail/dovecot
# make

make (выбрать LDAP)
make install
echo dovecot_enable="YES" >> /etc/rc.conf
Если при сборке вываливается ошибка
On FreeBSD before 6.2 ports system unfortunately can not set default X11BASE by itself so please help it a bit by setting X11BASE=${LOCALBASE} in make.conf.
On the other hand, if you do wish to use non-default X11BASE, please set variable USE_NONDEFAULT_X11BASE
В /etc/make.conf нужно добавить строку X11BASE=${LOCALBASE} и повторить сборку.

Приведенная ниже конфигурация позволяет использовать в качестве аутентификационной базы пользователей - LDAP-директорию, а данные о пользователях (uid, gid, homedir) достаточно статичны, поэтому они формируются средствами внутренних переменных (%u).
Приведены только те строки, которые требуют изменения.
# cd /usr/local/etc
# cp dovecot-example.conf dovecot.conf
dovecot.conf
# сеть локальная, поэтому можно разрешить plaintext-аутентификацию
disable_plaintext_auth = no
# иерархия папок очень важна, поэтому mbox'а не хватает
mail_location = maildir:~/Maildir
# данная схема аутентификации не нужна
#passdb pam {
#}
passdb ldap {
args = /usr/local/etc/dovecot-ldap.conf
}
userdb static {
# пользователя с uid=500 нужно создать, если его нет
args = uid=500 gid=mail home=/var/mail/myorganization/%u
}
# cp dovecot-ldap-example.conf dovecot-ldap.conf

dovecot-ldap.conf
# вместо глобального использования логина администратора для "привязки"
# (bind) к ldap-серверу будет использоваться логин и пароль
# аутентифицирующегося пользователя
auth_bind = yes
auth_bind_userdn = uid=%u,ou=People,o=myorganization,c=ru

Ссылки:
  1. AuthDatabase/LDAP