Exim+MySQL+Qpopper+DrWeb

Автор Александр Афанасенков
Патч 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 Александр Афанасенков.