"Полировка" почтового сервера

После установки, настройки ОС FreeBSD 10 и почты остаётся некоторая недоговорённость...
Нужно, чтобы сервер был защищён и опрятен. Рассмотрю настройку таки вещей, как:
  • Плагин quota
  • "Master" учётные записи
  • ClamAV
  • Amavis

P.S. В процессе написания список будет пополняться.
Итак, у нас уже есть почтовый сервер. Настроенный. Заранее я добавил поле quota в базу данных. Пора воспользоваться благами...
  1. Плагин Quota.
    Этот плагин задаёт максимальный объём почтового ящика (аккаунта) и следит за его заполнением. Если ящик заполнится полностью, приём и отправка писем будет невозможна, о чём система незамедлительно сообщит.
    Зачем этот плагин вообще нужен? Да чтобы почтовые аккаунты не сожрали всё свободное место на сервере =).
    • /usr/local/etc/dovecot/conf.d/90-quota.conf
      ## Quota limits
      ...
      quota_rule = *:storage=1G
      quota_rule2 = Trash:storage=+10%%
      quota_rule3 = Spam:storage=+10%%
      ...
      ## Quota warnings
      ...
      quota_warning = storage=95%% quota-warning 95 %u
      quota_warning2 = storage=90%% quota-warning 90 %u
      quota_warning3 = storage=80%% quota-warning 80 %u
      quota_warning4 = storage=70%% quota-warning 70 %u
      quota_warning5 = storage=60%% quota-warning 60 %u
      ...
      service quota-warning {
      executable = script /usr/local/bin/quota-warning.sh
      user = vmail
      unix_listener quota-warning {
      user = vmail
      }
      }
      ...
      ## Quota backends
      ...
      quota = maildir:User quota
      ...
    • /usr/local/etc/dovecot/conf.d/15-lda.conf
      mail_plugins = $mail_plugins quota
    • /usr/local/etc/dovecot/conf.d/20-imap.conf
      mail_plugins = $mail_plugins quota imap_quota
    • /usr/local/etc/dovecot/conf.d/20-pop3.conf
      mail_plugins = $mail_plugins quota
    • /usr/local/etc/dovecot/conf.d/20-lmtp.conf
      mail_plugins = $mail_plugins quota imap_quota
    • # nano /usr/local/bin/quota-warning.sh

      #!/bin/sh
      PERCENT=$1
      USER=$2
      cat << EOF | /usr/local/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
      From: administrator@albvvp.ru
      Subject: Внимание!

      Внимание!
      Ваш почтовый ящик заполнен на $PERCENT%. Удалите ненужную корреспонденцию во избежание переполнения!
      EOF


      chmod +x /usr/local/bin/quota-warning.sh 
      chown vmail:vmail /usr/local/bin/quota-warning.sh
      chmod 550 /usr/local/bin/quota-warning.sh
    • /usr/local/etc/dovecot/dovecot-sql.conf.ext
      ...
      user_query = Select `user`, `domain`, `username`, `home`, `mail`, `uid`, `gid`, `quota_rule` From `V_Users` Where `user` = '%u'
      ...
    • /usr/local/etc/dovecot/dovecot-ldap.conf.ext
      ...
      user_attrs = description=quota_rule=*:storage=%$
      ...
    • service dovecot restart

    Смысл: те, у кого явно не указана квота (я имею в виду LDAP), у меня имеют почтовый ящик, объёмом 1 гигабайт (объёмы позволяют). Папки Spam и Trash гарантированно имеют по 10%.
    При заполнении ящика на 60%, 70%, 80%, 90% и 95% пользователю будет приходить информационное письмо. В контроллере домена храню квоту в поле Description (напр. 2G).
  2. Master записи.
    Смысл таков. Если есть учётная запись, помеченная, как master-запись, то от её имени можно войти в любой аккаунт в пределах почтового сервера. Я думаю, что подобный финт будет полезен в дальнейшем.
    Создаём таблицу в базе:
    CREATE TABLE `Masters` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `id_login` INT(10) UNSIGNED NOT NULL,
    `id_reason` INT(10) UNSIGNED NOT NULL,
    `date` DATETIME NOT NULL,
    `editdate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `edituser` VARCHAR(128) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    INDEX `FK_Master_idlogin` (`id_login`),
    INDEX `FK_Master_idreasin` (`id_reason`),
    CONSTRAINT `FK_Master_idlogin` FOREIGN KEY (`id_login`) REFERENCES `Logins` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
    CONSTRAINT `FK_Master_idreasin` FOREIGN KEY (`id_reason`) REFERENCES `Reasons` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
    );
    DELIMITER //
    CREATE TRIGGER `tr_Master_bi`
    BEFORE INSERT
    ON `Master`
    FOR EACH ROW BEGIN
    Set New.edituser = User();
    END//
    DELIMITER ;

    DELIMITER //
    CREATE TRIGGER `tr_Master_bu`
    BEFORE UPDATE
    ON `Master`
    FOR EACH ROW BEGIN
    Set New.edituser = User();
    END//
    DELIMITER ;

    К ней пилим представления:
    Create View V_Masters_Id
    As
    select
    `m`.`id_login` AS `id_login`,
    max(`m`.`date`) AS `date`
    from `Masters` `m`
    where `m`.`date` <= now()
    group by `m`.`id_login`;
    Create View V_Masters_all
    As
    select
    `m`.`id` AS `id`,
    `m`.`id_login` AS `id_login`,
    `m`.`id_reason` AS `id_reason`,
    `m`.`date` AS `date`,
    `r`.`active` AS `active`
    from `Masters` `m`
    join `V_Masters_Id` `i` on
    `m`.`id_login` = `i`.`id_login` and
    `m`.`date` = `i`.`date`
    join `V_Reasons` `r` on
    `m`.`id_reason` = `r`.`id`;
    Alter View V_Logins
    As
    select
    `l`.`id` AS `id`,
    lcase(`l`.`login`) AS `username`,
    lcase(`d`.`domain`) AS `domain`,
    concat(lcase(`l`.`login`),'@',lcase(`d`.`domain`)) AS `user`,
    `l`.`password` AS `password`,
    concat('maildir:',ifnull(`l`.`home`,concat('/mail/',lcase(`d`.`domain`),'/',lcase(`l`.`login`)))) AS `mail`,
    ifnull(`l`.`home`,concat('/mail/',lcase(`d`.`domain`),'/',lcase(`l`.`login`))) AS `home`,
    concat('*:storage=',`l`.`quota`) AS `quota`,
    ifnull(m.active, 0) as `masteruser`,
    `s`.`active` AS `active`
    from `V_Status` `s`
    join `Logins` `l` on `s`.`id_login` = `l`.`id`
    join `V_Domains` `d` on `l`.`id_domain` = `d`.`id`
    left join `V_Masters_all` `m` on `s`.`id_login` = `m`.`id_login`;
    Create View V_Masters
    As
    Select `username`, `domain`, `user`, `password`
    From `V_Logins`
    Where `active` = 1 and `masteruser` = 1

    Логика. По принципу логирования активности, создаём таблицу мастеринга. Принцип как со статусами - есть основания вступления в силу мастер-записи, и есть основания его окончания. Дополняем представление V_Logins - высовываем туда отметку мастер-записи. А также создаём отдельное представление только для мастер-записей.
    Дальше правим:
    • /usr/local/etc/dovecot/conf-master.conf.ext
      ...
      passdb {
      driver = sql
      master = yes
      args = /usr/local/etc/dovecot/dovecot-sql-master.conf.ext

      # Unless you're using PAM, you probably still want the destination user to
      # be looked up from passdb that it really exists. pass=yes does that.
      pass = yes
      }
      ...
    • /usr/local/etc/dovecot/conf.d/10-auth.conf
      ...
      auth_master_user_separator = *
      ...
      !include auth-master.conf.ext
      ...
    • # cat << DELIMITER > /usr/local/etc/dovecot/dovecot-sql-master.conf.ext
      driver = mysql
      connect = host=localhost dbname=mail user=mail password=mail
      default_pass_scheme = SHA512
      password_query = Select `password` From `V_Masters` Where `user` = '%u'
      DELIMITER
    • service dovecot restart

    Заполняем данные в таблице. Всё. Чтобы зайти в чужую учётную запись, нужно ввести следующие данные:
    user: <user@domain1>*<masteruser@domain2>, где
    • user@domain - это пользователь, под которым хотим войти,
    • <masteruser@domain> - мастер-пользователь.

    ВНИМАНИЕ!
    Домены нужно указывать именно те, которые прописаны.
    Пароль нужно указать от учётной записи мастер-записи.
  3. Clamav
    Это один из известнейших антивирусов для Linux/Posix. Нужен будет для проверки корреспонденции на спам.
    # cd /usr/ports/security/clamav
    # make config-recursive
    # make install clean
    # rehash

    http://it.icmp.ru/postimages/8426/7633/full/clamav.jpg

    # sysrc clamav_clamd_enable=YES
    # sysrc clamav_freshclam_enable=YES
    # nano /usr/local/etc/clamd.conf
    ...
    LogFile /var/log/clamav/clamd.log
    ...
    LogFileMaxSize 10M
    ...
    LogTime yes
    ...
    LogVerbose yes
    ...
    LogRotate yes
    ...
    TemporaryDirectory /var/tmp
    ...
    LocalSocket /var/run/clamav/clamd
    ...

    # service clamav-clamd start
    # service clamav-freshclam start
    # freshclam
  4. Amavis - набор средств, чтобы связать воедино calmd, spamassassin и т.п.
  5. [code]# cd /usr/ports/security/amavisd-new/
    # make config-recursive

    Ставил с такими настройками
    http://it.icmp.ru/postimages/8426/7633/full/amavis.jpg

    http://it.icmp.ru/postimages/8426/7633/full/spamassassin.jpg

    остальное - по умолчанию
    # make config-recursive
    # make install clean
    # rehash
    # pyzor discover
    # razor-admin -create
    # razor-admin -register
    # mv /home/username/.pyzor /var/amavis
    # mv /home/username/.razor /var/amavis
    # chown -R vscan:vscan /var/amavis/.pyzor /var/amavis/.razor
    # pw groupmod vscan -M clamav

    Далее редактируем настройки. По-идее, необходимо внимательно курить весь конфиг. Укажу только основное, что я изменял:
    # nano /usr/local/etc/amavisd.conf
    ...
    @bypass_virus_checks_maps = (1); # controls running of anti-virus code
    @bypass_spam_checks_maps = (1); # controls running of anti-spam code
    $bypass_decode_parts = 1; # controls running of decoders&dearchivers
    $max_servers = 2; # num of pre-forked children (2..30 is common), -m
    $daemon_user = 'vscan'; # (no default; customary: vscan or amavis), -u
    $daemon_group = 'vscan'; # (no default; customary: vscan or amavis), -g
    $mydomain = 'some.dom'; # a convenient default for other settings
    $MYHOME = '/var/amavis'; # a convenient default for other settings, -H
    $TEMPBASE = "$MYHOME/tmp"; # working directory, needs to exist, -T
    $ENV{TMPDIR} = $TEMPBASE; # environment variable TMPDIR, used by SA, etc.
    $QUARANTINEDIR = '/var/virusmails'; # -Q
    $db_home = "$MYHOME/db"; # dir for bdb nanny/cache/snmp databases, -D
    $helpers_home = "$MYHOME/var"; # working directory for SpamAssassin, -S
    $lock_file = "$MYHOME/var/amavisd.lock"; # -L
    $pid_file = "$MYHOME/var/amavisd.pid"; # -P
    #NOTE: create directories $MYHOME/tmp, $MYHOME/var, $MYHOME/db manually
    $log_level = 1; # verbosity 0..5, -d
    $log_recip_templ = undef; # disable by-recipient level-0 log entries
    $do_syslog = 1; # log via syslogd (preferred)
    $syslog_facility = 'mail'; # Syslog facility as a string
    # e.g.: mail, daemon, user, local0, ... local7
    $enable_db = 1; # enable use of BerkeleyDB/libdb (SNMP and nanny)
    # $enable_zmq = 1; # enable use of ZeroMQ (SNMP and nanny)
    $nanny_details_level = 2; # nanny verbosity: 1: traditional, 2: detailed
    $enable_dkim_verification = 0; # enable DKIM signatures verification
    $enable_dkim_signing = 0; # load DKIM signing code, keys defined by dkim_key
    @local_domains_maps = ( [".$mydomain"] ); # list of all local domains
    @mynetworks = qw( 127.0.0.0/8 [::1] [FE80::]/10 [FEC0::]/10
    10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 );

    В самом низу я закомментировал все антивирусы, кроме ClamAV.
    Далее нужно поправить Postfix:
    • /usr/local/etc/postfix/main.cf
      content_filter = smtp-amavis:
    • [127.0.0.1]:10024
    • /usr/local/etc/postfix/master.cf
      smtp-amavis unix - - n - 2 smtp
      -o smtp_data_done_timeout=1200
      -o smtp_send_xforward_command=yes
      -o disable_dns_lookups=yes
      -o max_use=20

      127.0.0.1:10025 inet n - n - - smtpd
      -o content_filter=
      -o local_recipient_maps=
      -o relay_recipient_maps=
      -o smtpd_restriction_classes=
      -o smtpd_delay_reject=no
      -o smtpd_client_restrictions=permit_mynetworks,reject
      -o smtpd_helo_restrictions=
      -o smtpd_sender_restrictions=
      -o smtpd_recipient_restrictions=permit_mynetworks,reject
      -o mynetworks_style=host
      -o mynetworks=127.0.0.0/8
      -o strict_rfc821_envelopes=yes
      -o smtpd_error_sleep_time=0
      -o smtpd_soft_error_limit=1001
      -o smtpd_hard_error_limit=1000
      -o smtpd_client_connection_count_limit=0
      -o smtpd_client_connection_rate_limit=0
      -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

      И, по идее, всё...
      # sysrc amavisd_enable=YES
      # sysrc amavisd_pidfile=/var/amavis/var/amavisd.pid
      # sysrc spamd_enable=YES
      # service amavisd restart
  • просмотров: ~1721
  • рейтинг: ?

Комментарии (1)

Вы - anonymous, войти ?

можно использовать bbcode-теги
[b]жирный текст[/b]
[i]курсив[/i]
[u]underline[/u]
[s]зачеркнутый текст[/s]
[size=20px]размер шрифта[/size]
всякие изменения текста
[left][/left]
[right][/right]
[center][/center]
позиционирование элементов: картинки, текст и т.д
[url][/url]
[email][/email]
внутри тега [url] помещайте ссылки, а внутри [email] адрес электронной почты;
так же [url] можно использовать в виде:
[url=http://example.com]пример[/url],
[url=http://test.ru][img]http://flickr.com/givemeimg.png[/img][/url]
[code][/code]
[quote][/quote]
внутри тега [code] можно помещать программный код (подстветка попытается включиться автоматически); для выделения цитат используйте [quote]
также можно напрямую указать язык [code=cpp]int i;[/code]
[list][/list]
создаем списки, каждый элемент пишется после [*].

Можно указывать маркер - [list=marker].
возможные маркеры 1(decimal), i(lower-roman), I(upper-roman), a(lower-alpha), A(upper-alpha). Примеры:

[list][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=1][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=A][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[table][/table]
оформляем таблицу, используя внутренние теги [tr] и [td].
[tr] - строка, [td] - поле в строке,
[table=100%] - можно задавать ширину в процентах, по-умолчанию ширина 100%
[td=2] - можно задавать сколько столбцов входит в это поле. Пример:

[table=50%][tr][td]столбец 1[/td][td]столбец 2[/td][/tr][tr][td]значение 1[/td][td]значение 2[/td][/tr][tr][td=2]сразу 2 столбца[/td][/tr][/table]
[img][/img]
тег для вставки фото или картинок, мы любим картинки. Примеры использования:

[img]http://ya.ru/logo.png[/img],
[img=100x100px]http://ya.ru/logo.png[/img]
[img=fullimg.url]thumbimg.url[/img],
Пожалуйста загружайте картинки на наш сайт, либо вставляйте с бекбоновских ресурсов.
[video][/video]
Проигрывает видео, внутрь вставляем ссылки на видео, поддерживается Play.Ykt.Ru(нужно вставить ссылку на страницу с видео) и tv.ykt.ru(нужно вставить ссылку на адрес файла)