AutoMysqlBackup: Warning: Using a password on the command line interface can be insecure

Utilizo AutoMySQLBackup para respaldar bases de datos en varios servidores. Desde la versión MySQL 5.6 el comando mysql produce un warning si se ejecuta con la clave en la línea de comando haciendo que AutoMySQLBackup envíe un correo diario.

En un artículo del blog de Redeo encontré cómo él solucionó el problema quitando esas líneas de registro de errores y evitando el correo. Pero Redeo aclara que lo hizo contra el script disponible en sourceforge, no al paquete Debian automysqlbackup 2.6+debian.3-1 que es lo que tengo en mi caso.

Así que puse manos en el asunto para adaptarlo al script automysqlbackup de debian, y aquí está el diff:

689c689,696
<            cat "$LOGERR" | mail -s "ERRORS REPORTED: MySQL Backup error Log for $HOST - $DATE" $MAILADDR
---
>           # Remove annoying warning message since MySQL 5.6
>           sedtmpfile="/tmp/$(basename $0).$$.tmp"
>           grep -v "Warning: Using a password on the command line interface can be insecure." "$LOGERR" > $sedtmpfile
>           mv $sedtmpfile $LOGERR
>           if [ -z $LOGERR ]
>               then
>                   cat "$LOGERR" | mail -s "ERRORS REPORTED: MySQL Backup error Log for $HOST - $DATE" $MAILADDR
>           fi

La idea es borrar las líneas con el warning cuándo se envía el correo en

elif [ "$MAILCONTENT" = "quiet" ]

y enviar el resto de ellas, si es que existen; si no, evitar el incómodo correo diario con dicho warning.

¿Nada para decir?

Argumentar que a ti no te importa el derecho a la privacidad porque no tienes nada para ocultar es lo mismo que decir que no te importa la libertad de expresión porque no tienes nada para decir – Edward Snowden

El kernel Linux no es libre

gato_encerrado

Linux es el proyecto del kernel (núcleo) del sistema operativo que generalmente se llama igual, muchos lo llaman GNU/Linux, y empresas le ponen distintas marcas comerciales.

Resulta que el kenel hace muchos años que incorpora piezas de software oscurecido y de los cuales no se cuenta con documentación. ¿por qué? por una complicidad entre los productores de hardware que entregan estos códigos y los desarrolladores del kernel que lo incorporan y distribuyen a los usuarios.

Estas piezas no libres (porque no pueden ser ni modificadas ni estudiadas) empezaron siendo unas pocas, pero han ido creciendo en número con el correr del tiempo, llegando más de cien, en su mayoría drivers y archivos de firmware y se conocen como blob binarios

Entré al sitio oficial del proyecto Linux y descargué la última versión estable (4.3) y me puse a analizar de qué está compuesto.

Es un proyecto de software enorme:

  • Un archivo compactado de 83M
  • Descompactados ocupan 688M
  • Un total de 3439 carpetas
  • Un total de 51544 archivos
  • Más de 20 millones de líneas de código (según Wikipedia)

que tiene más de 11 años de desarrollo desde su primer versión estable.

Revisando sus archivos con file veo que está compuesto de:

$ find linux-4.3 -type f -exec file {} \; | cut -d: -f 2- | sort | uniq -c | sort -nr
38900  ASCII c program text
6226  ASCII English text
2955  ASCII text
1324  ASCII Pascal program text
 948  UTF-8 Unicode c program text
 199  UTF-8 Unicode English text
 180  HTML document text
 113  POSIX shell script text executable
  93  Bourne-Again shell script text executable
  93  ASCII C++ program text
  73  UTF-8 Unicode Pascal program text
  60  ASCII make commands text
  44  ASCII assembler program text
  43  OS/2 REXX batch file text
  39  XML  document text
  19  a /usr/bin/perl -w script text executable
  14  troff or preprocessor input text
  14  Netpbm PPM image text
  14  ASCII c program text, with very long lines
  13  a /usr/bin/perl script text executable
  12  ASCII FORTRAN program text
  10  a /usr/bin/python script text executable
   9  exported SGML document text
   9  empty
   9  data
   8  awk script text executable
   6  very short file (no magic)
   6  a perl script text executable
   6  SVG Scalable Vector Graphics image
   6  ISO-8859 English text
   6  Arhangel archive data
   6  ASCII Pascal program text, with very long lines
   5  lex description text
   5  ISO-8859 c program text
   4  UTF-8 Unicode (with BOM) English text
   4  ASCII mail text
   4  ASCII English text, with very long lines
   3  Perl5 module source text
   3  PDF document, version 1.4
   3  PDF document, version 1.3
   3  ISO-8859 Pascal program text
   3  ERROR: line 22: regexec error 17, (illegal byte sequence)
   3  Bio-Rad .PIC Image File 10799 x 8202, 8234 images in file
   2  diff output text
   2  a python script text executable
   2  a /usr/bin/python2 script text executable
   2  UTF-8 Unicode text
   2  TI-XX Graphing Calculator (FLASH)
   2  PDF document, version 1.2
   2  Non-ISO extended-ASCII c program text
   2  Netpbm PBM image text
   2  FIG image text, version 3.2
   2  DBase 3 index file
   2  Bio-Rad .PIC Image File 26915 x 28262, 25956 images in file
   2  ASCII text, with very long lines
   1  news or mail text
   1  core file (Xenix)
   1  a python2 script text executable
   1  a /usr/bin/perl -s script text executable
   1  XPack archive data
   1  UTF-8 Unicode c program text, with very long lines
   1  UTF-8 Unicode C++ program text
   1  SemOne archive data
   1  SAS 7+
   1  SAS
   1  Par archive data
   1  PPMN archive data
   1  Minix filesystem, V3, 20302 zones
   1  Minix filesystem, V3, 15648 zones
   1  LaTeX 2e document text
   1  ICE authority data
   1  GIF image data, version 89a, 257 x 303
   1  Bio-Rad .PIC Image File 10799 x 29216, 25460 images in file
   1  ASCII news text
   1  ASCII c program text, with escape sequences
   1  ASCII M4 macro language pre-processor text
   1  ASCII Java program text
   1  ASCII English text, with overstriking

y descargo el script deblob del sitio de la FSFLA y veo que esos archivos están contaminados con códigos que no puedo modificar, ni estudiar:

$ cd linux-4.3/
$ ../deblob-4.3 
Makefile: added -gnu to EXTRAVERSION
README: added blurb about GNU Linux-libre
include/linux/firmware.h: added non-Free firmware notification support
include/linux/ihex.h: added non-Free ihex firmware notification support
drivers/base/firmware_class.c: shorten non-Free firmware fail-to-load timeout

MICROCODE_AMD - AMD microcode patch loading support
arch/x86/kernel/cpu/microcode/amd.c: disabled non-Free firmware-loading machinery
arch/x86/kernel/cpu/microcode/amd.c: removed blobs

MICROCODE_AMD_EARLY - Early load AMD microcode
arch/x86/kernel/cpu/microcode/amd_early.c: removed blobs

MICROCODE_INTEL - Intel microcode patch loading support
arch/x86/kernel/cpu/microcode/intel.c: disabled non-Free firmware-loading machinery
arch/x86/kernel/cpu/microcode/intel.c: removed blobs

MICROCODE_INTEL_EARLY - Early load Intel microcode
arch/x86/kernel/cpu/microcode/intel_early.c: removed blobs

MICROCODE_EARLY - Early load microcode
Documentation/x86/early-microcode.txt: removed blobs

...

DRM_NOUVEAU - Nouveau (nVidia) cards
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c: disabled non-Free firmware-loading machinery
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c: removed blobs
drivers/gpu/drm/nouveau/nvkm/engine/falcon.c: disabled non-Free firmware-loading machinery
drivers/gpu/drm/nouveau/nvkm/engine/falcon.c: removed blobs
drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c: disabled non-Free firmware-loading machinery
drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c: removed blobs

...

Entonces, la próxima vez que diga que Linux es libre, sepa que no es así. El linux (kernel) que recibe con las distribuciones más conocidas no permitirá que haga ciertas cosas…. claro que usarlo podrá usarlo, de última es la llamada Libertad 0 (cero)

Más información sobre blob binarios:
* Conferencia: Binary Blobs Attack 2012
* Linux Foundation Driver Statement 2009

Crear archivos grandes

create large files

Varias veces he tenido la necesidad de crear archivos grandes, ya sea para luego darles formato de sistema de archivos y usarlos como imágenes o para llenar espacio en disco. Hasta ahora utilizaba el comando dd, pero hace poco encontré que existen formas múcho más rápidas para hacerlo y que terminan siendo más adecuadas.

dd

Como dije utilizaba el comando dd que está pensado para copiar archivos y, cuando se leen datos desde el dispositivo /dev/zero, se puede crear un archivo lleno de ceros.

dd if=/dev/zero of=archivo.img bs=1024 count=1000000

Página man dd

fallocate

fallocate se utiliza para pre-asignar bloques a un nombre de archivo. Esta tarea se realiza muy rápidamente porque solo se asignan bloques sin datos, por lo que no se realizan operaciones de entrada/salida y termina siendo mucho más rápido que crear un archivo lleno de ceros.

fallocate está disponible desde el kernel Linux v2.6.31 y está soportado por los sistemas de archivos btrfs, ext4, ocfs2 y xfs.

fallocate -l 10M archivo.img

Página man fallocate

truncate

truncate permite ampliar o reducir un archivo a un tamaño especificado. Si el archivo no existe, se crea con el tamaño específico, que es lo que generalmente necesito hacer.

Si un archivo es más grande que el tamaño especificado, se pierden los datos extra. Si un archivo es más corto, se extiende y la parte ampliada está llena de byte cero.

truncate -s 10M archivo.img

Página man truncate

xfs_mkfile

xfs_mkfile permite crear uno o más archivos en sistemas de archivo xfs exclusivamente (lo estandar en RedHat a partir de la versión 7).

El archivo por defecto se rellena con ceros por defecto. El tamaño que se indica por defecto es en bytes, pero se pueden indicar en kilobytes, bloques, megabytes o gigabytes con los parámetros k, b, m, o g, respectivamente.

xfs_mkfile 1240m archivo.img

Pagina man xfs_mkfile

Packer crea tus imágenes en cualquier lugar

hero_image-d2e0f00a

Desde que Martín Loy me sugirió probar Packer para crear mis propias imágenes (box) para Vagrant he descubierto una herramienta que me ha dado muchas satisfacciones.

A partir de una simple descripción en un archivo json, Packer crea una máquina virtual en múltiples plataformas, instala el sistema operativo y lo aprovisiona, para finalizar creando una imagen de dicha máquina virtual para futuros usos.

Así Packer puede crear una AMI para Amazon EC2,  un snapshot para DigitalOcean, Docker, o Google Compute Engine, una imagen para OpenStack o Qemu, un OVF para Virtualbox, un VMX para VMWare o un box para Vagrant.

A partir de la ejecución un único comando

$ packer build centos-7.1.1503-x86_64.json

se obtiene una imágen pronta para re-utilizar las veces que sea necesarias.

==> Builds finished. The artifacts of successful builds are:
--> virtualbox-iso: 'virtualbox' provider box: build/centos-7.1.1503-x86_64.box

Con la ventaja de poder «perfeccionar» la descripción json y volver a generar una imágen cada vez más adecuada para las necesidades personales.

Hay que reconocer que la gente de HashiCorp tiene muy claro los conceptos de automatización.

Virtualbox Guest Additions en Fedora 22

maxresdefault

Estoy probando Fedora 22 en Virtualbox y para instalar las Guest Additions es necesario:

# dnf install kernel-devel kernel-headers dkms gcc gcc-c++

y luego ya se puede correr la utilidad de Virtualbox para compilar los módulos del kernel necesarios para que el Fedora corra con todo el potencial del entorno de virtualización.

docker-machine para embarcar tus contenedores donde quieras

Captura del Puzzle Docker para Android de dockerapps
Imágen del Puzzle Docker para Android de dockerapps

Hacía tiempo, como dos meses, que no me soprendía con «magia informática» ya que acabo de ver docker-machine (sí, dos meses es bastante tiempo en informática, como para empezar a notar óxido intelectual).

Venía utilizando boot2docker para levantar una máquina virtual porta-contenedores que me permitía embarcar en ella mis docker; pero en la última actualización me avisa que es un comando ‘deprecated‘ y me refiere a docker-machine.

Luego de instalarlo (brew install docker-machine) me doy cuenta la notoria evolución que representa docker-machine: permite levantar una instancia/máquina-virtual porta-contenedores en mi notebook (virtualizando con virtualbox o vmware), en una nube (amazon, azure, digitalocean, google, rackspace, openstack, softlayer, etc) o en mi datacenter (openstack, vmwarevsphere), y, a partir de ahí, puedo empezar a embarcar mis contenedores.

El proceso es bien simple:

1. Crear porta-contenedores

Comando para VirtualBox local de nombre ‘vbdev

$ docker-machine create -d virtualbox \
        --virtualbox-memory "5120" \
        vbdev

Comando para DigitalOcean para un ‘droplet‘ en Amsterdam de 1GB ram de nombre ‘dodev

$ docker-machine create --driver digitalocean \
	--digitalocean-access-token "6d0c7..a0bfa" \ 
	--digitalocean-image "ubuntu-14-04-x64" \
	--digitalocean-region "ams1" \
	--digitalocean-size "1gb" \
	dodev

Para hacer esto, docker-machine crea certificados OpenSSH, se valida contra el sistema de cloud o virtualización, provisiona la instancia de acuerdo a la configuración solicitada y registra los accesos.

2. Activar el entorno del porta-contenedores que se va a utilizar

Por ejemplo, el entorno del porta-contenedor en DigitalOcean

$ eval "$(docker-machine env dodev)"

que permitirá a docker hacer las conexiones para administrar los contenedores.

3. Comenzar a embarcar los contenedores de forma acostumbrada

$ docker run hello-world

Como es de esperarse, docker-machine permite toda la administración de nuestro porta-contenedores donde quiera que esté, es decir, iniciarlo, detenerlo, borrarlo, reiniciarlo, obtener su configuración, actualizarlo, etc.

También acceder al porta-contenedor

$ docker-machine ssh dodev

y obtener la lista de todos nuestros porta-contenedores y su estado actual:

$ docker-machine ls
NAME    ACTIVE   DRIVER         STATE     URL                         SWARM
dev              virtualbox     Stopped                               
dodev            digitalocean   Timeout                               
vbdev            virtualbox     Running   tcp://192.168.99.100:2376   

Paso siguiente: docker-compose para instalaciones multi-contenedor.

Monit: servicio si hay enlace

Por distintos temas de arquitectura se planteó la necesidad de disponer de un servicio solamente si el enlace (a Internet) estaba activo, o sea que cuando el enlace estuviera caído el servicio debería estar apagado, o lo contrario.

Perfectamente podría haber creado un simple script que periódicamente (mediante cron) revisara el enlace y actuara como se requiere, y creo que habría solucionado en unas pocas líneas de bash, aunque luego con notificaciones por correo y registros podría ser algo más complejo.

Así que preferí encarar la tarea con monit, por ser un daemon especialmente pensado para monitoreo y acción.

Monit dispone de una funcionalidad de monitoreo de networking y la regla de monit quedó así:

check host ConexionInternet with address 10.0.2.3
    if failed icmp type echo count 3 with timeout 3 seconds
         then exec "/usr/bin/service nginx stop"
    else if succeeded
         then exec "/usr/bin/service nginx start"
    alert monitor@gcorreo.com

y así quedan los registros, cuando baja y sube el servicio:

error    : ICMP echo request for 10.0.2.3 1/3 failed -- Operation not permitted
error    : ICMP echo request for 10.0.2.3 2/3 failed -- Operation not permitted
error    : ICMP echo request for 10.0.2.3 3/3 failed -- Operation not permitted
error    : 'ConexionInternet' failed ICMP test [Echo Request]
info     : 'ConexionInternet' exec: /usr/bin/service

info     : 'ConexionInternet' succeeded ICMP test [Echo Request]
info     : 'ConexionInternet' exec: /usr/bin/service

Luego analizando vimos que el servicio era de capa aplicación, por que decidimos cambiar a monitoreo de conexión, quedando así:

check host ConexionInternet with address www.google.com
    if failed url http://www.google.com/
        then exec "/etc/init.d/nginx stop"
    else if succeeded
        then exec "/etc/init.d/nginx start"
    alert monitor@gcorreo.com

Muy simple y confiable con la tarea delegada en el daemon monit.

Linux networking con Team

Link_Aggregation1

Preparando los temas del curso de RedHat Enterprise Server 7 que dicto, me encuentro con la funcionalidad team o teaming para interfaces Ethernet. Hasta ahora había utilizado bonding que es muy simple de configurar, pero tengo que reconocer que teaming ofrece más potencia de configuración y monitoreo que el anterior bonding.

Este nuevo dispositivo de red «teaming» busca ser más rápido, escalable, simple, configurable en espacio de usuario y reemplazar a bonding utilizando una arquitectura diferente. En si, permite crear una interfaz virtual que agrupa varias interfaces Ethernet reales; el proceso se conoce como «channel bonding«, «Ethernet bonding«, «channel teaming«, «link aggregation«, etc. y el objetivo es aumentar el ancho de banda o la disponibilidad de la conexión.

En team se crea un dispositivo «team«, que es la interfaz virtual que tendrá la IP (v4 y/o v6), a la que se asocian «ports» que son las interfaces reales.  El kernel tiene un mínimo driver para el manejo de paquetes y toda la funcionalidad está dada por un daemon teamd que implementa los runners que manejan los modos en que trabajarán las interfaces (broadcast, roundrobin, activebackup, loadbalance, lacp).

Las principales ventajas de team son:

  • Control a nivel de espacio de usuario
  • Monitoreo de link por interfaz
  • API para administración
  • Backup y upload de configuración mediante JSON

Así que ahora tenemos:

Un dirver del kernel:

filename:       /lib/modules/4.0.4-301.fc22.x86_64/kernel/drivers/net/team/team.ko.xz
alias:          rtnl-link-team
description:    Ethernet team device driver
author:         Jiri Pirko <jpirko@redhat.com>
license:        GPL v2
depends:
intree:         Y
vermagic:       4.0.4-301.fc22.x86_64 SMP mod_unload
signer:         Fedora kernel signing key
sig_key:        6A:00:6A:CA:14:AF:B6:50:69:E2:C0:94:CB:35:EA:80:6E:85:C2:4B
sig_hashalgo:   sha256

Un daemon:

teamd — team network device control daemon

Una librería:

Description : This package contains a library which is a user-space
: counterpart for team network driver. It provides an API
: to control team network devices.

Una herramienta de control de teamd:

teamdctl — team daemon control tool

Una herramienta de control de las interfaces:

teamnl — team network device Netlink interface tool

El equipo de Redhat ha trabajado mucho para dejar funcionando team con NetworkManager, aunque algunas funcionalidades avanzadas (por ej. Bridge sobre el Team) todavía requieren de los comandos y los ‘viejos’ archivos.

Sugiero leer el artículo «If You Like Bonding, You Will Love Teaming» por el autor del driver Jiri Pirko y Rashid Khan; y para un completo estudio del tema el manual de Redhat Enterprise Linux 7.

Ceibal y Google Apps for Education: bienvenida la discusión, pero para arribar a conclusiones

IT_GAFElogo

El Plan Ceibal firmó un contrato para disponer de Google Apps For Education para la Educación Pública de Uruguay y recientemente la Universidad de la República (UdelaR) emitió un comunicado manifestando su «honda preocupación por la aplicación del acuerdo sin discusión previa«.

Su preocupación se centra en la  «cuestión la protección de los datos personales de los menores de edad alumnos de la ANEP, en clara discordancia con la normativa vigente en nuestro país«.  El comunicado concluye con la explícita disposición institucional para discutir y evaluar «alternativas eficaces» «que sean garantes de la protección de los derechos consagrados por la legislación nacional«.

Bienvenida la discusión, que siempre es buena y sana cuando su objetivo es arribar a conclusiones y lograr un mejor resultado que el originalmente previsto.

El Plan Ceibal sometió el contrato al análisis de la Unidad Reguladora de Control de Datos Personales (URCDP) que concluyó que el acuerdo «se adecúa a las disposiciones normativas vigentes en materia de protección de datos personales«.

Entonces lo primero a resolver es quién tiene razón si la Universidad de la República que ve una clara discordancia con la normativa vigente o la Unidad Reguladora de Control de Datos Personales que entiende que se adecúa a la normativa. Tiendo a pensar que la organización especializada en regular los datos personales (URCDP) a quién le piden un análisis específico, no se equivoca y creo que la Universidad de la República se apresuró en sus fundamentos, sin consultar a sus especialistas en la materia.

Pero más me llama la atención cuándo la Universidad de la República ofrece discutir y evaluar alternativas eficaces que sean garantes de la protección de los derechos, pues si tiene alternativas eficaces deberian estarlas planteando.  Es fácil darse cuenta que el Plan Ceibal YA TIENE el problema resuelto de ofrecer una plataforma mediante este acuerdo con Google, mientras que la Universidad de la República pretende detenerlo para abrir una mesa para una discusión abierta y minuciosa de alternativas (no manifiestas).

Bienvenida la discusión.  Discutamos, pero si es una discusión constructiva.

Percibo un mensaje de lo que hiciste no me gusta y como no lo discutiste conmigo, entonces «paren las rotativas»,  primero vamos discutirlo y luego vemos qué hacemos, y eso no parece constructivo.

Quién profesa «honda preocupación» por algo, no está a favor. ¿es esa la semilla para ofrecer un aporte constructivo?

¿por qué la Universidad ve problemas donde Ceibal no los ve? ¿acaso por la «clara discordancia con la normativa vigente»? …. ¿y URCDP?

o ¿por qué la Universidad conoce «alternativas eficaces» que Ceibal no conoce?  ¿por qué parecen estar  «reservadas» para la mesa de discusión una vez que el acuerdo se «congele»?   La Universidad de la República tiene gente con muchísima capacidad que seguro está al tanto de esas alternativas eficaces ¿por qué no las están planteando?

Sigo diciendo que es buena la discusión del tema y que se tiene que dar, pero que no así, que parece un palo en la rueda al Plan Ceibal.

No así, sin concretar esas alternativas eficaces a los servicios de Google Apps for Education de los que se habla, porque a mi me dan miedo otras empresas globales, competidoras de Google, que ya han ‘coqueteado’ con el Plan Ceibal y que si son alternativas.

Con comunicados de este tenor pienso que la Universidad de la República se está perdiendo la oportunidad de hacer un aporte sustancial al Plan Ceibal.  Si se tiene conciencia de los problemas relativos a la protección de la privacidad, aprovechemos a trabajar con los maestros, educadores, familias y niños para que cada uno pueda reconocer estos problemas y protejer sus datos.

Y sería bueno para toda la sociedad la discusión seria de las soluciones eficaces (que existen) para protejer la privacidad y los datos personales; pero cómo dice Raúl Echeberria en la nota de Subrayado «la discusión sobre la privacidad y protección de los datos personales ‘es otro tema’«, o  al menos es lo que hasta ahora parece y está quedando relegada.