2008-08-08

Переход с Microsoft Exchange на Postfix+cyrus-imapd+clamav+OpenLDAP



Переход с Microsoft Exchange на Postfix+cyrus-imapd+clamav+OpenLDAP

Автор: Филиппов Алексей

Связь: fa13@bk.ru

Дата создания: 16 мая 2007

Постоянный адрес статьи: http://phas13.blogspot.com/2008/08/microsoft-exchange-postfixcyrus.html

Задача – выкосить Microsoft Exchange.

Используемые для этого дела компоненты:

l SuSE Linux Enterprise Server 10

postfix-2.2.9-10.2

cyrus-sasl-2.1.21-18.4

cyrus-imapd-2.2.12-27.2

openldap2-2.3.19-18.7

apache2-2.2.0-21.2

phpLDAPadmin 1.0.2

clamav-0.90.2-0.1

Необходимо, чтоб работала почта, адресная книга, группы рассылки, антивирусная проверка проходящей почты.

Подготовка файловой системы

Как всем известно, в Linux много рецептов подготовки файловой системы. Я делаю следующим образом:

  1. Под swap выделаю объем равный двойному объему оперативной памяти. В принципе, на серверах с 2-мя гектарами мозгов которые не будут выполнять функции серверов баз данных или еще чего-нибудь жрущего оперативку можно давать меньше места на swap, но я перестраховываюсь – а вдруг через месячишко из-за дефицита мощностей на этом сервере добавят какую-нибудь нехилую задачку.
  2. Выделяю под /boot отдельную точку монтирования. Размер 150 метров, файловая система ext3. Для /boot можно было бы использовать и ext2, так как содержимое этого раздела меняется только при установке нового ядра, но я опять же перестраховываюсь.
  3. Под / на данном сервере выделил 8 гектар. Файловая система ext3.
  4. Ну и под самый веселый раздел /var выдедил все оставшееся место. Получилось 56 Гб.

CLAMAV

Как настоящие пацаны сначала настраиваем антивирус. Для этого используем clamav-0.90.2-0.1. В дистрибутиве SLES10 идет более старая версия, поэтому качаем из инета версию поновее (на www.clamav.net есть, где взять). Устанавливаем и настраиваем.

Первым делом в каталоге /var/log создаем директорию, куда clamav будет складывать логи работы. Так как clamav будет работать под пользователем vscan, то даем этому пользователю права на эту директорию:

root> mkdir /var/log/clamav

root> chown vscan:vscan /var/log/clamav -R

Настраиваем clamav. Все настройки clamav находятся в файле /etc/clamav.conf:

ArchiveMaxFileSize 10M

ArchiveMaxRecursion 10

ArchiveMaxFiles 1000

ArchiveMaxCompressionRatio 0

FixStaleSocket yes

Foreground no

LocalSocket /var/lib/clamav/clamd-socket

LogFacility LOG_MAIL

LogFile /var/log/clamav/clamav.log

LogFileMaxSize 0

LogSyslog yes

LogVerbose yes

PidFile /var/lib/clamav/clamd.pid

User vscan

После этого необходимо запустить демон clamd:

root> /etc/init.d/clamd start

Кроме того, нам необходимо, чтоб clamd автоматически стартовал при запуске системы:

root> ln -s /etc/init.d/clamd /etc/init.d/rc3.d/K08clamd

root> ln -s /etc/init.d/clamd /etc/init.d/rc3.d/S14clamd

root> ln -s /etc/init.d/clamd /etc/init.d/rc5.d/K08clamd

root> ln -s /etc/init.d/clamd /etc/init.d/rc5.d/S14clamd

Чтоб не делать это руками, можно использовать «Runlevel Editor» в yast. Указать там автостарт сервиса.

Теперь настраиваем автоматическое обновление антивирусных баз clamav. За сие замечательное занятие отвечает демон freshclam. Все его настройки хранятся в файле /etc/freshclam.conf:

Checks 24

DatabaseMirror database.clamav.net

DatabaseOwner vscan

HTTPProxyServer 10.77.11.70

HTTPProxyPort 3128

LogFacility LOG_MAIL

LogSyslog yes

NotifyClamd /etc/clamd.conf

PidFile /var/lib/clamav/freshclam.pid

UpdateLogFile /var/log/clamav/freshclam.log

LogVerbose yes

ScriptedUpdates yes

Кроме того, нам необходимо, чтоб freshclam автоматически стартовал при запуске системы:

root> ln -s /etc/init.d/freshclam /etc/init.d/rc3.d/K08freshclam

root> ln -s /etc/init.d/freshclam /etc/init.d/rc3.d/S14freshclam

root> ln -s /etc/init.d/freshclam /etc/init.d/rc5.d/K08freshclam

root> ln -s /etc/init.d/freshclam /etc/init.d/rc5.d/S14freshclam

Чтоб не делать это руками, можно использовать «Runlevel Editor» в yast. Указать там автостарт сервиса.

Теперь нужно установить clamsmtp, приблуда необходима для связи postfix с clamav. В моем случае я выкачал http://memberwebs.com/nielsen/software/clamsmtp/clamsmtp-1.8.tar.gz. Когда вы будете эту штуку ставить – проверьте, может есть версия поновее. Архив распаковал во временную директорию /_tmp/clamsmtpd. Далее устанавливаем:

root> cd /_tmp/clamsmtpd/clamsmtp-1.8

root> ./configure

root> make

root> make check

root> make install

root> mkdir /usr/local/etc

root> cp doc/clamsmtpd.conf /usr/local/etc

root> cd /

root> rm -r /_tmp

Настраиваем этот самый clamsmtp. Его настройки хранятся в файле /usr/local/etc/clamsmtpd.conf. Оригинал сохраняем, исходную копию редактируем:

OutAddress: 10026

Listen: 0.0.0.0:10025

ClamAddress: /var/run/clamav/clamd-socket

TempDirectory: /tmp

User: clamav

Теперь нужно, чтоб clamsmtpd стартовал при запуске системы... Качаем http://memberwebs.com/nielsen/software/clamsmtp/contrib/clam_x_rc_script.tar.gz. Это есть скрипт для автостарта clamsmtpd, созданный специально для SuSE. Из архива файлик clamgate копируем в /etc/init.d. После этого редактируем его:

user=clamav меняем на user=vscan

Ставим # (то есть по виндузятному наречию рэмим) перед строчками:

su -m $user -c "$prefix/sbin/clamd"

rc_check

[ -f $piddir/clamd.pid ] && kill `cat $piddir/clamd.pid`

rc_check

checkproc -p $piddir/clamd.pid $prefix/sbin/clamd

rc_check

Смысл сего шага в том, чтоб отключить запуск демона clamd через сей замечательный скрипт. Ну ведь логично – зачем нам это делать здесь, если это уже сделано в другом месте???

Потом выполняем:

root> ln -s /var/lib/clamav /var/run/clamav

root> ln -s /usr/sbin/clamd /usr/local/sbin/clamd

Это делается для того, чтоб удовлетворить требования скрипта по расположению каталогов. Можно конечно руками его отрихтовать, но в данном случае работы меньше, да и глюков тоже.

Теперь собственно ставим линки на автозагрузки:

root> ln -s /etc/init.d/clamgate /etc/init.d/rc3.d/K08clamgate

root> ln -s /etc/init.d/clamgate /etc/init.d/rc3.d/S14clamgate

root> ln -s /etc/init.d/clamgate /etc/init.d/rc5.d/K08clamgate

root> ln -s /etc/init.d/clamgate /etc/init.d/rc5.d/S14clamgate

Тут засада есть в том, что yast какого-то перца не дает сделать линки через Runlevel Editor, поэтому придется ручками :).

POSTFIX

Базовые параметры почтового сервера PostFIX настраиваются в конфигурационном файле main.cf. При добавлении или изменении параметра необходимо следить, чтоб параметр не повторялся. Кроме параметров по умолчанию, приписанных в этом файле при установке, дописываем и модифицируем следующие:

alias_maps = hash:/etc/aliases,

hash:/etc/postfix/aliases,

hash:/etc/postfix/aliases4bank

inet_interfaces = all

header_checks = regexp:/etc/postfix/header_checks

local_recipient_maps =

mailbox_size_limit = 0

message_size_limit = 4096000

mailbox_transport = cyrus

mydestination = $myhostname, localhost.$mydomain, localhost

mydomain = co.mycorp.com.ua

myhostname = antares.co.mycorp.com.ua

mynetworks = 127.0.0.0/8

10.77.1.0/24

10.77.9.0/24

10.77.11.0/24

10.77.13.0/24

10.77.253.0/24

10.77.254.0/24

relay_domains = $mydestination, $mydomain

relayhost = 10.77.11.60

# for clamav

content_filter = scan:127.0.0.1:10025

receive_override_options = no_address_mappings

После этого проверяем корректность файла параметров:

root> postfix check

Если никаких ошибок не было выдано - значит синтаксис файла корректен.

Теперь беремся за файлик /etc/postfix/master.cf. Дописываем в этот файл следующее:

# AV scan filter (used by content_filter)

scan unix - - n - 16 smtp

-o smtp_send_xforward_command=yes

# For injecting mail back into postfix from the filter

127.0.0.1:10026 inet n - n - 16 smtpd

-o content_filter=

-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks

-o smtpd_helo_restrictions=

-o smtpd_client_restrictions=

-o smtpd_sender_restrictions=

-o smtpd_recipient_restrictions=permit_mynetworks,reject

-o mynetworks_style=host

-o smtpd_authorized_xforward_hosts=127.0.0.0/8

И меняем строки

cyrus unix - n n - - pipe

user=cyrus argv=/usr/lib/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}

на

cyrus unix - n n - - pipe

user=cyrus argv=/usr/lib/cyrus/bin/deliver -e -r ${sender} $(recipient)

Настраиваем группы рассылки. Например добавим группу All_ProgrammerRes@co.mycorp.com.ua и all_abon@co.mycorp.com.ua. Для этого создаем файл /etc/postfix/aliases под пользователь root и заполняем его следующим содержимым:

all_programmerres: admin@brres.mycorp.gov.ua,

admin@bzres.mycorp.gov.ua,

admin@cpres.mycorp.gov.ua,

admin@crres.mycorp.gov.ua,

admin@gnres.mycorp.gov.ua,

admin@gpres.mycorp.gov.ua,

admin@gsres.mycorp.gov.ua,

admin@ivres.mycorp.gov.ua,

admin@klres.mycorp.gov.ua,

admin@kvres.mycorp.gov.ua,

admin@nkres.mycorp.gov.ua,

admin@nsres.mycorp.gov.ua,

admin@ntres.mycorp.gov.ua,

admin@nvres.mycorp.gov.ua,

admin@skres.mycorp.gov.ua,

admin@vares.mycorp.gov.ua,

admin@vlres.mycorp.gov.ua,

admin@vpres.mycorp.gov.ua,

admin@vrres.mycorp.gov.ua,

admin@gs.mycorp.gov.ua

all_abon: abon@brres.mycorp.gov.ua,

abon@bzres.mycorp.gov.ua,

abon@cpres.mycorp.gov.ua,

abon@crres.mycorp.gov.ua,

abon@gnres.mycorp.gov.ua,

abon@gpres.mycorp.gov.ua,

abon@gsres.mycorp.gov.ua,

abon@ivres.mycorp.gov.ua,

abon@klres.mycorp.gov.ua,

abon@kvres.mycorp.gov.ua,

abon@nkres.mycorp.gov.ua,

abon@nsres.mycorp.gov.ua,

abon@ntres.mycorp.gov.ua,

abon@nvres.mycorp.gov.ua,

abon@skres.mycorp.gov.ua,

abon@vares.mycorp.gov.ua,

abon@vlres.mycorp.gov.ua,

abon@vpres.mycorp.gov.ua,

abon@vrres.mycorp.gov.ua,

abon@gs.mycorp.gov.ua,

kanc@gs.mycorp.gov.ua,

Alexandr.Belous@co.mycorp.com.ua,

Ostrov@co.mycorp.com.ua,

Vitaliy.Stavickiy@gs.mycorp.gov.ua,

tavrik_esu@gs.mycorp.gov.ua,

centr_esu@gs.mycorp.gov.ua,

shumen_esu@gs.mycorp.gov.ua

В случае, если необходимо создать новую группу рассылки – добавляйте ее в этот файл.

Теперь создаем из данного файла базу:

root> postalias /etc/postfix/aliases

Теперь объясняем MTA, как отправлять почту на эти группы рассылки. Редактируем файл /etc/postfix/transport. Добавляем следующее:

# mail groups

all_abon@co.mycorp.com.ua local:all_abon

all_programmerres@co.mycorp.com.ua local:all_programmerres

Создаем из этого файла базу:

root> postmap /etc/postfix/transport

После изменений в файлах aliases и transport обязательно пересоздавать базу указанными командами и делать перезагрузку (не перезапуск) postfix.

Ну и ставим postfix на автозагрузку:

root> ln -s /etc/init.d/postfix /etc/init.d/rc3.d/K12postfix

root> ln -s /etc/init.d/postfix /etc/init.d/rc3.d/S10postfix

root> ln -s /etc/init.d/postfix /etc/init.d/rc5.d/K12postfix

root> ln -s /etc/init.d/postfix /etc/init.d/rc5.d/S10postfix

или делаем это через «Runlevel Editor» в YaST. Через YaST проще и правильнее :).

И не забываем запустить postfix, если вы этого еще не сделали:

root> /etc/init.d/postfix start

Теперь еще одна тема – необходимо, чтобы приходящая банковская выписка в зависимости от темы письма рассылалась по районам и оставалась в ящике, куда приходит. Приходит она у нас в buh-bank1@co.mycorp.com.ua. Создаем файлик /etc/postfix/header_checks со следующим содержимым:

/^Subject: Vipiska - 035/

REDIRECT bank035@co.mycorp.com.ua

/^Subject: Vipiska - 036/

REDIRECT bank036@co.mycorp.com.ua

, и так далее для всех возможных вариантов тем для автоматической рассылки (их у нас штук 20). Обратите внимание, что перенаправление осуществляется только на основании темы письма. Как сделать более сложную схему я пока не знаю. После этого создаем файлик с алиасами для рассылки, который называется /etc/postfix/aliases4bank со следующим содержимым:

bank035: buh-bank1@co.mycorp.com.ua,

buhsbyt@bzres.mycorp.gov.ua

bank036: buh-bank1@co.mycorp.com.ua,

buhsbyt@brres.mycorp.gov.ua

, и так далее для всех необходимых групп рассылки. После этого создаем базу данны из файла алиасов:

root> postalias /etc/postfix/aliases4bank

Ну и добавляем правила отправки на данные группы рассылки в файл /etc/postfix/transport:

# mail groups for banks

bank035@co.mycorp.com.ua local:bank035

bank036@co.mycorp.com.ua local:bank036

, и так для всех групп необходимых рассылки. Теперь пересоздаем базу:

root> postmap /etc/postfix/transport

Не забываем перезагрузить конфигурацию postfix:

root> /etc/init.d/postfix reload

Напоследок создаем каталог, куда будут системные сообщения почтовой системы:

root> mkdir /var/log/post

Cyrus-SASL

Эта штука нам нужна для одной простой вещи – она будет хранить логины и пароли пользователей почтовой системы cyrus-imapd. Вперед, с песней:

root> /etc/init.d/saslauthd start

root> saslpasswd2 -c cyrus

Password: вводим пароль для пользователя cyrus

Again (for verification): опять вводим тот же пароль

root> chmod 644 /etc/sasldb2

root> chown cyrus:mail /etc/sasldb2

Ставим наш дорогой sasl на автозагрузку. Либо как обычно (задолбался повторять) через YaST, либо руками:

root> ln -s /etc/init.d/saslauthd /etc/init.d/rc3.d/K16saslauthd

root> ln -s /etc/init.d/saslauthd /etc/init.d/rc3.d/S06saslauthd

root> ln -s /etc/init.d/saslauthd /etc/init.d/rc5.d/K16saslauthd

root> ln -s /etc/init.d/saslauthd /etc/init.d/rc5.d/S06saslauthd

Все, с этим разобрались. Дальше...

Cyrus-IMAPD

Теперь настраиваем IMAP4/POP3 сервер. Все основные настройки cyrus-imapd хранятся в файле /etc/imapd.conf. При добавлении или изменении параметра необходимо следить, чтоб параметр не повторялся. Кроме параметров по умолчанию, приписанных в этом файле при установке, дописываем и модифицируем следующие:

altnamespace: yes

autocreatequota: 25000

defaultdomain: co.mycorp.com.ua

quotawarn: 95

sasl_pwcheck_method: auxprop

sasl_sasldb_path: /etc/sasldb2

timeout: 720

virtdomains: userid

Запускаем cyrus-imapd:

root> /etc/init.d/cyrus start

Создаем новый почтовый ящик:

root> su – cyrus

cyrus> /usr/sbin/saslpasswd2 -c fa

cyrus> cyradm –user cyrus localhost

localhost> cm user.fa@co.mycorp.com.ua

localhost> cm user.fa.Sent@co.mycorp.com.ua

localhost> cm user.fa.Trash@co.mycorp.com.ua

localhost> cm user.fa.Drafts@co.mycorp.com.ua

localhost> sam user.fa@co.mycorp.com.ua fa write

localhost> sq user.fa@co.mycorp.com.ua 25000

localhost> exit

Поздравляю – первый почтовый ящик создан.

Пока жив Exchange

Дело в том, что на данном этапе у нас есть 2 почтовки, которые будут держать домен co.mycorp.com.ua – это Exchange и та, что мы настраиваем (antares). Нужно сделать так, чтоб почта работала нормально во всех направлениях :) (не знаю как сказать по другому). Поэтому нам сейчас придется понасоздавать временных костылей, от которых мы со смертью Exchange избавимся.

Для начала в свойствах протокола SMTP Exchange сервера (Default SMTP Virtual Server) во вкладке «Messages» для опции «Forward all mail with unresolved recipients to host» устанавливаем значение «[10.77.11.60]» (это ip-адрес вышестоящей самой главной почтовки). Кроме того надо четко осознавать, что как только пользователь переедет в новую почтовку – он исчезнет из адресной книги Exchange.

Затем на вышестоящей почтовке, ну то есть на самой главной, для всех адресов, которые будут обрабатываться новой почтовкой необходимо прописать жесткие маршруты движения. После кончины Exchange это будет убрано и вся почта домена co.mycorp.com.ua будет отправляться на новую почтовку. Делается это следующим образом. В файл /etc/postfix/transport вышестоящего MTA для каждого адреса, обрабатываемого новой почтовкой добавляется строка:

fa@co.mycorp.com.ua smtp:10.77.11.51

, где 10.77.11.51 – ip-адрес новой почтовки. Затем:

root> postmap /etc/postfix/transport

root> /etc/init.d/postfix reload

Затем на новой почтовке делаем примерно то же самое. В файл /etc/postfix/transport нового MTA для каждого адреса, обрабатываемого новой почтовкой добавляется строка:

fa@co.mycorp.com.ua cyrus:localhost

, после чего:

root> postmap /etc/postfix/transport

root> /etc/init.d/postfix reload

Все, после этого адрес fa@co.mycorp.com.ua будет корректно обрабатываться всеми участвующими в его жизни почтовыми серверами. Нехило, да?

Так, осталась адресная книга. Угадайте, чем? Правильно,

OpenLDAP2

Избалованные пользователи привыкли, что у них в почтовом клиенте есть адресная книга, и без нее они уже не могут, поэтому начинаем. У нас будет 2 LDAP сервера, один из которых будет master, второй – slave. Изменения с master будут реплицироваться на slave. Необходимость наличия 2-х LDAP серверов обусловлена требованиями к отказоустойчивости системы.

Master находится у нас на 10.77.11.51, slave на 10.77.11.60.

Настраиваем master сервер. Настройки LDAP сервера находятся в файле /etc/openldap/slapd.conf. Мой файл выглядит следующим образом:

include /etc/openldap/schema/core.schema

include /etc/openldap/schema/cosine.schema

include /etc/openldap/schema/inetorgperson.schema

include /etc/openldap/schema/rfc2307bis.schema

include /etc/openldap/schema/yast.schema

pidfile /var/run/slapd/slapd.pid

argsfile /var/run/slapd/slapd.args

modulepath /usr/lib/openldap/modules

access to dn.base=""

by * read

access to dn.base="cn=Subschema"

by * read

access to attrs=userPassword,userPKCS12

by self write

by * auth

access to attrs=shadowLastChange

by self write

by * read

access to *

by * read

#######################################################################

# BDB database definitions

#######################################################################

database bdb

suffix "dc=mycorp,dc=com,dc=ua"

checkpoint 1024 5

cachesize 10000

rootdn "cn=admin,dc=mycorp,dc=com,dc=ua"

rootpw {MD5}/b8HnGMRXvKCbMz4jWCtHQ==

directory /var/lib/ldap/mycorp.com.ua

index objectClass eq

replica host=10.77.11.60

binddn="cn=admin,dc=mycorp,dc=com,dc=ua"

bindmethod=simple

credentials=htgkbrfwbz

replogfile /var/lib/ldap/mycorp.com.ua/replica.log

replicationinterval 30

Значение пароля {MD5}/b8HnGMRXvKCbMz4jWCtHQ== я получил следующим образом:

root> slappasswd -h {MD5}

На запрос ввел пароль, который мне надо зашифровать, подтвердил его и получил эту загадочную строку символов. Обратите внимание на строчку credentials=htgkbrfwbz – это в незашифрованом виде то, что на slave сервере прописано в зашифрованом виде в строке rootpw.

Создаем каталоги, в которых будет храниться база mycorp.com.ua и куда будет логироваться OpenLDAP:

root> mkdir /var/log/ldap

root> su – ldap

ldap> mkdir /var/lib/ldap/mycorp.com.ua

ldap> cp /var/lib/ldap/DB_CONFIG /var/lib/ldap/mycorp.com.ua

Запускаем необходимые сервисы и ставим их на автозапуск, через YaST или руками:

root> /etc/init.d/ldap start

root> /etc/init.d/slurpd start

root> ln -s /etc/init.d/ldap /etc/init.d/rc3.d/K13ldap

root> ln -s /etc/init.d/ldap /etc/init.d/rc3.d/S09ldap

root> ln -s /etc/init.d/ldap /etc/init.d/rc5.d/K13ldap

root> ln -s /etc/init.d/ldap /etc/init.d/rc5.d/S09ldap

root> ln -s /etc/init.d/slurpd /etc/init.d/rc3.d/K12slurpd

root> ln -s /etc/init.d/slurpd /etc/init.d/rc3.d/S10slurpd

root> ln -s /etc/init.d/slurpd /etc/init.d/rc5.d/K12slurpd

root> ln -s /etc/init.d/slurpd /etc/init.d/rc5.d/S10slurpd

После запуска LDAP сервера в каталоге mycorp.com.ua должны появится файлы базы данных LDAP. Кстати, хотя процесс slurpd (занимается репликацией изменений с master на slave сервер) и запущен, но реплицировать ему пока нечего и некуда, ведь база у нас пустая да и slave сервер пока отсутствует. Давайте его создадим.

Итак, настраиваем slave LDAP сервер. slapd.conf этого сервера выглядит почти так же, как и на master сервере:

include /etc/openldap/schema/core.schema

include /etc/openldap/schema/cosine.schema

include /etc/openldap/schema/inetorgperson.schema

include /etc/openldap/schema/rfc2307bis.schema

include /etc/openldap/schema/yast.schema

pidfile /var/run/slapd/slapd.pid

argsfile /var/run/slapd/slapd.args

modulepath /usr/lib/openldap/modules

access to dn.base=""

by * read

access to dn.base="cn=Subschema"

by * read

access to attrs=userPassword,userPKCS12

by self write

by * auth

access to attrs=shadowLastChange

by self write

by * read

access to *

by * read

#######################################################################

# BDB database definitions

#######################################################################

database bdb

suffix "dc=mycorp,dc=com,dc=ua"

checkpoint 1024 5

cachesize 10000

rootdn "cn=admin,dc=mycorp,dc=com,dc=ua"

rootpw {MD5}UQiLwCP2DA8ecWNe6h3rLQ==

directory /var/lib/ldap/mycorp.com.ua

index objectClass eq

updatedn "cn=admin,dc=mycorp,dc=com,dc=ua"

Создаем каталоги, в которых будет храниться база mycorp.com.ua и куда будет логироваться OpenLDAP:

root> mkdir /var/log/ldap

root> su – ldap

ldap> mkdir /var/lib/ldap/mycorp.com.ua

ldap> cp /var/lib/ldap/DB_CONFIG /var/lib/ldap/mycorp.com.ua

Запускаем необходимые сервисы и ставим их на автозапуск, через YaST или руками:

root> /etc/init.d/ldap start

root> /etc/init.d/slurpd start

root> ln -s /etc/init.d/ldap /etc/init.d/rc3.d/K13ldap

root> ln -s /etc/init.d/ldap /etc/init.d/rc3.d/S09ldap

root> ln -s /etc/init.d/ldap /etc/init.d/rc5.d/K13ldap

root> ln -s /etc/init.d/ldap /etc/init.d/rc5.d/S09ldap

root> ln -s /etc/init.d/slurpd /etc/init.d/rc3.d/K12slurpd

root> ln -s /etc/init.d/slurpd /etc/init.d/rc3.d/S10slurpd

root> ln -s /etc/init.d/slurpd /etc/init.d/rc5.d/K12slurpd

root> ln -s /etc/init.d/slurpd /etc/init.d/rc5.d/S10slurpd

После запуска LDAP сервера в каталоге mycorp.com.ua должны появится файлы базы данных LDAP.

Ну и после этого процесс slurpd с master сервера уже может колбасить изменения в slave.

Так, ну и теперь нам нужно удобное средство для работы с OpenLDAP. Можно конечно все изменения делать из консоли с использованием *.ldif файлов через такой замечательный набор консольных утилит как slapadd, ldapadd, ldapdelete, ldapmodify, ldapsearch и т.д., но это скучно и некрасиво, да и долго, и знать надо много, и ваще... Добрые люди для ленивых придумали такую классную штуку, как

phpLDAPadmin

Первым делом дуем на http://phpldapadmin.sourceforge.net и качаем самую свежую стабильную версию phpLDAPadmin. Архив выкладываем на сервер и содержимое папки phpldapadmin-x.x.x распаковываем в папку /opt/phpldapadmin. Далее:

root> cd /opt/phpldapadmin/config

root> cp config.php.example config.php

В принципе можно ничего и не настраивать, разве что сделать осмысленное название LDAP сервера на стартовой страничке. Для этого в файле config.php меняем строку

$ldapservers->SetValue($i,'server','name','My LDAP Server');

на строку

$ldapservers->SetValue($i,'server','name','Херсоноблэнерго LDAP Server');

Ну а так как морда у phpLDAPadmin написано на PHP, как видно из названия продукта, то нам нужен Web Server с PHP. Для этого ставим apache2, PHP версии 4 или выше и модули PHP для apache2, ну и такую штуку, как gettext. Из всего этого хозяйства настроить нужно только

Apache2

Тут все более-менее просто :), а вы как думали – тут все просто, стоит только прочитать несколько предыдущих страниц текста :). Редактируем файл /etc/apache2/httpd.conf, добавляем в самый конец такое:

ServerAdmin sit@co.mycorp.com.ua

ServerName antares.mycorp.com.ua

# For OpenLDAP WEB Access (phpLDAPadmin)

Alias /ldap "/opt/phpldapadmin"

Order Deny,Allow

Allow from all

Options -Indexes

После этого запускаем apache2 и ставим его на автозагрузку:

root> /etc/init.d/apache2 start

root> ln -s /etc/init.d/apache2 /etc/init.d/rc3.d/K11apache2

root> ln -s /etc/init.d/apache2 /etc/init.d/rc3.d/S11apache2

root> ln -s /etc/init.d/apache2 /etc/init.d/rc5.d/K11apache2

root> ln -s /etc/init.d/apache2 /etc/init.d/rc5.d/S11apache2

После этого если вы зайдете на http://antares/ldap, или как там он у вас называется, то увидите очень симпатичную можду phpLDAPadmin. Все, можете создавать адресную книгу.

Настройки логирования и ротации

Без этого никуда. Что подразумеваем под системными настройками – логирование информационных систем, описанных выше, и ротацию журнальных файлов.

Настраиваем syslog-ng. Если не знаете, что это такое – это более новая версия всеми любимого syslog, только мощнее. В каталоге /etc/syslog-ng, есть два файла с идентичным содержимым, но разными названиями (когда я говорю об идентичности, я исключаю из рассмотрения комментарии – они отличаются). Редактируем файл syslog-ng.conf.in (syslog.conf редактировать нельзя). Добавляем в самый конец следующее:

# clamsmtpd

filter fff_clamsmtpd { match('clamsmtpd') and not match(accepted); };

destination ddd_clamsmtpd { file("/var/log/post/clamsmtpd"); };

log { source(src); filter(fff_clamsmtpd); destination(ddd_clamsmtpd); };

# cyrus

filter fff_cyrus { match('cyrus'); };

destination ddd_cyrus { file("/var/log/post/cyrus"); };

log { source(src); filter(fff_cyrus); destination(ddd_cyrus); };

# imap

filter fff_imap { match('imap'); };

destination ddd_imap { file("/var/log/post/imap"); };

log { source(src); filter(fff_imap); destination(ddd_imap); };

# pop

filter fff_pop { match('pop'); };

destination ddd_pop { file("/var/log/post/pop"); };

log { source(src); filter(fff_pop); destination(ddd_pop); };

# postfix

filter fff_postfix { match('postfix'); };

destination ddd_postfix { file("/var/log/post/postfix"); };

log { source(src); filter(fff_postfix); destination(ddd_postfix); };

# openldap

filter fff_ldap { match('slapd'); };

destination ddd_ldap { file("/var/log/ldap/slapd"); };

log { source(src); filter(fff_ldap); destination(ddd_ldap); };

Не факт, что вы добавите именно это, возможно у вас свой взгляд на систему логирования этого комплекса событий.

Теперь из файла syslog-ng.conf.in делаем файл syslog-ng.conf:

root> SuSEconfig

А, как просто, да?

Ну и настраиваем ротацию журнальных файлов. Для этого в каталоге /etc/logrorate.d создаем файлы clamav, ldap, post со следующим содержимым:

/etc/logrotate.d/clamav:

/var/log/clamav/* {

dateext

compress

copytruncate

weekly

missingok

notifempty

olddir /var/log/arhiv/clamav

rotate 100

}

/etc/logrotate.d/ldap:

/var/log/ldap/* {

dateext

compress

copytruncate

daily

missingok

notifempty

olddir /var/log/arhiv/ldap

rotate 100

}

/etc/logrotate.d/post:

/var/log/post/* {

dateext

compress

copytruncate

daily

missingok

notifempty

olddir /var/log/arhiv/post

rotate 100

}

Ну вроде все. Что вспомню - добавлю.




Читать далее

Установка PostgreSQL 8.3.1 из исходников + базовая настройка


Установка PostgreSQL 8.3.1 из исходников + базовая настройка

Автор: Филиппов Алексей

Связь: fa13@bk.ru

Дата создания: 27 марта 2008

Постоянный адрес статьи: http://phas13.blogspot.com/2008/08/postgresql-831.html

Имеем установленный SLES9 SP4.

Необходимо получить работающий сервер PostgreSQL версии 8.3.1, собранный из исходников, взятых с официального сайта postgresql.org.

Сразу дам совет — курите маны!!! Прочитайте внимательно инструкцию PostgreSQL по установке. Фиг с ним, что на английском — все равно вы без него никуда не денетесь...

Необходимо проверить, что в системе установлены следующие пакеты:

gcc-3.3.3

gettext-0.14.1

make-3.80

perl-5.8.3

perl-gettext-1.01

readline-devel-4.3

readline-4.3

zlib-1.2.1

zlib-devel-1.2.1

Для проверки используем команду rpm -q.

Версии могут отличаться, главное, чтоб в большую сторону. Может и в меньшую, но незначительно. Более точные и подробные требования приведены в документации PostgreSQL, в разделе «Installation Instructions».

Тянем с postgresql.org исходники последней версии.

Копируем их в каталог /opt

Далее все действия выполняем под root:

root# mkdir /opt/src

root# cp /opt/postgresql-8.3.1.tar.gz /opt/src

root# rm /opt/postgresql-8.3.1.tar.gz

root# cd /opt/src

root# tar -xvzf postgresql-8.3.1.tar.gz

root# cd postgresql-8.3.1

ВНИМАНИЕ!!! Каталог /opt/src/postgresql-8.3.1 и файл /opt/src/postgresql-8.3.1.tar.gz удалять нельзя никогда!!! По крайней мере пока на данном сервере эксплуатируется данная версия postgresql. Продолжаем под root:

root# mkdir /opt/pgsql

root# ./configure --prefix=/opt/pgsql --enable-thread-safety

root# gmake

После ввода последней команды будет долго мелькать информация о компиляции. В конце должно быть выдано следующее сообщение:

All of PostgreSQL successfully made. Ready to install.

Далее делаем предварительный тест установки. Для этого заходим в систему под непривилегированным пользователем (у меня это alexsf):

root# su — alexsf

alexsf> cd /opt/src/postgresql-8.3.1/

alexsf> gmake check

В результате будет выдано большое количество информации. Внимательно смотрим на все выданное, ищем ошибки (у меня их не было, поэтому я не знаю как они выглядят). Самое главное, что у меня было выдано:

=======================

All 114 tests passed.

=======================

В принципе, наверное неплохо... Будем считать, что тест прошел успешно. Выходим из непривилегированного пользователя и продолжаем под root:

alexsf> exit

root# make install

Помелькает на экране много всякого, но достаточно быстро. В результате должно быть выдано:

PostgreSQL installation complete.

Теперь настраиваем наш linux. Первым делом параметры ядра linux.

ВНИМАНИЕ!!! Если на сервере, где ставится postgresql работает oracle, или установлен пакет orarun, то параметры ядра уже настроены, и по этому ничего делать не нужно. Если же сервер девственно чист, то под пользователем root редактируем файл /etc/sysctl.conf. Добавляем или редактируем строку, чтобы получилось так:

kernel.shmmax = 1000000000

После этого перегружаемся или выполняем под пользователем root (что по на самом деле одно и то же):

root# sysctl kernel.shmmax = 1000000000

С параметрами ядра закончили.

Теперь займемся объяснением linux-у, где чего у нас лежит, и как это что-то найти. Редактируем файл /etc/profile. В самый конец дописываем:

LD_LIBRARY_PATH=/opt/pgsql/lib:${LD_LIBRARY_PATH}

export LD_LIBRARY_PATH

PATH=/opt/pgsql/bin:${PATH}

export PATH

MANPATH=/opt/pgsql/man:${MANPATH}

export MANPATH

Создадим пользователя, под которым у нас будет работать база данных:

root# mkdir /opt/pgsql/home

root# mkdir /opt/pgsql/data

root# groupadd postgres

root# useradd postgres -d /opt/pgsql/home -s /bin/bash

root# usermod -G postgres postgres

root# passwd postgres

root# chown postgres:postgres /opt/pgsql/home

root# chown postgres:postgres /opt/pgsql/data

Инициализируем кластер базы данных:

root# su — portgres

postgres> initdb -D /opt/pgsql/data

В результате мы должны увидеть, что кластер инициализировался нормально.

Осталось совсем немного — создать скрипты останова-запуска базы и обеспечить автоматический старт при загрузке сервера.

postgres> exit

root# cp /opt/src/postgresql-8.3.1/contrib/start-scripts/linux /etc/init.d/

root# mv /etc/init.d/linux /etc/init.d/postgresql

root# chmod 755 /etc/init.d/postgresql

root# ln -s /etc/init.d/postgresql /etc/init.d/rc3.d/K13postgresql

root# ln -s /etc/init.d/postgresql /etc/init.d/rc3.d/S09postgresql

root# ln -s /etc/init.d/postgresql /etc/init.d/rc5.d/K13postgresql

root# ln -s /etc/init.d/postgresql /etc/init.d/rc5.d/S09postgresql

Редактируем файл /etc/init.d/postgresql.

Меняем строку

prefix=/usr/local/pgsql

на

prefix=/opt/pgsql

Меняем строку

PGDATA="/usr/local/pgsql/data"

на

PGDATA="/opt/pgsql/data"

Ну и собственно пробуем запустить:

root# /etc/init.d/postgresql start

Должно выдать

Starting PostgreSQL: ok

Ну собственно вся работа по установке закончена. Сервер запущен. Работает. Осталась базовая настройка и ввод в эксплуатацию. К сборке PostgreSQL из исходников это отношения не имеет, но информация полезная. так что...

Поменяем пароль пользователю базы данных postgres:

root# su — postgres

postgres> psql

postgres=# alter role postgres password 'some_password';

postgres=# \q

postgres> exit

root#

Обеспечим, чтоб PostgreSQL принимал запросы от любых хостов. Редактируем файл /opt/pgsql/data/pg_hba.conf. У меня он выглядит так:

local all all ident sameuser

host all all 127.0.0.1/32 ident sameuser

host all all 0.0.0.0/0 password

Потом редактируем файл /opt/pgsql/data/postgres.conf. У меня он выглядит так:

#---------------------------------------------------------------------------

# FILE LOCATIONS

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------

# CONNECTIONS AND AUTHENTICATION

#---------------------------------------------------------------------------

listen_addresses = '*'

max_connections = 100

superuser_reserved_connections = 5

#---------------------------------------------------------------------------

# RESOURCE USAGE (except WAL)

#---------------------------------------------------------------------------

max_fsm_pages = 153600

max_stack_depth = 2MB

shared_buffers = 300MB

temp_buffers = 20MB

work_mem = 2MB

#---------------------------------------------------------------------------

# WRITE AHEAD LOG

#---------------------------------------------------------------------------

fsync = off

#---------------------------------------------------------------------------

# QUERY TUNING

#---------------------------------------------------------------------------

constraint_exclusion = on

#---------------------------------------------------------------------------

# ERROR REPORTING AND LOGGING

#---------------------------------------------------------------------------

log_line_prefix = '%s %h %u '

log_min_duration_statement = 60000

log_min_error_statement = warning

log_statement = 'ddl'

redirect_stderr = on

#---------------------------------------------------------------------------

# RUNTIME STATISTICS

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------

# AUTOVACUUM PARAMETERS

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------

# CLIENT CONNECTION DEFAULTS

#---------------------------------------------------------------------------

datestyle = 'iso, dmy'

lc_messages = 'ru_RU.UTF-8'

lc_monetary = 'ru_RU.UTF-8'

lc_numeric = 'ru_RU.UTF-8'

lc_time = 'ru_RU.UTF-8'

#---------------------------------------------------------------------------

# LOCK MANAGEMENT

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------

# VERSION/PLATFORM COMPATIBILITY

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------

# CUSTOMIZED OPTIONS

#---------------------------------------------------------------------------

Перезапускаем PostgreSQL:

root# /etc/init.d/postgres restart

Теперь нам нужно создать базу данных, в которой будут рабочие данные:

root# mkdir /u02/pgdata/res -p

root# chown postgres:postgres /u02/pgdata/res

root# su — postgres

postgres# psql

postgres=# CREATE ROLE res LOGIN PASSWORD 'res' NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE;

postgres=# CREATE TABLESPACE res OWNER res LOCATION '/u02/pgdata/res';

postgres=# CREATE DATABASE "res" WITH ENCODING='UTF8' OWNER=res TABLESPACE=res;

postgres=# CREATE SCHEMA res AUTHORIZATION res;

postgres=# \q

postgres> exit

root#

Теперь настраиваем автоматический сбор статистики и vacuum.

root# mkdir /u02/scheduler/analyze/pgsql -p

root# chown postgres:postgres /u02/scheduler/analyze/pgsql

root# touch /u02/scheduler/analyze/pgsql/pgsql.sh

root# chmod 754 /u02/scheduler/analyze/pgsql/pgsql.sh

Редактируем файл /u02/scheduler/analyze/pgsql/pgsql.sh. Должно получиться следующее:

#!/bin/bash

su - postgres -c "cd /u02/scheduler/analyze/pgsql; psql -d res -f vacuum.sql -o vacuum_execute -t; psql -d res -f vacuum_execute -o vacuum_execute.log"

su - postgres -c "cd /u02/scheduler/analyze/pgsql; psql -d res -f analyze.sql -o analyze_execute -t; psql -d res -f analyze_execute -o analyze_execute.log"

Обратите внимание, что строки с табуляцией — это продолжение первой строки без табуляции. Короче все в строчку должно писаться. Дальше выполняем:

root# su - postgres

postgres# touch /u02/scheduler/analyze/pgsql/vacuum.sql

postgres# touch /u02/scheduler/analyze/pgsql/analyze.sql

postgres# exit

Редактируем файл /u02/scheduler/analyze/pgsql/analyze.sql. Должно получиться следующее:

select 'analyze verbose ' || table_schema || '.' || table_name || ';'

from information_schema.tables

where lower(table_schema) = 'res'

and lower(table_type) = 'base table'

order by table_schema, table_name;

Редактируем файл /u02/scheduler/analyze/pgsql/vacuum.sql. Должно получиться следующее:

select 'vacuum full verbose ' || table_schema || '.' || table_name || ';'

from information_schema.tables

where lower(table_schema) = 'res'

and lower(table_type) = 'base table'

order by table_schema, table_name;

После этого ставим /u02/scheduler/analyze/pgsql/pgsql.sh в cron на еженощное выполнение.

Ну и дело за малым — обеспечить резервное копирование. Заморачиваться по тяжелому не будем, сделаем все по простому.

root# mkdir /u02/scheduler/backup/pgsql/data -p

root# mkdir /u02/scheduler/backup/pgsql/mountpoint

root# chown postgres:postgres /u02/scheduler/backup/pgsql -R

root# touch /u02/scheduler/backup/pgsql/pgsql.sh

root# chmod 754 /u02/scheduler/backup/pgsql/pgsql.sh

Редактируем файл /u02/scheduler/backup/pgsql/pgsql.sql. Должно получиться следующее:

#!/bin/bash

export CURDT=$(date +%Y-%m-%d.%H.%M.%S)

#cool backup

/etc/init.d/postgresql stop

tar -cvf data/pgsql.cool.tar /u02/pgdata

tar -uvf data/pgsql.cool.tar /var/lib/pgsql

tar -uvf data/pgsql.cool.tar /u02/scheduler/analyze/pgsql

tar -uvf data/pgsql.cool.tar /u02/scheduler/backup/pgsql/pgsql.sh

tar -cvzf data/pgsql.cool.$CURDT.tar.gz data/pgsql.cool.tar

rm data/pgsql.cool.tar

/etc/init.d/postgresql start

# full dump

su - postgres -c "cd /u02/scheduler/backup/pgsql/data; pg_dumpall -v > pgsql.pg_dumpall"

tar -cvzf data/pgsql.pg_dumpall.$CURDT.tar.gz data/pgsql.pg_dumpall

rm data/pgsql.pg_dumpall

# res dump

su - postgres -c "cd /u02/scheduler/backup/pgsql/data; pg_dump -C -F c -b -f pgsql.res "res""

tar -cvzf data/pgsql.res.$CURDT.tar.gz data/pgsql.res

rm data/pgsql.res

# copy backup files

umount mountpoint

mount 196.77.150.3:/files/backup/pgsql mountpoint -w

cp -fv data/pgsql.cool.$CURDT.tar.gz mountpoint

cp -fv data/pgsql.pg_dumpall.$CURDT.tar.gz mountpoint

cp -fv data/pgsql.res.$CURDT.tar.gz mountpoint

umount mountpoint

Обратите внимание, что в данном скрипте подразумевается, что на хосте 196.77.150.3 в NFS экспортирована директория /files/backup/pgsql с доступом на запись.

Ну и естественно ставим /u02/scheduler/backup/pgsql/pgsql.sql в cron на выполнение в любое удобное для Вас время.

В принципе все.

27 марта 2008

Читать далее

Горе. Закрыли http://fa13.by.ru

Случилось горе. Закрыли мою свялку доки на http://fa13.by.ru. Тамошним админам написал письмо, но рекации никакой. Обидно...
Короче, всю эту доку вываливаю сюда. Пользуйтесь.
Читать далее