Docker, operación bikini

O cómo reducir el peso de nuestros contenedores con unos sencillos pasos.

Hace cuestión de unos días, revisando unos desarrollos comprobé como algunas de las imágenes que había creado para mis contenedores eran demasiado pesadas, por lo que comencé a investigar cómo reducirlas. Para ello encontré cinco sencillos pasos pasos.

1. Parte de una buena base

Parte de la imagen más pequeña que puedas y que se adecue a tus necesidades. Invierte unos minutos en buscar y determinar de qué imagen base partir. Existen distribuciones como Alpine o las versiones Slim de Debian que merecen la pena ser estudiadas

2. Instala lo justo

Incluye sólo lo que necesites, evita instalar herramientas de desarrollo y utiliza opciones como –no-install-recommends de apt o –no-recommends de zypper para evitar la instalación de paquetes recomendados que probablemente no necesites

3. Menos es más

Reduce el número de capas, cada una de ellas requiere un peaje, que aunque no es demasiado alto, puede suponer una diferencia sustancial entre una imagen y otra. Veamos el siguiente ejemplo

FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y curl --no-install-recommends
RUN apt-get install -y wget --no-install-recommends
RUN apt-get install -y net-tools --no-install-recommends
RUN apt-get install -y inetutils-ping --no-install-recommends
RUN  rm -rf /var/lib/apt/lists/*

CMD ["echo", "Hello World!" ]
FROM ubuntu:latest
RUN apt-get update && \
apt-get install -y curl wget net-tools inetutils-ping \
--no-install-recommends && \
rm -rf /var/lib/apt/lists/*

CMD ["echo", "Hello World!" ]

Hay que reconocer que reducir el número de capas puede suponer un incordio a la hora de desarrollar, dado que dificulta en cierta medida la identificación de fallos y aumenta los tiempos a la hora de construir nuevas imágenes, dado que las capas será mayores.

4. Limpia

Elimina lo que ya no necesites, carpeta temporales, código fuente y ficheros intermedios de compilación, caché de herramientas como apt o apk, ficheros de log, historial de comandos, etc

5. fromlatest

Se trata de una herramienta muy útil que te ayudará a realizar un último repaso de tu fichero Dockerfile https://www.fromlatest.io/#/

Anuncios

AP administrado via web (II)

Volvemos a la carga. En el post anterior  AP administrado via web (I), terminamos configurando mínimamente un servidor FreeRADIUS,  conectado a una MySQL, y un servidor HTTP (Apache2 en nuestro caso) con la aplicación daloRADIUS para administrar nuestro servidor RADIUS. Ahora partimos de dicho punto para terminar de configurar nuestro punto de acceso, para el que necesitaremos:

  • Configurar las interfaces de red
  • Instalar y configurar un servidor DHCP
  • Configurar un NAS en  FreeRADIUS
  • Instalar y configurar hostapd

En nuestro caso disponemos de una interfaz de wlan y otra ethernet. Dejaremos la interfaz ethernet configurada por dhcp y en la interfaz plan estableceremos una ip fija. Hay que tener en cuenta que algunas distribuciones linux disponen de herramientas que gestionan las interfaces de red para facilitar la conexión a la red, en nuestro cómo utilizaremos la interfaz wifi a modo de AP, nos interesará detener este tipo de herramientas/servicios:

root@dalo:~# service network-manager stop
root@dalo:~# ifdown wlan0
root@dalo:~# ifdown eth0

Ahora con la interfaz bajada y el network-manager detenido, configuraremos la interfaz  de red editando el fichero /etc/network/interfaces:

auto eth0
iface eth0 inet dhcp

auto wlan0
iface wlan0 inet static
address 192.168.2.1
netmask 255.255.255.0

Para que nuestro punto acceso haga routing entre las dos redes tendremos que activar el reenvío entre interfaces:

echo 1 > /proc/sys/net/ipv4/ip_forward

La linea anterior activaría puntualmente el ip fowarding, para persistir dicho cambio tendríamos que añadir al fichero /etc/sysctl.conf, la siguiente linea:

net.ipv4.ip_forward = 1

Por último volvemos a levantar las interfaces de red

root@dalo:~# ifup wlan0
root@dalo:~# ifup eth0

Ya tenemos las interfaces configuradas y operativas, así que empezaremos a con la instalación y configuración del servidor DHCP. Instalamos el servidor idc-dhcp:

root@dalo:~# apt-get update && apt-get install isc-dhpc-server

Tras instalarlo configuraremos un pool de conexiones sobre la red 192.168.2.0/24 en el fichero /etc/dhcp/dhcpd.conf:

subnet 192.168.2.0 netmask 255.255.255.0 {
 range 192.168.2.10 192.168.2.50;
 option subnet-mask 255.255.255.0;
 option broadcast-address 192.168.2.255;
 option routers 192.168.2.1;
}

Por último, arrancamos el servidor:

root@dalo:~# service isc-dhcp-server restart

Ya tenemos DHCP, así que para realizar la autenticación entre hostapd y FreeRADIUS, tendremos que configurar en FreeRADIUS un NAS (Network Access Server, será la labor de hostapd) que se encargará de recibir y tratar las tramas EAPOL (Más información sobre EAP) para delegar en FreeRADIUS la autenticación y autorización:

dalo3

Ya tenemos hostapd configurado en FreeRADIUS, así que ya sólo nos queda instalarlo y configurarlo. Hostapd es un demonio que permite crear puntos de acceso tanto wifi como cableados. En nuestro caso, tal y como hemos comentado anteriormente lo utilizaremos para configurar un punto de acceso wifi con autenticación WPA-EAP que haga uso de un servidor RADIUS. Para instalar el software, utilizaremos apt-get como en casos anteriores:

root@dalo:~# apt-get update && apt-get install hostapd

Después tendremos que configurar el servicio, para lo que tendremos que crear el fichero /etc/hostapd/hostapd.conf con el siguiente contenido:

# Configuracion punto de acceso
ssid=test
channel=12
auth_algs=3
wpa=3
wpa_key_mgmt=WPA-EAP
wpa_pairwise=TKIP CCMP
nai_realm=0,test.com,1
rsn_preauth=1

# Configuracion de hardware y control
hw_mode=b
interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0

# Activacion 802.1x
ieee8021x=1
auth_server_addr=127.0.0.1
auth_server_port=1812
auth_server_shared_secret=Secret.1617
# Activamos también el accounting
acct_server_addr=127.0.0.1
acct_server_port=1813
acct_server_shared_secret=Secret.1617

Una vez configurado hostapd, pasamos a configurar el demonio para poderlo arrancar como servicio. Esto se podrá realizar editando el fichero /etc/default/hostapd y dejando la siguiente configuración:

# Defaults for hostapd initscript
#
# See /usr/share/doc/hostapd/README.Debian for information #about alternative
# methods of managing hostapd.
#
# Uncomment and set DAEMON_CONF to the absolute path of a hostapd configuration
# file and hostapd will be started during system boot. An example #configuration
# file can be found at #/usr/share/doc/hostapd/examples/hostapd.conf.gz
#
DAEMON_CONF="/etc/hostapd/hostapd.conf"

# Additional daemon options to be appended to hostapd command:-
# -d show more debug messages (-dd for even more)
# -K include key data in debug messages
# -t include timestamps in some debug messages
#
# Note that -B (daemon mode) and -P (pidfile) options are automatically
# configured by the init.d script and must not be added to #DAEMON_OPTS.
# Acitivamos debug
DAEMON_OPTS="-d"

Por último arrancamos el servicio:

root@dalo:~# service hostapd start

Pues con esto, ya casi hemos terminado, sólo nos quedaría dar de alta un usuario, al que llamaremos cliente1, y probar el acceso:

dalo4

Para probar el acceso y al haber activado el accounting tanto en FreeRADIUS como en hostapd, podremos consultar que los accesos son correctos directamente en daloRADIUS > Accounting > User Accounting:

dalo5

Y con esto podemos dar por concluido este how-to sobre cómo configurar un punto de acceso wifi WPA-EAP con FreeRADIUS y administración web.

AP administrado via web (I)

Por azares del destino, hace unos días descubrí daloRADIUS, un proyecto open source para crear unas interfaz web de administración para FreeRADIUS. Este proyecto a día de hoy se encuentra un poco abandonado, pero poco a poco un grupo de desarrolladores lo está intentando reflotar para adaptarlo a la últimas versiones de PHP y FreeRADIUS.

Hé aquí mi pequeña contribución al proyecto, una pequeña guía sobre cómo montarnos un punto de acceso wifi con autenticación WPA-EAP y administrado vía web. Para ello necesitaremos MySQL, FreeRADIUS, Apache2 + PHP, hostapd y por supuesto un poquito de daloRADIUS.

Primero instalaremos todo el software necesario:

apt-get install mysql-server freeradius freeradius-mysql freeradius- utils apache2 libapache2-mod-php php php-db php-gd php-pear php-mail php- mysql hosted

daloRADIUS está desarrollado para funcionar con FreeRADIUS 2 y PHP 4/5, el comando anterior en la mayoría de sistemas actuales, terminará instalando FreeRADIUS 3 y PHP 7, pero no os preocupéis, las funcionalidades básicas siguen funcionando, aunque hay que tener en cuenta algunos detalles que iremos comentando.

Una vez instalado los servidores MySQL y FreeRADIUS, lo que haremos será preparar la base de datos para su correcto funcionamiento. Para ello crearemos un usuario y un base de datos para radius y le aplicaremos el esquema incluido en /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql:

root@dalo:~# service mysql start
root@dalo:~# mysql –u root –p
mysql> create database radius;
mysql> grant super on *.* to radius@localhost identified by “Radius.1617”; mysql> quit;
root@dalo:~# mysql –u radius –p radius < /etc/freeradius/3.0/mods- config/sql/main/mysql/schema.sql

Ahora configuraremos FreeRADIUS para que utilice el módulo SQL. Para llevarlo a cabo tendremos que configurar la conexión a base de datos a través del fichero /etc/freeradius/3.0/mods-available/sql estableciendo el driver de conexión a base de datos y los datos de conexión (que en nuestro caso será la MySQL que acabamos de configurar)

 sql {

# The sub-module to use to execute queries. This should match
... ...
# the database you're attempting to connect to. #
# * rlm_sql_mysql
# * rlm_sql_mssql
# * rlm_sql_oracle
# * rlm_sql_postgresql
# * rlm_sql_sqlite
# * rlm_sql_null (log queries to disk) #
driver = "rlm_sql_mysql"
dialect = "mysql"
# Connection info:
#
server = "localhost" port = 3306
login = "radius" password = "Radius.1617"
# Database table configuration for everything... radius_db = "radius"

Tras editar el fichero de configuración del módulo SQL, lo activaremos para que se aplique durante el inicio de FreeRADIUS. Para ello bastará con crear un enlace simbólico en el directorio mods-enabled:

 root@dalo:/etc/freeradius/3.0/mods-enabled# ln -s ../mods-available/sql sql

Tras esto, nos situaremos en el directorio /var/www/html y descargaremos daloRADIUS

root@dalo:/var/www/html # wget http://downloads.sourceforge.net/project/daloradius/daloradius/daloradius0.9-9/daloradius-0.9-9.tar.gz 
root@dalo:/var/www/html # tar -xvzf daloradius-0.9-9.tar.gz 
root@dalo:/var/www/html # mv daloradius-0.9-9 daloradius root@dalo:/var/www/html # chown www-data:www-data -R daloradius

Aplicamos sobre la base de datos de radius las modificaciones necesarias para que daloRADIUS funciones correctamente:

 root@dalo:/var/www/html # mysql -u radius -p radius < daloradius/contrib/db

Creamos el fichero de log

root@dalo:~# mkdir /var/log/daloradius
root@dalo:~# touch /var/log/daloradius/daloradius.log
root@dalo:~# chown www-data:www-data /var/log/daloradius/daloradius.log

Ahora configuramos el acceso a base de datos para la aplicación. Esta configuración se realiza a través del fichero <daloradius_home>/library/daloradius.conf.php. Lo editamos y establecemos la siguiente configuración:

$configValues['DALORADIUS_VERSION'] = '0.9-9';
$configValues['FREERADIUS_VERSION'] = '2';
$configValues['CONFIG_DB_ENGINE'] = 'mysqli';
$configValues['CONFIG_DB_HOST'] = 'localhost';
$configValues['CONFIG_DB_PORT'] = '3306';
$configValues['CONFIG_DB_USER'] = 'radius';
$configValues['CONFIG_DB_PASS'] = 'Radius.1617';
$configValues['CONFIG_DB_NAME'] = 'radius';
…
$configValues['CONFIG_LOG_FILE'] = '/var/log/daloradius/daloradius.log'

Ya tenemos todo el sistema instalado, así que ahora procederemos a la comprobar el correcto funcionamiento del mismo. Para ello levantaremos los distintos servicios y crearemos un usuario de prueba para comprobar que podemos realizar la autenticación del mismo.

Arrancamos los servicios:

root@dalo:~# service mysql start && service freeradius start && service apache2 start

Accedemos a la interfaz web de daloRADIUS y nos autenticamos con el usuario administrator/radius. desde el apartado de administración de usuarios procederemos a la creación de un usuario de prueba:

dalo1

Una vez tengamos el usuario de prueba creado, realizaremos una prueba de autenticación con el comando radtest:

root@dalo:~# radtest testuser test.1617 localhost 1812 testing123

Sent Access-Request Id 144 from 0.0.0.0:38110 to 127.0.0.1:1812 length 78

     User-Name = "testuser"

     User-Password = "test.1617"

     NAS-IP-Address = 127.0.1.1

     NAS-Port = 1812

     Message-Authenticator = 0x00

     Cleartext-Password = "test.1617"

Received Access-Accept Id 144 from 127.0.0.1:1812 to 0.0.0.0:0 length 20

Podemos ver también los distintos intentos de autenticación desde la interfaz web a través del menú Reports > Last connection attemps:
dalo2

 

A continuación desglosaremos incidencias que pueden ocurrir durante proceso de instalación y cómo resolverlas:

  • El servidor Apache arranca pero al acceder a la página de daloRADIUS (http://locahost/daloradius) muestra que la página no se encuentra, error 404
  • Comprueba que la ruta que escrita en el navegador se corresponde con el nombre de la carpeta en la que hemos descargado daloRADIUS.
  • Revisa que la carpeta daloradius se encuentre en /var/www/html o en la ruta que tengamos como DocumentRoot en la configuración de apache (podemos consultar la configuración con apachectl -S)

 

  • El servidor Apache arranca pero al acceder a la página de daloRADIUS (http://locahost/daloradius) muestra que la página está prohibida, error 403
  • Chequea que el usuario que utiliza Apache (por defecto www-data, nobody o http, esta configuración se puede consultar con apachectl -S) tiene permisos para leer y ejecutar la carpeta daloradius y los archivos que se encuentran en ella.

 

  • El servidor Apache arranca pero al acceder a la página de daloRADIUS (http://locahost/daloradius) muestra una pagina vacía o un error de base de datos
  • Chequear que se han instalado correctamente todas las librería php necesarias: php, php-db, php-gd, php-mail, php-mysql, php-pear. Se puede consultar con dpkg –l | grep php
  • Revisar si se han aplicado los scripts de configuración de base de datos de daloRADIUS.
  • Comprobar que daloRADIUS está configurado para usar el motor de base de datos mysqli. Por defecto, está configurado para usar el driver/motor de base de datos “mysql”, API que ya no está disponible en PHP 7. Durante la realización de esta práctica se ha hecho uso de mysqli por ofrecer un conjunto de funcionalidades similar pero ampliado al de mysql. Más información: http://php.net/manual/en/mysqlinfo.api.choosing.php

 

  • La prueba de autenticación no es satisfactoria
  • Comprobar que en el fichero /etc/freeradius/3.0/clients.conf está dado de alta el cliente “localhost” con el secreto “testing123”
  • Comprobar que el servidor freeradius está haciendo uso del módulo SQL. Para cerciorarnos podemos parar el servidor freeradius y levantarlo con las opciones de depuración, freeradius –X

 

Y con esto lo dejamos por hoy. En próximas entregas veremos cómo configurar hostapd para obtener el caso de uso completo

¿Usuarios de Directorio Activo en OpenLDAP?

¿Es eso posible?, ¿podemos migrar usuarios de Active Directory de Microsoft a un OpenLDAP? La respuesta a ambas preguntas es sí, y a lo largo de esta entrada se comentarán una serie de  consideraciones ha tener en cuenta, cómo compilar/configurar un OpenLDAP para que soporte las nuevas entradas y algunas herramientas útiles para estos menesteres.

Consideraciones ha tener en cuenta

El principal escollo con el que nos vamos a encontrar a la hora de migrar datos ente ambos sistemas es la obtención de contraseñas del Active Directory. Aunque OpenLDAP y Active Directory son implementaciones del protocolo LDAP, son muy distintas entre sí a la hora de persistir las contraseñas. Mientras que OpenLDAP guarda la contraseña, a no ser que se indique lo contrario, como un atributo más de un usuario (encriptada por supuesto), Active Directory almacena esta información en la base de datos del SAM (Security Account Manager) encriptada con el algoritmo Lan Manager, por lo que al consultar la información de un usuario con un cliente LDAP no aparecerá dato alguno sobre la contraseña y habrá que recurrir a otras herramientas para su obtención.

Cómo configurar un OpenLDAP

Cómo se ha mencionado anteriormente las contraseñas en Active Directory se almacenan encriptadas con LanManager, así que el principal esfuerzo, a la hora de configurar OpenLDAP, será dar soporte a dicho algoritmo de hashing. De este modo cuando un usuario intente autenticarse, nuestro sistema deberá ser capaz de encriptar con dicho algoritmo la contraseña que proporcione el usuario y comprobar si se corresponde con el hash almacenado para él. Para que nuestro Open LDAP sea capaz de realizar dicha tarea será necesario compilar los fuentes con la opción --enable-lmpasswd. A continuación se especifica cómo realizar esta tarea sobre Debian:

  1. Instalar en nuestro entorno los paquetes necesarios para llevar a cabo labores de construcción/compilación:
    dev:~# aptitude install build-essential
  2. Intalaremos las dependencias con Berkeley DB necesarias para OpenLDAP (utilizaremos paquetes para simplificar el proceso):
    dev:~# aptitude install libdb4.4-dev openssl-dev
  3. Ejecutaremos ldconfig para cargar las librerías compartidas (este paso podríamos obviarlo):
    dev:~# ldconfig
  4. Descargaremos los fuentes y descomprimimos:
    dev:~/dowloads# wget ftp://ftp.OpenLDAP.org/pub/OpenLDAP/openldap-release/openldap-<version>.tgz
    dev:~/dowloads# tar -xzf openldap-<version>.tgz
  5. Ahora procederemos a compilar la herramienta con las siguientes instrucciones:
    dev:~/dowloads/openldap-<version># ./configure --prefix="/opt/openldap" --enable-lmpasswd
    dev:~/dowloads/openldap-<version># make depend
    dev:~/dowloads/openldap-<version># make
    dev:~/dowloads/openldap-<version># make test
    dev:~/dowloads/openldap-<version># make install

Ya tenemos instalado servidor de LDAP en el directorio /opt/openldap y sólo nos quedará configurarlo según nuestras necesidades. A continuación se establecerá  una configuración básica con la que poder probar la autenticación.

  1. Editaremos el fichero slapd.conf (/opt/openldap/etc/openldap/slapd.conf) en el que se modificarán las siguientes entradas:

    include      /opt/openldap/etc/openldap/schema/core.schema
    include      /opt/openldap/etc/openldap/schema/cosine.schema
    include      /opt/openldap/etc/openldap/schema/nis.schema

    suffix       "o=mrpotatoe,c=es"
    rootdn       "cn=admin,o=mrpotatoe,c=es"
    rootpw       admin
  2. Ahora crearemos un fichero ldif  (/tmp/carga.ldif) en con algunos datos a persistir:
    dn: o=mrpotatoe,c=es
    objectclass: organization
    o: mrpotatoe

    dn: cn=admin,o=mrpotatoe,c=es
    objectclass: organizationalRole
    cn: admin

    # En este punto crearíamos un usuario con la contraseña 12345678
    # encriptada con lan manager para la realización de pruebas
    dn: cn=user,o=mrpotatoe,c=es
    objectClass: top
    objectClass: account
    objectClass: posixAccount
    cn: user
    gidNumber: 0
    homeDirectory: -
    uid: user
    uidNumber: 0
    userPassword:{lanman}0182BD0BD4444BF836077A718CCDF409

  3. Lo próximo será iniciar el servidor e introducir los datos necesarios para realizar las pruebas, para ello tendremos que ejecutar el siguientes comando:
    dev:~# su -c /opt/openldap/libexec/slapd
    dev:~# /opt/openldap/bin/ldapadd -xcWD 'cn=admin,o=mrpotatoe,c=es' -f /tmp/carga.ldif
  4. Una vez llegados a este punto podremos probar a autenticarnos contra nuestro openldap con el usuario de prueba que hemos creado. Para ello podremos utilizar cualquier cliente de LDAP.

Algunas herramientas útiles

A continuación se enumeran algunas herramientas para migrar usuarios de Directorio Activo a OpenLDAP:

  • PwDump
    Esta utilidad permite extraer las contraseñas en LM y en NTLM de los usuarios de un sistema SAM. Esta herramienta nos será útil para obtener las contraseñas de los usuarios de un directorio activo.
  • Apache Directory Studio
    Se trata de un cliente LDAP bastante potente que nos permitirá, además de navegar y consultar un LDAP, editar ficheros LDIF, crear y editar esquemas para OpenLDAP y Apache Directory Server, utilizar un Apache Directory Server embebido, etc.