Оригинал взят у
mshurutov в
Свой клуП. PAM-auth,DNS (Bind), Email (Postfix+Dovecot)Настройка аутентификации, DNS (хыхы :)),
SMTP (Postfix) + IMAP+POP (dovecot) based on PostgreSQL
На момент написания предыдущей части блокирование аккаунта после некоторого количества неудачных попыток не было настроено. Поэтому настройка этого разврата здесь.
Аутентификация
Блокировка после неудачных попыток
Приводим файл /etc/pam.d/system-login к виду:
auth required pam_tally2.so deny=5 even_deny_root unlock_time=1800 onerr=succeed
где
deny=5 - 5 попыток, после этого аккаунт блокируется;
even_deny_root - запрет логина для root-а. Ибо нефиг!
unlock_time=1800 - по идее аккаунт должен автоматически разблокироваться через указанный интервал. Но что-то у меня не получилось. Не вышел каменный цветок, или я где-то чего-то перенедоборщил.
Безопасные пароли
Пароли д/б проблематичными для взлома. Правим соответствующую строку /etc/pam.d/system-auth следующим образом:
password required pam_cracklib.so difok=2 minlen=12 dcredit=-1 ocredit=-1 ucredit=-1 lcredit=0 retry=3
Минимальная длина - 12 символов. Безо всяких упрощений!
Установка соответствующих пакетов описана в
Свой клуП. Базовая система;. Здесь будут ньюансы и прочие хитрости, буде таковые найдутся.
BIND
Настройка зависит от ваших потребностей. Я у себя поднял мастер-зону, где определил почтарь, веб, форумы и слейвы для сервера DNS, которые (слейвы) крутятся у регистратора.
PostgreSQL
Базовые настройки
/etc/postgresql/9.3/postgresql.conf
listen_addresses = 'localhost,127.0.0.1,'
port =
...
...
wal_level = hot_standby
full_page_writes = on
archive_mode = on
archive_command = 'gzip -9 %p > /opt/backup/pg/xlog/%f.gz'
/etc/postgresql/9.3/pg_hba.conf
local all postgres peer
host all all 127.0.0.1/32 md5
host all all /32 md5
host all all ::1/128 md5
И запускаем.
/etc/init.d/postgresql-9.3 start
Объекты почтовой БД
сама база
postgres=# CREATE ROLE mailowner LOGIN PASSWORD '';
postgres=# CREATE DATABASE maildb OWNER mailowner;
postgres=# CREATE ROLE reader LOGIN PASSWORD ''
postgres=# GRANT SELECT ON TABLE domains TO reader;
postgres=# GRANT SELECT ON TABLE users TO reader;
postgres=# GRANT SELECT ON TABLE postfix_mailboxes TO reader;
postgres=# GRANT SELECT ON TABLE virtual TO reader;
postgres=# GRANT SELECT ON TABLE postfix_virtual TO reader;
postgres=# GRANT SELECT ON TABLE transport TO reader;
postgres=# GRANT SELECT ON TABLE transport_view TO reader;
таблицы
главная таблица базы: users
CREATE SEQUENCE users_uid_seq;
select setval('users_uid_seq',10000);
CREATE TABLE users (
username character varying(128) NOT NULL,
password character(120) NOT NULL,
home character varying(255) NOT NULL,
uid bigint DEFAULT nextval('users_uid_seq'::regclass) NOT NULL,
gid integer NOT NULL,
active character(3) DEFAULT 'OK!'::bpchar NOT NULL,
realname character varying(128),
mail character varying(255),
CONSTRAINT check_home_path CHECK (((home)::text ~~ '/home/vmail/%'::text)),
CONSTRAINT check_pass_crypt CHECK ((password ~~ '{SHA512-CRYPT}%'::text))
);
10000 - начнем ID виртуальных пользователей с данного значения. Ну вот захотелось мне так!
И я писал в предыдущем выпуске, что будет разное, связанное с постгресом! :) Какие у меня суровые ограничения, однако. :)
Обслуживаемые домены: domains
CREATE TABLE domains (
domainname character varying(128) UNIQUE,
gid SERIAL PRIMARY KEY
);
В доках немного другая структура, но я-то - все-таки какой-никакой, но админ баз данных!
Транспорты: transport
CREATE TABLE transport (
transport character varying(128) NOT NULL,
gid bigint
);
На самом деле, алиасы: virtual
CREATE TABLE virtual (
address character varying(255) NOT NULL,
username character varying(255) NOT NULL
);
вьювы
postfix_mailboxes
CREATE VIEW postfix_mailboxes AS
SELECT users.username AS userid,
((users.home)::text || '/Maildir/'::text) AS mailbox
FROM users
UNION ALL
SELECT domains.domainname AS userid,
'dummy'::text AS mailbox
FROM domains;
postfix_virtual
CREATE VIEW postfix_virtual AS
SELECT users.username AS userid,
users.username AS address
FROM users
UNION ALL
SELECT virtual.username AS userid,
virtual.address
FROM virtual;
transport_view
CREATE VIEW transport_view AS
SELECT d.domainname,
t.transport
FROM (domains d
JOIN transport t USING (gid));
Поехали с почтой разбираться.
Postfix
Общие требования
Вспоминаем, на какой системе ставим, и отказываемся от мысли сваять свои конфиги. Ваяем путём минимально необходимого редактирования существующих.
У нас свой MX, поэтому myhostname, mydomain, myorigin, mydestination, mynetworks_style д/б определены корректно. Иначе удачи не видать! (Надеюсь, вы догадались запросить у хостера определение хоста по адресу для myhostname?)
Включение аутентификации
Включаем аутентификацию, указываем механизм оной, определяем, где будет открыт сокет и обозначаем локальный домен, соответственно.
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain = $mydomain
Ограничения ставьте в соответствии с мерой своей испорченности. :)
SSL/TLS
Ибо аутентификация по открытому каналу - ну я вас умоляю!
Где я утянул данную конфигурацию - не помню. Но вот что нужно, по моему скромному мнению, это выделено жЫрным шрифтом.
smtpd_use_tls = yes
smtpd_tls_always_issue_session_ids = yes
smtpd_tls_ask_ccert = no
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/ssl/mail.crazynotes.ru-key.pem
smtpd_tls_cert_file = /etc/postfix/ssl/mail.crazynotes.ru-cert.pem
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_ciphers = export
smtpd_tls_fingerprint_digest = sha1
smtpd_tls_loglevel = 3
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_mandatory_protocols = TLSv1, SSLv3
smtpd_tls_protocols = TLSv1, SSLv3
smtpd_tls_received_header = yes
smtpd_tls_req_ccert = no
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 600s
Создание ключей/сертификатов оставляю в качестве домашнего задания. Хех.
Указываем postfix-у слушать 465 и 587 порты соответственно в /etc/postfix/master.cf:
...
smtps inet n - n - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
...
submission inet n - n - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
...
Остальное - смотрите доки, думайте, выставляйте те параметры, которые посчитаете нужным.
Виртуальные пользователи
Настройки main.cf, master.cf
Самое интересное - виртуальные пользователи. А т.к. sasl_type = dovecot, то и все получатели/отправители будут также определяться dovecot-ом. Будьте внимательны!
dovecot_destination_recipient_limit = 1
transport_maps = pgsql:/etc/postfix/pgsql/transport.cf
virtual_uid_maps = pgsql:/etc/postfix/pgsql/uids.cf
virtual_gid_maps = pgsql:/etc/postfix/pgsql/gids.cf
virtual_mailbox_base = /
virtual_mailbox_maps = proxy:pgsql:/etc/postfix/pgsql/mailboxes.cf
virtual_alias_maps = pgsql:/etc/postfix/pgsql/virtual.cf
virtual_transport = dovecot
mailbox_transport = dovecot
В /etc/postfix/master.cf:
Включаем dovecot, как LDA
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/dovecot-lda -f ${sender} -d ${recipient}
Здесь dovecot_destination_recipient_limit = 1, virtual_transport = dovecot и строка из /etc/postfix/master.cf отвечают за виртуальных пользователей в dovecot.
/etc/postfix/pgsql/*.cf
.
/etc/postfix/pgsql/gids.cf
user=reader
password=
dbname=maildb
table=users
select_field=gid
where_field=username
hosts=127.0.0.1
/etc/postfix/pgsql/uids.cf
user=reader
password=
dbname=maildb
table=users
select_field=uid
where_field=username
hosts=127.0.0.1
/etc/postfix/pgsql/transport.cf
user=reader
password=
dbname=maildb
table=transport_view
select_field=transport
where_field=domainname
hosts=127.0.0.1
/etc/postfix/pgsql/mailboxes.cf
user=reader
password=
dbname=maildb
table=postfix_mailboxes
select_field=mailbox
where_field=userid
hosts=127.0.0.1
/etc/postfix/pgsql/virtual.cf
user=reader
password=
dbname=maildb
table=postfix_mailboxes
select_field=mailbox
where_field=userid
hosts=127.0.0.1
Dovecot
Журналирование
www dovecot # grep -v "^$\|^#" conf.d/10-logging.conf
log_path = /var/log/dovecot.log
auth_verbose = yes
...
}
Хотя сейчас уже можно отключать расширенный режим журналирования аутентификации.
Если же вам необходимо включить в журнал отображение паролей (мне пришлось), то необходимо раскомментировать строку.
#auth_verbose_passwords = no
соответственно указав yes вместо no.
Пути к ящикам
www dovecot # grep -v "^$\|^ *#" conf.d/10-mail.conf
mail_location = maildir:/home/vmail/%d/%n/Maildir
...
И откедова каталог-то /home/vmail/ появится? А вот откуда:
www ~ # useradd -m -u 5001 vmail
Протоколы
IMAP? POP3? Ага, щщщаззз! IMAPS&POP3S only!
/etc/dovecot/conf.d/10-master.conf
...
service imap-login {
inet_listener imap {
#port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
...
}
service pop3-login {
inet_listener pop3 {
#port = 110
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
...
Postfix
/etc/dovecot/conf.d/10-master.conf
...
service auth {
...
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
...
}
А строка, которую нужно впендюрить в /etc/postfix/master.cf, описана выше, в разделе описания виртуальных пользователей Postfix-а.
Аутентификация
/etc/dovecot/conf.d/10-auth.conf
...
disable_plaintext_auth = yes
auth_mechanisms = plain login digest-md5 cram-md5
...
1-й параметр - это отключение открытых паролей, за исключением защищенного соединения (SSL/TLS).
2-й - механизмы аутентификации, т.е. в каком виде пароли бегают по Сети.
А вот в каком виде они лежат в БД, определяется в соответствующем /etc/dovecot/dovecot-{sql,ldap}.conf.ext. В нашем случае в /etc/dovecot/dovecot-sql.conf.ext:
...
default_pass_scheme = SHA512-CRYPT
...
Я вот думаю, а не влупить ли еще и соль для этих паролей?
БД пользователей и паролей
Определение доступных баз
Откедова брать пользователей (system, LDAP, SQL etc) определяется в /etc/dovecot/conf.d/10-auth.conf директивой !include:
www dovecot # grep \!include conf.d/10-auth.conf
#!include auth-deny.conf.ext
#!include auth-master.conf.ext
#!include auth-system.conf.ext
!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext
Я определил давкоту пользователей только в SQL-хранилище.
Настройка получения паролей из Postgres-а
www dovecot # grep -v "^$\|^#" dovecot-sql.conf.ext
driver = pgsql
connect = host=127.0.0.1 port=54321 dbname=maildb user=reader password==
default_pass_scheme = SHA512-CRYPT
password_query = SELECT username as user, password FROM users WHERE username = '%u'
user_query = SELECT home, uid,gid FROM users WHERE username='%u'
Проверка работы всего этого безобразия
Создание тестового пользователя
.
Для совсем начала надо определить хотя бы один обслуживаемый домен.
www ~ # su - postgres
postgres@www ~ $ psql maildb
psql (9.3.5)
Введите "help", чтобы получить справку.
maildb=# insert into domains (domainname) values ('mydomain.com');"
Ну и посмотреть, какой gid этот домен получил:
psql (9.3.5)
Введите "help", чтобы получить справку.
maildb=# select gid from domains where domainname='mydomain.com';"
gid
-------
10001
(1 строка)
maildb=#
Для начала нам надо родить пароль в формате SHA512-CRYPT.
www ~ # doveadm pw -s SHA512-CRYPT -u user@mydomain.com -p 123456
{SHA512-CRYPT}$6$kqHlyV5yYtcMA63S$yNTYti7Uy5OYbBtU0E/0NFKGjSec8C8Ffwh.sjP6I87v2g6CK0MGnXs3q7eXJU8XGIDY7g0o9cz4HmjhLPEc61
www ~ # su - postgres
postgres@www ~ $ psql maildb
psql (9.3.5)
Введите "help", чтобы получить справку.
maildb=# insert into users (username,password,home,gid,realname) values ('user@mydomain.com','{SHA512-CRYPT}$6$kqHlyV5yYtcMA63S$yNTYti7Uy5OYbBtU0E/0NFKGjSec8C8Ffwh.sjP6I87v2g6CK0MGnXs3q7eXJU8XGIDY7g0o9cz4HmjhLPEc61',,'/home/vmail/mydomain.com/user',10001,'Fake User');
Для дополнительной информации man doveadm-pw
Выходим из отовсюду и...
Проверка корректной работы
www ~ # doveadm auth test -x service=imaps -x rip=1.2.3.4 user@mydomain.com
Для дополнительной информации man doveadm-auth.
Должно вылезти что-нибудь подобное:
passdb: user@mydomain.com auth succeeded
extra fields:
user=user@domain.com
В чем я сильно сомневаюсь - курите логи, маны, думайте башкой и развлекайтесь! А у меня DNS&Mail работают. :)
Содержание.
Свой клуП. Установка системы;Свой клуП. PAM-auth,DNS (Bind), Email (Postfix+Dovecot);
Свой клуП. Email (Web-interface+fetching from others mailboxes);
Свой клуП. WWW (nginx+php-fpm+python);
Свой клуП. Список использованных источников.