Como instalar OpenLDAP en Debian7/Ubuntu13.04 con soporte GnuTLS

OpenLDAP LogoPara quienes trabajamos realizando montajes de servidores usando GNU/Linux y Software Libre, OpenLDAP viene convirtiéndose en una de esas herramientas de «uso obligatorio» en todo montaje medianamente ambicioso.

Pero, ¿Que es OpenLDAP?

Vamos por partes… ¿Que es LDAP?

Según la Wikipedia

LDAP son las siglas de Lightweight Directory Access Protocol (en español Protocolo Ligero de Acceso a Directorios) que hacen referencia a un protocolo a nivel de aplicación que permite el acceso a un servicio de directorio ordenado y distribuido para buscar diversa información en un entorno de red. LDAP también se considera una base de datos (aunque su sistema de almacenamiento puede ser diferente) a la que pueden realizarse consultas.

En resumen…
El protocolo LDAP nos permite crear un directorio (muy similar a un directorio telefónico) para nuestra organización, facilitando la organización de los diferentes objetos (Usuarios, Grupos, Dispositivos, etc) en una estructura jerárquica (similar a un árbol). simplificando la creación de «perfiles» para cada uno de los objetos que conforman nuestro directorio; muy útil para otorgar permisos de acceso (autorización) a los diferentes servicios/recursos que ofrezcamos en nuestra organización.

En una definición mucho mas simple, un directorio LDAP es una base de datos optimizada para llevar a cabo operaciones de lectura.

Ahora si, ¿Que es OpenLDAP?

OpenLDAP es una implementación libre del protocolo LDAP, licenciado bajo la OpenLDAP Public Licence cuyas principales características son:

  • Soporte IPV6
  • Soporte para referrals (distribuido)
  • UTF-8 como codificación de caracteres por defecto
  • Soporte para autenticación usando Kerberos, SASL, CRAM-MD5
  • Soporte para el protocolo LDAPv3
  • Soporte para TLS
  • Soporte para Proxy LDAP
  • Backends Disponibles: DBD (obsoleto), HDB, LDIF y NDB
  • Soporte para LDAP Monitor
  • Soporte para ldap-dnssrv o búsqueda de servicios LDAP usando registro SRV
  • Soporte para llamadas a procedimientos remoto o RPC
  • Gran cantidad de Overlays disponibles (piezas de código que proveen características adicionales. Mayormente al backend de almacenamiento)

Si deseas ahondar aún mas en el proyecto, te invito a que visites su sitio web http://www.openldap.org

OpenLDAP se divide en 3 grandes componentes

  • Demonio de servidor (slapd)
  • Librerías para interactuar con el directorio
  • Herramientas de gestión (ldapsearch, ldapmodify, ldapadd, ldapindex, entre otras)

Manos a la obra

Instalación

Tanto en Debian, como en Ubuntu al instalar el paquete slapd, por defecto se crea un nuevo árbol de directorio usando los datos del dominio plasmados en el archivo /etc/hosts, por lo tanto, si en nuestro archivo hosts, tenemos lo siguiente:

127.0.1.1 debianpruebas.slabinfo.com.co debianpruebas

El instalador, creará automáticamente el siguiente árbol de directorio (BaseDN):

dc=slabinfo,dc=com,dc=co

Aclarado el punto anterior, instalamos OpenLDAP y sus utilidades usando APT

sudo apt-get install slapd ldap-utils

El instalador nos solicitará una contraseña para el administrador del nuevo árbol de directorio (cn=admin, dc=slabinfo,dc=com,dc=co), es aconsejable crear una contraseña segura para proteger de mirones no autorizados nuestro directorio.

Configuración inicial del directorio

El servidor slapd, tanto en Ubuntu, como en Debian, usa el estilo de configuración cn=config o «configuración al vuelo», por lo que dicha configuración se hace a base de archivos de texto usando el formado LDIF (LDAP Data Interchange Format).

Estructura del directorio

En este punto cada cual puede adaptar dicha configuración según sus necesidades, yo suelo usar un árbol de directorio estructurado así:

   dc=slabinfo,dc=com,dc=co
    +ou=usuarios
    | +uid=john
    | +uid=jhondoe
    |  ...
    |
    +ou=grupos
    | +cn=sistemas
    | +cn=contabilidad
    |  ...
    |
    +ou=equipos
    | +cn=estacion1
    | +cn=estacion2
    |  ...
    |
    +ou=servicios
    | +cn=squid
    | +cn=samba
    |  ...
    |
    +cn=admin

Comenzamos creando un archivo de texto LDIF y lo guardamos con el nombre estructura-directorio.ldif:

dn: ou=usuarios,dc=slabinfo,dc=com,dc=co
objectClass: organizationalUnit
ou: usuarios

dn: ou=grupos,dc=slabinfo,dc=com,dc=co
objectClass: organizationalUnit
ou: grupos

dn: ou=equipos,dc=slabinfo,dc=com,dc=co
objectClass: organizationalUnit
ou: equipos

dn: ou=servicios,dc=slabinfo,dc=com,dc=co
objectClass: organizationalUnit
ou: servicios

Luego, aplicamos los cambios al directorio con el comando:

ldapadd -x -D cn=admin,dc=slabinfo,dc=com,dc=co -W -f estructura-directorio.ldif
Enter LDAP Password:
adding new entry "ou=usuarios,dc=slabinfo,dc=com,dc=co"

adding new entry "ou=grupos,dc=slabinfo,dc=com,dc=co"

adding new entry "ou=equipos,dc=slabinfo,dc=com,dc=co"

adding new entry "ou=servicios,dc=slabinfo,dc=com,dc=co"

Creamos 2 usuarios de prueba (john y jhondoe) en nuestro directorio, creamos el archivo estructura-usuarios.ldif.

dn: uid=john,ou=usuarios,dc=slabinfo,dc=com,dc=co
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Ortiz Roman
givenName: John Edisson
cn: John Edisson Ortiz Roman
displayName: John Edisson Ortiz
uidNumber: 10000
gidNumber: 1000
userPassword: contrasena_segura
gecos: John Edisson Ortiz Roman
loginShell: /bin/false
homeDirectory: /home/john

dn: uid=johndoe,ou=usuarios,dc=slabinfo,dc=com,dc=co
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: johndoe
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 10001
gidNumber: 1001
userPassword: contrasena_segura
gecos: John Doe
loginShell: /bin/false
homeDirectory: /home/johndoe

y los añadimos al directorio con el comando:

ldapadd -x -D cn=admin,dc=slabinfo,dc=com,dc=co -W -f estructura-usuarios.ldif
Enter LDAP Password:
adding new entry "uid=john,ou=usuarios,dc=slabinfo,dc=com,dc=co"

adding new entry "uid=johndoe,ou=usuarios,dc=slabinfo,dc=com,dc=co"

finalmente los grupos sistemas y contabilidad, para ello, creamos el archivo estructura-grupos.ldif:

dn: cn=sistemas,ou=grupos,dc=slabinfo,dc=com,dc=co
objectClass: posixGroup
objectClass: top
cn: sistemas
gidNumber: 1000
memberUid: john

dn: cn=consultoria,ou=grupos,dc=slabinfo,dc=com,dc=co
objectClass: posixGroup
objectClass: top
cn: consultoria
gidNumber: 1001
memberUid: jhondoe

Nuevamente el comando ldapadd será nuestro aliado.

ldapadd -x -D cn=admin,dc=slabinfo,dc=com,dc=co -W -f estructura-grupos.ldif
Enter LDAP Password:
adding new entry "cn=sistemas,ou=grupos,dc=slabinfo,dc=com,dc=co"

adding new entry "cn=consultoria,ou=grupos,dc=slabinfo,dc=com,dc=co"

Como se puede observar, creamos 4 unidades organizacionales (usuarios, grupos, servicios y equipos), 2 usuarios (john y jhondoe) y 2 grupos (sistemas y contabilidad), a la vez que «matriculamos» al usuario john en el grupo sistemas y a johndoe en contabilidad.

Por ahora no haremos uso de las unidades organizacionales servicios y equipos, pues entraremos en detalles sobre las mismas en futuros artículos cuando expliquemos como hacer para que samba y squid usen LDAP en sus procesos de autenticación.

Ya tenemos nuestra estructura terminada, ahora a habilitar el soporte para GnuTLS.

Activando el soporte GnuTLS

GnuTLS es una implementación libre y de código abierto de los protocolos SSL y TLS permitiendo establecer comunicaciones seguras entre clientes y servidores en la capa de red.

Para hacer uso de TLS en nuestro servidor LDAP, requeriremos de mínimo 1 certificado público y una clave privada. En nuestro caso en particular, crearemos además una CA (Autoridad Certificadora) la cual va a firmar el certificado que nuestro servidor slapd usará en sus conexiones.

De nuevo, manos a la obra

Tanto para crear nuestra CA, como para crear y firmar el par llave/certificado para nuestro servidor LDAP usaremos el paquete gnutls-bin disponibe en los repositorios de Debian y Ubuntu.

sudo apt-get install gnutls-bin

Para mi comodidad, siempre creo una carpeta con el nombre CA-dominio-fqdn, en mi caso dicha carpeta se llama asi: CA-slabinfo.com.co.

mkdir CA-slabinfo.com.co && cd CA-slabinfo.com.co

Creando la CA

Lo primero, la llave privada que usará nuestra CA

~/CA-slabinfo.com.co# certtool --generate-privkey > ca-slabinfo.com.co-key.pem
Generating a 2432 bit RSA private key...

Ahora el turno es para el certificado público de nuestra CA
Antes que nada, crearemos una plantilla que contendra los datos de nuestra CA (parece complicado, pero no tiene ciencia), el archivo en cuestión se llama ca.info

cn = Slabinfo EU
ca
cert_signing_key

Ahora, creamos el certificado y lo firmamos

certtool --generate-self-signed --load-privkey ca-slabinfo.com.co-key.pem --template ca.info --outfile ca-slabinfo.com.co-cert.pem
Generating a self signed certificate...
X.509 Certificate Information:
	Version: 3
	Serial Number (hex): 521bc2e8
	Validity:
		Not Before: Mon Aug 26 21:04:40 UTC 2013
		Not After: Tue Aug 26 21:04:40 UTC 2014
	Subject: CN=Slabinfo EU
	Subject Public Key Algorithm: RSA
	Certificate Security Level: Normal
		Modulus (bits 2432):
			00:c0:1b:c8:62:5a:79:6d:50:f3:f6:56:e9:e5:34:e4
			de:9b:4a:b5:f4:07:98:9b:ef:85:06:46:39:3d:b6:cf
			6d:88:89:a8:37:9e:71:d4:10:f3:13:66:39:7b:85:b4
			20:97:ee:91:f3:7f:95:2e:69:46:5f:a6:cb:93:0d:98
			80:ec:20:eb:c2:75:73:f0:a3:85:31:17:ae:45:66:99
			15:ab:66:07:5a:e5:cb:f6:8a:94:78:4f:35:e9:73:75
			53:f6:d9:4d:19:a7:42:20:51:b3:ad:bf:53:65:87:0e
			e7:39:a0:29:44:73:9d:59:52:8b:42:ef:7e:c9:30:ba
			dc:a1:c7:97:5d:c0:cb:50:b7:55:75:b7:b0:15:02:d7
			99:43:3c:d2:ac:97:d1:93:9e:e5:45:b3:ae:75:7a:43
			d3:d5:a7:b5:9f:3a:ba:68:4d:01:41:5c:f5:e2:44:05
			e7:73:cc:85:4d:b7:d2:c3:ce:da:4c:0c:22:be:be:ca
			24:85:fc:b4:f8:3a:66:fe:b0:40:5f:61:53:37:28:c7
			db:56:6f:96:9f:a3:23:02:b0:dd:fc:ef:84:46:ae:ed
			f6:1a:d1:c6:38:8a:65:4b:36:46:26:de:17:c7:58:6e
			c9:d9:ae:74:7b:71:97:78:b0:22:40:1d:6c:dd:23:52
			f2:e0:3c:61:c1:38:a9:9b:d4:cc:43:42:0b:17:8e:b3
			58:70:15:1e:a3:b5:38:25:bf:ee:3f:ee:2c:de:92:f8
			cf:a8:42:95:92:74:be:56:08:04:eb:47:ff:f4:b6:24
			01
		Exponent (bits 24):
			01:00:01
	Extensions:
		Basic Constraints (critical):
			Certificate Authority (CA): TRUE
		Key Usage (critical):
			Certificate signing.
		Subject Key Identifier (not critical):
			d7fce9fc2f83362289c6116792b82cd41d66e144
Other Information:
	Public Key Id:
		d7fce9fc2f83362289c6116792b82cd41d66e144

Signing certificate...

Ya hemos creada nuestra CA (muuuuy básica, por cierto), ahora, a crear y firmar el par llave/certificado para nuestro servidor.
Empezamos con la clave (ejem 1024bits siguen siendo una longitud aceptable)

certtool --generate-privkey --bits 1024 --outfile ldap.slabinfo.com.co-key.pem
** Note: Please use the --sec-param instead of --bits
Generating a 1024 bit RSA private key...

Ahora, es el turno de generar y firmar certificado
Primero, crearemos el «template» a usar por el certificado, de nuevo un archivo de texto llamado ldap.info con lo siguiente

organization = Slabinfo E.U.
cn = ldap.slabinfo.com.co
tls_www_server
encryption_key
signing_key
expiration_days = 720

Luego, creamos y firmarmos nuestro certificado

certtool --generate-certificate --load-privkey ldap.slabinfo.com.co-key.pem --load-ca-certificate ca-slabinfo.com.co-cert.pem --load-ca-privkey ca-slabinfo.com.co-key.pem --template ldap.info --outfile ldap.slabinfo.com.co-cert.pem
Generating a signed certificate...
X.509 Certificate Information:
	Version: 3
	Serial Number (hex): 521bc601
	Validity:
		Not Before: Mon Aug 26 21:17:53 UTC 2013
		Not After: Sun Aug 16 21:17:53 UTC 2015
	Subject: O=Slabinfo E.U.,CN=ldap.slabinfo.com.co
	Subject Public Key Algorithm: RSA
	Certificate Security Level: Weak
		Modulus (bits 1024):
			00:b8:53:57:5b:18:0b:b6:c4:eb:2b:da:14:7f:dd:7c
			b1:82:7e:d8:df:f3:27:c2:ea:25:84:7b:dd:29:33:18
			bc:b5:8a:6f:4e:fd:24:30:50:95:7c:23:43:ff:2f:10
			a9:07:7e:c5:b0:28:de:02:3e:5d:f8:d7:5f:df:3f:0d
			e6:e3:7f:c0:6a:af:4b:b3:48:91:a1:13:a8:ad:12:07
			0b:1a:bc:ae:67:ca:81:f7:71:81:55:70:ce:80:42:f7
			86:c5:12:c5:24:52:21:70:45:7c:ee:fd:37:3a:f0:e0
			fd:81:71:ea:b4:bd:5b:3f:bc:31:0b:52:91:cd:75:94
			85
		Exponent (bits 24):
			01:00:01
	Extensions:
		Basic Constraints (critical):
			Certificate Authority (CA): FALSE
		Key Purpose (not critical):
			TLS WWW Server.
		Key Usage (critical):
			Digital signature.
			Key encipherment.
		Subject Key Identifier (not critical):
			88d07313bdf48e7bb27606bf358be399a7175a16
		Authority Key Identifier (not critical):
			d7fce9fc2f83362289c6116792b82cd41d66e144
Other Information:
	Public Key Id:
		88d07313bdf48e7bb27606bf358be399a7175a16

Signing certificate...

Una vez termindos los pasos anteriores, tendremos 6 archivos en nuestra carpeta:

  • ca.info
  • ca-slabinfo.com.co-cert.pem
  • ca-slabinfo.com.co-key.pem
  • ldap.info
  • ldap.slabinfo.com.co-cert.pem
  • ldap.slabinfo.com.co-key.pem

Nuestro servidor LDAP usará solo 3 archivos (el certificado público de la CA, y su par llave/certificado) por lo que los movemos a una ubicación mas idónea.

cp {ca-slabinfo.com.co-cert.pem,ldap.slabinfo.com.co-cert.pem} /etc/ssl/certs/
cp ldap.slabinfo.com.co-key.pem /etc/ssl/private/

Es importante brindarle los permisos de acceso adecuados a dichos certificados/llave para evitar quebraderos de cabeza tratando de dar con el error main: TLS init def ctx failed: -1.

sudo adduser openldap ssl-cert
Añadiendo al usuario `openldap' al grupo `ssl-cert' ...
Añadiendo al usuario openldap al grupo ssl-cert
sudo chgrp ssl-cert /etc/ssl/private/ldap.slabinfo.com.co-key.pem
chmod g+r /etc/ssl/private/ldap.slabinfo.com.co-key.pem
chmod o-r /etc/ssl/private/ldap.slabinfo.com.co-key.pem

En Debian podrían necesitar instalar el paquete ssl-cert
En Ubuntu podría ser necesario modificar el archivo /etc/apparmor.d/usr.sbin.slapd y agregar:

  /etc/ssl/private/ r,
  /etc/ssl/private/* r,

Ya que tenemos todos los certificados y llaves que necesitamos, procederemos a configurar nuestro servidor LDAP para que haga uso de el protocolo TLS, una vez mas.. recurrimos a la creación de un archivo llamado tls.ldif

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca-slabinfo.com.co-cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.slabinfo.com.co-key.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.slabinfo.com.co-cert.pem

Aplicamos la configuración en nuestro servidor LDAP:

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

y reiniciamos

sudo service slapd restart
[ ok ] Stopping OpenLDAP: slapd.
[ ok ] Starting OpenLDAP: slapd.

Ahora solo nos queda conectarnos a nuestro servidor usando cualquier GUI que soporte TLS (recomiendo Apache Directory Studio)

apacheds-conexion
apacheds-conexion-1
apacheds-conexion-2

Modo seguro en Thunderbird

El viernes, luego de actualizar mi Thunderbird ya no pude iniciarlo de nuevo, siempre que quería arrancarlo, me arrojaba este error:

john@rigardo:~ $ thunderbird 
enigmail.js: Registered components
mimeVerify.jsm: module initialized
Violación de segmento (`core' generado)

Como el error no me arrojaba ningún tipo de información útil, decidí arrancar thunderbird en modo seguro.

john@rigardo:~/$ /usr/bin/thunderbird -safe-mode

En el dialogo de confirmación seleccionamos Continue in Safe Mode
thunderbird-safe-mode-confirmation

Luego deshabilitamos las extensiones «problemáticas» y reiniciamos.
thunderbird-safe-mode-addons

Instalar servidor de repositorios GIT con gitolite y cgit en Ubuntu Server 12.04

Logo Git


Muchos trabajamos a diario con miles de archivos, sean de configuración o de software. Pero todos en mayor o menor medida requerimos una herramienta que nos permita llevar un control de los cambios que realizamos o del avance que llevamos de nuestros proyectos.

Existen muchas alternativas para llevar a cabo dicha tarea entre las que se encuentran: CVS, SVN y GIT. No voy a entrar en detalles de cada uno, porque no es la temática del post, pero para mi tipo de trabajo encaja perfectamente GIT.

Que es GIT?

Como reza en la página web del proyecto:

Git es un sistema de control de versiones distribuido libre y de código abierto, diseñado para manejar todo, desde pequeños a grandes proyectos con rapidez y eficiencia.

El problema radica en que GIT, como tal no es todo lo sencillo de configurar y poner en producción que uno querría. Para solventar dicho handicap, el señor Sitaram Chamarty puso manos a la obra y se sacó de la manga el proyecto gitolite.

Dicho lo dicho, MANOS A LA OBRA!

Sigue leyendo

Servir multiples VirtualHost SSL con una única IP en Ubuntu

apache2


En entornos empresariales es común encontrar aplicaciones web que deben correr sobre https para funcionar correctamente, lo primero que piensas es «bueno, montemos un servidor Web Apache y configuremos las aplicaciones sobre VirtualHost».
El problema viene cuando te encuentras que los virtualHost sobre SSL no funcionan, la razón? al transmitir los datos cifrados, el servidor web no tiene un mecanismo para saber que VirtualHost esta solicitando el navegador.
La solución mas sencilla es utilizar los VirtualHost basados en IP. Pero debido a la escasez de direcciones IPv4 este ya no es un escenario que podamos considerar.

Para solucionar este problema la IETF publicó el RFC4366 con el cual TLS pasa a soportar extensiones a nivel Cliente-Servidor, en este caso la que nos interesa es SNI (Server Name Indication).

SNI permite que el ciente, antes de cifrar la conexión, envié al servidor el nombre del dominio al que desea acceder.

Para que SNI funcione correctamente, son necesarios los siguientes requisitos:

  • OpenSSL 0.9.8f o posterior compilado con soporte para extensiones TLS (enable-tlsext; desde Openssl 0.9.8k las extensiones vienen activadas por defecto).
  • Apache2 2.2.12 o superior compilado contra la librería OpenSSL que tenga dichas extensiones activadas.
    • El navegador web del cliente debe soportar también SNI

    • Mozilla Firefox 2.0 o superior
    • Opera 8.0 or superior (Con TLS 1.1 habilitado)
    • Internet Explorer 7.0 or superior (sólo Vista, Win7 y Win8)
    • Google Chrome
    • Safari 3.2.1 o superior en Mac OS X 10.5.6 o superior

Activación

En Ubuntu, editamos los siguientes archivos de configuración y agregamos:

/etc/apache2/httpd.conf

SSLStrictSNIVHostCheck on

/etc/apache2/ports.conf


...
    NameVirtualHost *:443
    Listen 443
...

Luego editamos nuestros VirtualHost SSL como si fueran VirtualHost normales:

/etc/apache2/sites-available/default-ssl

<VirtualHost *:443>
  ServerName virtualhost1.dominio.com
  DocumentRoot /home/web/virtualhost1

  ErrorDocument 500 500.html
  ErrorDocument 404 404.html
  ErrorDocument 403 403.html
  ErrorLog        /var/log/apache2/virtualhost1.dominio.com-error.log
  TransferLog     /var/log/apache2/virtualhost1.dominio.com-access.log
  CustomLog       /var/log/apache2/virtualhost1.dominio.com-traff.log traff
  CustomLog       /var/log/apache2/virtualhost1.dominio.com-combined.log combined

  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
  SSLCertificateFile      /etc/ssl/certs/virtualhost1.dominio.com.crt
  SSLCertificateKeyFile   /etc/ssl/private/virtualhost1.dominio.com.key

<Directory /home/web/virtualhost1>
    Options -Indexes FollowSymLinks
    AllowOverride None
</Directory>
</VirtualHost>

Finalmente reiniciamos el apache para recargar la nueva configuración

sudo service apache2 restart

Si en los logs de error de apache nos encontramos con el siguiente mensaje de error, es que nuestro navegador no es compatible con SNI

[error] No hostname was provided via SNI for a name based virtual host

IntergerOrderingMatch y busquedas con operadores mayor o igual y menor o igual en LDAP

La historia es la siguiente:

Soy administrador de algunos servidores en Linux, y «mi jefe» me solicitó crear un script (bash, php, python, lo que sea) que realice una búsqueda en todo el directorio LDAP e identifique que usuarios están próximos a expirar y envíe una alerta a un correo electrónico con dicho listado.

Hasta ahí sin problema. El problema sobrevino cuando la búsqueda en el directorio no arrojaba ningún resultado.

ldapsearch -LLL -x -b ou=users,dc=slabinfo,dc=com,dc=co -h 127.0.0.1 "(&(objectClass=virtualmailaccount)(objectClass=posixAccount)(expireDate>=1359936000)(expireDate<=1360454400))" uid uidnumber expireDate

Examinando detenidamente el RFC4511 me encuentro con esto:

4.5.1. Search Request


   The Search request is defined as follows:

        SearchRequest ::= [APPLICATION 3] SEQUENCE {
             baseObject      LDAPDN,
             scope           ENUMERATED {
                  baseObject              (0),
                  singleLevel             (1),
                  wholeSubtree            (2),
                  ...  },
             derefAliases    ENUMERATED {
                  neverDerefAliases       (0),
                  derefInSearching        (1),
                  derefFindingBaseObj     (2),
                  derefAlways             (3) },
             sizeLimit       INTEGER (0 ..  maxInt),
             timeLimit       INTEGER (0 ..  maxInt),
             typesOnly       BOOLEAN,
             filter          Filter,
             attributes      AttributeSelection }

        AttributeSelection ::= SEQUENCE OF selector LDAPString
                        -- The LDAPString is constrained to
                        -- <attributeSelector> in Section 4.5.1.8

        Filter ::= CHOICE {
             and             [0] SET SIZE (1..MAX) OF filter Filter,
             or              [1] SET SIZE (1..MAX) OF filter Filter,
             not             [2] Filter,
             equalityMatch   [3] AttributeValueAssertion,
             substrings      [4] SubstringFilter,
             greaterOrEqual  [5] AttributeValueAssertion,
             lessOrEqual     [6] AttributeValueAssertion,
             present         [7] AttributeDescription,
             approxMatch     [8] AttributeValueAssertion,
             extensibleMatch [9] MatchingRuleAssertion,
             ...  }

        SubstringFilter ::= SEQUENCE {
             type           AttributeDescription,
             substrings     SEQUENCE SIZE (1..MAX) OF substring CHOICE {
                  initial [0] AssertionValue,  -- can occur at most once
                  any     [1] AssertionValue,
                  final   [2] AssertionValue } -- can occur at most once
             }

        MatchingRuleAssertion ::= SEQUENCE {
             matchingRule    [1] MatchingRuleId OPTIONAL,
             type            [2] AttributeDescription OPTIONAL,
             matchValue      [3] AssertionValue,
             dnAttributes    [4] BOOLEAN DEFAULT FALSE }

El atributo que intentaba buscar tenía un pequeño problema: No tenía ninguna Ordering Rule definida. La solución? editar el schema ldap correspondiente dejándolo así:

attributetype ( 1.3.6.1.4.1.22339.1.1.26 NAME 'expireDate'
DESC 'Expire date'
EQUALITY integerMatch
<strong>ORDERING integerOrderingMatch</strong>
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

El texto en negrita, es la Ordering Rule

Luego simplemente reemplacé el schema «problemático» con el nuevo corregido y voilá! mi búsqueda LDAP funciona correctamente.

ldapsearch -LLL -x -b ou=users,dc=slabinfo,dc=com,dc=co -h 127.0.0.1 "(&(objectClass=virtualmailaccount)(objectClass=posixAccount)(expireDate>=1359936000)(expireDate<=1360454400))" uid uidnumber expireDate
dn: uid=john,ou=Users,dc=slabinfo,dc=com,dc=co
uid: john
uidNumber: 1002
expireDate: 1360022400

Samba 4.0 estable

Logo Samba


El dia de ayer 11 de Diciembre, el grupo de trabajo del servidor de archivos por excelencia Samba, ha liberado por fin la versión estable de Samba 4.0 con mejoras muy esperadas por sus usuarios:

Soporte completo para AD

Ahora samba cuenta con servicios de DNS (interno – integración con BIND)/LDAP/Kerberos (KDC) permitiendo una integración limpia con MS Windows incluyendo el último Windows 8.

NTP

Ahora samba incorpora un socket seguro para las respuestas NTP

Sin duda con samba4 se abre un mundo de posibilidades en cuanto a servicios e integración, no solo en nuestros hogares sino en nuestras empresas.

Samba4 esta licenciado bajo la GPLv3 y puede descargarse desde sus mirrors.

Puedes consultar mas información en las notas de liberación

Instalar Java en Ubuntu 12.04/12.10


Hace algunos días, migré de ArchLinux con KDE a Xubuntu, como soy usuario habitual de herramientas «Eclipse-based» me vi en la necesidad de instalar java en mi equipo, como openJDK nunca me terminó de correr bien, tuve que instalar java 1.7 JRE en mi máquina. A continuación les dejo los pasos a seguir por si alguien se ve en la necesidad de realizar lo mismo.

Lo primero y mas importante: descargar Java

Al momento de crear esta entrada, la versión mas reciente de Java-JRE es la 1.7.0_09

Nos dirigimos a la página web de Oracle Java y en la sección de descargas, elegimos nuestra arquitectura (en mi caso i586), una vez en nuestro equipo, deberíamos tener un archivo similar a este:

jre-7u9-linux-i586.tar.gz

Lo siguiente e igual de importante: descomprimir, instalar y configurar JAVA

Creamos la carpeta donde instalaremos JRE y movemos el paquete descomprimido a su lugar (puede ser en cualquier lugar del sistema, en mi caso, lo hago en /usr/lib/jvm/)

cd ~/Descargas && tar -zxvf jre-7u9-linux-i586.tar.gz && sudo mkdir /usr/lib/jvm && sudo mv jre1.7.0_09 /usr/lib/jvm/jre1.7

Ya casi! solo nos faltan unos cuantos pasos

Ya tenemos JRE instalado en el sistema, ahora vamos a definir cual será el ejecutable por defecto para brindar /usr/bin/java

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jre1.7/bin/java 0

Si tuviésemos mas de una version de JRE (OpenJDK, Java 1.6, etc) tendríamos que decirle al sistema cual versión queremos utilizar

sudo update-alternatives --config java

Comprobemos que todo ha funcionado

Para comprobar que hemos instalado JRE exitosamente, debemos usar el siguiente comando:

java -version

Éste debería arrojarte una salida similar (o igual) a esta

java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) Server VM (build 23.5-b02, mixed mode)

Una corta de ModSecurity


ModSecurity es una de las herramientas mas potentes que tenemos a la mano para asegurar un servidor apache, pero en ocasiones requerimos deshabilitar el engine para cierta direccion IP, esto lo hacemos editando dicho VirtualHost y agregando lo siguiente:

<IfModule security2_module>

SecRule REMOTE_ADDR «^192\.168\.0\.250» phase:1,nolog,allow,ctl:ruleEngine=off

</IfModule>

Reiniciamos Apache y ya tendremos deshabilitado el engine para la direccion ip que queremos

Virtualbox Headless: No bootable medium found

Error en VirtualBox


Hace unos días se me presentó un «singular» error con una maquina virtual que tengo corriendo en un servidor Virtualbox Headless, cuando arrancaba la maquina virtual presentaba el siguiente error y no levantaba.

Fatal: no bootable medium found! System Halted

Buscando en internet, este error se presenta porque de alguna manera la configuración de la maquina virtual «bota» los discos.

Para solucionar este inconveniente tendremos que hacer lo siguiente:

Apagamos la maquina virtual

VBoxManage controlvm WinXP poweroff

Agregamos de nuevo el controlador IDE

VBoxManage storagectl «WinXP» –name «IDE Controller» –add ide

Adjuntamos al controlador IDE la imagen de disco duro

VBoxManage storageattach «WinXP» –storagectl «IDE Controller» –port 0 –device 0 –type hdd –medium /home/bismarck/WinXP.vdi

Re-Arrancamos la Maquina Virtual

VBoxHeadless –startvm «WinXP» &

Con este procedimiento y teniendo en cuenta ajustar los parámetros a tu máquina virtual solucionarás tu problema con VirtualBox Headless

Mostrar indicador de progreso con rsync

Rsync con indicador de progreso

Rsync con indicador de progreso


Para que rsync nos muestre la información del progreso del sincronizado de nuestros archivos, debemos utilizar el parámetro –progress quedando el comando de la siguiente manera:

rsync -varuz –progress ruta_archivo_origen ruta_archivo_destino