Demistificando Postfix
En este tutorial, se tratara de instalar postfix con courier imap, y un repositorio ldap, para las consultas. Se generara un repositorio LDAP, con contenedores para usuarios, y agenda de direcciones, para ser usado con el squirrelmail. Puntualmente, yo usare una version de squirrelmail modificada, llamada squirrelmail outlook, que le da una vision muy parecida a la del Outlook Web Access (OWA).
Lo primero es lo primero, lo primero que haremos, es instalar el postfix.
root@marcelo:/home/marcelo# apt-get install postfix
smtpd_banner = Mailserver de Ejemplo
biff = no
home_mailbox=Maildir/
#[1] esto no va, pero es mostrar que escogemos maildir
append_dot_mydomain = no
myhostname = webmail.ejemplo.com.ar
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = webmail.ejemplo.com.ar,ejemplo.com.ar
relayhost =
mynetworks = 127.0.0.0/8, 192.168.1.0/24
mailbox_command =
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
Luego, lo configuraremos, para que el tipo de buzon que reciba, sea Maildir, para que nuestro hostname, sea ejemplo.com, y para que las redes que permita relay, sean las 192.168.0.1/24, y la red de la placa loca, 127.0.0.1/8
Le pondremos el banner , de Mailserver de Ejemplo, esto es lo que mostrara cuando se conecte.
Cuando decimos mailbox_size_limit, decimos que no tenemos tamanio maximo.
Ahora, necesitaremos configurar el servidor IMAP, y el servidor pop. Para las primeras practicas, al servidor IMAP, y al pop, lo haremos validar por PAM. Luego, lo haremos validar por OpenLDAP.
root@marcelo:/home/marcelo# apt-get install courier-imap
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo información de estado… Hecho
Se instalarán los siguientes paquetes extras:
courier-authdaemon courier-authlib courier-authlib-userdb courier-base
libfam0 libltdl3
Paquetes sugeridos:
courier-doc courier-imap-ssl
Paquetes recomendados
fam
Se instalarán los siguientes paquetes NUEVOS:
courier-authdaemon courier-authlib courier-authlib-userdb courier-base
courier-imap libfam0 libltdl3
0 actualizados, 7 se instalarán, 0 para eliminar y 186 no actualizados.
A este punto, vale aclarar, que courier solo acepta leer mails en formato Maildir. Por eso, vale destacar en el archivo main.cf , de la configuracion de postfix , la importancia de [1], donde definimos que el formato de buzon, sea Maildir.
en alguna parte , nos va a preguntar, si queremos crear la consola de administracion web, a lo que contestamos que no.
Luego, realizamos lo mismo con el courier-pop.
Creando árbol de dependencias
Leyendo información de estado… Hecho
Paquetes sugeridos:
courier-doc courier-pop-ssl
Se instalarán los siguientes paquetes NUEVOS:
courier-pop
Ya digamos, que tenemos basicamente, todo lo que se necesitaria para enviar y recibir correos, servidor pop, imap, y servidor de correo smtp. Ahora , vamos por mas, lo vamos a configurar, con antivirus, antispam, OpenLDAP, y libretas de direcciones compartidas con el squirrelmail!.
Vamos con lo complicado primero.
Sin exponer demasiado, que es LDAP, y su implementacion de OpenLDAP, voy a decir que es un servicio que sirve para la validacion centralizada de diferentes servicios. Asi como para validar los usuarios del sistema, existe PAM, que este utiliza los usuarios del /etc/passwd, para validar el login, y demas, tambien podriamos validar los servicios via LDAP. Los invito a que revisen su directorio /etc/pam.d, y veran alli los diferentes servicios que se estan validando via pam (Que es por defecto como se validan). Podria usarse tambien para validar, MySQL, pero este tutorial escapa la validacion por mysql, ya que usaremos la integracion con openldap, para las libretas de direcciones compartidas.
root@marcelo:/mnt/lost+found# apt-get install slapd
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo información de estado… Hecho
Se instalarán los siguientes paquetes extras:
libdb4.2 libiodbc2 libldap-2.2-7
Paquetes sugeridos:
ldap-utils
Paquetes recomendados
db4.2-util
Se instalarán los siguientes paquetes NUEVOS:
libdb4.2 libiodbc2 libldap-2.2-7 slapd
En la instalacion, nos preguntara passwords de admin, y eso, a este punto lo saltearemos, pues tenemos una configuracion especial para nuestro servidor.
como veremos, se instalaran varios programas. SLAPD es el servidor que corre LDAP, y despues, son librerias que se usan. se necesitaran, y vamos a instalar, las utilidades clientes de ldap (ldap utils), y las utilidades de berkley db, (db4.2-util).
root@marcelo:/mnt/lost+found# apt-get install ldap-utils db4.2-util
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo información de estado… Hecho
Se instalarán los siguientes paquetes NUEVOS:
db4.2-util ldap-utils
Para borrar los datos de LDAP que ha generado el debconf, hacemos lo siguiente
rm -fr /var/lib/ldap/*
copiamos nuestra configuracion personalizada, donde destacaremos varios puntos.
# Allow LDAPv2 binds
allow bind_v2
# This is the main slapd configuration file. See slapd.conf(5) for more
# info on the configuration options.
#######################################################################
# Global Directives:
# Features to permit
#allow bind_v2
# Schema and objectClass definitions
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
# Schema check allows for forcing entries to
# match schemas for their objectClasses’s
schemacheck on
# Where the pid file is put. The init.d script
# will not stop the server if you change this.
pidfile /var/run/slapd/slapd.pid
# List of arguments that were passed to the server
argsfile /var/run/slapd.args
# Read slapd.conf(5) for possible values
loglevel 0
# Where the dynamically loaded modules are stored
modulepath /usr/lib/ldap
moduleload back_bdb
#######################################################################
# SSL:
# Uncomment the following lines to enable SSL and use the default
# snakeoil certificates.
#TLSCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
#TLSCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
#######################################################################
# Specific Backend Directives for bdb:
# Backend specific directives apply to this backend until another
# ‘backend’ directive occurs
backend bdb
checkpoint 512 30
#######################################################################
# Specific Backend Directives for ‘other’:
# Backend specific directives apply to this backend until another
# ‘backend’ directive occurs
#backend
#######################################################################
# Specific Directives for database #1, of type bdb:
# Database specific directives apply to this databasse until another
# ‘database’ directive occurs
database bdb
# The base of your directory in database #1
suffix «dc=ejemplo,dc=com,dc=ar»
rootdn «cn=admin,dc=ejemplo,dc=com,dc=ar»
rootpw nada
# Where the database file are physically stored for database #1
directory «/var/lib/ldap»
# Indexing options for database #1
index objectClass eq
# Save the time that the entry gets modified, for database #1
lastmod on
# Where to store the replica logs for database #1
# replogfile /var/lib/ldap/replog
# The userPassword by default can be changed
# by the entry owning it if they are authenticated.
# Others should not be able to see it, except the
# admin entry below
# These access lines apply to database #1 only
access to attrs=userPassword
by dn=»cn=admin,dc=ejemplo,dc=com,dc=ar» write
by anonymous auth
by self write
by * none
# Ensure read access to the base for things like
# supportedSASLMechanisms. Without this you may
# have problems with SASL not knowing what
# mechanisms are available and the like.
# Note that this is covered by the ‘access to *’
# ACL below too but if you change that as people
# are wont to do you’ll still need this if you
# want SASL (and possible other things) to work
# happily.
access to dn.base=»» by * read
# The admin dn has full write access, everyone else
# can read everything.
access to *
by dn=»cn=admin,dc=ejemplo,dc=com,dc=ar» write
by * read
Destaquemos las siguientes lineas.
suffix «dc=ejemplo,dc=com,dc=ar»
rootdn «cn=admin,dc=ejemplo,dc=com,dc=ar»
rootpw nada
en estas lineas, lo que estamos declarando es.
suffix, seria el dominio del servidor de ldap. Si nuestro dominio es misol.org.ar, el suffix seria
dc=misol,dc=org,dc=ar
rootdn, es el administrador de el servidor ldap. en este caso, seria el usuario admin, declarado en
cn=admin,dc=ejemplo,dc=com,dc=ar
rootpw, es el password. Por comodidad a este ejemplo, lo deje en texto claro. el password es nada.
y luego, agregamos un archivo donde tenemos las definiciones basicas de los atributos que necesitamos para LDAP.
Lo agregaremos en formato off-line, con el servidor sin validar, con el comando slapadd
El archivo a agregar, se llama data-agenda.ldif . NOTA: la extension ldif, es la extension por defecto de los archivos que tienen datos a integrar en el servidor LDAP.
dn: dc=ejemplo,dc=com,dc=ar
objectClass: top
objectClass: dcObject
objectClass: organization
o: ejemplo
dc: ejemplo
structuralObjectClass: organization
entryUUID: 8b568d00-a010-102b-8267-c41632270fd5
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20070526200759Z
modifyTimestamp: 20070526200759Z
entryCSN: 20070526200759Z#000001#00#000000
dn: cn=admin,dc=ejemplo,dc=com,dc=ar
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e2NyeXB0fXBJYU1jbnBHUU8xbEE=
structuralObjectClass: organizationalRole
entryUUID: 8b628eac-a010-102b-8268-c41632270fd5
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20070526200759Z
modifyTimestamp: 20070526200759Z
entryCSN: 20070526200759Z#000002#00#000000
dn: ou=People,dc=ejemplo,dc=com,dc=ar
ou: People
objectClass: organizationalUnit
objectClass: top
structuralObjectClass: organizationalUnit
dn: ou=Libreta,dc=ejemplo,dc=com,dc=ar
ou: Libreta
objectClass: organizationalUnit
objectClass: top
structuralObjectClass: organizationalUnit
Sin extenderme en explicar LDAP, pues no es la intencion de este tutorial, hemos creado dos Unidades Organizacionales que serian los contenedores LDAP. Una unidad People, donde contendra todos los usuarios de el servidor, y otra agenda, que es fundamentalmente para que pueda el squirrelmail consultar los usuarios de el sistema.
ahora, viene el comando de insercion, y luego, el de comprobacion que todo ha salido como queriamos!.
root@marcelo:~#slapadd -l data-agenda.ldif
root@marcelo:~#slapcat
dn: dc=ejemplo,dc=com,dc=ar
objectClass: top
objectClass: dcObject
objectClass: organization
o: ejemplo
dc: ejemplo
structuralObjectClass: organization
entryUUID: 8b568d00-a010-102b-8267-c41632270fd5
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20070526200759Z
modifyTimestamp: 20070526200759Z
entryCSN: 20070526200759Z#000001#00#000000
dn: cn=admin,dc=ejemplo,dc=com,dc=ar
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e2NyeXB0fXBJYU1jbnBHUU8xbEE=
structuralObjectClass: organizationalRole
entryUUID: 8b628eac-a010-102b-8268-c41632270fd5
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20070526200759Z
modifyTimestamp: 20070526200759Z
entryCSN: 20070526200759Z#000002#00#000000
dn: ou=People,dc=ejemplo,dc=com,dc=ar
ou: People
objectClass: organizationalUnit
objectClass: top
structuralObjectClass: organizationalUnit
entryUUID: 6651dcde-b5a1-102b-97f4-93491f4cf66c
creatorsName: cn=admin,dc=ejemplo,dc=com,dc=ar
modifiersName: cn=admin,dc=ejemplo,dc=com,dc=ar
createTimestamp: 20070623064748Z
modifyTimestamp: 20070623064748Z
entryCSN: 20070623064748Z#000003#00#000000
dn: ou=Libreta,dc=ejemplo,dc=com,dc=ar
ou: Libreta
objectClass: organizationalUnit
objectClass: top
structuralObjectClass: organizationalUnit
entryUUID: 6653b9be-b5a1-102b-97f5-93491f4cf66c
creatorsName: cn=admin,dc=ejemplo,dc=com,dc=ar
modifiersName: cn=admin,dc=ejemplo,dc=com,dc=ar
createTimestamp: 20070623064748Z
modifyTimestamp: 20070623064748Z
Luego de esto, y fundamental, debemos reiniciar el servidor slapd
/etc/init.d/slapd restart
Si hasta aca anduvimos igual, deberia funcionar todo bien, la insercion de los esquemas estaria bien. Ahora vamos a agregar un usuario, y para eso, he desarrollado un script, que agregara el usuario a nuestra base de ldap, en las estructuras contenedoras correspondientes, de people, y de agenda. Veamos como es el script, y luego, como ejecutarlo.
#!/bin/bash
#Script de generacion de Usuarios, basado en el de OpenXchange
#—- Configuraciones de Sistema
LDAPSEARCH_BIN=/usr/bin/ldapsearch
LDAPHOST=»127.0.0.1″
BINDDN=»cn=admin,dc=ejemplo,dc=com,dc=ar»
BINDPW=nada
USER_BASEDN=»ou=People,dc=ejemplo,dc=com,dc=ar»
LIBRETA_BASEDN=»ou=Libreta,dc=ejemplo,dc=com,dc=ar»
GREP_BIN=/bin/grep
SED_BIN=/bin/sed
SORT_BIN=/usr/bin/sort
HEAD_BIN=/usr/bin/head
AWK_BIN=/usr/bin/awk
TMPDIF=/tmp/usuario.ldif
MIN_UID=2001
EXPR_BIN=/usr/bin/expr
#—- Fin
CURRENT_UID=`$LDAPSEARCH_BIN -h $LDAPHOST -D $BINDDN -w $BINDPW -x -b $USER_BASEDN «(uid=*)» uidNumber | $GREP_BIN uidNumber | $SED_BIN -e ‘s/^uidNumber://’ | $SORT_BIN -nr | $HEAD_BIN -n 1 | $AWK_BIN {‘print $1′}`
if [ «$CURRENT_UID» = «#» ]
then
CURRENT_UID=$MIN_UID
else
CURRENT_UID=`$EXPR_BIN $CURRENT_UID + 1`
fi
#— Parametros de entrada
#$1 uid
#$2 Nombre
#$3 Apellido
#$4 Password
if [ «$1» = «» ]
then
echo «Debe especificar un UID, ejemplo mguazzardo»
error=»y»
fi
if [ «$2» = «» ]
then
echo «Debe especificar un Nombre, ejemplo Marcelo»
error=»y»
fi
if [ «$3» = «» ]
then
echo «Debe especificar un Apellido, ejemplo Guazzardo»
error=»y»
fi
if [ «$4» = «» ]
then
echo «Debe especificar un Password»
error=»y»
fi
if [ «$error» = «y» ]
then
echo «Por favor, corrija los errores»
exit 0
fi
#Password
CRYPTPASS=`slappasswd -h {crypt} -s $4`
PROXIMO=`expr $CURRENT_UID + 1`
#empezamos a escribir el file
echo «dn: uid=$1,$USER_BASEDN» > $TMPDIF
echo «uid: $1» >> $TMPDIF
echo «cn: $2 $3» >> $TMPDIF
echo «sn: $3»>>$TMPDIF
echo «objectClass: person»>>$TMPDIF
echo «objectClass: organizationalPerson»>>$TMPDIF
echo «objectClass: inetOrgPerson»>>$TMPDIF
echo «objectClass: posixAccount»>>$TMPDIF
echo «objectClass: top»>>$TMPDIF
echo «objectClass: shadowAccount»>>$TMPDIF
echo «shadowLastChange: 11627»>>$TMPDIF
echo «shadowMax: 99999»>>$TMPDIF
echo «shadowWarning: 7»>>$TMPDIF
echo «loginShell: /bin/false»>>$TMPDIF
echo «uidNumber: $PROXIMO»>>$TMPDIF
echo «gidNumber: 2001»>>$TMPDIF
echo «homeDirectory: /home/$1»>>$TMPDIF
echo «userPassword: $CRYPTPASS»>>$TMPDIF
ldapadd -x -v -D «cn=admin,dc=ejemplo,dc=com,dc=ar» -w $BINDPW -f $TMPDIF
rm -fr $TMPDIF
echo «dn: cn=$2 $3,$LIBRETA_BASEDN»>>$TMPDIF
echo «givenName: $2»>>$TMPDIF
echo «sn: $3»>>$TMPDIF
echo «cn: $2 $3»>>$TMPDIF
echo «mail: $1@ejemplo.com.ar»>>$TMPDIF
echo «objectClass: inetOrgPerson»>>$TMPDIF
echo «objectClass: top»>>$TMPDIF
ldapadd -x -v -D «cn=admin,dc=ejemplo,dc=com,dc=ar» -w $BINDPW -f $TMPDIF
rm -fr $TMPDIF
#Fin
#Genero el Maildir del Usuario
mkdir /home/$1
maildirmake /home/$1/Maildir
chown -R $1 /home/$1
Veamos, la ultima parte… dara un error, que por ahora no nos importara, que nos dira, que mguazzardo no es un usuario valido. Aun no le hemos dicho que valide a los usuarios de ldap, como usuarios de sistema, ya llegara esa parte, lo importante, que si todo ha salido bien, ahora llega la parte mas importante, que es integrar todo.
Validando PAM con OPENLDAP.
para validar pam con openldap, no es algo trivial, es algo, que me costo muchisimo!. Mas, que en debian, como en ubuntu existe un flor de bug con una libreria, ahora discutiremos de eso!.
root@marcelo:~# apt-get install libpam-ldap
a la configuracion, contestaremos cualquier cosa, total, tenemos nuestro archivo de configuracion propio.
root@marcelo:~# wget http://www.porcheron.info/libnss-ldap_251-7_i386.deb
root@marcelo:~# dpkg -i libnss-ldap_251-7_i386.deb
y luego, copiamos los archivos de configuracion, que crean estos dos archivos.
el primero, el /etc/pam_ldap.conf
host 127.0.0.1
base dc=ejemplo,dc=com,dc=ar
ldap_version 3
rootbinddn cn=admin,dc=ejemplo,dc=com,dc=ar
pam_password crypt
el segundo, el /etc/libnss-ldap.conf
host 127.0.0.1
base dc=ejemplo,dc=com,dc=ar
ldap_version 3
rootbinddn cn=admin,dc=ejemplo,dc=com,dc=ar
pam_password crypt
y tambien, hay que tocar un archivo mas, que no es generado por estos dos que hemos bajado, sino, por otro, el archivo es el /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc’ and `info’ packages installed, try:
# `info libc «Name Service Switch»‘ for information about this file.
passwd: files ldap
group: files ldap
shadow: files ldap
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
Con esto, le decimos al sistema, que cuando se trate de usuarios, primero se fije en los archivos de sistema , y luego, valide mediante ldap.
Probando que todo este configurado correctamente.
para realizar la prueba, de que todo hasta aca, esta funcionando correctamente, haremos lo siguiente.
getent passwd, y me deberia traer los usuarios de sistema, mas los usuarios creados recientemente por LDAP.
Ahora vamos por la integracion con courier-imap!.
Lo primero que debemos hacer, es instalar el soporte de courier para ldap.
root@marcelo:~#apt-get install courier-ldap
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo información de estado… Hecho
Se instalarán los siguientes paquetes extras:
courier-authlib-ldap
Paquetes sugeridos:
courier-doc
Se instalarán los siguientes paquetes NUEVOS:
courier-authlib-ldap courier-ldap
Luego, configuraremos , en /etc/pam.d/imap, para que el imap use validacion ldap.
auth required pam_ldap.so
account required pam_ldap.so
password required pam_ldap.so
session required pam_ldap.so
Luego de esto, ya estamos en condiciones de hacer la primer prueba, basica, de validacion del usuario que hemos generado!.
para eso, hacemos lo siguiente.
root@marcelo:~# telnet localhost 143
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2005 Double Precision, Inc. See COPYING for distribution information.
1 login mguazzardo ejemplo
* BYE [ALERT] Fatal error: Maildir: Permission denied
Connection closed by foreign host.
como vemos aca, nos da un error!. Que es eso de Maildir?… es como les comente antes, para que courier funcione, necesita tener un maildir. Al generar un usuario, se debe generar su maildir, es la parte del script de generacion de usuarios que dio la falla, por que no estaba seteado el pam y el ldap, ahora ese script no daria la falla, y es lo que necesitariamos para que esto funcione!. veamos la ultima linea del script, uid.sh.
chown -R $1 /home/$1
Esto hace que se le ceda la autoria del home, al usuario que se pasa por parametro, en este caso, mguazzardo.
si yo ejecuto…
chown -R mguazzardo /home/mguazzardo
Solucionamos el problema que nos daba anteriormente!.
veamos…
root@marcelo:~# telnet localhost 143
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2005 Double Precision, Inc. See COPYING for distribution information.
1 login mguazzardo ejemplo
1 OK LOGIN Ok.
bueno, ya vimos que hemos solucionado un problema, que ya nuestros usuarios se loguean via imap a nuestro servidor, ahora nos falta, lo mas divertido. Integracion con Webmail, con antivirus, y antispam… y ahi terminariamos la primera etapa!.
Llego la hora de instalar apache2, php5, php5-ldap, phpldapadmin!
root@marcelo:~# apt-get install apache2 php5 php5-ldap
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo información de estado… Hecho
Se instalarán los siguientes paquetes extras:
apache2-common apache2-mpm-prefork apache2-utils libapache2-mod-php5 libapr0 php5-common
Paquetes sugeridos:
apache2-doc php-pear
Se instalarán los siguientes paquetes NUEVOS:
apache2 apache2-common apache2-mpm-prefork apache2-utils libapache2-mod-php5 libapr0 php5 php5-common php5-ldap
nos falta instalar el squirrelmail, junto a su paquete de idiomas.
root@marcelo:~# apt-get install squirrelmail squirrelmail-locales
NOTA:
para setear que el squirrelmail este en castellano, y esto es un truco que encontre por la internet, en ubuntu, hay que generar las locales.
locale-gen es_ES
luego,
squirrelmail-configure
vamos a el punto 10, donde dice lenguaje, cambiamos, lenguaje, y charset.
NOTA: abajo dejo mi config.php, del squirrelmail.
LDAP!!!!!!!!!!!!
SquirrelMail Configuration : Read: config.php (1.4.0)
———————————————————
Main Menu —
1. Organization Preferences
2. Server Settings
3. Folder Defaults
4. General Options
5. Themes
6. Address Books
7. Message of the Day (MOTD)
8. Plugins
9. Database
10. Languages
D. Set pre-defined settings for specific IMAP servers
C Turn color on
S Save data
Q Quit
Command >>
ponemos 6
SquirrelMail Configuration : Read: config.php (1.4.0)
———————————————————
Address Books
1. Change LDAP Servers
2. Use Javascript Address Book Search : false
3. Global file address book :
4. Allow writing into global file address book : false
R Return to Main Menu
C Turn color on
S Save data
Q Quit
Command >> 1
You can now define different LDAP servers.
Please ensure proper permissions for config.php when including
sensitive passwords.
[ldap] command (?=help) > +
First, we need to have the hostname or the IP address where
this LDAP server resides. Example: ldap.bigfoot.com
hostname: 127.0.0.1
Next, we need the server root (base dn). For this, an empty
string is allowed.
Example: ou=member_directory,o=netcenter.com
base: ou=Libreta,dc=ejemplo,dc=com,dc=ar
This is the TCP/IP port number for the LDAP server. Default
port is 389. This is optional. Press ENTER for default.
port:
/**
* SquirrelMail Configuration File
* Created using the configure script, conf.pl
*/
global $version;
$config_version = ‘1.4.0’;
$config_use_color = 2;
$org_name = «Ejemplo»;
$org_logo = ‘/images/ejemplo.png’;
$org_logo_width = ‘308’;
$org_logo_height = ‘111’;
$org_title = «Mail Server de EJEMPLO»;
$signout_page = »;
$frame_top = ‘_top’;
$provider_uri = ‘http://www.misol.org.ar’;
$provider_name = ‘EJEMPLO’;
$motd = «»;
$squirrelmail_default_language = ‘es_ES’;
$default_charset = ‘iso-8859-15’;
$lossy_encoding = false;
$domain = ‘ejemplo.com.ar’;
$imapServerAddress = ‘localhost’;
$imapPort = 143;
$useSendmail = true;
$smtpServerAddress = ‘localhost’;
$smtpPort = 25;
$sendmail_path = ‘/usr/sbin/sendmail’;
$sendmail_args = ‘-i -t’;
$pop_before_smtp = false;
$imap_server_type = ‘other’;
$invert_time = false;
$optional_delimiter = ‘detect’;
$encode_header_key = »;
$default_folder_prefix = »;
$trash_folder = ‘INBOX.Trash’;
$sent_folder = ‘INBOX.Sent’;
$draft_folder = ‘INBOX.Drafts’;
$default_move_to_trash = true;
$default_move_to_sent = true;
$default_save_as_draft = true;
$show_prefix_option = false;
$list_special_folders_first = true;
$use_special_folder_color = true;
$auto_expunge = true;
$default_sub_of_inbox = true;
$show_contain_subfolders_option = false;
$default_unseen_notify = 2;
$default_unseen_type = 1;
$auto_create_special = true;
$delete_folder = false;
$noselect_fix_enable = false;
$data_dir = SM_PATH . ‘data/’;
$attachment_dir = $data_dir;
$dir_hash_level = 0;
$default_left_size = ‘150’;
$force_username_lowercase = false;
$default_use_priority = true;
$hide_sm_attributions = false;
$default_use_mdn = true;
$edit_identity = true;
$edit_name = true;
$hide_auth_header = false;
$allow_thread_sort = false;
$allow_server_sort = false;
$allow_charset_search = true;
$uid_support = true;
$plugins[0] = ‘calendar’;
$plugins[1] = ‘message_details’;
$plugins[2] = ‘compatibility’;
$plugins[3] = ‘html_mail’;
$plugins[4] = ‘newmail’;
$plugins[5] = ‘mail_fetch’;
$plugins[6] = ‘preview_pane’;
$plugins[7] = ‘translate’;
$theme_css = SM_PATH . ‘config/themes/css/outlook-08.css’;
$theme_default = 0;
$theme[0][‘PATH’] = SM_PATH . ‘themes/outlook.php’;
$theme[0][‘NAME’] = ‘Default’;
$theme[1][‘PATH’] = SM_PATH . ‘themes/plain_blue_theme.php’;
$theme[1][‘NAME’] = ‘Plain Blue’;
$theme[2][‘PATH’] = SM_PATH . ‘themes/sandstorm_theme.php’;
$theme[2][‘NAME’] = ‘Sand Storm’;
$theme[3][‘PATH’] = SM_PATH . ‘themes/deepocean_theme.php’;
$theme[3][‘NAME’] = ‘Deep Ocean’;
$theme[4][‘PATH’] = SM_PATH . ‘themes/slashdot_theme.php’;
$theme[4][‘NAME’] = ‘Slashdot’;
$theme[5][‘PATH’] = SM_PATH . ‘themes/purple_theme.php’;
$theme[5][‘NAME’] = ‘Purple’;
$theme[6][‘PATH’] = SM_PATH . ‘themes/forest_theme.php’;
$theme[6][‘NAME’] = ‘Forest’;
$theme[7][‘PATH’] = SM_PATH . ‘themes/ice_theme.php’;
$theme[7][‘NAME’] = ‘Ice’;
$theme[8][‘PATH’] = SM_PATH . ‘themes/seaspray_theme.php’;
$theme[8][‘NAME’] = ‘Sea Spray’;
$theme[9][‘PATH’] = SM_PATH . ‘themes/bluesteel_theme.php’;
$theme[9][‘NAME’] = ‘Blue Steel’;
$theme[10][‘PATH’] = SM_PATH . ‘themes/dark_grey_theme.php’;
$theme[10][‘NAME’] = ‘Dark Grey’;
$theme[11][‘PATH’] = SM_PATH . ‘themes/high_contrast_theme.php’;
$theme[11][‘NAME’] = ‘High Contrast’;
$theme[12][‘PATH’] = SM_PATH . ‘themes/black_bean_burrito_theme.php’;
$theme[12][‘NAME’] = ‘Black Bean Burrito’;
$theme[13][‘PATH’] = SM_PATH . ‘themes/servery_theme.php’;
$theme[13][‘NAME’] = ‘Servery’;
$theme[14][‘PATH’] = SM_PATH . ‘themes/maize_theme.php’;
$theme[14][‘NAME’] = ‘Maize’;
$theme[15][‘PATH’] = SM_PATH . ‘themes/bluesnews_theme.php’;
$theme[15][‘NAME’] = ‘BluesNews’;
$theme[16][‘PATH’] = SM_PATH . ‘themes/deepocean2_theme.php’;
$theme[16][‘NAME’] = ‘Deep Ocean 2’;
$theme[17][‘PATH’] = SM_PATH . ‘themes/blue_grey_theme.php’;
$theme[17][‘NAME’] = ‘Blue Grey’;
$theme[18][‘PATH’] = SM_PATH . ‘themes/dompie_theme.php’;
$theme[18][‘NAME’] = ‘Dompie’;
$theme[19][‘PATH’] = SM_PATH . ‘themes/methodical_theme.php’;
$theme[19][‘NAME’] = ‘Methodical’;
$theme[20][‘PATH’] = SM_PATH . ‘themes/greenhouse_effect.php’;
$theme[20][‘NAME’] = ‘Greenhouse Effect (Changes)’;
$theme[21][‘PATH’] = SM_PATH . ‘themes/in_the_pink.php’;
$theme[21][‘NAME’] = ‘In The Pink (Changes)’;
$theme[22][‘PATH’] = SM_PATH . ‘themes/kind_of_blue.php’;
$theme[22][‘NAME’] = ‘Kind of Blue (Changes)’;
$theme[23][‘PATH’] = SM_PATH . ‘themes/monostochastic.php’;
$theme[23][‘NAME’] = ‘Monostochastic (Changes)’;
$theme[24][‘PATH’] = SM_PATH . ‘themes/shades_of_grey.php’;
$theme[24][‘NAME’] = ‘Shades of Grey (Changes)’;
$theme[25][‘PATH’] = SM_PATH . ‘themes/spice_of_life.php’;
$theme[25][‘NAME’] = ‘Spice of Life (Changes)’;
$theme[26][‘PATH’] = SM_PATH . ‘themes/spice_of_life_lite.php’;
$theme[26][‘NAME’] = ‘Spice of Life – Lite (Changes)’;
$theme[27][‘PATH’] = SM_PATH . ‘themes/spice_of_life_dark.php’;
$theme[27][‘NAME’] = ‘Spice of Life – Dark (Changes)’;
$theme[28][‘PATH’] = SM_PATH . ‘themes/christmas.php’;
$theme[28][‘NAME’] = ‘Holiday – Christmas’;
$theme[29][‘PATH’] = SM_PATH . ‘themes/darkness.php’;
$theme[29][‘NAME’] = ‘Darkness (Changes)’;
$theme[30][‘PATH’] = SM_PATH . ‘themes/random.php’;
$theme[30][‘NAME’] = ‘Random (Changes every login)’;
$theme[31][‘PATH’] = SM_PATH . ‘themes/midnight.php’;
$theme[31][‘NAME’] = ‘Midnight’;
$theme[32][‘PATH’] = SM_PATH . ‘themes/alien_glow.php’;
$theme[32][‘NAME’] = ‘Alien Glow’;
$theme[33][‘PATH’] = SM_PATH . ‘themes/dark_green.php’;
$theme[33][‘NAME’] = ‘Dark Green’;
$theme[34][‘PATH’] = SM_PATH . ‘themes/penguin.php’;
$theme[34][‘NAME’] = ‘Penguin’;
$theme[35][‘PATH’] = SM_PATH . ‘themes/minimal_bw.php’;
$theme[35][‘NAME’] = ‘Minimal BW’;
$theme[36][‘PATH’] = SM_PATH . ‘themes/redmond.php’;
$theme[36][‘NAME’] = ‘Redmond’;
$theme[37][‘PATH’] = SM_PATH . ‘themes/netstyle_theme.php’;
$theme[37][‘NAME’] = ‘Net Style’;
$theme[38][‘PATH’] = SM_PATH . ‘themes/silver_steel_theme.php’;
$theme[38][‘NAME’] = ‘Silver Steel’;
$theme[39][‘PATH’] = SM_PATH . ‘themes/simple_green_theme.php’;
$theme[39][‘NAME’] = ‘Simple Green’;
$theme[40][‘PATH’] = SM_PATH . ‘themes/wood_theme.php’;
$theme[40][‘NAME’] = ‘Wood’;
$theme[41][‘PATH’] = SM_PATH . ‘themes/bluesome.php’;
$theme[41][‘NAME’] = ‘Bluesome’;
$theme[42][‘PATH’] = SM_PATH . ‘themes/simple_green2.php’;
$theme[42][‘NAME’] = ‘Simple Green 2’;
$theme[43][‘PATH’] = SM_PATH . ‘themes/simple_purple.php’;
$theme[43][‘NAME’] = ‘Simple Purple’;
$theme[44][‘PATH’] = SM_PATH . ‘themes/autumn.php’;
$theme[44][‘NAME’] = ‘Autumn’;
$theme[45][‘PATH’] = SM_PATH . ‘themes/autumn2.php’;
$theme[45][‘NAME’] = ‘Autumn 2’;
$theme[46][‘PATH’] = SM_PATH . ‘themes/blue_on_blue.php’;
$theme[46][‘NAME’] = ‘Blue on Blue’;
$theme[47][‘PATH’] = SM_PATH . ‘themes/classic_blue.php’;
$theme[47][‘NAME’] = ‘Classic Blue’;
$theme[48][‘PATH’] = SM_PATH . ‘themes/classic_blue2.php’;
$theme[48][‘NAME’] = ‘Classic Blue 2’;
$theme[49][‘PATH’] = SM_PATH . ‘themes/powder_blue.php’;
$theme[49][‘NAME’] = ‘Powder Blue’;
$theme[50][‘PATH’] = SM_PATH . ‘themes/techno_blue.php’;
$theme[50][‘NAME’] = ‘Techno Blue’;
$theme[51][‘PATH’] = SM_PATH . ‘themes/turquoise.php’;
$theme[51][‘NAME’] = ‘Turquoise’;
$default_use_javascript_addr_book = false;
$ldap_server[0] = array(
‘host’ => ‘127.0.0.1’,
‘base’ => ‘ou=Libreta,dc=ejemplo,dc=com,dc=ar’
);
$abook_global_file = »;
$abook_global_file_writeable = false;
$addrbook_dsn = »;
$addrbook_table = ‘address’;
$prefs_dsn = »;
$prefs_table = ‘userprefs’;
$prefs_user_field = ‘user’;
$prefs_key_field = ‘prefkey’;
$prefs_val_field = ‘prefval’;
$addrbook_global_dsn = »;
$addrbook_global_table = ‘global_abook’;
$addrbook_global_writeable = false;
$addrbook_global_listing = false;
$no_list_for_subscribe = false;
$smtp_auth_mech = ‘none’;
$imap_auth_mech = ‘login’;
$use_imap_tls = false;
$use_smtp_tls = false;
$session_name = ‘SQMSESSID’;
$config_location_base = »;
@include SM_PATH . ‘config/config_local.php’;
/**
* Make sure there are no characters after the PHP closing
* tag below (including newline characters and whitespace).
* Otherwise, that character will cause the headers to be
* sent and regular output to begin, which will majorly screw
* things up when we try to send more headers later.
*/
?>
PHPLDAPADMIN:
podriamos administrar correctamente todo lo que sigue, mediante el phpldapadmin.
Controlando el spam.
Si bien, no es un antispam, por definicion, para el control de spam, yo estoy utilizando un sistema de control, basado en listas grises. Y un producto, que funciona para postfix, que se llama, postgrey. Este producto, se basa en el rfc, de envio de correo, que cuando un correo ingresa, la primera vez, dara un error temporal, y se informara de este al SMTP de origen. Este SMTP de origen, si es un SMTP verdadero, y no un SMTP Zombie, lo que hara, es devolvernos el EMAIL. Cuando se devuelve este email, se detectara que es un mail verdadero, y se creara en memoria una tabla que validara el Mail este, y se dara paso a este mail.
para la instalacion, lo que haremos es lo siguiente
apt-get install postgrey.
y pondremos, en el archivo /etc/postfix/main.cf
que el content-filter sea el port 60000
le agregamos las siguientes lineas
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service inet:127.0.0.1:60000
Y con esto, ya estaria todo andando joya!
Golpeando Las puertas del infierno (o del cielo)
Introduccion simple al Port Knocking
Vamos a tomar una definicion de PortKnocking, que esta en la wikipedia
El golpeo de puertos (del inglés port knocking) es un mecanismo para
abrir puertos externamente en un firewall mediante una secuencia
preestablecida de intentos de conexión a puertos que se encuentran
cerrados. Una vez que el firewall recibe una secuencia de conexión
correcta, sus reglas son modificadas para permitir al host que realizó
los intentos conectarse a un puerto específico.
El propósito principal del PK es prevenir un escanéo de puertos por
parte de un atacante que busca posibles servicios vulnerables. Como
los los mismos solo se abren ante un pk correcto, los puertos donde se
brindan los servicios se muestran aparentemente cerrados.
Por lo general este mecanismo se implementa configurando un demonio
para que revise la bitácora o log del firewall para detectar esta
secuencia de intentos de conexión. Otra forma es tener un proceso
examinando paquetes con alguna interfaz de captura de paquetes, pero
esto tiene que hacerse en puertos TCP que se encuentren «abiertos».
El mayor uso del PK es para determinar acceso al puerto 22, el puerto
del Secure Shell (SSH). El golpeo en cuestión es similar a un
handshake secreto. La complejidad del mismo puede variar desde una
simple lista ordenada de intentos de conexión a puertos TCP, UDP, ICMP
u otro protocolo; hasta un hash basado en la dirección origen, tiempo
y otros factores, el cual determinará cuáles serán los puertos a
golpear.
Para la implementación, la idea es que el cliente tenga una aplicación
que ejecute el golpeo antes de acceder al servidor de manera normal.
Un demonio se encuentra escuchando en la máquina donde está el
firewall los paquetes que llegan a la misma. El utilitario del
cliente, responsable de realizar el golpeo de los puertos puede ser
desde un sencillo programa que ejecute comandos de ping, hasta un
complejo programa generador de un hash.
Generalmente no hay ninguna indicación cuando un usuario ejecuta una
secuencia errónea de PK. Simplemente el puerto que se esperaba
estuviese abierto al final de la secuencia, no lo está. Ningún paquete
es enviado al usuario en ningún momento.
A pesar de que esta técnica no ha sido ampliamente adoptada por la
comunidad, ha sido integrada en los rootkits más recientes.
Cuando habla de los rootkits, como el suckit, permiten abrir una
puerta trasera, mediante el envio de mensajes icmp.
Todos sabemos que cuando debemos proteger un puerto de los ataques de
internet, tenemos la opcion de filtrarlos, via iptables. Algunos
puertos pueden ser filtrados, para un grupo de ips, pero otros
como smtp, web, se complica aun mas.
Mas alla que con la web, podamos validar a ciertas direcciones ips
para entrar, podamos validar con usuarios/contraseñas, lo mas comun es
que un servidor web este publicando para todo el mundo. Pero
que un servidor ssh, este escuchando para todo el mundo, es algo muy
peligroso. Yo habia comentado, que uno puede utilizar reglas de
validaciones mediante ips. por ejemplo
iptables -t filter -A INPUT -s localhost -d localhost -p icmp -j ACCEPT
iptables -t filter -A INPUT -s localhost -d localhost -p udp -j ACCEPT
iptables -t filter -A INPUT -s localhost -d localhost -p tcp -j ACCEPT
iptables -t filter -A INPUT -p tcp -s 200.200.200.200 –dport 22 -j ACCEPT
iptables -t filter -A INPUT -j DROP
Con esto estariamos aceptando a 200.200.200.200 a nuestro ssh, pero
que pasa si tenemos una ip dinamica, o una notebook que pueda intentar
ingresar al puerto de ssh, desde una ip dinamica, u otra ip,
que no necesariamente sea conocida?.
Podriamos utilizar un servicio de dns dinamicos, como dyndns,
loguearnos, y luego tener algo asi como
iptables -t filter -A INPUT -p tcp -s mguazzardo.dyndns.org –dport 22
-j ACCEPT
Para ingresar con la direccion asociada a mguazzardo.dyndns.org.
Lo otro, es utilizar Port Knocking. Si bien esta nota esta basada en
portKnocking, existen varios programas e implementaciones, algunas
mejor que otras. Voy a hablar de Knockd, por la sencillez de este.
Para los que no lo conocen, les comento el programa
knockd, es basicamente, port knocking, hay que golpear antes de entrar
El programa, se activa por capa de aplicacion, y mediante mensajes
icmp modificados.
Se instala en el server, donde por ejemplo, podriamos tener cerrados
para todos, el ssh.
En el cliente, tambien se instala el paquete
debian:~# apt-get install knockd
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias… Hecho
Se instalarán los siguientes paquetes NUEVOS:
knockd
0 actualizados, 1 se instalarán, 0 para eliminar y 9 no actualizados.
Se necesita descargar 0B/26,4kB de archivos.
Se utilizarán 115kB de espacio de disco adicional despuÃ(c)s de desempaquetar.
Seleccionando el paquete knockd previamente no seleccionado.
(Leyendo la base de datos …
52952 ficheros y directorios instalados actualmente.)
Desempaquetando knockd (de …/knockd_0.5-1.1_i386.deb) …
Configurando knockd (0.5-1.1) …
Not starting knockd. To enable it edit /etc/default/knockd
Ahora supongamos, que tenemos cerrado, mediante una regla como esta.
iptables -t filter -A INPUT -j DROP
y yo quisiera entrar, entonces, deberia a mi ip, cuando ejecuto el
cliente, dejarme entrar via ssh
entonces…
una vez instalado en el servidor, debemos configurar el archivo /etc/knockd.conf
por defecto, este viene con esta configuracion
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEP
T
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEP
T
tcpflags = syn
Lo que dice, que para abrir el ssh, hay que mandar la secuencia de
ports 7000 8000 9000
(Esta secuencia puede ser cambiada).
****************** en el cliente, ejecutamos ***************
pepe:~# knock 192.168.19.129 7000 8000 9000
pepe:~# ssh 192.168.19.129
root@192.168.19.129’s password:
Linux debian 2.6.18-6-686 #1 SMP Sun Feb 10 22:11:31 UTC 2008 i686
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
debian:~# exit
logout
Connection to 192.168.19.129 closed.
pepe:~# knock 192.168.19.129 9000 8000 7000
**************************************************************************************************
Para cerrarlo, como dice ahi, habria que mandar 9000 8000 7000
Yo voy a poner , en mi reglas de iptables, la siguiente, para abrir
command = /sbin/iptables -I INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
Para no tener problemas con el Orden de Matcheo.
Recomendaciones Adicionales al ssh.
Una recomendacion adicional que realizo yo, es cambiar el puerto de
ssh por default. Esto se cambia en el archivo /etc/ssh/sshd_config
para cambiar el puerto, hacemos lo siguiente
# What ports, IPs and protocols we listen for
#Port 22
Port 22222
Por ejemplo, para ponerlo en el 22222
Despues, existen otras clausulas interesantes. Algo muy piola, seria
que los usuarios tuvieran que loguearse pero no como root, o sea,
denegar el acceso de root via ssh.
#PermitRootLogin yes
PermitRootLogin no
Tambien, podria pedir que solo dos usuarios ingresaran. marcelo, y ariel
AllowUsers marcelo, ariel
Luego, para que todo funcione como debe ser, recordemos que tenemos
que reiniciar el demonio, para hacerlo, lo hacemos
debian:~# /etc/init.d/sshd restart
Y ahi todos los cambios seran tomados!.
Conclusion:
Si bien se puede encontrar mucha mas informacion de port Knocking en
la web, esta ha sido solo una introduccion a esta interesante tecnica.
Saludos