Diferencia entre revisiones de «Calculin»

De CaFeLUG
Saltar a: navegación, buscar
(Intro)
(Configuración de DNS)
 
(No se muestran 20 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...:
 
  
 
* el web-cyradm está medio muerto como proyecto,  
 
* el web-cyradm está medio muerto como proyecto,  
Línea 9: Línea 8:
 
hice un cambio radical de estrategia y me puse a configurar el sistema con Postfix, Cyrus y backend LDAP.
 
hice un cambio radical de estrategia y me puse a configurar el sistema con Postfix, Cyrus y backend LDAP.
  
Buscando en Google encontré [http://linuxgazette.net/124/pfeiffer.html esta página] de la cual me basé para armar todo el tema.
+
Buscando en Google encontré [http://linuxgazette.net/124/pfeiffer.html esta página] (que habla de una migración de no-sé-qué a postfix+cyrus), también vi [http://bulmalug.net/body.phtml?nIdNoticia=2013 esta otra página] (que resita sobre una configuración de postfix+ldap+COURIER) y finalmente [http://www.postfix.org/VIRTUAL_README.html documentación de postfix]. Entre todas estas cosas empecé a armar todo el asunto.
  
=== Instalación de cada parte ===
+
== Instalación de cada parte ==
 
+
=== Paquetes instalados vía apt-get ===
== Paquetes instalados vía apt-get ==
 
  
 
* apt-get install slapd ldap-utils
 
* apt-get install slapd ldap-utils
Línea 19: Línea 17:
  
 
== Configuración ==
 
== 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:
 +
 +
<code><pre>
 +
# 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
 +
</pre></code>
 +
 +
'''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é [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
  
Para armar el certificado que se usa en todos lados (IMAPs, ldap, web?) lo hice con el siguiente comando:
+
;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>
 +
 
 +
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].
 +
 
 +
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.
 +
 
 +
<pre>
 +
smtpd_milters = inet:127.0.0.1:1025
 +
non_smtpd_milters = inet:127.0.0.1:1025
 +
</pre>
  
openssl req -x509 -newkey rsa:2048 -keyout privada.pem -out publica.pem -nodes -days 999
+
<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).
  
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)
+
<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.