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