Compilar PHP de 32 bits en Red Hat de 64 bits

Por una incopatibilidad entre aplicaciones he tenido que compilar la última versión de PHP en un servidor de 64 bits. El proceso es bastante sencillo si se tienen correctamente instaladas las librerias de 32 bit en el sistema. 

En este sistema ya tenia una serie de librerias de 32 bits instaladas, pero ha sido necesario instalar algunas mas para poder compilar correctamente. En concreto, las que hacian falta eran:

libstdc++-devel.i686
glib2.i686
zlib-devel.i686

Para instalarlas se puede hacer con yum.
Descargar el codigo fuente de la última versión de php desde la web de php.net en el servidor. Una vez verificado el MD5 procederíamos a descomprimir el código fuente en /var/tmp:

# md5sum php-5.6.4.tar.bz2
d31629e9c2fb5f438ab2dc0aa597cd82 php-5.6.4.tar.bz2
# tar xjvf php-5.6.4.tar.bz2

Una vez en la carpeta del codigo fuente exportaremos las variables CFLAGS, CXXFLAGS y LDFLAGS donde indicaremos que la arquitectura sobre la que se debe compilar es de 32 bits:

# export CFLAGS=’-m32′
# export CXXFLAGS=’-m32′
# export LDFLAGS=’-m32′

Si ya habíamos intentado compilar deberemos ejecutar un “make clean” y a continuación configurar la compilación:

# ./configure –libdir=/lib  –prefix=/usr/local/php-5.6.4 –with-libdir=/lib

Este proceso finaliza con la recomendación de ejecutar un test antes del install, con lo que ejecutaremos lo siguiente:

# make test && make install

Al finalizar la compilación la nueva versión de PHP quedará instalada en /usr/local/php-5.6.4 y veremos que es un binario de arquitectura de 32 bits:

# pwd
/usr/local/php-5.6.4/bin
# ./php -v
PHP 5.6.4 (cli) (built: Dec 23 2014 11:43:42)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
# file php
php: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

El servidor web se deberá configurar para que apunte a este binario.
Una vez sabemos que compila se debería recompilar con las opciones de configuración que sean necesarias en cada caso (módulos y extensiones).

#TIP

Como he comentado anteriormente, este sistema ya tenia una serie de librerias de 32 bits instaladas:

zlib.i686
libstdc++-devel.i686
libxcb.i686
libaio.i686
libXtst.i686
libstdc++.i686
libzip.i686
libXau.i686
libXi.i686
libxml2-devel.i686
glibc-devel.i686
gamin.i686
nss-softokn-freebl.i686
libXext.i686
compat-libstdc++-33.i686
glibc.i686
libselinux.i686
glib2.i686
zlib-devel.i686
libuuid.i686
libxml2.i686
libgcc.i686
libX11.i686
libaio-devel.i686
libXrender.i686
libzip-devel.i686
compat-libcap1.i686
libXp.i686

Para instalarlas todas con un comando lo que se puede hacer es copiar el listado en un fichero e instalarlo con yum de la siguiente manera:

# vi /tmp/paquetes
# yum install $(cat /tmp/paquetes)

Nginx como proxy inverso con SSL

Hace unos días me plantearon la necesidad de publicar en Internet u servicio que estaba corriendo sin ningún tipo de encriptacion, con lo que los passwords se estaban transmitiendo en claro.
Dándole vueltas encontré este tutorial donde se exponía un caso similar con la aplicación Jenkins:
(por cierto, muy buena la página de tutoriales de Digital Ocean)

La idea de este tutorial es la de montar un nginx delante del servicio que se quiere securizar de forma que encripte las comunicaciones que van por la red publica. Esta configuración se conoce como “reverse proxy” y el diagrama seria el mostrado a continuación:

Instalación de nginx

Para instalar nginx descargaremos el rpm ccorrespondiente desde la web del proyecto Nginx . Éste rpm nos configurara el repositorio lo que nos permitira instalarlo con yum:

[root@nginxprxy tmp]# yum -y install nginx-release-rhel-6-0.el6.ngx.noarch.rpm [root@nginxprxy tmp]# yum install -y nginx

Configuración del proxy reverso con ssl 

Como este servidor va a servir exclusivamente para la securización de un servicio no seguro editaremos el fichero de configuración default.conf. Lo deberemos dejar de la siguiente forma:
[root@nginxprxy tmp]# cd /etc/nginx/conf.d 
[root@nginxprxy conf.d]# cat default.conf 
server {
listen 80;
return 301 https://$host$request_uri;
}


# HTTPS server
#
server {
listen 443;
server_name service.enterprise.com;

ssl_certificate /etc/nginx/certs/service.enterprise.com.crt;
ssl_certificate_key /etc/nginx/certs/service.enterprise.comm.key;

ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;

access_log /var/log/nginx/service.access.log;

location / {

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass http://
unsecureservice.enterprise.com;
proxy_read_timeout 90;

proxy_redirect http://unsecureservice.enterprise.com https://service.enterprise.com;
}
}
En la primera parte, se redigirán todas las peticiones a la misma URL pero al puerto de HTTPS. Así, cualquier petición al puerto por defecto de HTTP será redirigida, sin posibilidad de servir contenido que no esté cifrado.
En la segunda parte, es donde se especifica el puerto de escucha HTTPS, los certificados y varias opciones del protocolo SSL. 

Por último se establecen las reglas de redirección del proxy de forma que todo lo que entre a través de la URL https://service.enterprise.com; lo redirija a la http://unsecureservice.enterprise.com.

Antes de arrancar el servidor deberemos conseguir los certificados. Lo primero será generar el CSR en el directorio que hemos especificado en el fichero de configuración:

[root@nginxprxy tmp]# cd /etc/nginx/
[root@nginxprxy tmp]# mkdir certs
[root@nginxprxy certs]# openssl req -new -newkey rsa:2048 -nodes -keyout service.enterprise.com.key -out service.enterprise.com.csr
Generating a 2048 bit RSA private key
……………………………………….+++
…+++
writing new private key to ‘service.enterprise.com.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [XX]:XX
State or Province Name (full name) []:XXXX
Locality Name (eg, city) [Default City]:XXXX 
Organization Name (eg, company) [Default Company Ltd]:XXXX
Organizational Unit Name (eg, section) []:XXXX
Common Name (eg, your name or your server’s hostname) []:service.enterprise.com
Email Address []:XXXX@enterprise.com

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Una vez obtengamos el certificado deberemos crear el fichero crt con el contenido del certificado: 

[root@nginxprxy certs]# vi service.enterprise.com.crt  —–BEGIN CERTIFICATE—– MIIFWjCCBEKgAwIBAgIDCmMEMA0GCSqGSIb3DQEBBQUAMGExCzAJBgNVBAYTAlVT8WjFirPK7+2Gbq+9w4DpJ+a5FJjTOKfcRvIrZION 

—–END CERTIFICATE—–

Será el momento de arrancar el servidor Nginx y probar la conexión desde un navegador, donde deberemos ver que inmediatamente se redirecciona a un puerto seguro y que el certificado es válido:

[root@nginxprxy conf.d]# service nginx stop Stopping nginx: [FAILED] [root@nginxprxy conf.d]# service nginx start  Starting nginx: [ OK ]

Conseguir Root en OnePlus One

Ayer me llegó el OnePlus One y después de utilizarlo un rato y acostumbrado a tener acceso root en mi anterior móvil me decidí a rootearlo para poder bloquear anuncios y utilizar el Greenify. El proceso es muy sencillo y se puede dividir en tres partes: Desbloquear el bootloader, instalar el recovery y instalar el SuperSU.

Como prerequisito para todo el proceso será necesario tener las utilidades fastboot y ADB en el PC que vayamos a utilizar. Para instalar las android tools en ubuntu podemos hacerlo desde los repositorios de ubuntu (fastboot y adb) con el siguiente comando:

$ sudo apt-get install android-tools-fastboot android-tools-adb

Vayamos ya con el proceso de rooteo.

1. DESBLOQUEAR EL BOOTLOADER

Debemos activar el modo Depuración. Para ello habilitaremos primero las opciones de desarrollo. Iremos a Ajustes-> Información del teléfono y tocaremos 7 veces en compilación. Una vez habilitado en el menú principal de los ajustes nos saldrá la opción “opciones de desarrollo”. Una vez dentro habilitaremos el debug de USB en el teléfono dejándolo como en la siguiente imagen:

Habilitar la opción de Depuración

Conectaremos el teléfono al ordenador con el cable USB y desde una terminal reiniciaremos en modo “fastboot”:

$ adb reboot bootloader

Una vez en modo “Fastboot” verificar que el PC vea el dispositivo con el comando “sudo fastboot devices“. El comando nos devolverá el número de serie del teléfono. En el modo fastboot en la pantalla aparece el logo de OnePlus y un texto con el mensaje fastboot.

Desde el mismo terminal desbloquear el bootloader:

$ sudo fastboot oem unlock

OKAY [ 0.005s]
finished. total time: 0.005s

NOTA: En este paso se borran todos los datos del teléfono. Haz una copia de seguridad de lo que necesites antes.

A continuación el teléfono se reiniciará, aparecerá un Android ejecutando el proceso y finalmente se vuelve a reiniciar.

Será necesario volver a habilitar el debug de usb para continuar con la instalación del recovery.

2. INSTALAR RECOVERY

Antes de instalar el nuevo recovery deshabilitaremos la opción “Actualizar recovery de CM” para que no nos lo machaque la próxima vez que arranque el teléfono. Esta opción esta en las opciones de desarrollo:

Deshabilitar la opción “Actualizar recovery de CM”

Descargaremos la última imagen correspondiene para el OnePlus desde la URL:

http://techerrata.com/browse/twrp2/bacon

En mi caso he descargado la siguiente imagen:

http://techerrata.com/file/twrp2/bacon/openrecovery-twrp-2.8.0.1-bacon.img

Filename: openrecovery-twrp-2.8.0.1-bacon.img

MD5sum: d03de30d110d0075a2a6c5cf5f2706a2

Verficaremos el MD5 por seguridad, ya que si instalamos una imagen dañada el teléfono no arrancaría:

$ md5sum openrecovery-twrp-2.8.0.1-bacon.img
d03de30d110d0075a2a6c5cf5f2706a2 openrecovery-twrp-2.8.0.1-bacon.img

Vemos que el MD5 corresponde con el publicado en la web, con lo que procederemos a reiniciar en modo “Fastboot”:

$ adb reboot bootloader

Otra vez verificaremos que el PC vea el dispositivo con el comando “sudo fastboot devices“. En caso correcto grabaremos la imagen del nuevo recovery (tarda apenas unos segundos):

$ sudo fastboot flash recovery openrecovery-twrp-2.8.0.1-bacon.img

En la pantalla del teléfono no se aprecia ningún cambio, pero realmente se ha instalado bien si la salida del comando no da errores.
Una vez flasheada la partición de recovery se continua con el arranque con el siguiente comando:

$ sudo fastboot continue
resuming boot…
OKAY [ 0.002s]
finished. total time: 0.003s

Una vez se haya completado correctamente, reiniciar el teléfono en modo recovery para verificar la instalación. Para arrancar en modo recovery con el teléfono apagado pulsar las teclas Volumen-Abajo y la tecla de encendido.

3. ROOTEAR:

Hay que bajar la última versión del fichero UPDATE-SuperSU-v2.37.zip desde http://download.chainfire.eu/supersu y grabarlo en la raíz de la memoria del teléfono.

Una vez el recovery instalado, arrancar en modo recovery con el siguiente comando:

$ adb reboot recovery

Seleccionar “Install” en el TWRP Recovery. Buscar el fichero que hemos copiado e instalarlo.

Reiniciar el teléfono y ahora encontrarás la aplicación SuperSU. Abre la aplicación y si no se obtienen errores el teléfono se habrá rooteado correctamente.