Dovecot

帶有 Lua 的 Dovecot 代理還是?

  • April 23, 2021

我已經建構了一個 Dovecot 代理,可以根據使用者的域將使用者發送到特定的後端。域 A 到伺服器 A,域 B 到伺服器 B,等等。域列表不是靜態的,但變化不大。使用 passdb 驅動程序 sql 和一個簡單的 SQL 語句,這完全可以正常工作,例如:

password_query = SELECT 
   NULL as password, 
   'y' as nopassword, 
   'y' as proxy, 
   NULL as destuser, 
   'y' as proxy_nopipelining, 
   host, 
   'y' as nodelay, 
   'y' as nologin, 
   'any-cert' as 'starttls' 
 FROM proxy_domain WHERE domain = '%d';

dovecot 配置包含:

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

userdb {
 args = static uid=5000 gid=5000 home=/dev/null
 driver = static
}

我的“問題”並不是真正的問題 - 但是……我只需要為這項工作安裝和執行 Mysql/MariaDB 伺服器,我認為,必須有一種更簡單的方法來解析特定域的主機。並行 postfix 安裝使用簡單的傳輸映射來完成相同的工作。我不需要 SQL 伺服器來進行簡單的查找。

我考慮過Dovecot Lua passdbstatic passdb但我找不到任何有用的範例來將域與帶有 Lua 的主機進行匹配,或者我如何返回所有必要的參數?

所以我已經安裝了 debian 包dovecot-auth-lua

我試過:

passdb {
 driver = lua
 args = file=/etc/dovecot/passdb.lua blocking=yes
 default_fields = password=NULL nopassword=y proxy=y destuser=NULL proxy_nopipelining=y nodelay=y nologin=y starttls=any-cert
}

有必要在這裡屏蔽嗎?這是只讀操作,還是?

Lua 腳本:

local database = "/etc/dovecot/backends"

function auth_passdb_lookup(req)
for line in io.lines(database) do
  for domain, host in string.gmatch(line, "(.+)%s(.+)") do
    if (domain == req.domain) then
      return dovecot.auth.PASSDB_RESULT_OK, "host=" .. host
    end
  end
end
return dovecot.auth.PASSDB_RESULT_USER_UNKNOWN, ""
end

<domain> <host>當然還有每行的後端文件。

但我在代理上遇到錯誤

pam_unix(dovecot:auth): check pass; user unknown
pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=user@domain rhost=<my-ip>
pam(user@domain,ip,<id>): pam_authenticate() failed: Authentication failure (Password mismatch?)

這是什麼意思?我不確定 - 但它是嗎,因為我在其中一些上返回“NULL”。當我刪除這兩個屬性時passworddestuser它具有相同的效果。

pam_authenticate 表示它正在嘗試系統使用者查找,通過註釋掉 10-auth.conf 中 auth-system.conf.ext 的包含來禁用 pam 查找。

ps:你讓LUA工作了嗎?我正在嘗試類似的東西。

編輯 - 通過將這些欄位添加到 passdb 查找函式返回欄位(不是 userdb 查找函式欄位)中,讓我的工作:

return dovecot.auth.PASSDB_RESULT_OK, “password=pass proxy=y host=imap.domain.com destuser=remote@user.com pass=anotherpass”

引用自:https://serverfault.com/questions/1051911