android-sdk-linux emulator: error=2

Hoy estaba haciendo unas mejoras en una de las APPs que tengo disponibles para Android y tras instalar todo el sistema Eclipse + Android SDK en mi nuevo equipo, creo una nueva máquina. En este caso, y para dar soporte a las mejoras que trae de pantalla, creé un dispositivo de tipo Nexus 5. Tras crearlo, decido iniciarlo para ver cómo se comporta la APP y obtengo el siguiente error,

Starting emulator for AVD 'Nexus_5'
Failed to start emulator: Cannot run program "/home/javier/Eclipse/android-sdk-linux/tools/emulator": error=2, No existe el archivo o el directorio
El error no tiene nada que ver con la versión de Android instalada ni de la API, sino con un fallo de librerías en sistemas de 64 bits. Tras investigar un poco, obtengo la solución,
shell> apt-get install libncurses5:i386 \
                       libstdc++6:i386 \
                       zlib1g:i386
Tras instalar los nuevos paquetes, las máquinas Android emuladas ya arrancan sin problemas.
Leer más

Arrancar ISO desde grub

Una de las muchas sorpresas que depara GNU/Linux es la versatilidad que este ofrece para hacer cosas. Hoy vamos a ver una que nos puede ayudar e incluso sacar de más de un apuro y que es cómo arrancar una ISO desde Grub.
Por norma general, cuando queremos arrancar una ISO, debemos de grabarla en un CD o en un pendrive para poder iniciar con ella el equipo y así verla y probarla. Pues bien, este tipo de acciones se pueden terminar con la posibilidad de arrancar una ISO desde el propio grub. Este método no servirá, lógicamente, para una reinstalación completa de tu sistema, pero sí te brindará la posibilidad de reiniciar tu equipo y probar una ISO de cualquier otra distribución o arrancar algún CD de utilidades. Vamos ya, por lo tanto, a preparar nuestro entorno.

Preparación del sistema

Vamos a ver aquí los pasos que debemos de hacer antes de nada. Lo primero será obtener la ISO que queramos tener en el arranque. Por ejemplo, una Ubuntu, una copia de BackTrack o el mismo Gparted. Para ello, debemos de ir a la web oficial y descargarla. Este paso no tiene nada que ver con lo que vamos a comentar, pero sí es necesario para luego.
Una vez que tengamos la ISO, deberemos de colocarla en una ruta específica. Puesto que estamos hablando de ISO de arranque, a mi me gusta colocarlas en /iso, por lo tanto,
shell> mkdir /iso
shell> mv gparted-live-0.20.0-2-i486.iso /iso
shell> mv ubuntu-14.04.1-desktop-amd64.iso /iso
A continuación, vamos a hacer que el grub se muestre cuando arranque, pues en las últimas versiones arranca con un retraso de 0 segundos, lo que hace que se complique la elección del sistema operativo a arrancar. Si no tienes este problema, ignora este paso, sino, edita el fichero /etc/default/grub y déjalo como sigue.
...
#GRUB_HIDDEN_TIMEOUT=0
...
Y ya para finalizar el apartado de cosas que debemos de saber, necesitamos averiguar sobre qué disco y que partición está nuestra nueva carpeta (/iso). Si tienes una instalación de las típicas, se supone que estará en el disco 0 (/dev/hda o /dev/sda) y la partición 1, por lo tanto (hd0, 1). Esto es importante tenerlo identificado. Para asegurarte, compruébalo con fdisk y con mount.
shell> fdisk -l
Dispositivo Inicio Comienzo    Fin    Bloques  Id  Sistema
/dev/sda1   *      2048   29296639   14647296  83  Linux
/dev/sda2      29296640   33202175    1952768  82  Linux swap
/dev/sda3      33202176  234440703  100619264  8e  Linux LVM
shell> mount
/dev/sda1 on / type ext4 (rw,errors=remount-ro)
...

Edición del grub

La parte común ya está. Ahora nos queda añadir las entradas necesarias a nuestro grub. Se recomienda no añadirlas directamente en /boot/grub/grub.cfg, puesto que en cada actualización este fichero se regenera y por lo tanto los cambios se pierden. Lo mejor es usar el fichero /etc/grub.d/40_custom, que es precisamente para estos casos, añadir entradas manualmente.

Ubuntu 64

menuentry 'Ubuntu 14.04 Live (64 bits)' {
   set isofile="/iso/ubuntu-14.04.1-desktop-amd64.iso"
   loopback loop (hd0,5)$isofile
   linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
   initrd (loop)/casper/initrd.lz
}

Ubuntu 32

menuentry 'Ubuntu 14.04 Live (32 bits)' {
   set isofile="/iso/ubuntu-14.04.1-desktop-i386.iso"
   loopback loop (hd0,5)$isofile
   linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
   initrd (loop)/casper/initrd.lz
}

Gparted

menuentry 'Gparted' {
   set isofile="/iso/gparted-live-0.20.0-2-i486.iso"
   set root=(hd0,5)
   loopback loop (hd0,5)$isofile
   linux (loop)/live/vmlinuz boot=live config union=aufs noswap noprompt ip=frommedia toram=filesystem.squashfs findiso=$isofile
   initrd (loop)/live/initrd.img
}
Cómo veis, cada ISO a arrancar tiene unas opciones diferentes y estas debes de averiguarlas antes de poder iniciarla. Por norma general, está documentado el proceso en la web principal.
Lo único que nos queda ahora por realizar es una actualización del grub.
shell> update-grub2

Arrancando desde la ISO

Llegados a este punto, ya estamos listos para poder reiniciar nuestro sistema. Así que, cerramos la consola y todo lo que estemos haciendo y reiniciamos.
Os debería, tras el reinicio salir una pantalla similar a esta donde destaqué con letra más clara las dos ISOs que tendremos disponibles para iniciar.





Qué significa cada uno de los parámetros

  • menuentry
    Nombre que aparecerá como entrada del grub.
  • set isofile
    Define una variable, isofile, que contendrá la ruta absoluta de la imagen a iniciar.
  • set root
    Indica la partición raíz sobre la que está la imagen.
  • loopback
    Indica la ruta donde localizar la imagen en el disco. Es una composición de disco + variable isofile.
  • linux
    Kernel que se usará para arrancar y la localización del mismo. También se le pasan aquí las opciones de arranque.
  • initrd
    Indica la localización del fichero initrd, pero siempre dentro de la imagen.
Leer más

Bloquear múltiples IPs eficientemente

Fijo que a muchos nos ha pasado que tengamos que bloquear un listado de IPs o rangos de red que están intentando atacar un servidor. La forma más sencilla y habitual de hacerlo, no es otra que emplear IPTables para realizar el trabajo. Algo similar a lo que sigue, para cada una de las IPs a bloquear,
shell> iptables -A INPUT -s 192.168.0.16 -p TCP -j DROP
O si lo necesitas hacer para una red,
shell> iptables -A INPUT -s 192.168.0.0/24 -p TCP -j DROP
Esto funciona perfectamente, pero si hay que repetir este paso para unas 1000 IPs/redes, quizás la forma de hacerlo ya no sea tan sencilla de aplicar, y mucho menos, tan gustosa de hacer. Para solucionar esto, IP Sets simplifica este proceso.

Qué es IP Sets

IP Sets es una feature del kernel de Linux que permite definir múltiples y diferentes IPs, redes, direcciones MAC o puertos y cargarlas desde IPTables. La ventaja es que para almacenarlas y usarlas emplea estructuras bitmap/hash, lo que lo hace muy eficiente en acceso. Esta es la principal ventaja, la otra es que puedes meter en dicha tabla miles de direcciones y cargarlas todas con una única regla de IPTables.

Instalación

Lo primero que vamos a ver es cómo instalar este software.
shell> apt-get install ipset

Uso

Tras la instalación del mismo, únicamente nos queda por crear la tabla que después cargaremos. Para ello, emplearemos el siguiente comando,
shell> ipset create bannet hash:ip
El primer argumento (bannet) es el nombre de la tabla que vamos a crear. El segundo (hash:ip) es el tipo de tabla a crear. Este tipo puede ser diferente según nuestros propósitos y puedes ver aquí todos los métodos soportados. En este caso, nos interesa un tipo hash:ip, ya que vamos a almacenar en ella un listado de IPs aisladas.
Con la tabla creada, ya sólo nos queda meterle las IPs que deseamos. Para ello, y este proceso sí que debe ser manual,
shell> ipset add bannet 1.1.1.1
shell> ipset add bannet 1.1.2.2
shell> ipset add bannet 1.1.3.3
shell> ipset add bannet 1.1.4.4
Y para ver un listado de las IPs introducidas,
shell> ipset list
Name: bannet
Type: hash:ip
Header: family inet hashsize 1024 maxelem 65536 
Size in memory: 16568
References: 0
Members:
1.1.3.3
1.1.4.4
1.1.2.2
1.1.1.1
Llegados a este punto, sólo nos queda cargar este IPSet en IPTables. Para hacerlo emplearemos la opción "-m set --match-set", quedando la regla tal que así,
shell> iptables -I INPUT -m set --match-set bannet src -p TCP -j DROP
Cómo veis, una única regla para manejar todas aquellas IPs bloqueadas.

Guardado y restauración

Las tablas creadas van a necesitar un mantenimiento, e IPSet está preparado para ofrecerlo, incorporando opciones de borrado, restauración, testeo, destrucción y un largo etcétera. Se recomienda leer la página man de IPSet. De todas formas, quizás una de las tareas más importantes sea la de guardar las reglas de un tabla, por tener un backup, y volver a restaurarlas en caso de necesidad.
Para hacer un backup de un conjunto de reglas,
shell> ipset save bannet > /backup/bannet.list
Para destruir un conjunto de las mismas,
shell> ipset destroy bannet
Y para restaurarlas, en caso de necesidad,
shell> ipset restore < /backup/bannet.list

En la próxima entrada veremos cómo aprovechas las listas disponibles en la red para mejorar la seguridad de nuestra red. Pero por el momento, quizás con esta opción, muchas de las reglas que tenéis en IPTables puedan ser reducidas de forma muy eficiente.

Referencias

Leer más

Instalación de SonarQube en GNU/Linux

Hace unos días un compañero y amigo, +Celso Conde Pérez, me preguntó si conocía SonarQube.
Para los que no lo sepáis, SonarQube es una plataforma centralizada de evaluación de código. Es software libre, lo cual está genial, y permite la evaluación estática de código según patrones preestablecidos. El objetivo es garantizar la calidad del código escrito. En El Mundo en Bits hablamos hace tiempo de una herramienta similar, rats, y puedes leer el artículo aquí. Digo similar, ya que Sonar cubre muchos más aspectos.
Puesto que últimamente estoy enfrascado en algunas tareas de desarrollo de scripts y código, decidí probar esta herramienta, ya que trae soporte para multitud de lenguajes de programación (python, php, java, etc.). Así que lo primero fue levantar una máquina virtual para poder instalar el servidor web. Con la máquina levantada simplemente seguí las instrucciones de instalación paso a paso.
  1. Instalación de la base de datos
    Aunque Sonar trae por defecto una base de datos embebida, tengo más experiencia y me gusta manejar los datos desde un MySQL. En este caso empleé para la máquina un sistema CentOS, así que,
    shell> yum install mysql-server
    
    Finalizada la instalación arrancamos el servicio,
    shell> service mysqld start
    
    Y creamos la base de datos que vamos a emplear en sonar, así como un usuario con permisos,
    mysql> CREATE DATABASE sonar;
    mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
    mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
    
  2. Instalar el servidor SonarQube
    Lo primero que tenemos que hacer es descargar la última versión del servidor. Para ello, desde la página oficial, sección descarga lo tenemos (la versión actual la puedes descargar desde aquí).
    shell> cd /tmp
    shell> wget dist.sonar.codehaus.org/sonarqube-4.5.1.zip
    
    A continuación lo descomprimimos,
    shell> unzip sonarqube-4.5.1.zip
    
    Y lo movemos a /etc, como dice en la guía de instalación.
    shell> mv /tmp/sonarqube-4.5.1 /etc/sonarqube
    
    Con esto ya tenemos el sistema SonarQube instalado y listo para poder usarse, aunque antes, debemos de configurar el acceso a base de datos. Para ello, editamos el fichero de propiedades de sonar, /etc/sonarqube/conf/sonar.properties y establecemos los parámetros de acceso a base de datos. El resto de la configuración nos sirve por defecto.
    ...
    #sonar.embeddedDatabase.port=9092
    ...
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar
    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
    ...
    sonar.web.host=0.0.0.0
    sonar.web.port=9000
    ...
    
  3. Arrancar el sistema
    Con todo listo y configurado ya podemos arrancar el servidor Sonar.
    shell> /etc/sonarqube/bin/linux-x86-64/sonar.sh start
    
    La carpeta dentro de bin a la que tendréis que acceder depende directamente del sistema sobre el que esté montando. En mi caso, es un sistema de 64 bits, por lo tanto empleo el script de 64bits.
    Tener presente que en el primer arranque hace un despliegue completo de toda la base de datos y esto, según el ordenador, podrá llevar más o menos tiempo. En mi caso, llevó algo más de 2 minutos, por lo que ser pacientes. El progreso de arranque lo podéis observar en el fichero de log (/etc/sonarqube/logs/sonar.log).
SonarQube está escrito en java, lo que hace necesario, para que todo funcione, tener instalado java en el sistema. Si no lo tenéis ya, habrá que ir a la web de Oracle y descargar la versión que corresponda del jdk e instalarlo. Por ejemplo, para la máquina en cuestión, descargué el jdk-8u25-linux-x64.rpm y tras su instalación el sistema Sonar ya pudo arrancar perfectamente.

Con la instalación del servidor Sonar, únicamente tenemos la parte centralizada de evaluación y análisis de código, pero tenemos pendiente todavía la configuración de los plugins de soporte de diversos lenguajes y también el cliente (sonar-runner), que analizará y enviará el código al servidor. Estas partes ocuparan las próximas entradas.
Leer más

Vagrant: Instalación y primeros pasos

Esta entrada la tenía pendiente desde que el otro día hablé con +Susana López Barreras sobre el tema. Así que por fin me decidí terminarla y publicarla. Servirá para ella y para más gente, espero.

¿Qué es Vagrant?

Vagrant es una herramienta pensada para facilitar la creación y configuración automática de entornos de desarrollo virtualizados. Aunque en sus orígines únicamente se podía usar con VirtualBox, actualmente ya es capaz de desplegar máquinas en sistemas como VMware, Amazon EC2, etc. La gran ventaja es que trabaja de la mano directamente con herramientas de centralización de configuraciones, tales como Puppet o SaltStack, de las que hablamos aquí en más de una ocasión. Es gracias a esta perfecta combinación donde reside el verdadero poder de Vagrant.

Instalación

Vagrant está disponible en los repositorios de la mayoría de distribuciones, pero yo personalmente recomiendo bajar el paquete desde la web oficial, Vagrantup.com, para disponer así de la última versión. Compensa tener la versión de la web oficial, ya que tiene importantes mejoras. Así que nos dirigimos a la parte de descargas y seleccionamos el sistema operativo que tengamos y lo descargamos. Yo personalmente me bajo la de Debian 64 ;-)
shell> wget https://dl.bintray.com/.../vagrant_1.6.5
Una vez la tenemos, simplemente instalamos el nuevo paquete,
shell> dpkg -i vagrant_1.6.5_x86_64.deb
Y desde este momento ya disponemos de Vagrant instalado en el sistema. Crear una nueva instancia de una máquina virtual a partir de ahora será muy sencillo y trivial.

Uso de Vagrant

Efectivamente, Vagrant, si no se emplea con SaltStack o Puppet, no es más que una forma diferente de crear máquinas virtuales en VirtualBox, por decirlo de forma sencilla. Aun así, es una forma muy cómoda, pues no necesitas realizar ningún tipo de instalación. Esta es la primero ventaja que tiene Vagrant. Si necesitas una máquina con un determinado sistema operativos, ya no es necesario descargar la ISO e instalarla, desde Vagrant es más sencillo.

Crear nueva máquina

shell> vagrant init
 A `Vagrantfile` has been placed in this directory. You are now
 ready to `vagrant up` your first virtual environment! Please read
 the comments in the Vagrantfile as well as documentation on
 `vagrantup.com` for more information on using Vagrant.
A continuación editamos dicho fichero (/tmp/Vagrantfile),
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
   config.vm.box = "ubuntu/precise64"
end
Dejándolo tal y como se muestra anteriormente. A continuación, simplemente,
shell> vagrant up
 Bringing machine 'default' up with 'virtualbox' provider...
  ==> default: Importing base box 'ubuntu/precise64'...
  ==> default: Matching MAC address for NAT networking...
  ...
Este comando hará todo lo necesario. Es decir, se descargará la pre-imagen de la máquina precise64 si fuese necesario, creará una nueva instancia de la máquina en VirtualBox (por defecto) y la arrancará. Para acceder a ella,
shell> vagrant ssh

Welcome to Ubuntu 12.04.5 LTS (GNU/Linux 3.2.0-72-virtual)
...

vagrant@vagrant-ubuntu-precise-64:~$
Si necesitas otra máquina, cual sea, simplemente editas el fichero y la creas. Sin complicaciones. Existen multitud de máquinas libres para descarga en vagrantcloud.

Destruir máquina

La ventaja de Vagrant y que veremos en próximas entradas es el poder de la auto-creación, pero por el momento, si tras levantar tu máquina virtual y trabajar con ella varios días, finalizaste el trabajo y ya no quieres que te ocupe espacio, simplemente,
shell> vagrant destroy
 Are you sure you want to destroy the 'default' VM? [y/N] y
  ==> default: Forcing shutdown of VM...
  ==> default: Destroying VM and associated drives...

Más

Como era de esperar, puedes apagarla, volver a levantarla, suspenderla y un largo etcétera de funcionalidades, según lo que aporte el sistema de virtualización que emplees.
Leer más

Actualizando librerías para metasploit

Hace ya unos meses que no jugaba con metasploit y hoy, tras decidirme a hacer unas pruebas de concepto de shellshock, tras actualizar el framework me empiezan a dar errores de librerías y no arranca. Puesto que no creo que sea al único al que le pasan, dejo aquí las soluciones tomadas, que espero a alguien le sirvan. Lo primero de todo, el error mostrado cuando intentaba arrancar el framework,
shell> msfconsole
/var/lib/gems/1.9.1/gems/bundler-1.3.5/lib/bundler/spec_set.rb:92:in `block in materialize': Could not find rake-10.3.2 in any of the sources (Bundler::GemNotFound)
...
Como se puede deducir por el mensaje, el problema está en la librería rake. Y concretamente en la versión de la misma que tras el ultimo upgrade de metasploit es necesaria. Para solucionarlo, actualizamos dicha librería
shell> gem install rake
Fetching: rake-10.3.2.gem (100%)
Successfully installed rake-10.3.2
1 gem installed
...
Y un nuevo error vuelve a aparecer en escena. Esta vez,
shell> msfconsole
/var/lib/gems/1.9.1/gems/bundler-1.3.5/lib/bundler/spec_set.rb:92:in `block in materialize': Could not find i18n-0.6.11 in any of the sources (Bundler::GemNotFound)
...
Aplicamos la misma solución que en el primer caso,
shell> gem install i18n
...
Installing sqlite3 (1.3.9) 
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /usr/bin/ruby1.9.1 extconf.rb 
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal',
'yum install sqlite-devel' or 'apt-get install libsqlite3-dev'
and check your shared library search path (the
location where your sqlite3 shared library is located).
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Gem files will remain installed in /var/lib/gems/1.9.1/gems/sqlite3-1.3.9 for inspection.
Results logged to /var/lib/gems/1.9.1/gems/sqlite3-1.3.9/ext/sqlite3/gem_make.out

An error occurred while installing sqlite3 (1.3.9), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.3.9'` succeeds before bundling.
Sólo que esta vez nos avisa de otro error de por medio. Nos falta una librería necesaria para poder instalar sqlite3 y, por suerte, la solución también nos la da un poco más arriba, que es instalar el paquete libsqlite3-dev. Procedemos,
shell> apt-get install libsqlite3-dev
Una vez finalizado, repetimos la instalación de i18n, esta vez debería de ir todo correcto y msfconsole debería de arrancar ya perfectamente.
shell> msfconsole
# cowsay++
 ____________
 metasploit 
 ------------
       \   ,__,
        \  (oo)____
           (__)    )\
              ||--|| *

+ -- --=[ 1358 exploits - 761 auxiliary - 218 post        ]
+ -- --=[ 346 payloads - 35 encoders - 8 nops             ]
+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]

msf >
Si a alguien le pasa lo mismo, aquí podrá encontrar la solución.
Leer más

Limitar velocidad de descarga para APT

Con los nuevos métodos de trabajo que se están implantando en entornos grandes, cada vez resulta más necesario tener un método de control que limite ciertos problemas de colapso de red. Uno de ellos es la instalación/actualización de paquetes en los servidores. Imaginaros que tenemos una red de 100 ordenadores con Debian/Ubuntu y decidimos instalar un nuevo paquete en todos. Herramientas como salt stack  hacen esta trabajo realmente sencillo y rápido,
shell> salt -G 'os:Debian' pkg.install vim
y mandar a 100 equipos descargar un mismo paquete en un mismo momento, puede provocar un colapso de red y ésta afectaría a todos los equipos y personas que estén en ella.
Para evitarlo, si empleamos herramientas de orquestación, por ejemplo para sistemas Debian, es muy recomendable configurar un máximo de velocidad de descarga desde los repositorios APT. Así evitaremos un sobre saturar de la red. Hacerlo es tan sencillo como crear el fichero /etc/apt/apt.conf.d/99limit con el siguiente contenido,
Acquire
{
   Queue-mode "access";
   http
   {
      Dl-Limit "25";
   };
};
Tras guardarlo, la próxima vez que empleemos apt, la velocidad de descarga se limitará a los kbs aquí establecidos (más o menos).
Leer más

Solucionar problema con popups en Chrome

Hoy me he encontrado con un problema en el trabajo. Tras la última actualización de Chrome no me abrían los popups de la web que usamos para gestionar los proyectos, lanzar ausencias, etc. ya que Chrome considera que este método está en desuso. La solución pasa por habilitar la opción de características web deprecated y para ello os dejamos aquí los siguientes pasos:

  1. Creamos la carpeta de políticas de Chrome
    shell> mkdir -p /etc/opt/chrome/policies/managed
    
  2. Creamos un fichero, chrome.js, con el siguiente contenido,
    {
    
    EnableDeprecatedWebPlatformFeatures = "ShowModalDialog_EffectiveUntil20150430"
    
    }
    
    Con esto lo habilitaríamos hasta el 30 de Abril de 2015
  3. Reiniciamos Chrome
    Una vez hecho esto, abrimos las políticas de Chrome para comprobar que se han cargado correctamente. La URL: chrome://policy
    Si todo fue bien debería aparecer la política que acabamos de introducir y ya deberían funcionar correctamente los popups.
Leer más

Humor social IV





Leer más

IP de salida en Postfix

Seguimos hablando de Postfix y de variables de configuración que, según qué instalación, pueden ser interesantes. Hoy vamos a ver cómo indicarle al servidor de correo la IP para el correo de salida que debe emplear (variable smtp_bind_address). Por defecto, dicha variable no se suele configurar y es el propio servicio el que se encarga de salir por el interfaz que mejor le convenga. En caso de que teniendo un servidor con más de una IP de salida, nos interese que el correo salga por una concreta, simplemente con indicarlo en el fichero de configuración (/etc/postfix/main.cf) nos llegaría.
smtp_bind_address = 192.168.0.2
Una vez reiniciado Postfix, la salida de correos se producirá por dicha IP y, por lo tanto, por el interfaz en el que esté configurada.
Leer más

Samba: Registro de actividad

Por normal general, tarde o temprano, al trabajar sobre unidades de red y ficheros compartidos, la pregunta ¿quién ha borrado el fichero ...? llega al administrador de sistemas. Es en este momento cuando un samba mal configurado o con unas opciones de auditoría malas puede complicarte la vida.
Por suerte, samba nativamente ofrece dicha posibilidad, y únicamente para usarlo hay que emplear el módulo full_audit que viene incluido ya en las últimas versiones de samba. La forma en la que yo lo implementé creo que es la más sencilla y fácil de gestionar, y permite más modularidad. Para ello, comenzamos creando el fichero /etc/samba/audit.conf con el siguiente contenido,
vfs objects         = full_audit
 
full_audit:prefix   = %u|%I|%m|%S
full_audit:success  = mkdir rename unlink rmdir pwrite
full_audit:failure  = none
full_audit:facility = local0
full_audit:priority = INFO
Con el fichero creado, únicamente debemos de incluir este método de auditoría en aquellas carpetas compartidas que deseemos. Para hacerlo, nada más sencillo que en el fichero /etc/samba/samba.conf, añadir la siguiente línea las unidades que deseemos,
[UNIDAD DE RED]
  include   = /etc/samba/audit.conf
  path      = /srv/data
  read only = no
  ...
Tras ello, y antes de reiniciar el servicio, podemos comprobar con testparm que el fichero de configuración es válido. Si todo está correcto, entonces ya podemos reiniciar el servicio.
shell> testparm
shell> service smbd restart
shell> service nmbd restart
Desde este momento, aparecerán líneas en syslog indicando la actividad de los usuarios en el sistema.
shell> tail -f /var/log/syslog
mail|192.168.0.20|304j|user|pwrite|ok|data/file.text
fran|192.168.0.14|71aj|user|pwrite|ok|data/file.text
fran|192.168.0.14|712j|user|pwrite|ok|data/file.text
mail|192.168.0.20|304j|user|pwrite|ok|data/file.text
javier|192.168.0.25|304j|user|pwrite|ok|javier/file.text
javier|192.168.0.25|304j|user|pwrite|ok|javier/file.text
javier|192.168.0.25|304j|user|pwrite|ok|javier/file.text
Espero que os sea de utilidad. En esta salida, buscar un evento, como veis es muy sencillo.

Nota:

Significado de las líneas del fichero de auditoría:
  • vfs objects
    Indicamos que use el módulo full_audit
  • full_audit:success
    Especifica las acciones en las cuales realizar la escritura de auditoría.
    • mkdir: Creación de directorios
    • rename: Cambio de nombres
    • unlink: Borrado de ficheros
    • rmdir: Borrado de directorios
    • pwrite: Nuevos ficheros (creados o subidos)
    Aquí puedes encontrar toda la lista de opciones soportadas.
  • full_audit:failure
    Indica qué acciones se deben de escribir a auditoría en caso de que fallen.
  • full_audit:facility
    full_audit envía todo a syslog, pero permite configurarlo por si nos interesa separar o poder filtrar dichas acciones. En este caso, hemos optado por poner la facility local0, ya que suele ser de las no usadas en el sistema.
  • full_audit:priority
    Al igual que nos permite indicar la facility, también se permite indicar la prioridad. Para nosotros INFO.
  • full_audit:prefix
    Indica cómo queremos escribir la línea de log, para hacerla más legible. A continuación os deja la tabla de las variables soportadas por full_audit.
    Variable Definition
    Variables de cliente
    %a Arquitectura del cliente
    %I Dirección IP del cliente
    %m Nombre NetBIOS del cliente
    %M Nombre DNS del cliente
    Variables de usuario
    %u Nombre de usuario
    %U Nombre de usuario que el cliente solicita
    %H Directorio ~ de %u
    %g Grupo primario de %u
    %G Grupo primario de %U
    Variables de compartido
    %S Nombre del compartido
    %P Directorio del compartido
    %p Punto de montaje del compartido
    Variables del servidor
    %d ID del proceso del servidor
    %h Nombre DNS del servidor
    %L Nombre NetBIOS del servidor
    %N Directorio raís del servidor
    %v Versión de samba
    Miscellaneous variables
    %R Nivel de protocolo SMB negociado
    %T Fecha
    var Valor de una variable de entorno var
Leer más

Fallo de seguridad en wget

Descripción:


Vulnerabilidad en wget, CVE-2014-4877, que permite a un atacante crear una estructura malintencionada en un servidor FTP. Con la opción de descarga recursiva que tiene wget, dicho FTP preparado puede crear enlaces, ficheros y directorios con y asignar los permisos que le interesen en el equipo remoto.

Versiones afectadas: < 1.16

Fecha:


29/10//2014

Detalles:


wget es una herramienta que permite la descarga de contenido desde diversos protocolos (http, https y ftp). También, una de las características más destacadas es la descarga recursiva de dicho enlace, lo que permite descargar FTPs completos, por ejemplo. Un FTP creado con un directorio especificamente manipulado, puede llegar a crear ficheros, directorios y enlaces en el sistema remoto que según el contenido de éste puede llegar a ser peligroso.
La vulnerabilidad está identificada con el código CVE-2014-4877.

Solución:


Hay varias soluciones y la primera y principal, es actualizar wget a la última versión disponible, la 1.16, donde ya está corregido el fallo.
En caso de que esta actualización no se pueda realizar, para mitigar el fallo comentado, se pueden tomas estas dos opciones:
  • - -retr-symlinks
    Pasando esta opción en línea de comandos antes de usar wget.
  • retr-symlinks=on
    En el fichero de configuración general (/etc/wgetrc) o de usuario (~/.wgetrc).
Leer más

Soporte VLAN en Debian

El concepto VLAN se emplea para separar através de una misma red física, varias redes virtuales. Esta separación, aunque sencilla de entender, no es tan sencilla a nivel de red. Para dar soporte VLAN, el equipo que se quiere conectar a dicha VLAN, debe marcar aquellos paquetes que se envían por el interfaz de VLAN con el tag correspondiente. A mayores, los equipos intermedios deben también de soportar esta característica, aunque a día de hoy, esto no suele ser ya un problema.

Soporte a VLAN

En sistemas Debian, para añadir el soporte para manejar VLANs, únicamente requiere instalar el paquete vlan.
shell> apt-get install vlan
A continuación necesitamos cargar el módulo que da soporte a VLANs, 8021q.
shell> modprobe 8021q
Y puesto que nos interesa que cada vez que el equipo arranque, dicho soporte exista, hacemos que se cargue.
shell> echo 8021q >> /etc/modules

Creando VLAN

Con el soporte para VLAN añadido, crear una nueva VLAN en el sistema es tan simple como añadir la VLAN y crear el interfaz por el que dar salida a dicha VLAN.
shell> vconfig add eth0 700
shell> ifconfig eth0.700 10.100.10.77/24
Como se puede observar, la VLAN 700, tiene como interfaz asociado el eth0.700, el decir, el interfaz virtual 700. Con esto conseguimos que todos los paquetes que salgan por dicho interfaz se marquen con el tag 700.

Solución estática

Por supuesto, lo escrito hasta aquí hace únicamente que la VLAN esté presente en el sistema hasta que éste se reinicie. Si queremos que este nuevo interfaz quede presente, tendremos que añadirlo al fichero de interfaces, junto con su configuración.
auto eth0.700
iface eth0.700 inet static
 address 10.100.10.77
 netmask 255.255.255.0

Borrando VLAN

Si llegado el momento, por lo que sea debemos de borrar una VLAN, vconfig tiene también forma de hacerlo,
shell> vconfig rem eth0.700
Leer más

Humor social III






Leer más

Reescribiendo direcciones de correo

Postfix, quizás el servidor de correo más extendido en la actualidad tiene miles de facilities interesantes. Una de ellas, y de la que vamos a hablar hoy es la reescritura de la dirección de correo (address rewriting). Esta funcionalidad sirve, por ejemplo, para que todos los correos internos del servidor, lleven como origen una dirección diferente a la real, pudiendo así facilitar una pregunta al administrador en caso de que el correo la generase.
Para poder poner a funcionar las reglas de reescritura, lo primero es crear el fichero /etc/postfix/generic. Este fichero, que será una tabla de mapeos admite expresiones regulares. Por ejemplo,
/^(.*)@(.*).localdomain$/  dudas@local.net
En este caso, todos los correos que salgan del servidor local (fqdn *.localdomain) se enviará con la dirección de origen dudas@local.net. Si alguno de los receptores quiere responder, el mail será entregado a una dirección pública conocida y no a un servidor de la red local.
Por supuesto, tras configurar el fichero generic hay que hacer uso del comando postmap, como para casi todos los ficheros externos de configuración de postfix.
shell> postmap /etc/postfix/generic
Una vez lo tengamos, simplemente lo añadimos a la configuración general (/etc/postfix/main.cf).
smtp_generic_maps = regexp:/etc/postfix/generic
Y reiniciamos el servicio.

Nota

Cada vez que modifiquemos el fichero generic tendremos que volver a crear la tabla de mapeos (postmap) y reiniciar el servicio.
Leer más

Añadir lanzadores en el menú de inicio

El otro día instalé Eclipse en mi ordenador bajándome el tar.gz de la página oficial. Lo descomprimí, lo moví a /opt y ya tenía eclipse, pero evidentemente no lo tenía en el menú de inicio para lanzarlo.
Para que nos aparezca en el menú y poder lanzarlo desde ahí simplemente tenemos que crear el fichero /usr/share/applications/eclipse.desktop con el siguiente contenido:
[Desktop Entry]

Name=Eclipse                # Nombre que aparecerá en el menú
Comment=Eclipse
Exec=/opt/eclipse/eclipse   # Ruta del binario de eclipse
Icon=/opt/eclipse/icon.xpm  # Ruta del icono del menú
Terminal=false
Type=Application
Categories=Development;     # Categoría del lanzador
Y listo! Ahí lo tenemos para poder usar.
Leer más

Expiración de contraseñas en MySQL

Desde la versión 5.6.6, MySQL implementó la posibilidad de poner caducidad o tiempo de expiración de contraseñas. Esto era algo que se llevaba mucho tiempo hablando y que era necesario, ya que la seguridad de los datos también reside en el lugar dónde se almacenan. Para reforzar esto, MySQL puede obligar a un usuario a cambiar la contraseña o el propio administrador puede forzar dicho cambio.
mysql> ALTER USER 'javier'@'localhost' PASSWORD EXPIRE;
Con ello, la próxima vez se conecte dicho usuario tendrá que cambiar la contraseña.
shell> mysql -u javier -p
mysql> SELECT 1;
  ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
Con lo que nos está avisando de que necesitamos restablecer nuestra contraseña para poder hacer cualquier cosa. Para ello,
mysql> SET PASSWORD = PASSWORD('your_password');
  Query OK, 0 rows affected (0.01 sec)

mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
Si el cliente que se está usando para la conexión no tiene soporte para cambiar la contraseña, obtendremos el siguiente mensaje al conectar,
shell> mysql -u myuser -p
  ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.
Con lo que tendremos que actualizar el cliente de conexión para poder seguir trabajando.
Este cambio es importante, pero también debemos tener cuidado con él, pues la fecha de expiración de una contraseña para usuarios de consulta web, por ejemplo, podría darnos dolor de cabeza.

Más información sobre esta nueva feature en la documentación oficial.
Leer más

Humor social II






Leer más

Seguridad en postfix: Deshabilitar VRFY

Hoy es uno de esos días en los que te dedicas a leer documentación y manual de servicios y descubres, como no podía ser de otra forma, parámetros cuando menos interesantes y que suelen ser olvidados. Este olvido puede traer, como veréis, problemas de revelación de datos que debemos de evitar. Hablamos, concretamente del parámetro verify de postfix. Este parámetro sirve para lo siguiente,
shell> telnet local.com 25
Trying 192.168.0.25...
Connected to mail.com.
Escape character is '^]'.
220 mail.local.com ESMTP Postfix
vrfy javier@local.com
252 2.0.0 javier@local.com
vrfy empty@local.com
550 5.1.1 empty@local.com: Recipient address rejected: local.com
exit

Creo que tras ver el ejemplo, ya os imagináis para qué sirve el comando vrfy de postfix. Sí, efectivamente, para poder averiguar si un usuario existe en el servidor o no. Como puedes comprender, crear un pequeño script que se conecte a un servidor de correo de un dominio y liste las cuentas de correo que éste tiene, muy complicado no resulta.
Por lo tanto, si queremos evitar que alguien se nos conecte al servidor y haga un descubrimiento de las cuentas de correo en él configuradas, debemos de ir al fichero de configuración de postfix (/etc/postfix/main.cf) y deshabilitar el uso del comando vrfy.
disable_vrfy_command = yes
Tras incluir la línea aquí arriba citada y reiniciar el servicio, si intentamos la conexión ya se nos advertirá de que no es posible.
shell> telnet local.com 25
Trying 192.168.0.25...
Connected to local.com.
Escape character is '^]'.
220 mail.local.com ESMTP Postfix
vrfy javier@local.com
252 2.5.2 Cannot VRFY user; try RCPT to attempt delivery (or try finger)
expn root
502 5.7.0 Sorry, we do not allow this operation
Leer más

Permisos de usuario avanzados en MySQL

Por temas del trabajo llevo unos días revisando documentación de MySQL y en la parte referente a los permisos de usuario descubrí que hay muchos más límites que se le pueden establecer a un usuario al conectarse al motor de base de datos. Hablando ya de cosas concretas, estamos hablando de límites para:
  • Número de consultas a realizar por hora
  • Número de actualizaciones a realizar por hora
  • Número de conexiones por hora
  • Número de conexiones simultáneas por usuario.

Cómo aplicar los nuevos límites

Estos límites son establecidos para cada usuario, y por lo tanto deben ser indicados para el usuario cuando se crea (comando GRANT), como se ve a continuación.
mysql> CREATE USER 'test'@'localhost' IDENTIFIED BY 'passwd';
mysql> GRANT ALL ON *.* TO 'test'@'localhost'
    -> WITH MAX_QUERIES_PER_HOUR 20
    -> MAX_UPDATES_PER_HOUR 10
    -> MAX_CONNECTIONS_PER_HOUR 20
    -> MAX_USER_CONNECTIONS 1;
Hay que tener en cuenta que estos límites son para query's que no estén en caché, es decir, todas las que implican acceso a recursos. Por lo tanto, si se emplea la misma query se puede realizar más de las N veces establecidas como límite.
Una vez alcanzado el límite establecido, se nos advertirá de ello y no se podrá hacer nada hasta que pase una hora.
mysql> SELECT * FROM users;
ERROR 1226 (42000): User 'test' has exceeded the 'max_questions' resource

Cómo modificar los límites

Lógicamente, también se pueden modificar dichos límites, por ejemplo,
mysql> GRANT USAGE ON *.* TO 'test'@'localhost'
    -> WITH MAX_QUERIES_PER_HOUR 50;

Cómo borrar los límites

Y para borrarlos sólo tenemos que establecer a 0 su valor.
mysql> GRANT USAGE ON *.* TO 'test'@'localhost'
    -> WITH MAX_QUERIES_PER_HOUR 0;


Más información:

Leer más

SSL suma y sigue: Poodle

Este año 2014 va a ser para recordar en la historia de la seguridad informática, sin dudarlo. SSL (heartbleed), bash (CVE-2014-6271 y CVE-2014-7169), y ahora nuevamente el protocolo SSL vuelve a ser noticia con una vulnerabilidad crítica que afecta, por lo que parece, al diseño del protocolo SSL 3.0. El código de fallo es el CVE-2014-3566 y está ahí pues más o menos desde hace 15 años que vio la luz.
El problema está en que a día de hoy la mayoría de los navegadores todavía le dan soporte y por lo tanto son vulnerables. El fallo se puede explotar en un ataque MitM (man-in-the-middle) en el que se fuerce al cliente a emplear el protocolo 3 para así acceder a los datos sin cifrar aunque la sesión esté cifrada.
La solución pasa por deshabilitar el soporte de SSL 3.0 o usar cifrados CBC-mode para dicha versión. El problema de esto no son los navegadores en sí, sino el resto de programas que pueden no tener estas compatibilidades.
Otra de las soluciones recomendadas es habilitar TLS_FALLBACK_SCSV, un mecanismo que soluciona los problemas causados por reintentar conexiones fallidas, previniendo que los atacantes puedan 'obligar' a los navegadores a usar SSL 3.0.

Más información:

Leer más

Humor social I





Leer más

Filtradas contraseñas de Dropbox

Dropbox, popular servicio de alojamiento de ficheros en la nube ha anunciado en su blog oficial que en el día de ayer se ha producido una importante filtración de contraseñas. Concretamente se está hablando de más de 7 millones de cuentas en riesgo. Actualmente Dropbox ha optado por bloquear aquellas cuentas donde detecten algún tipo de actividad extraña.
Here is another batch of Hacked Dropbox accounts from the massive hack of 7,000,000 accounts
To see plenty more, just search on [redacted] for the term Dropbox hack.

More to come, keep showing your support
Según lo que dicen, la filtración no se produjo por un fallo en sus servidores, sino en equipos de terceros.
Se recomienda el cambio inmediato de contraseñas así como la posibilidad de habilitar la verificación en dos pasos del servicio.

Más información:



Actualización:

Se están publicando en pastebin diferentes entradas con las credenciales robadas, por lo que es más importante el cambio de contraseña.
Leer más

Grabando sesiones MySQL completas

MySQL tiene una opción un tanto curiosa y a la vez interesante y es la de grabar una sesión completa de lo que se está haciendo. No deja de ser curioso que permita volcar en un fichero todo el trabajo, así como salidas que ofrece, pero a la vez puede ser práctico para enviarle a alguien y que vea en qué estás trabajando.
La opción que comentamos es --tee y únicamente hay que pasarle el fichero donde quieres dejar tu sesión grabada.
shell> mysql -p --tee=~/session.mysql.log
Leer más

/var/spool/cron, bailing out

Hoy tuve uno de esos fallo extraños que suceden algunos días cuando estás probando cosas nuevas. Concretamente estaba ejecutando el comando crontab para poder listar aquellas tareas que el usuario apache tenía dispuestas. Por ponernos en antecedentes, estaba bajo un sistema Red Hat, lo cual es un poco diferente de lo habitual, Debian. El comando se llamaba desde una página PHP con la sintaxis típica,
...
$output = shell_exec('crontab -l');
...
El resultado devolvía el code status 1 y por lo tanto no tenía salida ninguna. Si ejecutaba el comando empleando sudo, se podía ver perfectamente el listado de comandos de cron para éste usuario.
shell> sudo -u apache crontab -l
  */30 * * * *  python /usr/local/bin/test.py
  */15 * * * *  python /usr/local/bin/test2.py
Llegados a este punto, lo más lógico es pensar que algo está fallando, así que tocó hacer una revisión de los logs, en el cual aparecía la siguiente línea,
'/var/spool/cron' is not a directory, bailing out.
Una línea bastante descriptiva y en la que se nos dice, básicamente que SELINUX, ese gran sistema de control de permisos de Red Hat, estaba impidiendo el acceso a dicho directorio. Puesto que tenía prisa, lo más rápido fue editar el fichero /etc/selinux/config y deshabilitar SELINUX,
SELINUX=disabled
Con lo que el comando comenzó ya a devolver los datos esperados.
Leer más

Cookiechoices: Aviso de empleo de cookies

Desde hace un tiempo en adelante, todas aquellas páginas que tengan presencia en Internet deben tener una política de cookeis, así como un aviso de la misma. Esta obligación viene impuesta por la legislación europea (directiva 2009/136/CE), en la que se hace referencia a los derechos de los usuarios así como la necesidad de que estos sean correctamente informados cuando un sitio web vaya a hacer uso de sus datos.

Qué son las cookeis

Una cookie es una pequeña información enviada por un sitio web y almacenada en el navegador del usuario, de manera que el sitio web puede consultar la actividad previa del usuario.
Sus principales funciones son:

  • Llevar el control de usuarios, cuando un usuario introduce su nombre de usuario y contraseña, se almacena una cookie para que no tenga que estar introduciéndolas para cada página del servidor. Sin embargo, una cookie no identifica solo a una persona, sino a una combinación de computador-navegador-usuario.
  • Conseguir información sobre los hábitos de navegación del usuario, e intentos de spyware, por parte de agencias de publicidad y otros. Esto puede causar problemas de privacidad y es una de las razones por la que las cookies tienen sus detractores.

Por qué hay que avisar del uso

  1. Por que es lógico.
  2. Por que la legislación nos obliga.

Cómo avisar

Recientemente Google sacó un proyecto, cookiechoices, que simplifica y mucho la forma de avisar de que una web emplea cookies. En realidad no es más que un sencillo código javascript que, de forma asíncrona, ofrece las notificaciones legales que se piden, dejando al administrador de la web la única tarea de establecer su mensaje.
El código es sencillo, la carga del script cookiechoices es asíncrona, tiene la confiabilidad de Google y sobre todo no se aloja en sitios de terceros. El código javascript te lo ofrecen de forma gratuita para que esté sobre tu servidor.

Tipo de mensaje

Aunque cookiechoices te da el mensaje completo es importante saber las partes de las que se compone dicho mensaje,
  • Cuerpo
    Texto donde se avisa que la web emplea cookies
  • Learn more
    Link a la política de privacidad de la web en cuestión.
    Ver aquí un ejemplo.
  • Close message
    Botón de cierre de advertencia y aceptación del uso de cookies.

Uso de cookiechoices en Blogger

cookiechoices ofrece para descargar un pequeño código javascript y la forma de usarlo. En prácticamente cualquier web lo podrás usar según lo que indica Google, sin embargo para Blogger la cosa cambia un poco, ya que no hay forma de subir un fichero .js a la raíz de la web.
La forma más sencilla que encontré de usarlo, y así no tener que hacer el javascript necesario es siguiendo estos pasos.
  1. Editar plantilla
    Hay que editar la plantilla HTML de tu blog. Antes de tocar nada, hacemos una copia de seguridad, por si algo va mal.
  2. Pegar código
    Hay que recoger copiar todo el código que nos hemos descargado e incluirlo después de la etiqueta body , como sigue aquí
    <script>
    //<![CDATA[
    
    Código completo de cookiechoices.js
    
    //]]>
    
    document.addEventListener('DOMContentLoaded',
      function(event) {
        cookieChoices.showCookieConsentBar(
          'Utilizamos cookies',
          'Aceptar',
          'Leer más',
          '/politica-cookies.html'
        );
      }
    );
    </script>
    
  3. Modificar el mensaje
    Modificamos el mensaje que sacaremos al usuario, según lo que queramos.
    ...
    cookieChoices.showCookieConsentBar(
      'Mensaje a sacar',
      'Botón aceptar',
      'Botón con link a URL',
      'URL de explicación'
    );
    ...
    
  4. Guardar plantilla
    Guardamos la plantilla y si todo está correcto, el nuevo mensaje ya debería de salir. Podemos probar como queda con una pestaña de incógnito.
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios