Нужно, чтобы сервер был защищён и опрятен. Рассмотрю настройку таки вещей, как:
- Плагин quota
- "Master" учётные записи
- ClamAV
- Amavis
P.S. В процессе написания список будет пополняться.
Итак, у нас уже есть почтовый сервер. Настроенный. Заранее я добавил поле quota в базу данных. Пора воспользоваться благами...
- Плагин 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%. Удалите ненужную корреспонденцию во избежание переполнения!
EOFchmod +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
- 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'
DELIMITERservice dovecot restart
- user@domain - это пользователь, под которым хотим войти,
- <masteruser@domain> - мастер-пользователь.
- Clamav
Это один из известнейших антивирусов для Linux/Posix. Нужен будет для проверки корреспонденции на спам.# cd /usr/ports/security/clamav
# make config-recursive
# make install clean
# rehash# 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 - Amavis - набор средств, чтобы связать воедино calmd, spamassassin и т.п.
- /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
Смысл: те, у кого явно не указана квота (я имею в виду LDAP), у меня имеют почтовый ящик, объёмом 1 гигабайт (объёмы позволяют). Папки Spam и Trash гарантированно имеют по 10%.
При заполнении ящика на 60%, 70%, 80%, 90% и 95% пользователю будет приходить информационное письмо. В контроллере домена храню квоту в поле Description (напр. 2G).
Заполняем данные в таблице. Всё. Чтобы зайти в чужую учётную запись, нужно ввести следующие данные:
user: <user@domain1>*<masteruser@domain2>, где
ВНИМАНИЕ!
Домены нужно указывать именно те, которые прописаны.
Пароль нужно указать от учётной записи мастер-записи.
# make config-recursive
Ставил с такими настройками


остальное - по умолчанию
# 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: