Diferencia entre revisiones de «Calculin»

De CaFeLUG
Saltar a: navegación, buscar
(Intro)
(Configuración de DNS)
 
(No se muestran 3 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
=== Intro ===
+
=Intro=
 
 
 
Dado que el primer ''approach'' (usar web-cyradm) no funcionó porque...:
 
Dado que el primer ''approach'' (usar web-cyradm) no funcionó porque...:
  
Línea 12: Línea 11:
  
 
== Instalación de cada parte ==
 
== Instalación de cada parte ==
 
 
=== Paquetes instalados vía apt-get ===
 
=== Paquetes instalados vía apt-get ===
  
Línea 19: Línea 17:
  
 
== Configuración ==
 
== Configuración ==
 
 
=== Certificado X.509 para cifrado TLS/SSL ===
 
=== Certificado X.509 para cifrado TLS/SSL ===
 
Para armar el certificado que se usa en todos lados (IMAPs, ldap, web?) lo hice con el siguiente comando:
 
Para armar el certificado que se usa en todos lados (IMAPs, ldap, web?) lo hice con el siguiente comando:
Línea 42: Línea 39:
 
=== LDAP ===
 
=== LDAP ===
  
En el documento referido antes habla de meter schemas llamados <code>sendmail.schema</code>, <code>samba.schema</code>, y <code>mozillaOrgPerson_V0.6.schema</code>, al schema de samba ni lo metí porque no tiene sentido. Si bien los encontré por inet tiraban errores. Sí metí los <code>greenmta.schema</code> <s>y <code>lookup.schema</code></s> porque vi que los iba a usar luego.
+
Di mil vueltas con esto, más que nada porque es el primer LDAP que configuro desde cero y no encontré algún documento que diga ''usa este schema que sale con fritas''. Por lo que lei hay dos schemas más utilizados para trabajar con correo, uno es el de Courier y el otro es el de Qmail.
 +
 
 +
Me bajé [http://courier.cvs.sourceforge.net/*checkout*/courier/libs/authlib/authldap.schema el de courier]. El tema no está en que postfix pueda encontrar si una dirección de correo es válida (y saber a qué casilla enviarla), el problema son los aliases (claro que pude haber usado el hash:/etc/aliases, pero así quién no?! :-)).
 +
 
 +
Para no hacer las cosas muy complicadas segui la recomendación del documento de bulma que propone armar dos ramas: "People" y "Postfix". En la primera van los usuarios y en la segunda cosas de Postfix (dughh!).
 +
 
 +
Acá pasteo un LDIF para que se puedan ver ejemplos de cada cosa:
 +
 
 +
<code><pre>
 +
version: 1
 +
 
 +
# LDIF Export for: dc=cafelug,dc=org,dc=ar
 +
# Generated by phpLDAPadmin ( http://phpldapadmin.sourceforge.net/ ) on March 22, 2008 4:27 am
 +
# Server: My LDAP Server (localhost)
 +
# Search Scope: sub
 +
# Search Filter: (objectClass=*)
 +
# Total Entries: 7
 +
 
 +
dn: dc=cafelug,dc=org,dc=ar
 +
objectClass: top
 +
objectClass: dcObject
 +
objectClass: organization
 +
o: cafelug.org.ar
 +
dc: cafelug
 +
 
 +
dn: cn=admin,dc=cafelug,dc=org,dc=ar
 +
objectClass: simpleSecurityObject
 +
objectClass: organizationalRole
 +
cn: admin
 +
description: LDAP administrator
 +
userPassword: {crypt}XERparhpX9GD6
 +
 
 +
dn: ou=People,dc=cafelug,dc=org,dc=ar
 +
objectClass: organizationalUnit
 +
ou: People
 +
 
 +
dn: cn=Daniel Coletti,ou=People,dc=cafelug,dc=org,dc=ar
 +
cn: Daniel Coletti
 +
gidNumber: 5000
 +
mail: dcoletti@cafelug.org.ar
 +
sn: Coletti
 +
uidNumber: 5000
 +
objectClass: CourierMailAccount
 +
objectClass: person
 +
objectClass: top
 +
objectClass: inetOrgPerson
 +
homeDirectory: /var/vmail
 +
quota: 0
 +
userPassword: {CRYPT}Clave
 +
 
 +
dn: ou=Postfix,dc=cafelug,dc=org,dc=ar
 +
ou: Postfix
 +
objectClass: organizationalUnit
 +
userPassword: {CRYPT}FxThcXLxmMTw.
 +
 
 +
dn: ou=Alias,ou=Postfix,dc=cafelug,dc=org,dc=ar
 +
ou: Alias
 +
objectClass: organizationalUnit
 +
 
 +
dn: cn=postmaster@cafelug.org.ar,ou=Alias,ou=Postfix,dc=cafelug,dc=org,dc=ar
 +
objectClass: top
 +
objectClass: organizationalRole
 +
objectClass: CourierMailAlias
 +
cn: postmaster@cafelug.org.ar
 +
mail: postmaster@cafelug.org.ar
 +
maildrop: dcoletti@cafelug.org.ar
 +
maildrop: gacq@cafelug.org.ar
 +
</pre></code>
 +
 
 +
=DomainKeys=
 +
==Alternativas==
 +
;Implementaciones de domainkeys
 +
*dkimproxy
 +
*dk-milter
 +
*dkfilter (del mismo autor de dkimproxy, deprecado?)
 +
 
 +
==DKIMproxy==
 +
*[http://dkimproxy.sourceforge.net/ Mail-DKIM and DKIMproxy]
 +
 
 +
Debian packages: dkimproxy
 +
 
 +
;Howtos
 +
*[http://dkimproxy.sourceforge.net/postfix-outbound-howto.html Setting up the outbound proxy with Postfix]
 +
*[http://anothersysadmin.wordpress.com/2008/01/16/domainkeysdkim-with-postfix/ Domainkeys/Dkim with Postfix]
 +
 
 +
==dk-milter==
 +
debian packages: dk-filter?
 +
 
 +
*[http://www.sendmail.com/sm/wp/dkim/ About DKIM]
 +
*http://sourceforge.net/projects/dkim-milter/
 +
 
 +
;Howtos
 +
*[http://www.howtoforge.com/how-to-implement-domainkeys-in-postfix-using-dk-milter-centos5.1?TB_iframe=true&height=650&width=850 How To Implement Domainkeys In Postfix Using dk-milter]
 +
 
 +
==General domainkey references==
 +
*[http://www.postfix.org/MILTER_README.html Postfix before-queue Milter support]
 +
 
 +
==Implementación==
 +
 
 +
Para implementarlo finalmente elegimos usar dk-milter o dk-filter (que es lo mismo).
 +
Debian trae un paquete en lenny, por lo que me baje los fuentes con:
 +
 
 +
<code>
 +
apt-get -t lenny source dk-milter
 +
</code>
 +
 
 +
y después lo compilé (con <code>dpkg-buildpackage</code>)
 +
 
 +
Lo primero que hay que hacer es armar los certificados. El paquete trae un comandito para hacerlo <code>gentxt.csh</code>, este comando se ejecuta pasandole dos argumentos, el "selector" que es un nombre (yo le mandé "calculin") y el nombre del dominio al que pertenece el certificado, en este caso fue "cafelug.org.ar".
 +
 
 +
Genera dos archivos:
 +
* calculin.public
 +
* calculin.private
 +
 
 +
El archivo privado es el más importante y hay que ponerlo en alguna parte que después lea el demonio, yo lo mandé en /etc/postfix/domainkeys.
 +
 
 +
Luego hay que configurar el DNS y también algunos parámetros del dk-filter.
 +
 
 +
El dk-filter se configura tocando el archivo <code>/etc/default/dk-filter</code> y así quedó:
 +
<pre>
 +
# Sane defaults: log to syslog
 +
DAEMON_OPTS="-l -m smtpd,postfix"
 +
# Sign for example.com with key in /etc/mail/domainkey.key using
 +
# selector '2007' (e.g. 2007._domainkey.example.com)
 +
DAEMON_OPTS="$DAEMON_OPTS -d cafelug.org.ar -s /etc/postfix/domainkeys/dk_cafelug.org.ar.pem -S calculin"
 +
# See dk-filter(8) for a complete list of options
 +
#
 +
# Uncomment to specify an alternate socket
 +
#SOCKET="/var/run/dk-filter/dk-filter.sock" # default
 +
#SOCKET="inet:54321" # listen on all interfaces on port 54321
 +
SOCKET="inet:1025@localhost" # listen on loopback on port 12345
 +
#SOCKET="inet:12345@192.0.2.1" # listen on 192.0.2.1 on port 12345
 +
</pre>
 +
 
 +
Entre las opciones esta <code>-l</code> que es para que mande los logs a través de syslog, <code>-m smtpd,postfix</code> no sé si es necesario (entre las pruebas que hice quedó). Las otras son más importantes:
 +
* <code> -d cafelug.org.ar</code> (el dominio del certificado, se pueden poner más dominios)
 +
* <code> -s /etc/postfix/domainkeys/dk_cafelug.org.ar.pem</code> (el lugar donde está la clave privada)
 +
* <code> -S calculin</code> (el "selector").
 +
 
 +
Y la parte que me volvió un poco loco fue la opción de <code>SOCKET=</code>, postfix corre en chroot, por lo que la opción <code>SOCKET="/var/run/dk-filter/dk-filter.sock"</code> me tiraba '''file not found'''... estuve un rato para acordarme y darme cuenta que no lo encontraba porque no estaba dentro del jail. En fin, lo deje escuchando en un puerto y así no da problemas.
 +
 
 +
===Configuración de DNS===
 +
 
 +
La configuración de DNS es ''tricky'', la documentación que encontré no es muy específica. La forma de correcta de setearlo es poniendo '''dos''' entradas de tipo ''TXT'' en la zona:
 +
<pre>
 +
calculin._domainkey.cafelug.org.ar. TXT "k=rsa; t=y; p=MFwwDQYJ[...]xfS+g/UlcszvzvY3UPFNEVGEecCAwEAAQ=="
 +
 
 +
_domainkey.cafelug.org.ar. TXT "t=y; o=-"
 +
</pre>
  
Estos últimos dos schemas no dieron errores por lo que los integré al resto.
+
La primera indica la clave pública (encodeada en Base64) para el selector ''calculin'' (que use con el gentxt.csh) y es importante que esté con el selector adelante y seguido de un ''.'' (punto). O sea ''<selector>._domainkey.<dominio>'', las demás opciones ('''k=''' y '''t=''') están claramente documentadas en la [http://tools.ietf.org/html/rfc4870 RFC 4870].
  
Tener los schemas obviamente es el inicio del tema porque hay que insertar los ''registros'' todavía. Siguiendo los archivos de configuración del documento para las búsquedas LDAP que realizará el postfix encontré que necesitaba unos cuantos usuarios y '''ou'''s por acá y allá, estos son:
+
La segunda entrada indica cómo deben ser tratados los mails que llegan de este dominio, '''t=''' indica que el dominio está en ''test-mode'' (esto supongo que habrá que sacarlo), luego la opción '''o=''' tiene varios valores, ''~'' indica que los mails pueden ser firmados o no, en cambio ''-'' indica que todos los mails enviados van a salir firmados.
* cn=postfix,ou=system,ou=accounts,dc=cafelug,dc=org,dc=ar (para hacer las consultas)
 
* búsqueda de virtual_alias_maps:
 
** ou=users,ou=accounts,dc=cafelug,dc=org,dc=ar (buscando el atributo '''mail''' usando como filtro: '''(&(mailAlternateAddress=%s)(accountStatus=aktiv))''')
 
** lookupName=virtualusers,cn=postfix,cn=mailstore,ou=server,ou=edv,dc=cafelug,dc=org,dc=ar (como base de búsqueda del atributo '''lookupValue''', filtro: '''lookupKey''' &mdash;que no sé para qué lo usa todavía&mdash;, esta definido en el archivo mailforwards.cf y también en el virtual_alias_maps.cf)
 
** ou=users,ou=accounts,dc=cafelug,dc=org,dc=ar (buscando el atributo '''mail''' usando como filtro: '''(&(uid=%u)(accountStatus=aktiv))''', dentro del archivo de local_recipient_maps.cf)
 
  
  
De esto se desprende que el esquema LDAP está pensado para que un usuario pueda tener <u>aliases</u> en ''mailAlternateAddress'', lo que nos viene bien para casillas con @usla.org.ar, @linux.org.ar. También se pueden activar los usuarios en base al valor de ''accountStatus'', para que esté activa la casilla deberá tener el valor '''aktiv''' &mdash;que por supuesto, se puede cambiar a algo como ''activo'' ya que obviamente estos chicos no son argentinos ;-)&mdash;
+
===Configuración de postfix===
  
Sí hice un corte importante y creo que es por mi falta de experiencia con LDAP, todo el tema del ''lookupName'' no entiendo para que lo usa ni tampoco como crearlo realmente. Al tratar de armar la rama '''ou=server''' no encontré forma de meter el '''lookupName''' dentro del container '''cn=postfix,cn=mailstore,ou=server,ou=edv,dc=cafelug,dc=org,dc=ar'''. Por otro lado, de haberlo metido no sé qué datos deberían ir ahí dentro.
+
La configuración de postfix es simple, lo único que hay que tener en cuenta es la versión de postfix. Esto está soportado desde la versión 2.3.
  
<s>Los usuarios se buscan dentro de '''ou=users,ou=accounts,dc=cafelug,dc=org,dc=ar''' y el tema pasa por los [http://www.postfix.org/postconf.5.html#virtual_alias_maps virtual_alias_maps] y [http://www.postfix.org/postconf.5.html#virtual_alias_domains virtual_alias_domains] (de postfix). Postfix necesita saber a qué usuario (local) enviar mails que llegan a p.e.: dcoletti@cafelug.org.ar -> dcoletti y también dcoletti@usla.org.ar -> dcoletti. Así que en vez de hacer todo el asunto por <code>lookups</code>, lo armé para usarlo con atributos de '''ou=users,ou=accounts,dc=cafelug,dc=org,dc=ar''', o sea que '''cn=Daniel Coletti,ou=users,ou=accounts,dc=cafelug,dc=org,dc=ar''' tendrá que tener los atributos correspondientes como para que el mail le llegue a la casilla</s>
+
<pre>
 +
smtpd_milters = inet:127.0.0.1:1025
 +
non_smtpd_milters = inet:127.0.0.1:1025
 +
</pre>
  
cambié uno de los '''ou''' ya que en el documento usa como base de búsqueda ''lookupName=virtualusers,cn=postfix,cn=mailstore,ou=server,ou=edv,dc=cafelug,dc=org,dc=ar'' y no sé para qué pusieron la '''ou=edv''', así que cambié los archivos de búsqueda de postfix eliminando esta ou.
+
<code>smtpd_milters</code> indica donde encuentra los ''milters'' definidos (ojo con la sintaxis, no es la misma que usa el dk-milter, intercambia la posición del ''host'' y ''puerto'', así que no hay que hacer cut&paste).
  
Todas estas cosas las fui agregando con phpldapadmin ya que &mdash;por lo menos para mi&mdash; es indispensable (no sé tanto de ldap como para ir agregando las cosas vía <code>ldapadd</code>)
+
<code>non_smtpd_milters</code> es para los mails generados localmente.

Revisión actual del 03:38 31 mar 2008

Intro

Dado que el primer approach (usar web-cyradm) no funcionó porque...:

  • el web-cyradm está medio muerto como proyecto,
  • no pude hacer andar el cifrado MD5 con el pam_mysql (sí, compilé el libpam_mysql con MD5 y armé el paquete)
  • postfix daba problemas todo el tiempo con las cosas más irrisorias como que no encuentra "localhost"

hice un cambio radical de estrategia y me puse a configurar el sistema con Postfix, Cyrus y backend LDAP.

Buscando en Google encontré esta página (que habla de una migración de no-sé-qué a postfix+cyrus), también vi esta otra página (que resita sobre una configuración de postfix+ldap+COURIER) y finalmente documentación de postfix. Entre todas estas cosas empecé a armar todo el asunto.

Instalación de cada parte

Paquetes instalados vía apt-get

  • apt-get install slapd ldap-utils
  • apt-get install postfix cyrus-pop3d-2.2 cyrus-imapd-2.2

Configuración

Certificado X.509 para cifrado TLS/SSL

Para armar el certificado que se usa en todos lados (IMAPs, ldap, web?) lo hice con el siguiente comando:

# mkdir myCA
# chmod 0700 myCA
# cd myCA
# mkdir {crl,newcerts,private}
# touch index.txt
# echo "01" > serial
# cp /etc/ssl/openssl.cnf .
# openssl req -nodes -config ./openssl.cnf -days 999 -x509 -newkey rsa:2048 -out cacert.pem -outform PEM
# openssl genrsa -rand /dev/urandom -out calculin.cafelug.org.ar.key
# openssl req -new -nodes -key calculin.cafelug.org.ar.key -out calculin.cafelug.org.ar.csr
# cp privkey.pem private/cakey.pem
# openssl ca -config ./openssl.cnf -in calculin.cafelug.org.ar.csr -out calculin.cafelug.org.ar.cert -days 9999

Nota: Lo importante es que al poner el valor de "Common Name:" puse "*.cafelug.org.ar" (así no rompe las p[e]lotas el browser diciendo que el certificado es malo)

LDAP

Di mil vueltas con esto, más que nada porque es el primer LDAP que configuro desde cero y no encontré algún documento que diga usa este schema que sale con fritas. Por lo que lei hay dos schemas más utilizados para trabajar con correo, uno es el de Courier y el otro es el de Qmail.

Me bajé el de courier. El tema no está en que postfix pueda encontrar si una dirección de correo es válida (y saber a qué casilla enviarla), el problema son los aliases (claro que pude haber usado el hash:/etc/aliases, pero así quién no?! :-)).

Para no hacer las cosas muy complicadas segui la recomendación del documento de bulma que propone armar dos ramas: "People" y "Postfix". En la primera van los usuarios y en la segunda cosas de Postfix (dughh!).

Acá pasteo un LDIF para que se puedan ver ejemplos de cada cosa:

version: 1

# LDIF Export for: dc=cafelug,dc=org,dc=ar
# Generated by phpLDAPadmin ( http://phpldapadmin.sourceforge.net/ ) on March 22, 2008 4:27 am
# Server: My LDAP Server (localhost)
# Search Scope: sub
# Search Filter: (objectClass=*)
# Total Entries: 7

dn: dc=cafelug,dc=org,dc=ar
objectClass: top
objectClass: dcObject
objectClass: organization
o: cafelug.org.ar
dc: cafelug

dn: cn=admin,dc=cafelug,dc=org,dc=ar
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword: {crypt}XERparhpX9GD6

dn: ou=People,dc=cafelug,dc=org,dc=ar
objectClass: organizationalUnit
ou: People

dn: cn=Daniel Coletti,ou=People,dc=cafelug,dc=org,dc=ar
cn: Daniel Coletti
gidNumber: 5000
mail: dcoletti@cafelug.org.ar
sn: Coletti
uidNumber: 5000
objectClass: CourierMailAccount
objectClass: person
objectClass: top
objectClass: inetOrgPerson
homeDirectory: /var/vmail
quota: 0
userPassword: {CRYPT}Clave

dn: ou=Postfix,dc=cafelug,dc=org,dc=ar
ou: Postfix
objectClass: organizationalUnit
userPassword: {CRYPT}FxThcXLxmMTw.

dn: ou=Alias,ou=Postfix,dc=cafelug,dc=org,dc=ar
ou: Alias
objectClass: organizationalUnit

dn: cn=postmaster@cafelug.org.ar,ou=Alias,ou=Postfix,dc=cafelug,dc=org,dc=ar
objectClass: top
objectClass: organizationalRole
objectClass: CourierMailAlias
cn: postmaster@cafelug.org.ar
mail: postmaster@cafelug.org.ar
maildrop: dcoletti@cafelug.org.ar
maildrop: gacq@cafelug.org.ar

DomainKeys

Alternativas

Implementaciones de domainkeys
  • dkimproxy
  • dk-milter
  • dkfilter (del mismo autor de dkimproxy, deprecado?)

DKIMproxy

Debian packages: dkimproxy

Howtos

dk-milter

debian packages: dk-filter?

Howtos

General domainkey references

Implementación

Para implementarlo finalmente elegimos usar dk-milter o dk-filter (que es lo mismo). Debian trae un paquete en lenny, por lo que me baje los fuentes con:

apt-get -t lenny source dk-milter

y después lo compilé (con dpkg-buildpackage)

Lo primero que hay que hacer es armar los certificados. El paquete trae un comandito para hacerlo gentxt.csh, este comando se ejecuta pasandole dos argumentos, el "selector" que es un nombre (yo le mandé "calculin") y el nombre del dominio al que pertenece el certificado, en este caso fue "cafelug.org.ar".

Genera dos archivos:

  • calculin.public
  • calculin.private

El archivo privado es el más importante y hay que ponerlo en alguna parte que después lea el demonio, yo lo mandé en /etc/postfix/domainkeys.

Luego hay que configurar el DNS y también algunos parámetros del dk-filter.

El dk-filter se configura tocando el archivo /etc/default/dk-filter y así quedó:

# Sane defaults: log to syslog
DAEMON_OPTS="-l -m smtpd,postfix"
# Sign for example.com with key in /etc/mail/domainkey.key using
# selector '2007' (e.g. 2007._domainkey.example.com)
DAEMON_OPTS="$DAEMON_OPTS -d cafelug.org.ar -s /etc/postfix/domainkeys/dk_cafelug.org.ar.pem -S calculin"
# See dk-filter(8) for a complete list of options
#
# Uncomment to specify an alternate socket
#SOCKET="/var/run/dk-filter/dk-filter.sock" # default
#SOCKET="inet:54321" # listen on all interfaces on port 54321
SOCKET="inet:1025@localhost" # listen on loopback on port 12345
#SOCKET="inet:12345@192.0.2.1" # listen on 192.0.2.1 on port 12345

Entre las opciones esta -l que es para que mande los logs a través de syslog, -m smtpd,postfix no sé si es necesario (entre las pruebas que hice quedó). Las otras son más importantes:

  • -d cafelug.org.ar (el dominio del certificado, se pueden poner más dominios)
  • -s /etc/postfix/domainkeys/dk_cafelug.org.ar.pem (el lugar donde está la clave privada)
  • -S calculin (el "selector").

Y la parte que me volvió un poco loco fue la opción de SOCKET=, postfix corre en chroot, por lo que la opción SOCKET="/var/run/dk-filter/dk-filter.sock" me tiraba file not found... estuve un rato para acordarme y darme cuenta que no lo encontraba porque no estaba dentro del jail. En fin, lo deje escuchando en un puerto y así no da problemas.

Configuración de DNS

La configuración de DNS es tricky, la documentación que encontré no es muy específica. La forma de correcta de setearlo es poniendo dos entradas de tipo TXT en la zona:

calculin._domainkey.cafelug.org.ar. TXT "k=rsa; t=y; p=MFwwDQYJ[...]xfS+g/UlcszvzvY3UPFNEVGEecCAwEAAQ=="

_domainkey.cafelug.org.ar. TXT "t=y; o=-"

La primera indica la clave pública (encodeada en Base64) para el selector calculin (que use con el gentxt.csh) y es importante que esté con el selector adelante y seguido de un . (punto). O sea <selector>._domainkey.<dominio>, las demás opciones (k= y t=) están claramente documentadas en la RFC 4870.

La segunda entrada indica cómo deben ser tratados los mails que llegan de este dominio, t= indica que el dominio está en test-mode (esto supongo que habrá que sacarlo), luego la opción o= tiene varios valores, ~ indica que los mails pueden ser firmados o no, en cambio - indica que todos los mails enviados van a salir firmados.


Configuración de postfix

La configuración de postfix es simple, lo único que hay que tener en cuenta es la versión de postfix. Esto está soportado desde la versión 2.3.

smtpd_milters = inet:127.0.0.1:1025
non_smtpd_milters = inet:127.0.0.1:1025

smtpd_milters indica donde encuentra los milters definidos (ojo con la sintaxis, no es la misma que usa el dk-milter, intercambia la posición del host y puerto, así que no hay que hacer cut&paste).

non_smtpd_milters es para los mails generados localmente.