[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Exim Authentificación



Hola Jaume

On Wednesday 16 October 2002 09:23, jaume wrote:
> Alguien me puede decir algun documento sobre la autentificacion smtp en
> exim?
> Estoy un poco liado de conceptos y necesitaria aclaración por favor.
> Lo único que quiero es que al enviar una red con outlooks express a través
> de exim en una Woody tengan que marcar por fuerza "mi servidor requiere
> autentificacion", y que sea un usuario válido del sistema.(shadow passwd).
> Tengo el exim instalado a partir del apt-get  y configurado con las
> opciones del eximconf, pero no se si tengo que bajarme los codigos fuentes
> y compilarlo con otro soporte, ...o ke.
> Ayudadme por favor.
>
> Gracias.

La documentación oficial la puedes encontrar en:

http://www.exim.org/exim-html-3.30/doc/html/spec_toc.html#TOC763

( creo que incluso el spec viene en la distribución de exim )
Tienes todo un capítulo dedicado a eso, por si acaso y de paso te pego un 
documentillo de cocina interna para incomporar smpt autentiticado a un exim 
con LDAP en multidominio sólo para algunos dominios

---------------------------------------------------------------------------------------------------
-----------------------------------------

Paso 1: Compilación de exim con soporte para smtp autenticado: Local/Makefile
AUTH_PLAINTEXT=yes

Paso 2: Habilitar el uso de smtp autenticado por parte de los clientes:

desde cualquier dirección:host_auth_accept_relay = *
sólo desde las conexiones con relay permitido:
#puedes utilizar los formatos habituales de exim, o incluso poner una sola 
#dirección de red con máscaras
host_auth_accept_relay=/opt/exim/etc/relay.conf

generar una macro LDAP de este tipo:
LDAP_FILTER_SMTPAUTH=(&(mail=$2@dominio.com)(userpassword=$3))

Suponiendo que el mail del usuario de dominio.com contiene la uid del usuario 
y el
dominio de no ser asi tendrías
algo así:
                    
LDAP_FILTER_SMTPAUTH=(&(&(mail=*@dominio.com)(uid=$2))(userpassword=$3))


suponiendo que el atributo userpassword contiene el password del usuario en
texto plano.
en configuraciones más trabajadas se podría atacar un password cifrado con 
MD5,
pero en principio
el soporte de SHA en las comparaciones no se obtiene de forma nativa. si 
unimos
esto a que el atributo userpassword
suele estar protegido de las miradas curiosas, con lo que la búsqueda LDAP
se debe hacer con un usario con permisos suficientes para retirar el valor del
atributo.
lo puedes almacenar en otra Macro
CREDENTIALS=user="cn=Directory Manager" pass=password
Evidentemente no debería ser el directory manager quién haga la búsqueda, lo
mejor, como me comentaba
ernesto sería algo así como utilizar al propio usuario para validar su 
password,
te cuento:

imagina que todos los usuarios de dominio.com siguen la misma norma para 
generar
su DN, por ejemplo la
uid que envían para autenticar en el correo seguido de su posición en el 
árbol:

uid=$uid_de_autentificación,ou=dominio,o=bt

Como autentico al usuario validando la password....

pues creando esto en la macro credentias:
CREDENTIALS_SECURE= user="uid=$2,ou=dominio,o=bt" pass=$3

si utilizas este segundo método te ahorras poner el password en el filtro:
LDAP_FILTER_SMTPAUTH=(mail=$2@dominio.com)
o
LDAP_FILTER_SMTPAUTH=(&(&(mail=*@dominio.com)(uid=$2))

si la uid que utilizan para autententicar no es la misma, o no forma parte del
dn.....
pues tendrías que ver la manera de hacerte con el dn del usuario, puede que 
con
una búsqueda ldap extra

Evitas así configurar un usuario con privilegios sobre el LDAP en exim y el
sistema de cifrado de las passwords
es totalmente transparente para exim.... ( ¿qué sistema de smtp autenticado da
más que esto? )


smtp_auth_driver:
#opciones especificas de autentificación mediante password en claro
#usuario password_codificada_en_base64
driver = plaintext
public_name = PLAIN
#parametros que el servidor solicita al cliente antes de expandir la condicion
#por defecto usuario y password, cuando las tiene...., parece que a outlook 
#solo le gusta este formato concreto
server_prompts = Username : Password
#busqueda LDAP y validación
server_condition = "${lookup ldap {CREDENTIALS_SECURE \
ldap:///LDAP_BASE?LDAP_ATTRIBUTES?sub?LDAP_FILTER_SMTPAUTH}{true} fail}"
#paso del parametro de identificacion en forma de variable al resto
#de elementos de exim, por ejemplo para añadir un campo en las cabeceras
server_set_id = $2


tu server condition podría hacer usar la función crytpeq, aunque la extracción 
de los passwords del archivo de shadow te supondrá darle lectura al usuario 
que ejecuta exim, tendrías que obtener tu el texto cifrado, y bla bla bla, 
pero bueno, tampoco es :

------------------------------------------------------------------------------------------------------
crytpeq {<string1>}{<string2>}

This condition is included in the Exim binary if it is built to support any 
authentication mechanisms (see chapter 35). Otherwise, it is necessary to 
define SUPPORT_CRYPTEQ in `Local/Makefile' to get crypteq included in the 
binary.

The crypteq condition has two arguments. The first is encrypted and compared 
against the second, which is already encrypted. The second string may be in 
the LDAP form for storing encrypted strings, which starts with the encryption 
type in curly brackets, followed by the data. For example:

{md5}CY9rzUYh03PK3k6DJie09g==

If such a string appears directly in an expansion, the curly brackets have to 
be quoted, because they are part of the expansion syntax. For example:

${if crypteq {test}{\{md5\}CY9rzUYh03PK3k6DJie09g==}{yes}{no}}

Two encryption types are currently supported:

    * md5 first computes the MD5 digest of the string, and then expresses this 
as printable characters by means of base64 encoding.
* crypt calls the crypt() function as used for encrypting login passwords.

If the second string does not begin with `{' it is assumed to be encrypted 
with crypt(), since such strings cannot begin with `{'. Typically this will 
be a field from a password file.
--------------------------------------------------------------------------------------------------
PASSWORDCIFRADO="macro realizada con extract, utilizas $2 como patron de 
reconocimiento de línea y extraes con los : como separador de campo"
#(recuerda que las macros las defines en main, pueden ir en la misma línea 
#pero se hacen imposibles de leer"
server_condition = "${if crypteq {$3}{PASSWORDCIFRADA}{yes}{no}"

La información de como trabajar con extract ,la tienes también en la 
documentación:
http://www.exim.org/exim-html-3.30/doc/html/spec_toc.html#TOC179

Puede que haya un sistema mejor para comparar passwords del sistema pero lo 
desconozco, como consejo yo instalaría un openldap sin mucha floritura y lo 
atacaría para comparar passwords, expones menos la seguridad del sistema y al 
mismo tiempo te ahorras la "MACRO" de extracción de passwords cifrados ( 
aunque le puedas exportar usuario:password a un archivo y extraer de ahí que 
es bastante simple.... )

Ante cualquier duda de todos modos ya sabes donde estamos
Espero que algo de esto te sirva de ayuda, un saludo
Victor



Reply to: