Eu criei um proxy Dovecot que envia usuários para back-ends específicos com base em seu domínio. O domínio A vai para o servidor A e o domínio B vai para o servidor B, etc. A lista de domínios não é estática, mas não muda muito. Isso funciona totalmente bem com um sql de driver passdb e uma instrução SQL simples como:
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';
A configuração do dovecot contém:
passdb {
args = /etc/dovecot/sql.conf
driver = sql
}
userdb {
args = static uid=5000 gid=5000 home=/dev/null
driver = static
}
Meu "problema" não é realmente um problema - mas... Eu preciso instalar e executar um servidor Mysql/MariaDB apenas para este trabalho e acho que deve haver uma maneira mais fácil de resolver o host para um domínio específico. Uma instalação postfix paralela usa um mapa de transporte simples para fazer o mesmo trabalho. Eu não preciso de um servidor SQL para essa pesquisa simples.
Eu pensei sobre o passdb do Dovecot Lua ou o passdb estático , mas não consigo encontrar nenhum exemplo útil para combinar um domínio com um host com Lua ou como retornar todos os parâmetros necessários?
Então eu instalei o pacote debian dovecot-auth-lua
.
Eu tentei com:
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
}
O bloqueio aqui é necessário? É operação somente leitura, ou?
O roteiro 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
e, claro, o arquivo de backends com <domain> <host>
por linha.
Mas eu tenho um erro no proxy
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?)
O que isto significa? Não tenho certeza - mas é, porque eu retorno "NULL" em alguns deles. Quando eu removo os dois atributos password
e destuser
tem o mesmo efeito.
pam_authenticate significa que está tentando uma pesquisa de usuário do sistema, desative as pesquisas de pam comentando a inclusão de auth-system.conf.ext em 10-auth.conf.
ps: você conseguiu fazer o LUA funcionar? Estou tentando algo semelhante.
edit - fiz o meu funcionar adicionando esses campos nos campos de retorno da função de pesquisa passdb (NÃO campos de função de pesquisa userdb):
return dovecot.auth.PASSDB_RESULT_OK, "password=pass proxy=y host=imap.domain.com [email protected] pass=anotherpass"