20140927

Ultimate guide to patch ShellShock in old Ubuntus

I've recently have to patch 28 ubuntu servers in our company, in theory it's an easy procedure but, you know, when you're dealing with old systems that have not been updated for years it can get a little more complicated.

Looking for the solution in different posts I've compiled my own recipe.

First of all, how to know if you're vulnerable?

Run this:
env X="() { :;} ; echo busted" `which bash` -c "echo completed"


OK output:
/bin/bash: warning: X: ignoring function definition attempt
/bin/bash: error importing function definition for `X'
completed

KO output, must be PATCHED!:
busted
completed

The easiest way to update in Ubuntu is using aptitude:

apt-get update
apt-get install --only-upgrade bash

If for any reason this method don't work (outdated sources.list or pointing to old-releases or whatever), you can update bash rebuilding from source, this method should work for other Linux flavors but I've only tested in Ubuntus.

It's easy to update from source following this recipe:

cd /src
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz

for i in $(seq -f "%03g" 0 25); do wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz
cd bash-4.3
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done
./configure --prefix=/usr --bindir=/bin --sbindir=/sbin --sysconfdir=/etc && sudo make && sudo make install

Remember to re-check the initial command to see if the problem has vanished.

Sources for this post:

20140907

Cómo modificar el tmpdir de mysql y no tener problemas de permisos al reiniciar el servicio #ubuntu #apparmor #mysql #tmpdir


Estos días me he encontrado con problemas por falta de espacio en el /tmp al hacer consultas pesadas con ordenaciones o group-bys que generaban mucho espacio temporal, por defecto el servidor venía con 2Gbs en /tmp pero con una tabla de 2 millones de registros no podia hacer algunas consultas y me fallaban por falta de espacio en /tmp.

Al intentar cambiar la variable tmpdir del my.cnf me aparecia un error al reiniciar el mysql que evitaba que arrancase (de mal en peor).

El error que me encontraba era:

/usr/sbin/mysqld: Can't create/write to file '/mnt/sdb1/tmp/ib05T1js' (Errcode: 13)
140907 10:50:18  InnoDB: Error: unable to create temporary file; errno: 13

Al final el culpable era el apparmor que define ciertos directorios donde puede escribir el mysql y otros procesos críticos del sistema.

En este mini-tutorial además aprovecharemos para crear un temporary filesystem para mejorar la eficiencia de los sorts de mysql.

NOTA: No hay garantía de que funcione! sólo lo he probado con un ubuntu 12.04 y es probable que se tengan que modificar detalles para otros sistemas.

En resumen, la idea es modificar el directorio tmpdir de mysql utilizando un temporary filesystem en un disco secundario y solucionando los problemas que da el apparmor.

Vamos a asumir que tenemos montado un filesystem en un disco secundario con poca carga /mnt/sdb1

Primero crearemos un directorio tmp en este filesystem:

cd /mnt/sdb1
mkdir -p tmp

Le damos permisos adecuados:

chmod 0777 tmp
chown mysql:mysql tmp

Obtenemos el id de grupo y de usuario de mysql:

id mysql

Editamos el /etc/fstab e incluimos la linea:

tmpfs /mnt/sdb1/tmp tmpfs rw,gid=110,uid=105,size=4G,nr_inodes=10k,mode=0700 0 0

OJO: utilizar el gid y el uid obtenidos en el paso anterior y definir size al valor que nos interese, en el ejemplo 4G (4 Gigas)

Re-montamos los filesystems:

mount -a

Editamos la configuración del tmpdir de mysql (/etc/mysql/my.cnf), parametro tmpdir:

tmpdir=/mnt/sdb1/tmp

Este es el punto crítico ya que si reiniciamos en este punto y tenemos el apparmor activado nos dará error ya que el apparmor no tiene el direcotio /mnt/sdb1/tmp como permitido para mysql.

Editamos el fichero de configuración de apparmor para mysql /etc/apparmor.d/local/usr.sbin.mysqld añadimos estas dos líneas al final:

/mnt/sdb1/tmp/ r,
/mnt/sdb1/tmp/** rw,

Reiniciamos el apparmor:

service apparmor reload

Ahora ya podemos reiniciar el mysql sin problemas:

service mysql restart


Espero que os sirva!

20140828

Com utilitzar les cues de missatges natives de UNIX amb PHP

Si mai us heu trobat el problema de registrar visualitzacions a objectes que teniu en base de dades però no voleu penalitzar el rendiment fent un UPDATE cada vegada que un usuari entra al detall d'aquest objecte, una manera molt fàcil de millorar el rendiment es fer servir cues de missatges. La pàgina de detall només registre el hit a la cua i després tenim un batch per anar processant els hits dels últims minuts.


En concret amb PHP la solució més simple es utilitzar les cues de sistema operatiu, es tant fàcil com:


Enviar visualitzacions d'ids a una cua:
// 12345 es el número de cua de procés, ha de ser un número que només utilitzem nosaltres per comunicar els diferents processos.
$queue=msg_get_queue(12345);
msg_send($queue, 1, $id);



Consumir la cua (ho farem en un cron, per tant si trobem el final de la cua sortim):


$queue = msg_get_queue(12345);
$msg_type = NULL;
$msg = NULL;
$max_msg_size = 512;
while (msg_receive($queue, 1, $msg_type, $max_msg_size, $msg))
{
  //do your business logic here and process this message!
  //finally, reset our msg vars for when we loop and run again
  $msg_type = NULL;
  $msg = NULL;
  // Si ja no tenim missatges deixem de processar
  $stats=msg_stat_queue($queue);
  if ($stats['msg_qnum']===0) break;
}



Una manera de veure els missatges que hi han a les cues es utilitzant la comanda de sistema ipcs, en concret:
ipcs -q


Pots sofisticar tant com vulguis la logica, pots jugar amb el $msg_type per enviar i consumir diferents tipus de missatges i el $msg pot ser qualsevol objecte (serialitzat automàticament).

Per provar si el teu sistema operatiu permet utilitzar les cues des de PHP pots fer servir aquest script de test:


echo "Creamos cola\n";
$queue=msg_get_queue(11111);
echo "Insertamos en cola\n";
msg_send($queue, 1, 'hola');
echo "Obtenemos estadisticas de la cola\n";
$stats=msg_stat_queue($queue);
print_r($stats);

echo "Obtenemos mensajes de la cola\n";
$msg_type = NULL;
$msg = NULL;
$max_msg_size = 512;
while (msg_receive($queue, 1, $msg_type, $max_msg_size, $msg)) 
{
echo "Message pulled from queue - $msg \n";
$stats=msg_stat_queue($queue);
//print_r($stats);
if ($stats['msg_qnum']===0) break;
}
echo "Finalizado\n";



La salida si todo es correcto debería ser:

------------
Creamos cola
Insertamos en cola
Obtenemos estadisticas de la cola
Array
(
    [msg_perm.uid] => 0
    [msg_perm.gid] => 0
    [msg_perm.mode] => 438
    [msg_stime] => 1409301612
    [msg_rtime] => 0
    [msg_ctime] => 1409301612
    [msg_qnum] => 1
    [msg_qbytes] => 16384
    [msg_lspid] => 48299
    [msg_lrpid] => 0
)
Obtenemos mensajes de la cola
Message pulled from queue - hola
Finalizado
-----------


Més informació:
Comanda ipcs
Tutorial1
Tutorial2




Happy coding!

20140328

Cómo hacer miniaturas de una web desde Ubuntu

UPDATE: EN UBUNTU 14.04 HE TENIDO QUE HACER UN PAR DE CAMBIOS PARA QUE FUNCIONE:
- En lugar de instalar libicu48 se debe instalar libicu52, o sea:
apt-get install libicu52
- El make petará porque se tienen que incluir unas clases adicionales, ir al fichero CutyCapt.hpp y añadir estas lineas al principio antes de hacer el make.
#include
#include

#include

En este post quiero explicar como realizar un screenshot de una URL cualquiera utilizando un software gratuito y de código abierto que funciona de maravilla.

Vamos a usar CutyCapt, en concreto vamos a ver la instalación y ejecución en Ubuntu.
























Primero vamos a instalar librerias de soporte varias, entre ellas Subversion para descargar CutyCapt de su repositorio y xvfb que nos permitirá lanzar una instancia de XWindows de manera muy sencilla.

apt-get install subversion libqt4-webkit libqt4-dev g++ xvfb libicu48 

Descargamos CutyCapt de su repositorio de subversion (posicionarse primero en el directorio donde lo queramos instalar):

svn co svn://svn.code.sf.net/p/cutycapt/code/ cutycapt 

Instalamos:

cd cutycapt/CutyCapt 
qmake
make 


Ya estamos listos para usarlo!

 Ejemplo de comandos:

xvfb-run --server-args="-screen 0, 1024x768x24" ./CutyCapt --url=http://www.omatech.com --out=omatech.png 
xvfb-run --server-args="-screen 0, 1024x768x24" ./CutyCapt --url=http://www.easypromosapp.com --out=easypromos.png 

Podemos jugar con los distintos parámetros como la resolución de pantalla y por supuesto la url y el fichero y formato de salida.

Con estas sencillas instrucciones puedes montar un generador de thumbnails de urls con muy poco esfuerzo via línea de comandos.

Puedes adaptar fácilmente estas instrucciones a tu propia versión de Linux, creo que CutyCapt incluso funciona para Windows.

 ¡A disfrutar!

Más información sobre CutyCapt en su web: http://cutycapt.sourceforge.net/

20140202

Playing with the Marvel API in PHP

This sunday afternoon I've been trying the new marvel.com API.

As a huge fan of the house of the ideas I think this can be a great tool for developers around the world.

If you're new to the API you must connect to marvel developers developer.marvel.com and sign in and request an API key.

Once you get your private and public keys you can try the API, there are methods for getting comics, characters, creators and much more.

You can use this little sample to see the working of the API if you're a PHP coder.

You can see a live demo here marvel.omatech.com this simply shows 100 characters per page and let you select the page in the top links, you can browse all the Marvel characters in only 40 lines of code.

20140101

Presentació de l'iPhone SDK (esdikey)

(post del 2008 que se'm va quedar en drafts)

Aquesta nit no podía dormir i com que sabía que hi havia la presentació d'Apple del nou SDK per l'iPhone, m'he decidit a veure el vídeo de presentació.

JA NO PODRE DORMIR !

Increible, un SDK amb accés a totes les funcionalitats del Sistema Operatiu i les increibles funcionalitats que només trobes en un iPhone:

- Multi-touch interface
- TCP/IP integrat
- 3D Engine
- Posibilitat de localitzar-te
- Accés a la API del accelerometer (moviment espaial, tipus Wiimote)
- SQLLite integrat

A més el SDK es gratuit, pots baixar-te'l i començar a programar JA!

També han pressentat una especie de tenda on podras descarregar els programes (sempre validats per Apple). Falta veure si aquest model de distribució de software trionfa o no, pero les característiques son espectaculars.

- Instal.lació i actualització dels programes "over the air" sempre que tinguis connexió
- Els programes gratuits son realment gratuits, si passen el control de qualitat d'Apple, el desenvolupador no ha de pagar res i l'usuari tampoc.
- Els programes de pagament es venen amb un rati de 70-30 (70 pel developer, 30 per Apple)

L'unic fee que han anunciat es un fee de 99$ per entrar dins del developer program, amb la qual cosa crec que donaran support als desenvolupadors, dema mateix, omatech.com s'apuntarà al developer program, no hi ha res a perdre i si molt a guanyar.

Bé, els competidors ja es poden possar les piles:
- Nokia ja cal que espabilis
- Microsoft deixa-ho ja, si en tants anys no t'has fet amb el mercat, ja no ho faras
- Google, potser necessitaras alguna cosa més que un Android per trencar el mercat.

Si encara no era un "believer" avui m'han convençut, l'iPhone arrasarà, es un producte trencador que pot capturar molt "developer mind share" en molt poc temps i aquest cop Microsoft no té ni idea del que li ve a sobre.

Més informació a http://developer.apple.com
Per cert aquí teniu el vídeo que m'ha fet veure la llum

Historic handhelds en els últims 16 anys

Tots els que em coneixeu sabeu que soc un friki dels gadgets tipus PDA o handheld des de fa un munt d'anys, en concret el 2014 farà 16 anys que tinc dispositius d'aquest tipus.

Com a registre personal documento les meves compres:

Palm Personal - 17/04/1998 (29 messos d'us)
Palm Vx - 01/09/2000 (27 messos d'us)
Palm Tungsten T - 05/12/2002 (24 messos d'us)
Palm T|5 - 20/12/2004 (25 messos d'us)
Palm T|X - 05/01/2007 (19 messos d'us)
Palm Centro - 27/07/2008 (22 messos d'us)
Palm Pixi Plus - 25/05/2010 (13 messos d'us)
iphone4 - 10/06/2011 (30 messos d'us)
iphone5c 10/12/2013 (?)

Com veureu l'iPhone4 ha estat el gadget que m'ha durat més, molt aprop de la primera Palm Personal que vaig tenir, l'iPhone4 encara em podia haver durat més pero el canvi a iOS7 l'ha enlentit molt, en canvi el hardware estava en perfecte estat i el guardaré com backup del nou iPhone5c.

Post resum 2013

Gadgets of the year (comprats o regalats):
Bateria multi-dispositiu
Aeroccino de Nespresso
Deshuesador per cireres i olives
iPhone 5C

Samarretes del any:
Evolucio acabant en robot
#soytanfriky (amic invisible d'omatech)

Friky coses guays:
angular.js
sphinxsearch per cerques per proximitat geoespacial
postman
pusher
Panic's Status Board
Meteor.com
redline
ReactPHP
Neo4j
ArangoDB
FoundationDB

Jocs als que m'he viciat aquest any:
Dots
Plants vs Zombies 2
Speedball2 (iOS)

Grups guays que he descobert aquest any:
The babies
Merchandise

Millors concerts als que he anat:
Blur
Breeders
Adam Green and Binki Shapiro
The postal service

Millors pelis que he vist:
Life during wartime
The descendants
Los Vengadores
Un metodo peligroso
La historia mas grande jamas vendida
Rompe Ralph
Hysteria
Malditos bastardos
Terminator Salvation
Young Adult
Nunca me abandones
Resident Evil, venganza
El dictador
Lo imposible
Star Trek into darkness
Argo

Llibres que he llegit i m'han agradat:
Biografia d'Steve Jobs
Rework, Jason Fried
Yo, precario, Javier Lopez Menacho
Matar al padre, Nothomb
Condenada, Palahniuck
World War Z, Max Brooks

Comics:
Cuarenton
Guia del mal padre
Europesadilla
Los capullos no regalan flores
Messiah Complex
198
Planet Hulk
World War Hulk
Fear Itself
The Chaos Wars
Avengers vs. X-Men
War of Kings
Ardalen

Series a les que m'he enganxat (per ordre d'adiccio):
Breaking Bad s1, s2, s3, s4, s5
Game of thrones s3
Boarwalk Empire s3
Big Bang s6
The walking dead s3
The following s1
Fringe s5

Teatre:
Incendis al Romea
Palla, Fusta, Pedra al tantarantana
La granja mes petita del mon a la fundacio Miro
Blancaneus al Casino l'Aliança
Aladdi al Casino l'Aliança
Ventafocs al Casino l'Aliança
Do not disturb al Casino l'Aliança

Documentals:
Searching for Sugar Man
Documental Tomi Hungerer

Millors restaurants:
Gorria
Els pescadors
Mam's (Arbucies)

20131116

Problems with a rootkit


During this week I've been struggling with a problem with one of our servers.

The server started to collapse with no aparent reason, sometimes we see suspicious processes like this:

./m64 -o stratum+tcp://mine.pool-x.eu:9000 -u gvsall.64 -p 64 --algo scrypt --no-longpoll -B

Searching in google found that it's a miner of bitcoins WTF???

Killing the process and changing the root password seems to have no effect, then I've got to make deeper analysis.

Finally I figured out that the problem was a rootkit installed on the server, then I've taken two curses of action:

1) Remove the rogue software installed
2) Avoid being hacked again addressing the server's vulnerability

1) Remove the malicious software installed by the rootkit


Usually those kind of programs install in temporary folders, look at:
/tmp
/var/tmp

ALERT: Always look with -a flag because usually there are lots of hidden files 

ls -la 

You must look too for crontabs installed by the rootkit.

cd /var/spool/cron/crontabs
ls -la 

Look specially for www-data crontabs or users that you don't control and musn't be there.

Look too in the /etc/passwd file looking for uncontrolled users, use the last command to see last logins into the system.

To find suspicius files and processes you can use this programs, are really easy to use and will give you clues about how to solve the server's vulnerability too:


Look for the reports generated by those and rm or quarantine the rogue files.

2) Avoid being hacked again addressing the server's vulnerability


Usually those kinds of programs are installed using some webserver vulnerability.

Years ago I've found a similar rootkit that exploited a vulnerability of PHPMyAdmin, the rule of thumb is try to update your software often to avoid this kind of problems.

This time it was a problem with php running in CGI mode.

You must look at clues using chkrootkit and rkhunter, then look at the apache logs for suspicius strings like:

GET /w00tw00t.at.ISC.SANS...
POST //%63%67%69%2D%62%69%...
POST cgi-bin/php-cgi?-d+allow_url_include=on+-d...
POST cgi-bin/php5?-d+allow_url_include=on+-d...

Often you didn't even need the cgi-bin/php running at all because the standard installation doesn't work through CGI. That's old configuration and probably you don't even need that.

If you can avoid using cgi-bin look at the sites-enabled folder and try to get rid of cgi configurations. Look specially at default site, you can find old lines of config that you don't use at all.

Restart the Apache server after that.


Interesting posts and links:

20130218

Como transformar tablas MyISAM a InnoDB masivamente en MySQL

He encontrado este truco en StackOverflow funciona bien con tablas relativamente pequeñas, del orden de Megas, si pasamos a tablas de Gigas el tema empieza a tardar y ya tienes que hacer algun tipo de exportación e importación.

El script:

SELECT CONCAT('ALTER TABLE `',table_schema,'`.'
,table_name,' ENGINE=InnoDB;') InnoDBConversionSQL
FROM information_schema.tables 
WHERE engine='MyISAM' AND table_schema NOT IN
('information_schema','mysql','performance_schema') 
ORDER BY (data_length+index_length);


Si quereis ver el tamaño de cada tabla antes de ejecutarlo:

SELECT CONCAT('ALTER TABLE `',table_schema,'`.'
,table_name,' ENGINE=InnoDB;') InnoDBConversionSQL
, data_length+index_length
FROM information_schema.tables 
WHERE engine='MyISAM' AND table_schema NOT IN
('information_schema','mysql','performance_schema') 
ORDER BY (data_length+index_length);

Recomiendo siempre empezar por las primeras tablas (más pequeñas) e ir subiendo, hasta que veamos que el proceso tarda demasiado.