Автор Александр Афанасенков
Патч qpopper4.0.3-mysql-0.4.patch
Поводом к созданию связки Exim+MySQL+Qpopper+DrWeb, послужило
устаревшее программное обеспечение, а так же поток спама и вирусов
сотрудникам нашей компании.
Первое что мы делаем - устанавливаем MySQL сервер.
[root@proxy /]# cd /usr/src/
[root@proxy src]# wget http://www.mysql.com/Downloads/MySQL-3.23/mysql-3.23.49.tar.gz
[root@proxy src]# tar xzpf mysql-3.23.49.tar.gz
[root@proxy src]# cd mysql-3.23.49
[root@proxy mysql-3.23.49]# ./configure \
--prefix=/usr/local/mysql \
--localstatedir=/usr/local/mysql/data \
--with-mysqld-user=mysql \
--disable-large-files \
--with-libwrap \
--without-debug \
--with-charset=koi8_ru \
--with-extra-charsets=all
[root@proxy mysql-3.23.49]# make
[root@proxy mysql-3.23.49]# make install
[root@proxy mysql-3.23.49]# scripts/mysql_install_db
[root@proxy mysql-3.23.49]# chown -R root.mysql /usr/local/mysql
[root@proxy mysql-3.23.49]# chown -R mysql /usr/local/mysql/data
[root@proxy mysql-3.23.49]# cp support-files/my-medium.cnf /etc/my.cnf
[root@proxy mysql-3.23.49]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
[root@proxy mysql-3.23.49]# ln -s /usr/local/mysql/bin/mysqladmin /usr/bin/mysqladmin
[root@proxy mysql-3.23.49]# ln -s /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump
После этого отредактирум файл /etc/ld.so.conf, добавив в него запись:
/usr/local/mysql/lib/mysql, затем выполним ldconfig
Для того чтобы MySQL автоматически запускался при загрузке ПК,
поместим в /etc/rc.d/rc.M перед строкой '# Start Web server:', запись вида:
# Start MySQL server:
if [ -x /etc/rc.d/mysql.server ]; then
. /etc/rc.d/mysql.server start
fi
После этого скопируем файл /usr/local/mysql/share/mysql/mysql.server
в каталог /etc/rc.d/
Демон mysqld должен запускаться от имени пользователя mysql, для этого
в файле mysql.server нужно найти строчку $bindir/safe_mysqld \
--datadir=$datadir --pid-file=$pid_file & и добавить в неё --user=mysql,
сразу после $bindir/safe_mysqld, если нет необходимости обращения к БД
с других ПК, то рекомендуется так же добавить к этой строке ключ
--skip-networking.
Запустим MySQL, выполнив /etc/rc.d/mysql.server start и изменим пароль
пользователя root базы данных MySQL, для этого сделаем следующее:
[root@proxy /]# mysqladmin -u root -p password 'новый_пароль'
(На приглашение ввести пароль, просто нажать Enter)
Для того чтобы обеспечить нормальное завершение работы MySQL при выключении
или перезагрузке ПК, сделаем следующее:
В начало файла /etc/rc.d/rc.6, сразу после PATH поместим:
# Shutdown MySQL server.
if [ -x /etc/rc.d/mysql.server ]; then
. /etc/rc.d/mysql.server stop
fi
После установки MySQL, приступим к инсталляции Exim.
Сперва отредактируем файл /etc/passwd добавив в него:
exim:x:111:12::/var/spool/mail:/bin/false
Создаем файл /etc/aliases следующего содержания:
postmaster: root
root: sysop
abuse: sysop
Создаем файл /etc/exim/aliases, который понадобится нам для
'aliases пользователей'.
[root@proxy src]# mkdir -p /var/spool/mail
[root@proxy src]# mkdir /var/log/exim
[root@proxy src]# chown exim.mail /var/spool/mail/
[root@proxy src]# chown exim.adm /var/log/exim/
[root@proxy src]# chmod 1777 /var/spool/mail/
[root@proxy src]# chmod 2750 /var/log/exim/
[root@proxy src]# mkdir /etc/exim
[root@proxy src]# wget ftp://ftp.directnet.ru/pub/exim/exim3/exim-3.36.tar.bz2
[root@proxy src]# bzip2 -dc exim-3.36.tar.bz2|tar xv
[root@proxy src]# cd exim-3.36
[root@proxy exim-3.36]# mkdir Local
[root@proxy exim-3.36]# cp src/EDITME Local/Makefile
После этого приступим к редактированию Local/Makefile файла.
MAKE_SHELL=/bin/sh
CHOWN_COMMAND=/bin/chown
CHGRP_COMMAND=/bin/chgrp
MV_COMMAND=/bin/mv
RM_COMMAND=/bin/rm
PERL_COMMAND=/usr/bin/perl
INFO_DIRECTORY=/usr/info
COMPRESS_COMMAND=/bin/gzip
ZCAT_COMMAND=/usr/bin/zcat
CONFIGURE_FILE=/etc/exim/exim.conf
EXIM_UID=111
EXIM_GID=12
# EXIM_MONITOR=eximon.bin
LOG_FILE_PATH=/var/log/exim/exim_%slog
LOG_DIRECTORY_MODE=0750
LOG_MODE=0644
LOOKUP_MYSQL=yes
LOOKUP_INCLUDE=-I /usr/local/mysql/include/mysql
LOOKUP_LIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient
MSGLOG_DIRECTORY_MODE=0700
PID_FILE_PATH=/var/run/exim%s.pid
SPOOL_DIRECTORY=/var/spool/mail
SPOOL_DIRECTORY_MODE=07
SPOOL_MODE=0600
[root@proxy exim-3.36]# make
[root@proxy exim-3.36]# make install
[root@proxy exim-3.36]# ln -s /usr/exim/bin/exim /usr/lib/sendmail
[root@proxy exim-3.36]# ln -s /usr/exim/bin/exim /usr/sbin/sendmail
Приступим к созданию пользователей в MySQL.
[root@proxy exim-3.36]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.49-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database mail;
Query OK, 1 row affected (0.04 sec)
mysql> use mail
Database changed
mysql> grant select on mail.* to 'exim';
Query OK, 0 rows affected (0.00 sec)
mysql> use mysql
Database changed
mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','exim',PASSWORD('password'));
Query OK, 1 row affected (0.02 sec)
mysql> grant SELECT,INSERT,UPDATE on mail.* to 'exim';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> use mail
Database changed
mysql> CREATE TABLE domains (id int(6) NOT NULL auto_increment, \
domain varchar(250) NOT NULL default '', PRIMARY KEY (id));
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO domains VALUES (1,'sheremetyevo-2.ru');
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TABLE relays (id int(6) NOT NULL auto_increment, \
ip varchar(20) NOT NULL default '', ts int(11) NOT NULL default '0', \
PRIMARY KEY (id), KEY ip (ip));
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE users (id int(6) NOT NULL auto_increment,
login varchar(16) NOT NULL default '', \
password varchar(40) NOT NULL default '', \
uid varchar(8) NOT NULL default 'exim', \
gid varchar(8) NOT NULL default 'mail', \
PRIMARY KEY (id), UNIQUE KEY login (login));
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO users VALUES(1,'sysop',ENCRYPT('password'),'exim','mail');
Query OK, 1 row affected (0.01 sec)
mysql> \q;
Bye
Приступим к редактированию конфигурационного файла /etc/exim/exim.conf
######################################################################
# Runtime configuration file for Exim #
######################################################################
hide mysql_servers = "<host>/<db>/<user>/<passwd>"
message_size_limit = 5M
freeze_tell_mailmaster
message_filter = /etc/exim/system_filter.exim
message_filter_pipe_transport = filter_pipe
message_filter_reply_transport = address_reply
rbl_domains = blackholes.mail-abuse.org:dialups.mail-abuse.org:relays.mail-abuse.org
rbl_reject_recipients = true
recipients_reject_except = abuse@sheremetyevo-2.ru
rbl_warn_header = true
prohibition_message = "Contact abuse@sheremetyevo-2.ru to discuss our junk-mail control policies"
smtp_banner = "Welcome! This system does not accept Unsolicited \
Commercial Email and will\nblacklist offenders through RBL and our \
internal list. Have a nice day!\n\n${primary_hostname} ESMTP"
######################################################################
# MAIN CONFIGURATION SETTINGS #
######################################################################
primary_hostname = proxy.sheremetyevo-2.ru
qualify_domain = sheremetyevo-2.ru
local_domains = "localhost:mysql;SELECT domain FROM domains WHERE domain='$key'"
# never_users = root
host_accept_relay = "localhost:mysql;SELECT ip FROM relays WHERE \
ip='${sender_host_address}' AND ((UNIX_TIMESTAMP()-120) < ts)"
relay_domains = sheremetyevo-2.ru
receiver_verify
sender_verify
######################################################################
# TRANSPORTS CONFIGURATION #
######################################################################
# ORDER DOES NOT MATTER #
# Only one appropriate transport is called for each delivery. #
######################################################################
local_delivery:
driver = appendfile
file = /var/mail/$local_part
delivery_date_add
envelope_to_add
return_path_add
user = exim
######################################################################
# DIRECTORS CONFIGURATION #
# Specifies how local addresses are handled #
######################################################################
# ORDER DOES MATTER #
# A local address is passed to each in turn until it is accepted. #
######################################################################
user_aliases:
driver = aliasfile
file = /etc/exim/aliases
search_type = lsearch
file_transport = address_file
pipe_transport = address_pipe
virtual_localuser:
driver = aliasfile
domains = mysql;SELECT domain FROM domains
search_type = mysql
query = "SELECT login FROM users, domains WHERE users.login='${local_part}' AND domains.domain='${domain}'"
transport = local_delivery
[root@proxy exim]# sendmail -bd -q15m
Смотрим лог-файл /var/log/exim/exim_mainlog, если ошибок нет, то
мы увидим примерно следующее:
2002-04-18 14:00:33 exim 3.36 daemon started: pid=1127, -q15m, \
listening for SMTP on port 25
2002-04-18 14:00:33 Start queue run: pid=1128
2002-04-18 14:00:33 End queue run: pid=1128
[root@proxy exim]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220-Welcome! This system does not accept Unsolicited Commercial Email and will
220-blacklist offenders through RBL and our internal list. Have a nice day!
220-
220 proxy.sheremetyevo-2.ru ESMTP
helo julia
250 proxy.sheremetyevo-2.ru Hello localhost [127.0.0.1]
mail from: sysop@sheremetyevo-2.ru
250 <sysop@sheremetyevo-2.ru> is syntactically correct
rcpt to: julia@sheremetyevo-2.ru
250 <julia@sheremetyevo-2.ru> verified
data
354 Enter message, ending with "." on a line by itself
Hello!
.
250 OK id=16y8mR-0000IJ-00
quit
221 proxy.sheremetyevo-2.ru closing connection
Connection closed by foreign host.
Смотрим лог-файл /var/log/exim/exim_mainlog, если ошибок нет, то
мы увидим примерно следующее:
2002-04-18 14:11:47 Start queue run: pid=1154
2002-04-18 14:11:47 16y8mR-0000IJ-00 => julia <julia@sheremetyevo-2.ru> \
D=virtual_localuser T=local_delivery
2002-04-18 14:11:47 16y8mR-0000IJ-00 Completed
2002-04-18 14:11:47 End queue run: pid=1154
После того как мы установили Exim, приступим к установке Qpopper:
[root@proxy src]# mkdir /etc/qpopper
[root@proxy src]# wget ftp://ftp.qualcomm.com/eudora/servers/unix/popper/qpopper4.0.3.tar.gz
Изначально qpopper не умеет работать с MySQL, для того чтобы
поправить ситуацию, воспользуемся патчем: qpopper4.0.3-mysql-0.4.patch
[root@proxy src]# gunzip -c qpopper4.0.3.tar.gz| tar xv
Поместим qpopper4.0.3-mysql-0.4.patch в директорию qpopper'а.
[root@proxy src]# cd qpopper4.0.3
[root@proxy qpopper4.0.3]# patch -p1 < qpopper4.0.3-mysql-0.4.patch
[root@proxy qpopper4.0.3]# ./configure \
--prefix=/usr \
--enable-shy \
--enable-log-login-mysql \
--enable-mysql \
--enable-fast-update \
--with-mysqlconfig=/etc/qpopper/popper.conf \
--disable-check-pw-max \
--enable-specialauth \
--disable-hash-dir-check
[root@proxy qpopper4.0.3]# make
[root@proxy qpopper4.0.3]# make install
[root@proxy qpopper4.0.3]# cp mysql-popper.conf /etc/qpopper/popper.conf
Приступим к редактированию конфигурационного файла /etc/qpopper/popper.conf
MysqlAuthHost <host>
MysqlAuthDb <db>
MysqlUsername <user>
MysqlPassword <passwd>
MysqlAuthTable users
MysqlAuthPasswordMethod crypt
MysqlAuthUsernameField login
MysqlAuthPasswordField password
MysqlAuthUidField uid
MysqlAuthGidField gid
В /etc/inetd.conf добавим строку вида:
pop3 stream tcp nowait root /usr/sbin/popper qpopper -s
После этого выполним killall -HUP inetd
[root@proxy etc]# telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
+OK ready
USER julia
+OK Password required for julia.
PASS ,jkmifzve[f
+OK julia has 1 visible messages (0 hidden) in 701 octets.
quit
+OK Pop server at proxy.sheremetyevo-2.ru signing off.
Connection closed by foreign host.
Теперь приступим к установке DrWeb.
Сперва отредактируем файл /etc/passwd добавив в него:
drweb:x:112:12::/opt/drweb:/bin/false
[root@proxy src]# wget http://www.drweb.spb.ru/download/unix/drweb-4.28.1-linux.tgz
[root@proxy src]# wget http://www.drweb.spb.ru/download/unix/drweb-exim-4.28.4-linux.tgz
[root@proxy src]# tar xzpf drweb-4.28.1-linux.tgz
[root@proxy src]# tar xzpf drweb-exim-4.28.4-linux.tgz
[root@proxy src]# cp -r drweb-4.28.1-linux/* /
[root@proxy src]# cp -r drweb-exim-4.28.4-linux/* /
[root@proxy src]# chown -R drweb.adm /var/drweb/
[root@proxy src]# chmod 2750 /var/drweb/
Приступим к редактированию конфигурационного файла /etc/drweb/drweb32.ini
[Linux:Daemon]
User = drweb
Отредактируем конфигурационный файл /etc/drweb/drweb_exim.conf
[Scanning]
SpamFilter = on
[Actions]
SpamFilterAlert = reject
FilterMail = DrWeb-DAEMON@sheremetyevo-2.ru
[VirusNotifications]
RcptsNotify = no
Отредактируем 'templates' файлы, которые находятся в директории
/etc/drweb/templates/en/exim/
/etc/drweb/templates/en/exim/mailbomb-sender.msg и
/etc/drweb/templates/en/exim/skipobj-sender.msg
Please contact with <postmaster@sheremetyevo-2.ru>
Создаём файл-фильтр /etc/exim/system_filter.exim
# Exim filter
## Version: 0.10
#
# Only run any of this stuff on the first pass through the
# filter - this is an optimisation for messages that get
# queued and have several delivery attempts
#
# we express this in reverse so we can just bail out
# on inappropriate messages
#
if $received_protocol is "drweb-scanned"
then
# looks like a already scanned message
finish
endif
if error_message and $header_from: contains "Mailer-Daemon@"
then
# looks like a real error message - just ignore it
finish
endif
if not first_delivery
then
# not first delivery attempt
finish
endif
# Dr.Web Filter
pipe "/opt/drweb/drweb-exim -f $sender_address -- $recipients"
finish
Отредактируем конфигурационный файл /etc/exim/exim.conf
######################################################################
# Runtime configuration file for Exim #
######################################################################
trusted_users = drweb
trusted_groups = mail
message_filter = /etc/exim/system_filter.exim
message_filter_pipe_transport = filter_pipe
message_filter_reply_transport = address_reply
######################################################################
# TRANSPORTS CONFIGURATION #
######################################################################
# ORDER DOES NOT MATTER #
# Only one appropriate transport is called for each delivery. #
######################################################################
filter_pipe:
driver = pipe
user = drweb
group = mail
return_fail_output
Проверим работу демона DrWebD.
Для проверки я использовал вирусные файлы в специально подготовленном архиве 'virus.rar'
В крайнем случае можно воспользоваться тестовым вирусом, идущим в комплекте с drweb.
[root@proxy tmp]# /opt/drweb/drwebd
Key file: /opt/drweb/drwebd.key
Registration info:
0101200095
demo
Loading /var/drweb/bases/drwebase.vdb - Ok, virus records: 29405
Daemon is installed, TCP socket created on port 3000
[root@proxy tmp]# uuencode virus.rar virus.rar |mail -s "Virus" julia
После чего проверил почту. Пользователь отправивший письмо с вирусом получил ответ:
Dear User,
The message you sent to the julia@sheremetyevo-2.ru is infected
and has not delivered. Antivirus filter reports:
--- DrWeb report ---
======================
DrWeb scanning report:
======================
127.0.0.1 [13907] /var/drweb/spool/drweb.tmp_cHXuXE - archive MAIL
127.0.0.1 [13907] >/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar - archive RAR
127.0.0.1 [13907] >>/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar/SirCam.rar - archive RAR
127.0.0.1 [13907] >>>/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar/SirCam.rar/ATT00037.dat infected with Win32.HLLW.SirCam
127.0.0.1 [13907] >>>/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar/SirCam.rar/JOKE.EXE infected with Win98.Vecna.23040
127.0.0.1 [13907] >>/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar/WIN95CIN.RAR - archive RAR
127.0.0.1 [13907] >>>/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar/WIN95CIN.RAR/EXPAND.EXE infected with Win95.CIH.1003
========
Summary:
========
known virus is found : 3
--- DrWeb report ---
An original message was storied in archive record named:
drweb.infected_nD6s6X
In order to receive the original message, please send request to
postmaster, referring to the archive record
name given above.
---
Antivirus service provided by DrWeb Daemon
(http://www.drweb.ru)
Please send your comments to DialogueScience, Inc.
(http://www.dials.ru, support@dials.ru)
Администратору пришло уведомление:
Dear Postmaster,
The message sent by root@sheremetyevo-2.ru to julia@sheremetyevo-2.ru
is infected and has not delivered.
Antivirus filter reports:
--- DrWeb report ---
======================
DrWeb scanning report:
======================
127.0.0.1 [13907] /var/drweb/spool/drweb.tmp_cHXuXE - archive MAIL
127.0.0.1 [13907] >/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar - archive RAR
127.0.0.1 [13907] >>/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar/SirCam.rar - archive RAR
127.0.0.1 [13907] >>>/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar/SirCam.rar/ATT00037.dat infected with Win32.HLLW.SirCam
127.0.0.1 [13907] >>>/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar/SirCam.rar/JOKE.EXE infected with Win98.Vecna.23040
127.0.0.1 [13907] >>/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar/WIN95CIN.RAR - archive RAR
127.0.0.1 [13907] >>>/var/drweb/spool/drweb.tmp_cHXuXE/virus.rar/WIN95CIN.RAR/EXPAND.EXE infected with Win95.CIH.1003
========
Summary:
========
known virus is found : 3
--- DrWeb report ---
An original message was storied in archive record named:
drweb.infected_nD6s6X
После установки DrWeb, приступим к настройке автоматического обновления
вирусных баз drweb.
[root@proxy src]# wget http://cpan.org/modules/by-module/String/String-CRC32-1.2.tar.gz
[root@proxy src]# tar zxvf String-CRC32-1.2.tar.gz
[root@proxy src]# cd String-CRC32-1.2
[root@proxy String-CRC32-1.2]# perl Makefile.PL
[root@proxy String-CRC32-1.2]# make
[root@proxy String-CRC32-1.2]# make test
[root@proxy String-CRC32-1.2]# make install
[root@proxy /]# crontab -e
00 12 * * * /opt/drweb/update/update.pl
P.S. Замечания, дополнения и исправления - приветствуются.
Документ впервые опубликован - 12.04.2002.
Дата последнего обновления - 27.06.2002.
copyright by Александр Афанасенков.