1

我在 Vultr 上设置了一个 OpenBSD 7.0 实例,以便让一个运行 Dovecot 和 OpenSMTPD 的邮件服务器。我(大部分)遵循此处此处的说明以及此处的说明。

我将其设置为与虚拟邮件一起使用,使用单个虚拟用户在“/etc/mail/virtual”和“/etc/mail/credentials”中创建文件:“user@domain.ca::vmail:2000:2000: /var/vmail/domain.ca/user::userdb_mail=maildir:/var/vmail/domain.ca/user'

我使用“smtpctl encrypt”创建了加密密码,并将其粘贴到凭据文件中应有的位置。

但是,运行“doveadm auth login user@domain.ca”失败。

在 /var/log/maillog 我得到:

 Jan 25 14:06:58 vultrBSD dovecot: auth-worker(165): conn unix:auth-worker (pid=44111,uid=518): auth-worker<1>: bsdauth(user@domain.ca): unknown user
Jan 25 14:06:58 vultrBSD dovecot: auth: passwd-file(user@domain.ca): Password mismatch

我知道密码是正确的,我尝试更改它并粘贴我使用“smtpctl encrypt”创建的新密码,但仍然是同样的错误。'/etc/mail/credentials' 文件设置为 0440 并归 _smtpd:_dovecot 所有。即使暂时将其设置为 0777 也不起作用。

我可以从另一个帐户向服务器发送邮件,我看到它显示在“/var/vmail/domain.ca/user/new”中,但我无法将我的 Thunderbird 客户端连接到服务器。尝试在 Thunderbird 中设置新邮件帐户似乎不起作用,Thunderbird 拒绝密码(尽管它确实检测到正确的协议和端口,IMAP/SMTP)。

这是 /etc/dovecot 中的 local.conf 文件:

auth_debug_passwords = yes
auth_mechanisms = plain
first_valid_uid = 2000
first_valid_gid = 2000
mail_location = maildir:/var/vmail/%d/%n
mail_plugin_dir = /usr/local/lib/dovecot
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex  imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext imapsieve vnd.dovecot.imapsieve
mbox_write_locks = fcntl
mmap_disable = yes

namespace inbox {
  inbox = yes
  location =
  mailbox Archive {
  auto = subscribe
  special_use = \Archive
  }
  mailbox Drafts {
  auto = subscribe
  special_use = \Drafts
  }
  mailbox Junk {
  auto = subscribe
  special_use = \Junk
  }
  mailbox Sent {
  auto = subscribe
  special_use = \Sent
  }
  mailbox Trash {
  auto = subscribe
  special_use = \Trash
  }
  prefix =
}

plugin {
  imapsieve_mailbox1_before = file:/usr/local/lib/dovecot/sieve/report-spam.sieve
  imapsieve_mailbox1_causes = COPY
  imapsieve_mailbox1_name = Junk
  imapsieve_mailbox2_before = file:/usr/local/lib/dovecot/sieve/report-ham.sieve
  imapsieve_mailbox2_causes = COPY
  imapsieve_mailbox2_from = Junk
  imapsieve_mailbox2_name = *
  sieve = file:~/sieve;active=~/.dovecot.sieve
  sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
  sieve_pipe_bin_dir = /usr/local/lib/dovecot/sieve
  sieve_plugins = sieve_imapsieve sieve_extprograms
}

protocols = imap sieve
service imap-login {
    inet_listener imaps {
    port = 993
  }
}

service managesieve-login {
  inet_listener sieve {
    port = 4190
  }
  inet_listener sieve_deprecated {
    port = 2000
  }
}

ssl_cert = </etc/ssl/domain.ca.fullchain.pem
ssl_key = </etc/ssl/private/domain.ca.key

userdb {
  args = username_format=%u /etc/mail/credentials
  driver = passwd-file
  name =
}
passdb {
  args = scheme=CRYPT username_format=%u /etc/mail/credentials
  driver = passwd-file
  name =
}

protocol imap {
  mail_plugins = " imap_sieve"
}

有没有其他人经历过这个并且知道修复?

谢谢。

4

1 回答 1

0

散列字符串,包括密码,通常使用除基本散列算法之外的几个层。使用相同散列算法的两个不同实现(dovecot vs smtpd)将在给定相同输入(密码)的情况下输出两个不同的散列。

这是由于所谓的盐和胡椒。Salt是一个随机生成的字符串,通常基于一些用户数据作为种子。然后在散列密码之前,以实现(dovecot 或 smtpd)规定的方式将此盐插入密码中。

类似地,pepper 是一个由实现指定的字符串,并在散列之前插入到密码中。这种加盐和加胡椒的组合为每个实现创建了一个唯一的哈希,这使得存储密码更安全。这使得破解者无法轻易地比较来自多个站点或程序的哈希来破解用户密码并同时侵入该密码的所有实例。

这就是为什么您不能重用一个程序存储的密码哈希来解锁另一个程序使用的相同密码。即使两个程序都使用相同的哈希算法。

解决方法应该是为每个程序单独设置凭据,而不是重复使用彼此的哈希值。

于 2022-02-15T19:00:42.590 回答