dovecot auth (глючит?)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.

Модераторы: SLEDopit, Модераторы разделов

pelmen
Сообщения: 1268
ОС: debian

dovecot auth

Сообщение pelmen »

Настраиваю postfix+dovecot+mysql без всяких ssl и пр.
Дошел до момента, когда в mysql уже лежат пользователи с вирт. доменами, письма приходят и ложатся туда, куда нужно (т.е. создаются директории /var/mail/domain/user на основании домена и пользователя из mysql), отправляются куда угодно (я из локальной сети разрешил без аутентификации), а вот при проверке их через pop3 выдается ошибка "неверный пароль"
mail.log:
Jan 5 21:54:40 gateway dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=<test@domain.ru>, method=PLAIN, rip=client_ip, lip=server_ip

mysql.log:
100105 22:07:48 200 Query SELECT password FROM mail_users WHERE user = 'test' AND domain = 'domain.ru' AND active = '1'

dovecot.conf:

Код: Выделить всё

ssl_disable = yes
protocols = pop3
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_privileged_group = mail
disable_plaintext_auth = no
mail_location = maildir:/var/mail/virtual/%d/%n

protocol pop3 {
        pop3_enable_last = yes
        pop3_uidl_format = %08Xu%08Xv
        pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}

protocol lda {
        postmaster_address = admin@mail.ru
        log_path = /etc/dovecot/deliver.log
        auth_socket_path = /var/run/dovecot/auth-master
}


auth default {
  mechanisms = plain login

  passdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }

  userdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }
  passdb pam {
  }

  userdb passwd {
  }


  user = root

  socket listen {
    master {
        path = /var/run/dovecot/auth-master
        mode = 0600
        user = pochta
    }
    client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
      group = postfix
    }
  }

}

auth_username_format = %Ln@%Ld


dovecot-sql.conf:
driver = mysql
connect = host=localhost dbname=mail user=user password=password
default_pass_scheme = MD5
password_query = SELECT password FROM mail_users WHERE user = '%n' AND domain = '%d' AND active = '1'
user_query = SELECT '1005' as uid, '1006' as gid FROM mail_users WHERE user = '%n' AND active = '1' AND domain = '%d'


Если делать вручную

Код: Выделить всё

SELECT password FROM mail_users WHERE user = 'test' AND domain = 'domain.ru' AND active = '1'
то выводится зашифрованный пароль (т.е. все ок)
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: dovecot auth

Сообщение KiWi »

Код: Выделить всё

default_pass_scheme = MD5

Предполагает, что пароли хранятся в виде: $1$ozdpg0V0$0fb643pVsPtHVPX8mCZYW/, который не является чистым MD5(поэтому и был переименован в MD5-CRYPT).
Если у вас хранятся непосредственно MD5-хеши, то должна быть указана схема PLAIN-MD5.
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: dovecot auth

Сообщение pelmen »

Ой, спасибо большое. Все заработало! Теперь буду разбираться со всякими ssl,tls и пр.
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: dovecot auth

Сообщение pelmen »

На другом сервере настраиваю такую же связку postfix+dovecot+mysql
Все ящики - виртуальные в mysql, системные не используются. Приходящая почта складывается postx-ом в папку /var/mail/virtual/domain.ru/user/
А вот когда пытаюсь её прочитать, то возникает проблема (неправильный пароль). Лазил по логам и выяснил, в чем она заключается, но вот не пойму, как её решить.
/var/log/mysql/mysql.log:
141 Connect mailuser@localhost on mail
141 Query SELECT user, password FROM mail_users WHERE user = 'pelmen' AND domain = 'testdomain.ru' AND active = '1'
141 Query SELECT '/var/mail/virtual//pelmen' as home, '1001' as uid, '1001' as gid FROM mail_users WHERE user = 'pelmen' AND domain = '' AND active = '1'
То есть при попытке авторизоваться dovecot лезет в mysql за паролем и все там нормально находит, а при втором запросе почему-то не передает значение домена.
dovecot-sql.conf:
password_query = SELECT user, password FROM mail_users WHERE user = '%n' AND domain = '%d' AND active = '1'
user_query = SELECT '/var/mail/virtual/%d/%n' as home, '1001' as uid, '1001' as gid FROM mail_users WHERE user = '%n' AND domain = '%d' AND active = '1'

dovecot.conf:

Код: Выделить всё

disable_plaintext_auth = no
protocols = imap pop3
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_privileged_group = mail
protocol imap {
}
protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
}
auth_username_format = %Ln@%Ld
auth default {
  mechanisms = plain login
  passdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }
  userdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }
  user = root
  socket listen {
    client {
path = /var/spool/postfix/private/auth
user = postfix
    }
  }
}
dict {
}
plugin {
}
postfix, dovecot, mysql перезагружал. Не пойму в чем проблема.
Меняю в файле dovecot-sql.conf
user_query = SELECT '/var/mail/virtual/testdomain.ru/%n' as home, '1001' as uid, '1001' as gid FROM mail_users WHERE user = '%n' AND domain = 'testdomain.ru' AND active = '1'
И все сразу работает. Но это ведь не нормально. Мне же и другие домены надо обслуживать.

И еще: перед тем, как делать пользователей в mysql, они хранились в файле.
main.cf:
hash:/etc/postfix/virtual_mailbox_maps
dovecot.conf:
passdb passwd-file {
args = /etc/dovecot/passwd
}
userdb passwd-file {
args = /etc/dovecot/users
}

Все работало нормально, хотя я в файл master.cf не вписал строчку про dovecot. Т.е. я его (файл) вообще не менял. Просто забыл про него. А почта все равно работала. И приходили письма, и я их читал, и отправлял, и они уходили. Зачем тогда туда писать dovecot? (В файле main.cf не указывал virtual_transport = dovecot, а зачем это надо?)
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: dovecot auth

Сообщение pelmen »

УДИВИТЕЛЬНО! Я нашел ошибку. 100% это она. Убираю 1 слово - работает, ставлю обратно - не работает так, как я описал выше.
В файле dovecot-sql.conf:
password_query = SELECT user, password FROM mail_users WHERE user = '%n' AND domain = '%d' AND active = '1'
Если убрать user и оставить
password_query = SELECT password FROM mail_users WHERE user = '%n' AND domain = '%d' AND active = '1'
то работает. О как!

Теперь интересно про master.cf, зачем туда что-то добавлять про довекот, если и так работает?


Код: Выделить всё

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

myhostname = computername
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = computername, localhost.localdomain, , localhost
relayhost =
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

smtpd_sasl_auth_enable = yes

        #smtpd_sasl_authenticated_header = yes
        #broken_sasl_auth_clients = yes

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

virtual_mailbox_domains = domain111.ru, domain222.ru
virtual_alias_maps = mysql:/etc/postfix/virtual_alias_maps.cf
virtual_mailbox_base = /var/mail/virtual/
virtual_mailbox_maps = mysql:/etc/postfix/virtual_mailbox_maps.cf
virtual_uid_maps = static:1001
virtual_gid_maps = static:1001

iУведомление от модератора Ленивая Бестолочь
используйте же теги code для оформления листингов. (а не quote)
Спасибо сказали: