Linux Security

Linux Security, Hacking, Databases, seguridad, Tutoriales, LDAP

  • Archivos

  • Blog Stats

    • 21.398 hits

Archive for octubre 2008

Linux Volume Manager , LVM, Tutorial

Posted by mguazzardo en octubre 28, 2008

Discos del Infierno


Introduccion a LVM.

La mayoria de las instalaciones que realizamos, usando una Distro cualquiera sea, de ellas, como puede ser debian, redhat, Tuquito o Condorlinux(1), se realizan, por lo general utilizando discos communes.

Imaginemos esto, que hacemos una instalacion, donde particionamos de la siguiente manera.
/ 10 Gb
/boot 200 mb
/var 1 Gb

Esta puede ser una tabla de particionado generico, no digo que sea la mas optima, es solo para ejemplos.

Supongamos, que nuestro directorio /var, esta lleno, por que estamos usando un servidor de correo sendmail(2), y nos quedamos sin espacio. Tambien supongamos, que tenemos todo este particionado en un disco Serial Ata , al que el sistema lo detecto como sda, y que para darle mas espacio a /var, deberia agregar un nuevo disco, y copiar todos los datos de /var/, al nuevo disco, crear la partición via fdisk, editar el /etc/fstab, y todas esas cosas que Uds, por supuesto que ya saben.

Podriamos haber evitado esto desde el principio, si en el diseño de la Instalacion Hubieramos optado por usar, LVM, o Linux Volume Manager.

Vamos a Dar una Definición de Lvm, pero para no rompernos la cabeza, voy a tomar una definición de Daniel Coletti, en su documento

“Logical Volume Manager (LVM) . Administrador de Volúmenes Lógicos”.

El LVM es un módulo que se le agrega al núcleo Linux y genera una abstracción entre los
discos físicos y los dispositivos para accederlos. Con la ayuda de herramientas de administración, el administrador puede acceder a los beneficios de utilizar LVM.
Básicamente lo que se logra es tener un nuevo dispositivo que apunta no a un disco o una
partición, sino a un grupo de discos y particiones como un todo (manejar muchos espacios de disco como si fuera un único disco).

Es importante aclarar, que si bien se puede “migrar” un OS, a LVM, lo mas conveniente es el diseño del LVM, antes del Comenzar la instalacion.

Para la siguiente explicación, Utilizare una Instalacion en vmware, sobre debian etch.

¿Por que es Importante LVM?

Es importante entender LVM ya que otros sistemas de manejadores de discos, como puede ser el de Solaris, o el de productos como veritas, utilizan conceptos similares. De hecho, se deja de pensar en un disco aislado, sino en un File System.

Conceptos a Definir.

(Tambien tomado del mismo texto, de Daniel Coletti).

Entrando en detalle vamos a encontrarnos inicialmente con tres nuevos conceptos que utiliza
el LVM, Volumen Físico, Volumen Lógico y Grupo Volumen. Los Volúmenes Físicos (VF) son los discos o particiones de un disco, los Volúmenes Lógicos (VL) son dispositivos donde se pueden crear sistemas de archivos y por último, el Grupo Volumen (GV) es un área donde se juntan los VF y VL.

Una aclaracion fundamental.

Para que el Sistema Operativo trabaje con LVM, debera esto estar soportado en el kernel. Si bien el Kernel que utiliza debian etch, ya trae por defecto el soporte a LVM y a Raid, esta aclaracion es valida por si estamos compilando nuestro propio Kernel.

Habilitando el Soporte a Raid y LVM en el Kernel:

Multi-device support (RAID and LVM). -> .Logical volumen manager (LVM)
support.

Luego, lo que debemos hacer, es instalar el soporte a LVM, para eso, lo que debemos hacer, es

debian:/#apt-get install lvm2

Vamos, a tomar una medicion de cuanto disco rigido tenemos ocupado en este momento.

debian:/# df -k
S.ficheros Bloques de 1K Usado Dispon Uso% Montado en
/dev/sda3 2877872 881244 1850440 33% /
tmpfs 128484 0 128484 0% /lib/init/rw
udev 10240 68 10172 1% /dev
tmpfs 128484 0 128484 0% /dev/shm
/dev/sda2 279999 28188 237353 11% /boot
/dev/mapper/gv1-vl1 7845572 411752 7035280 6% /var

Y luego, en el vmware, agrego un disco virtual, para hacer el sistema Volume Manager.

Lo primero que debo hacer con este disco virtual, es formatearlo.

debian:~# fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won’t be recoverable.

The number of cylinders for this disk is set to 1044.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1044, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044):
Using default value 1044

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Lo que haremos sobre esta partición creada, es montar un Volumen Logico, y luego le asignaremos el directorio /var. Luego, una vez que el Volumen Logico este creado, le agregaremos otro disco mas, de 2 GB aproximadamente.

Lo primero que hacemos, es generar

pvcreate /dev/sdc1

Con esto generamos el disco fisico, para que sea veo por el grupo de volúmenes de discos.

Luego,

vgcreate gv1 /dev/sdc1

Con esto generamos el grupo de volumenes.

Luego,

lvcreate -L 7,6 GB -n vl1 gv1

Con esto, se genera el Volumen Logico, desde cual puede ser accedido desde el Sistema Operativo.

Luego,

mkfs.ext3 /dev/gv1/vl1

Montamos la particion del volumen, par aver que todo este marchando como esperamos

mount /dev/gv1/vl1 /mnt

Copiamos todo lo del /var/ actual, a lo que va a ser el nuevo /var, que ahora esta en /mnt

Nota:

Quizas tengas que hacer

debian:/#apt-get install rsync

Luego

debian:/#rsync -ax /var/. /mnt

Luego, movemos el actual /var, a /usr (Por ejemplo, por si algo falla). Por ultimo, debemos editar el /etc/fstab, para que tenga una apariencia parecida a esta. Nota: En tu equipo seguro sera distinto, es dependiente a la tabla de particionamiento.

debian:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
#
proc /proc proc defaults 0 0
/dev/sda3 / ext3 defaults,errors=remount-ro 0 1
/dev/sda2 /boot ext3 defaults 0 2
/dev/sda1 none swap sw 0 0
/dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/gv1/vl1 /var ext3 defaults,errors=remount-ro 0 1
/dev/fd0 /media/floppy0 auto rw,user,noauto 0 0

Una vez, que hacemos esto, booteamos el equipo. Si todo anda bien, al realizar un mount, veremos algo similar a esto.

debian:~# mount
/dev/sda3 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda2 on /boot type ext3 (rw)
/dev/mapper/gv1-vl1 on /var type ext3 (rw,errors=remount-ro)

Veamos la ultima linea,

/dev/mapper/gv1-vl1 on /var type ext3 (rw,errors=remount-ro)

Esto significa, que ya tenemos un volumen logico, y en el , montado el directorio /var.

Viendo las diferencias:

Realizando un df, vemos que el tamaño ocupado en /, disminuyo, y que se genero un volumen logico.

debian:/# df
S.ficheros Bloques de 1K Usado Dispon Uso% Montado en
/dev/sda3 2877872 618312 2113372 23% /
tmpfs 128484 0 128484 0% /lib/init/rw
udev 10240 68 10172 1% /dev
tmpfs 128484 0 128484 0% /dev/shm
/dev/sda2 279999 28188 237353 11% /boot
/dev/mapper/gv1-vl1 7845572 411752 7035280 6% /var

Agregando Discos al volumen logico.

Supongamos, aunque este no es el caso, que necesitamos agregar un disco nuevo, a nuestro volumen logico. Para esto, conectamos un disco mas, que nuestro OS, lo va a detectar como sdb, y obviamente, lo formateamos.

debian:/# pvcreate /dev/sdb1
Physical volume «/dev/sdb1» successfully created
debian:/# vgextend gv1 /dev/sdb1
Volume group «gv1» successfully extended

debian:/# vgdisplay -v
Finding all volume groups
Finding volume group «gv1»
— Volume group —
VG Name gv1
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 9,99 GB
PE Size 4,00 MB
Total PE 2558
Alloc PE / Size 1946 / 7,60 GB
Free PE / Size 612 / 2,39 GB
VG UUID J3TtQI-wo2U-IQgp-DNvU-jsNz-lUo6-yPjYHW

— Logical volume —
LV Name /dev/gv1/vl1
VG Name gv1
LV UUID cqX3IW-N1Gq-xo75-NQDJ-hFyZ-p6Ia-0nVah6
LV Write Access read/write
LV Status available
# open 1
LV Size 7,60 GB
Current LE 1946
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:0

— Physical volumes —
PV Name /dev/sdc1
PV UUID gMTq2t-H27D-7X1a-vRAR-BJfo-56KW-oCR02x
PV Status allocatable
Total PE / Free PE 2047 / 101

PV Name /dev/sdb1
PV UUID Q4FSVy-IzHd-GZHx-bj0J-sW6j-7aJB-o1HW80
PV Status allocatable
Total PE / Free PE 511 / 511

debian:/# lvextend -L +1,6G /dev/gv1/vl1
Rounding up size to full physical extent 1,60 GB
Extending logical volume vl1 to 9,20 GB
Logical volume vl1 successfully resized

debian:/# resize2fs -p /dev/gv1/vl1
resize2fs 1.40-WIP (14-Nov-2006)
Filesystem at /dev/gv1/vl1 is mounted on /var; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/gv1/vl1 to 2412544 (4k) blocks.
The filesystem on /dev/gv1/vl1 is now 2412544 blocks long.

Ahora, realizaremos un df –k, para ver la nueva asignacion de espacio.

debian:/# df
S.ficheros Bloques de 1K Usado Dispon Uso% Montado en
/dev/sda3 2877872 618316 2113368 23% /
tmpfs 128484 0 128484 0% /lib/init/rw
udev 10240 68 10172 1% /dev
tmpfs 128484 0 128484 0% /dev/shm
/dev/sda2 279999 28188 237353 11% /boot
/dev/mapper/gv1-vl1 9498256 411756 8605240 5% /var

Y vemos, con en la ultima linea, disponemos de mayor espacio en var. Con esto, podemos imaginarnos un monton de utilidades.

Por ultimo, voy a dejar, un compendio de comandos que tambien voy a sacar del excelente apunte de Daniel Coletti,

Comandos de volúmenes físicos
pvchange Cambia los atributos de un volumen físico
pvcreate Crea un volumen físico
pvdata Muestra información de depuración sobre un volumen físico
pvdisplay Muestra información sobre un volumen físico
pvmove Mueve extensiones físicas de un volumen físico a otro.
pvscan Localiza y enumera todos los volúmenes físicos

Comandos de Grupo Volumen
vgcfgbackup Hace una copia del área del descriptor de grupo volumen
vgcfgrestore Recupera el área del descriptor de grupo volumen al disco
vgchange Cambia los atributos de un grupo volumen
vgck Comprueba la consistencia del área del descriptor de grupo volumen
vgcreate Crea un grupo volumen a partir de volúmenes físicos
vgdisplay Muestra los atributos de un grupo volumen
vgexport Exporta un grupo volumen del sistema
vgextend Añade volúmenes físicos a un grupo volumen
vgimport Importa un grupo volumen al sistema
vgmerge Combina dos grupos volumen
vgmknodes Combina un directorio y los archivos especiales de un grupo volumen
vgreduce Elimina volúmenes físicos de un grupo volumen
vgremove Elimina un grupo volumen
vgrename Renombra un grupo volumen
vgscan Localiza y enumera todos los grupos volumen del sistema
vgsplit Divide un grupo volumen

Comandos de Volumen Logico
lvchange Cambia los atributos de un volumen lógico
lvcreate Crea un volumen lógico
lvdisplay Muestra los atributos de un volumen lógico
lvextend Incrementa el tamaño de un volumen lógico
lvreduce Reduce el tamaño de un volumen lógico
lvremove Elimina un volumen lógico
lvrename Renombra un volumen lógico
lvscan Localiza y enumera todos los volúmenes lógicos, creando /etc/lvmtab y /etc/lvmtab.d/*

Comandos de Administración de Volúmenes Logicos

lvmchange Cambia los atributos del sistema LVM
lvmdiskscan Localiza y enumera todos los discos disponibles, los dispositivos múltiples y las particiones
lvmsadc Recoge información sobre la actividad de LVM
lvmsar Muestra información sobre la actividad de LVM

Notas:

1) El sendmail utiliza por defecto /var/spool/mail para alojar esto
2) ¿Pablo, para cuando?

Referencias:

Daniel Coletti: Administrador de Volúmenes Logicos en Linux.

Marcos Ruso: Ayuda para entender la “magia”.

Posted in Linux | Etiquetado: , , , , , | 1 Comment »

Introduccion al Squid, Tutorial de Squid

Posted by mguazzardo en octubre 28, 2008

Octopusy

Esta nota servira para mostrar una configuracion adecuada de squid, con cosas que probablemente no se ven en otros tutoriales.
Introduccion.
El squid es un proxy a nivel de aplicacion, que viene con la mayoria de las distros de linux. En particular, usare para la nota debian, por lo que lo que de
beriamos hacer, en esta ocasion, es lo siguiente.

debian:~# apt-get install squid
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias… Hecho
Se instalarán los siguientes paquetes extras:
squid-common
Paquetes sugeridos:
squidclient squid-cgi logcheck-database resolvconf smbclient
Se instalarán los siguientes paquetes NUEVOS:
squid squid-common

Esto nos bajara el squid, en nuestra pc, y de aca, lo que deberemos hacer, es configurar el archivo /etc/squid/squid.conf.
pero antes, deberemos tener en cuenta, que antes, el squid, genera archivos de logueo, en /var/log/squid/, y que estos seran muy importantes, para en el
futuro poder ver la actividad del proxy.

Empezando.

Veremos los archivos de configuracion:
Directivas:

Las directivas en el squid, son los parametros a pasar. Asi , por ejemplo, es normal, que el http_port (Puerto de Squid), este seteado en el port 3128,
pero tambien, mucha gente lo usa en el 8080 (Como lo usaba el viejo Proxy de Microsoft).
¿Como cambiar esto?.
Sencillo, deberemos ubicar la directiva
http_port 3128
y la cambiamos a
http_port 8080
Visible Hostname
Existe una clausula, llamada visible hostname, que es muy importante. En esta clausula, se define el nombre del proxy
por ejemplo
visible_hostname proxy.midominio.com.ar
Es muy importante que este clausula este correctamente seteada, sino, no se podra iniciar el servicio de squid.

ACLS:

Bueno, aca empieza la parte fundamental del funcionamiento del squid. Todos sabemos que la funcion primordial del squid, es el filtrado de contenido. Las
acls, lo que hacen, precisamente es ello.
Por ejemplo, vamos a ver lo siguiente
acl redlocal src 192.168.4.0/24
Que significa todo esto?
Se define una acl llamada red local, y se define como src (origen), todo lo que viene desde la red, 192.168.4.0/24, o sea toda la red con mascara 2
255.255.255.0.
Esta es una ACL mas bien sencilla, ya veremos mas adelante, como se complicara todo.
Paso a paso:

Insertaremos la nueva acl, en el archivo de configuracion simplificado, le hemos sacado todos los comentarios a nuestro archivo, para una mejor compresion

http_port 3128
visible_hostname proxy.midominio.com.ar
acl redlocal src 192.168.4.0/24
#Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access allow red_local
http_access deny all

Digamos que con esta minima configuracion, tenemos acceso a toda la red, 192.168.4.0/24, sin ningun tipo de restricciones. Ahora bien, supongamos que por
un enlace punto a punto, o tambien podria ser via vpn, o diversas configuraciones locales, tenemos una red, por ejemplo en Villa Dolores(Cba). Definiremos
esa red
acl villa_dolores 192.168.5.0/24
donde es obvio, que estamos dejando pasar a toda la red 192.168.5.0/24

Complicando un poco mas, y entendiendo la sintaxis de las acls.

Veremos, en un primer momento, yo quisiera que toda la red de villa dolores, tenga acceso a internet, pero que no pueda descargarse archivos.
esto ya se esta complicando aun un poco mas, por eso, deberemos primero generar una acl archivos, y ya veremos como.
acl archivos urlpath_regex «/etc/squid/archivos»
aca vemos, que usaremos una regex(Expresion regular), para ver que tipos de archivos estan envueltos en esta regla. Obviamente, como la mayoria habra
supuesto, existira un archivo llamado /etc/squid/archivos. En caso de no existir este archivo, al restartear squid, seremos informados.
en el archivo, /etc/squid/archivos, pongo lo siguiente

exe
avi
mp3
mpeg
mp4
rad

Y con esto, agregamos estos tipos de archivos a la acl archivos. Ahora veremos como aplicar esta acl.
Supongamos que a la red de villa dolores, le quisiera dar internet, pero no quisiera que se pudieran bajar de una pagina, los siguientes archivos, entonces,
generaria una regla del siguiente tipo

http_access allow villa_dolores !archivos

como vemos, el !archivos, funciona como un NOT. entonces, dejara pasar la acl definida en villa_dolores, que es que toda la red 192.168.5.0 pueda navegar,
pero no dejare que bajen los archivos.

Viendo otro ejemplo mas

Supongamos ahora mismo, que queremos filtrar una gran cantidad de palabras obsenas, como puede ser, (vamos, las que uds. ya conocen!!).
generamos una acl, que ahora, tenga como sentido el filtro de palabras.
acl filtrar url_regex «/etc/squid/filtrar»
con esto, el url_regex, filtrara las palabras que estaran en el archivo filtrar
en el archivo filtrar por ejemplo ponemos
pedofilia
gays
travestis
Y si en la url destino, encontraramos esas palabras, se denegaria el acceso.

filtro MSN:

Esto me costo bastante, y fue mas bien viendo por donde se metia el msn, en los logs del squid.
acl filtro_msn dstdomain «/etc/squid/msn»
aca vemos la directiva dstdomain. Se filtrara por el dominio de destino, que estara especificado en /etc/squid/msn
en ese archivo, pondremos.

gateway.messenger.hotmail.com
login.live.com
login.live.com:443
messenger.hotmail.com
messenger.msn.com
messenger.microsoft.com
echo-v1.msgr.hotmail.com
echo-v2.msgr.hotmail.com
echo-v3.msgr.hotmail.com
echo-v4.msgr.hotmail.com
echo-v5.msgr.hotmail.com
echo-v6.msgr.hotmail.com
echo-v7.msgr.hotmail.com
echo-v8.msgr.hotmail.com
echo-v9.msgr.hotmail.com
echo-v10.msgr.hotmail.com
g.msn.com
rsi.hotmail.com
config.messenger.msn.com

y con esto, nos aseguramos que no se puedan conectar al msn. Si bien anteriormente al MSN Live, se podia hacer una regla por aplicacion, pero ahora ya no.
entonces, simplificando, imaginemos que queremos que la red de villa dolores, no tenga ni msn, ni baje archivo, ni vea paginas con palabras prohibidas,
generamos la siguiente acl.
http_access allow villa_dolores !filtro_msn !archivos !filtrar
con esto, demostramos que se puede filtrar, y usando la logica, podemos incluir muchisimas directivas.

Configuracion final del /etc/squid/squid.conf

http_port 3128
visible_hostname proxy.midominio.com.ar
acl redlocal src 192.168.4.0/24
acl villa_dolores src 192.168.5.0/24
acl filtrar url_regex «/etc/squid/filtrar»
acl filtro_msn dstdomain «/etc/squid/msn»
acl archivos urlpath_regex «/etc/squid/archivos»

#Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access allow red_local
http_access allow villa_dolores !filtro_msn !archivos !filtrar
http_access deny all


Otros tipos de configuraciones y directivas:

Existe la posibilidad de filtrar por horario de trabajo, por grupos y dominios (Para eso utilizaremos Winbind, si queremos unir el server a un dominio),
o tambien, la posibilidad de conectar a un arbol de directorio LDAP, (OpenLdap, Novell eDirectory, y tambien hasta a Microsoft Active Directory).
Tambien existe la validacion basica, usuario a usuario.

Vamos por el log

Si nosotros quisieramos visualizar la actividad del squid, deberiamos buscar esto en el archivo de log del squid (/var/log/squid/squid.log)

Continuara.

Posted in Linux | Etiquetado: , , , , | 4 Comments »

Un articulo de DNS viejo. Introduccion a BIND

Posted by mguazzardo en octubre 28, 2008

Configurando un Servidor de DNS

Gente, aca les dejo un articulo sobre dns que hice en el 2000!, hace ya 8 años!

Configurando un Servidor De DNS

Este articulo tiene como fin configurar un servidor de dns. Muchos se estaran
preguntando que es un servidor de DNS. Primero, comenzaremos por la definicion
del servidor de DNS. Domain Name Server,
o sea Servidor de Nombres de
Dominios.

En un principio, en internet todas las maquinas tenian asignados numeros ip, y
al no haber tantas maquinas, se podrian llegar a ubicar estas facilmente por
un numero. El ejemplo seria, la Universidad
de Carolina tiene el ip
25.234.23.21, y la Universidad de London, el 23.43.23.12. Las comunicaciones
se establecian al principio entre los dos numeros, o sea que 25.234.23.21 se
comunicaba con 23.43.23.12.

A medida que Internet crecia, estos numeros se anotaban en un archivo que se
llamaba hosts.txt, y
este se lo ponia en cada maquina.

Este archivo tenia el formato siguiente:

(ip) Fqdn

192.168.0.1 jak0.qqmelo.com.ar
192.168.0.2 netg4s.qqmelo.com.ar
192.168.0.3 ]-[eavy.qqmelo.com.ar

pero, imaginemosnos que mientras crecia internet, se tenian que copiar estos
nombres a diario, y
que cada Maquina con conexion a internet, se lo tendria
que actualizar, cosa que seria por demas engorrosa.

Actualmente, este archivo se llama host, y se encuentra en los linux, dentro
del directorio /etc.
(Para redes Peque~as, este archivo sirve, cuando las redes crecen este archivo
tiende a ser inutil, por
lo cual se busco otra solucion, que es el sistema
DNS).

Bind 8

La mayor parte de los sistemas DNS, utilizan el BIND ( Berkeley
Internet Name Domain ),
que podemos ver dos versiones tipicas, la version 4 y
la version 8. En nuestro caso analizaremos la
version 8, ya que es la que
actualmente se esta usando. La nueva version es mas sencilla de configurar y
trae ciertas mejoras en el aspecto de seguridad, a la vez que incorpora una
nueva sintaxis.

Comenzando:

Se ha dicho que instalar y configurar un sistema DNS no es sencillo
( Cuanta razon!!! ), pero
el fin de este texto es demistificar eso.

Lo que vamos a hacer, es mostrar dns y como configurarlos, paso a paso,
y tratando de
encontrar los errores mas comunes.

Planteamiento:

Para esto, lo que vamos a hacer es mostrar ejemplos sencillos de
configuracion.
Definiremos zona, dando a entender por zona los dominios que querramos
registrar.

Queremos que nuestro dns sirva para resolver a todas las pc que se encuentran
en la zona lam0s.com.ar
y que si queremos consultar una pc de esta zona, se
devuelva una respuesta que pertenece a ella.

Ejemplo:

Segun el registro de la nic, la ip 203.203.203.203, esta asignada a la
zona lam0s.com.ar.

Ahora, nosotros nos ocuparemos de setear el archivo para que se resuelva
correctamente la ip.
Veamos paso a paso como realizar esto.

1- Necesitaremos crear un archivo de configuracion, de zona, que desde el bind
8, este se encuentra
bajo el directorio /etc.

Este archivo es llamado named.conf, y tiene la siguiente estructura.
zone «lam0s.com.ar» {
type master;
file «db.lam0s.com.ar»
}

analizando este archivo veremos lo siguiente:

Primero, que se define la zona lam0s.com.ar, y alli se dice que
va a ser una zona
master ( o sea primaria ) y se indica que el file ( archivo
de configuracion se encuentra en db.lam0s.com.ar ), ustedes se estaran
preguntando, si, pero donde lo encuentro??, tranquilos amigos
que
anteriormente hay unas lineas en este mismo archivo que indican donde estaran
alojadas las zonas.

options {

directory «/var/named»
}

Con esto, le indico que todas las zonas estaran alojadas en el
directorio var/named

Siguiendo, veremos en un caso practico, como configurar las zonas
correctamente.
Hemos dicho, que el archivo db.lam0s.com.ar, resuelve los hosts de esta
zona, vamos a ver
este archivito, y luego vamos a ir entendiendo como crear
correctamente los otros archivos.

Este es el archivo db.lam0s.com.ar

lam0s.com.ar. IN SOA QQm310.lam0s.com.ar. lam0s.com.ar. (

2000121997; numero de serie
28800 ; tiempo de refresco en minutos
14000 ; caducidad de una peticion
86400; minimo de tiempo vivo
)

IN NS QQm310.lam0s.com.ar

QQm310.lam0s.com.ar. IN A 203.203.203.203
netg4s.lam0s.com.ar. IN A 203.203.203.204
velez.lam0s.com.ar. IN A 203.203.203.205

Analicemos un Poquito esto!

de entrada , en la primera linea, vemos lo siguiente lam0s.com.ar. , que
es esto, Pues es nuestra
Zona!!!, luego vemos IN, este registro significa
Internet, significa que sera dada de alta en Internet,
Luego seguimos viendo algo asi como SOA ( start of autority, o sea, comienzo
de autoridad, y aqui
nos daremos cuenta que la maquina donde esta alojando el
servidor DNS es QQm310.com.ar )

Luego, las caracteristicas , tiempo de refresco, tiempo de peticion , etc, y
luego comienza lo que
a todos nos interesa, y donde nos detendremos!!!

Vemos nuevamente IN NS
NS es el registro encargado de indicar cual va a ser el servidor de
nombres , el cual debe coincidir con el de comienzo de autoridad, o sea
QQm310.lam0s.com.ar.

Luego, vemos la siguiente linea.

QQm310.lam0s.com.ar. IN A 203.203.203.203

Y esto que significa??

Tranquilos!!!!!!!!!!!

veamos, esto es simple!!!

QQm310.lam0s.com.ar. es el nombre de la pc, IN es el registro de internet y A
( de Address, significa
que le va a transformar la direccion
QQm310.lam0s.com.ar. a 203.203.203.203). simple no?

Bueno, asi seguiremos con los otros host de nuestra red!

Nombres Canonicos y alias

Pero, la pagina web lam0s.com.ar esta en el mismo ip que QQm310.lam0s.com.ar,
como lo defino?
repito la definicion???? NOOOOOOOO, pues esto podria lograr que el sistema
termie funcionando mal,
entonces una solucion es los nombres canonicos ( alias
), veamos que es esto

Introducimos la linea

http://www.lam0s.com.ar. IN CNAME QQm310.lam0s.com.ar.

y aqui le indico que las peticiones a la pagina http://www.lam0s.com.ar. apunten a
QQm310.lam0s.com.ar.
que en realidad apunta a 203.203.203.203, que es el servidor de DNS.

o sea, que nuestra zona quedaria de la siguiente manera!!

lam0s.com.ar. IN SOA QQm310.lam0s.com.ar. lam0s.com.ar. (

2000121997; numero de serie
28800 ; tiempo de refresco en minutos
14000 ; caducidad de una peticion
86400; minimo de tiempo vivo
)

IN NS QQm310.lam0s.com.ar

QQm310.lam0s.com.ar. IN A 203.203.203.203
netg4s.lam0s.com.ar. IN A 203.203.203.204
velez.lam0s.com.ar. IN A 203.203.203.205
QQm310.lam0s.com.ar. IN CNAME 203.203.203.203

Zonas Reversas!!!!

Listo, ya tenemos nuestro servidor de DNS andando correctamente para
las zonas directas
o «derechas en la jerga!», pero aun no resolvimos el tema
de las peticiones inversas, por ejemplo
yo quisiera que al consultar
203.203.203.203, me dijeran QQm310.lam0s.com.ar

Para lograr esto, deberia configurar la zona inversa!

Primero, haremos la entrada correspondiente en el /etc/named.conf

zone «203.203.203.in-addr.arpa» {
type master;
file «db.203.203.203.in-addr.arpa»
}

Pero ustedes se preguntaran, ehh? y esto??, que es ese
203.203.203.in-addr.arpa?

La respuesta es que las zonas inversas se escriben asi, y que esto
resolvera las
peticiones correspondientes a la 203.203.203.x, donde setearemos
nosotros esos x.

Como supondran, tambien tendremos que configurar el archivo
correspondiente, de la
zona reversa, pero la repuesta es, ovbio, que
inteligente que son mis lectores y/o alumnitos!
(:-)) )

Configuraremos el archivo db.203.203.203.in-addr.arpa

203.203.203.in-addr.arpa IN SOA QQm310.lam0s.com.ar. lam0s.com.ar. (

2000121997; numero de serie
28800 ; tiempo de refresco en minutos
14000 ; caducidad de una peticion
86400; minimo de tiempo vivo
)

IN NS QQm310.lam0s.com.ar

203 IN PTR QQm310.lam0s.com.ar.
204 IN PTR netg4s.lam0s.com.ar.
205 IN PTR velez.lam0s.com.ar.

y vemos que sencillo que es !!!

Lo primero es declarar la zona a configurar, y luego, lo otro como lo venimos
realizando de costumbre
solo que tenemos que invertir los datos.
Vemos que tenemos el registro PTR este significa puntero, y dice que la
direccion 203
de la zona 203.203.203. apunta a QQm310.lam0s.com.ar.

OJO!!!!!!!!!!!!!!!

mucha gente se equivoca aqui, y pone 203.203.203.203, y esto buscara el
ip 203.203.203.203.203.203.230, cosa que no existe, por que recordemos que
como he dicho
anteriormente, la zona es 203.203.203.in-addr.arpa, y aca en
in-addr.arpa, se reemplazaran las
direcciones que seteemos, por ejemplo 203,
204, 205, que seran reemplazadas por los x.

Reiniciando el Demonio

Para que los cambios tengan efecto, tendremos que reiniciar el demonio,
el cual esta
alojado en /etc/rc.d/init.d/

la orden seria la siguiente:

#/etc/rc.d/init.d/named stop
#/etc/rc.d/init.d/named start

Configurando el cliente DNS

Para realizar estas pruebas, lo primero que debemos es indicarle a
nuestra maquina
donde encontrara el servidor DNS.
El archivo de configuracion es el /etc/resolv.conf, y veremos como
setearlo correctamente.

veamos: lo configuraremos para que sea nuestro servidor DNS 203.203.203.203.

entonces, ponemos lo siguiente

nameserver 203.203.203.203

Probando si las cosas andan bien:

Con el comando nslookup, podremos ver si nuestro servidor funciona joya

#nslookup http://www.lam0s.com.ar

Server: QQmelo.lam0s.com.ar
Address: 203.203.203.203

Name: http://www.lam0s.com.ar
Address:203.203.203.203

y esto significa que nuestro server anduvo de primera!!!!!!!!!!!!!!!!!

si tuvieramos un error, tendriamos que ver los archivos de configuracion, para
que no haya errores,
cuando la experiencia me dice que la mayoria de los
errores que se presentan son de tipeado,
y bueno, somos humanos !!!

Resumiendo!!

Mostrare como Quedarian los archivos que fui nombrando

el primer archivo, el /etc/named.conf

options {

directory «/var/named»
}

zone «.» {

type hint;
file «named.ca»;
};

zone «0.0.127.in-addr.arpa» {

type master;
file «named.local»

}

zone «lam0s.com.ar» {
type master;
file «db.lam0s.com.ar»
}

zone «203.203.203.in-addr.arpa» {
type master;
file «db.203.203.203.in-addr.arpa»
}

Bueno, ustedes diran, hay unas zonas que anteriormente no he nombrado, es
cierto, son las zonas
raices, donde tiene la mayoria de los dns de los
servidores raices por paises, esa es la zona «.»
y luego la zona de loopback.

Luego, veremos los archivos que pusimos en /var/named, ademas de lo que estan
alli, named.local y
named.root ( los que hablamos recien )

lam0s.com.ar. IN SOA QQm310.lam0s.com.ar. lam0s.com.ar. (

2000121997; numero de serie
28800 ; tiempo de refresco en minutos
14000 ; caducidad de una peticion
86400; minimo de tiempo vivo
)

IN NS QQm310.lam0s.com.ar

QQm310.lam0s.com.ar. IN A 203.203.203.203
netg4s.lam0s.com.ar. IN A 203.203.203.204
velez.lam0s.com.ar. IN

y ahora la reversa

203.203.203.in-addr.arpa IN SOA QQm310.lam0s.com.ar. lam0s.com.ar. (

2000121997; numero de serie
28800 ; tiempo de refresco en minutos
14000 ; caducidad de una peticion
86400; minimo de tiempo vivo
)

IN NS QQm310.lam0s.com.ar

203 IN PTR QQm310.lam0s.com.ar.
204 IN PTR netg4s.lam0s.com.ar.
205 IN PTR velez.lam0s.com.ar.

luego, no se olviden de Poner el cliente DNS

/etc/resolv.conf

nameserver 203.203.203.203

Configurando Virtual Domains

Pero Bueno, ustedes estaran preguntandose, eh, yo tengo varias zonas, y tan
solo un ip, este Qqm310 nos esta chamuyando :-))))

Entonces, nada mas simple que armar virtual domains. Como lo hacemos??

Lo primero es declarar la zona virtual en el /etc/named.conf.

Una vez declarado aqu¡, lo que sigue es mas bien simple, definir la zona en
/var/named…. mmmm pasaremos a la practica de lo anteriormente dicho.

Supongamos que queremos una zona virtual llamada velezito.com.ar

entonces, lo que debemos hacer, es crear esta zona en el /etc/ named.conf

Hagamoslo!!!

zone «velezito.com.ar» {
type master;
file «db.velezito.com.ar»
}

Con esto, lo hemos declarado en el /etc/named.conf, y esto lo que hara es
buscarlo en
el archivo db.velezito.com.ar, del /var/named.

Definiendo la zona:

velezito.com.ar. IN SOA QQm310.lam0s.com.ar. lam0s.com.ar. (

2000121997; numero de serie
28800 ; tiempo de refresco en minutos
14000 ; caducidad de una peticion
86400; minimo de tiempo vivo
)

IN NS QQm310.lam0s.com.ar
http://www.velezito.com.ar. IN A 203.203.203.203

Y como vemos, el domain velezito.com.ar apunta a nuestro ip publico,
viendo que no tenemos nada mas que hacer, podremos hacer los dns que
querramos.

Apendice:

Como el txt este lo hice a las chapas, me saltee un par de vocablos
tecnicos.

Tipos de regustros:

SOA: Comienzo de Autoridad

NS: Servidor de Nombres

A: Registro de direccion.

PTR: Registro Puntero.

MX: Intercambiador de Correo.

CNAME: Nombre canonico o Aceptado.

RP y TXT: Entradas de documentacion.

Posted in Linux | Etiquetado: , , , | 1 Comment »

POSTFIX LDAP , DEMISTIFICANDO POSTFIX

Posted by mguazzardo en octubre 28, 2008

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 cielo PortKnocking

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

Posted in Linux | Etiquetado: , , , , , , , , | Leave a Comment »

Introduccion a los servicios de directorios

Posted by mguazzardo en octubre 28, 2008

Configurando un NIS en debian

Esta es la primera parte de una serie de notas, sobre como seria la correcta configuracion de servicios de Directorios en debian.
Comenzaremos con NIS, para luego dirigirnos hacia OPENLDAP.

Nis nos provee un sistema de passwords centralizados, al estilo, dentro de una red.

El esquema de esto, funciona asi.

Debian: Servidor
Marcelo y pepe : clientes

Existiria un Servidor de Cuentas, donde se alojan todas las cuentas, y los clientes.

En el servidor , deberiamos instalar el software nis (Que es el mismo para cliente y Servidores)

debian:~# apt-get install nis
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias… Hecho
Se instalarán los siguientes paquetes extras:
libdbus-1-3 libdbus-glib-1-2 libslp1 make portmap
Paquetes sugeridos:
slpd openslp-doc make-doc-non-dfsg
Paquetes recomendados
dbus
Se instalarán los siguientes paquetes NUEVOS:
libdbus-1-3 libdbus-glib-1-2 libslp1 make nis portmap
0 actualizados, 6 se instalarán, 0 para eliminar y 50 no actualizados.
Necesito descargar 1095kB de archivos.
Se utilizarán 3437kB de espacio de disco adicional después de desempaquetar.
¿Desea continuar [S/n]? s

Definimos el domainanme

para eso, ponemos

debian:/var/yp# domainname qqmelo.com.ar

para ver que todo marcha bien, podremos hacer

debian:/var/yp# cat /etc/defaultdomain
qqmelo.com.ar

Una vez que llegamos aca, debemos setear el archivo /etc/default/nis

Cambiamos estas lineas

NISSERVER=false
por
NISSERVER=true

NISCLIENT=true
por
NISCLIENT=false

Y PONEMOS

NISMASTER=true

Ya esta!.
Ahora, probaremos con un usuario, para que este despues pueda entrar en cualquier cliente

generamos el usuario demo, con password demo

debian:/var/yp# useradd -m prueba
debian:/var/yp# passwd prueba
Enter new UNIX password:
Retype new UNIX password:
passwd: contraseña actualizada correctamente

Por alli, habia leido yo, que habia que hacer algo en el shadow, y en el passwd, pero la verdad, que a mi
me funciono de una.

Lo que realizamos ahora, es, generar los servicios, y las capas nis.

Para levantar los servicios, hacemos lo siguiente

Obviamente en el server, (debian)

/usr/sbin/ypserv start

/usr/sbin/rpc.yppasswd

/usr/sbin/rpc.ypxfrd

Y luego, creamos el mapa NIS

para esto tipeamos,

debian:/var/yp# /usr/lib/yp/ypinit -m

At this point, we have to construct a list of the hosts which will run NIS
servers. debian.nada.com.ar is in the list of NIS server hosts. Please continue to add
the names for the other hosts, one per line. When you are done with the
list, type a .
next host to add: debian.nada.com.ar
next host to add:
The current list of NIS servers looks like this:

debian.nada.com.ar

Is this correct? [y/n: y] y
We need a few minutes to build the databases…
Building /var/yp/qqmelo.com.ar/ypservers…
Running /var/yp/Makefile…
make[1]: se ingresa al directorio `/var/yp/qqmelo.com.ar’
Updating passwd.byname…
Updating passwd.byuid…
Updating group.byname…
Updating group.bygid…
Updating hosts.byname…
Updating hosts.byaddr…
Updating rpc.byname…
Updating rpc.bynumber…
Updating services.byname…
Updating services.byservicename…
Updating netid.byname…
Updating protocols.bynumber…
Updating protocols.byname…
Updating netgroup…
Updating netgroup.byhost…
Updating netgroup.byuser…
Updating shadow.byname…
make[1]: se sale del directorio `/var/yp/qqmelo.com.ar’

Con esto, se actualiza la informacion de los dominios.

vamos nuevamente a generar otro usuario

debian:/var/yp# useradd pain
debian:/var/yp# passwd pain
Enter new UNIX password:
Retype new UNIX password:
passwd: contraseña actualizada correctamente

Ahora, veamos, nosotros nos encontramos bajo el directorio /var/yp

lo que vamos a hacer, es actualizar la informacion de este usuario, a las paginas amarillas,
para eso hacemos

debian:/var/yp# make
make[1]: se ingresa al directorio `/var/yp/qqmelo.com.ar’
Updating passwd.byname…
Updating passwd.byuid…
Updating group.byname…
Updating group.bygid…
Updating netid.byname…
Updating shadow.byname…
make[1]: se sale del directorio `/var/yp/qqmelo.com.ar’

Y este usuario ha sido agregado correctamente al dominio.

Ahora veremos si estan todos los servicios corriendo, para eso hacemos rpcinfo -p

debian:/var/yp# rpcinfo -p
programa vers proto puerto
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100004 2 udp 935 ypserv
100004 1 udp 935 ypserv
100004 2 tcp 938 ypserv
100004 1 tcp 938 ypserv
100009 1 udp 945 yppasswdd
600100069 1 udp 948 fypxfrd
600100069 1 tcp 950 fypxfrd

Y esta todo corriendo!

Configuracion de los clientes NIS!

para esto, lo que debemos hacer, es instalar en cada cliente NIS, el paquete nis, como ya lo habiamos configurado

Luego, corremos

domainname qqmelo.com.ar

Luego, en /etc/yp.conf, debemos poner

ypserver qqmelo.com.ar

Para que sepa a que dominio debera bindearse, esto buscara por broadcast el domino qqmelo.com.ar
lo hara el demonio ypbind).

Por ultimo, hay que configurar el archivo /etc/nsswitch.conf, y agregar en cada campo al final la palabra nis
deberia quedar como este

marcelo:~# cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference’ and `info’ packages installed, try:
# `info libc «Name Service Switch»‘ for information about this file.

passwd: compat nis
group: compat nis
shadow: compat nis

hosts: files dns nis
networks: files nis

protocols: db files nis
services: db files nis
ethers: db files nis
rpc: db files nis

netgroup: nis

al final del archivo /etc/passwd se agrega la siguiente linea

+::::::

y finalmente, lanzamos el demonio

ypbind

Posted in Linux | Etiquetado: , , , , , | Leave a Comment »