# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Ocultar la versión de PHP

Algo importante en la seguridad de servidores web es ofrecer siempre la menor cantidad de información acerca de las versiones del software instalado en el servidor. Hace ya bastante tiempo vimos cómo ocultar o enmascarar la versión de Apachela versión de Bind.

En este caso vamos a ocultar la versión de PHP, es extremadamente sencillo. Únicamente hay que editar el fichero de configuración general php.ini y modificar el siguiente parámetro a Off:

expose_php Off

Ya podemos verificar que al hacer la petición contra el sitio web la información PHP ya no se muestra:

# telnet servidor 80

Connected to xxx.com (xx.xx.xx.xx).
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 13 Aug 2010 14:18:09 GMT
Server: Apache
Last-Modified: Fri, 12 Feb 2010 12:22:56 GMT
ETag: "44967c-6f-53ca4800"
Accept-Ranges: bytes
Content-Length: 111
Connection: close
Content-Type: text/html

Connection closed by foreign host.

Activar pcntl para PHP en cPanel (easyapache)

Si necesitamos personalizar la compilación de un servidor web PHP + Apache en cPanel y el módulo que necesitamos no se incluye dentro de los disponibles dentro de easyapache podemos añadirlo del siguiente modo.

En este caso necesitaba activar pcntl, el procedimiento ha sido el siguiente:

  1. Crear un fichero llamado /var/cpanel/easy/apache/rawopts/PHP-X.X.X donde X.X.X es la versión de PHP que queremos compilar.
    En este caso era /var/cpanel/easy/apache/rawopts/PHP-5.2.13
  2. Dentro del fichero añadir:
    --enable-pcntl
  3. Guardar el fichero.
  4. Ejecutar easyapache y recompilar.

Una vez finalizado ya debería aparecer compilado el módulo correspondiente:

# php -m | grep pcntl
pcntl

Instalar php 5.2.10 a través de YUM en CentOS

Una de las formas más cómodas de instalar servicios y aplicaciones en CentOS es a través del gestor de paquetes YUM. Esto tiene sus desventajas, porque muchas veces las versiones de las aplicaciones no son todo la actuales que necesitamos.

En el caso de php, en CentOS 5.4 sigue instalandose la rama 5.1 con los repositorios por defecto. Podríamos instalar la nueva versión con paquetes RPM precompilados o compilando a mano pero yo soy partidario de unificar todo con un mismo sistema para evitar problemas y simplificar el funcionamiento de el conjunto de aplicaciones. La idea del repositorio testing la encontré en un comentario de este artículo en inglés.

El repositorio que tiene esta versión actualizada de PHP es CentOS-5 Testing así que solamente tendremos que instalarlo. Para ello creamos el fichero correspondiente en la carpeta de repositorios:

# vim /etc/yum.repos.d/centos-test.repo

El contenido:

[c5-testing]
name=CentOS-5 Testing
baseurl=http://dev.centos.org/centos/5/testing/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing

Ahora si hacemos un yum info de php veremos que podemos instalar la versión 5.2.10 (en este caso pone que ya está instalada porque yo ya lo hice):

# yum info php
Loaded plugins: fastestmirror, priorities
Determining fastest mirrors
 * addons: sunsite.rediris.es
 * base: sunsite.rediris.es
 * extras: sunsite.rediris.es
 * updates: sunsite.rediris.es
addons                                                   |  951 B     00:00
base                                                     | 2.1 kB     00:00
c5-testing                                                                                                                                                     | 1.9 kB     00:00
extras                                                                                                                                                         | 2.1 kB     00:00
updates                                                                                                                                                        | 1.9 kB     00:00
450 packages excluded due to repository priority protections
Installed Packages
Name       : php
Arch       : i386
Version    : 5.2.10
Release    : 1.el5.centos
Size       : 3.1 M
Repo       : installed
Summary    : The PHP HTML-embedded scripting language
URL        : http://www.php.net/
License    : PHP
Description: PHP is an HTML-embedded scripting language. PHP attempts to make it
           : easy for developers to write dynamically generated webpages. PHP also
           : offers built-in database integration for several commercial and
           : non-commercial database management systems, so writing a
           : database-enabled webpage with PHP is fairly simple. The most common
           : use of PHP coding is probably as a replacement for CGI scripts.
           :
           : The php package contains the module which adds support for the PHP
           : language to Apache HTTP Server.

Así que solo queda instalarlo:

# yum install php

Recomiendo una vez hecho esto activar las prioridades de repositorios para evitar que otros paquetes que no sean php se instalen a través de este repositorio. Vamos a dar preferencia al repositorio base de centos.

# yum install yum-priorities

Una vez instalado damos al repositorio de centos base prioridad 10 y al testing 20. Añadimos lo siguiente a cada uno de los apartados entre corchetes del fichero /etc/yum.repos.d/CentOS-Base.repo

 /etc/yum.repos.d/CentOS-Base.repo

Ejemplo:

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=10

Y para el repositorio de Testing:

/etc/yum.repos.d/centos-test.repo
[c5-testing]
name=CentOS-5 Testing
baseurl=http://dev.centos.org/centos/5/testing/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing
priority=20

Cómo instalar ionCube Loader en Windows

Con la instalación de IonCube loader tendremos la posibilidad de visualizar páginas php con contenido codificado con ionCube. La instalación es sumamente sencilla en Windows (en este caso 2003 Server con php 5.2.X):

En primera instancia descargamos la extensión/módulo desde el sitio web de ioncube:

http://www.ioncube.com/loaders.php

Posteriormente, procedemos a descomprimir el fichero, dentro del cual encontraremos las versiones de los módulos para cada versión de PHP y dos scripts php para testear que la instalación se ha realizado correctamente:

ioncube_loader_win_4.1.dll
ioncube_loader_win_4.2.dll
ioncube_loader_win_4.3.dll
ioncube_loader_win_4.4.dll
ioncube_loader_win_5.0.dll
ioncube_loader_win_5.1.dll
ioncube_loader_win_5.2.dll
ioncube-loader-helper.php
ioncube-encoded-file.php

Bien, llegados a este punto debemos copiar el módulo correspondiente a nuestra versión de php en la carpeta donde guardemos todos los módulos de php, normalmente “ext” dentro de la carpeta PHP.

Posteriormente, llamamos al módulo desde el fichero de configuración php.ini añadiendo la siguiente línea, que hace referencia al módulo comentado antes:

zend_extension_ts = "c:\carpeta_php\ext\ioncube_loader_win_5.2.dll"

Guardamos y testeamos con un navegador si la instalación se ha realizado correctamente, ejecutando el script ioncube-encoded-file.php, tendrá que mostrar lo siguiente:

This file has been successfully decoded. ionCube Loaders are correctly installed.

PHP: Deshabilitar funciones peligrosas

A estas altura todos conocemos la potencia y versatilidad del lenguaje PHP. Existen no obstante ciertas funciones que utilizadas de forma incorrecta, o con fines maliciosos (exploits, crackeos, etc) comprometan seriamente la seguridad del servidor que está ejecutando el php. Estamos hablando de bugs en una versión de php instalada, bugs en la programación, mala securización de un servidor y muchos más puntos a tener en cuenta y que pueden provocar graves problemas de seguridad en una máquina.

Un buen punto sobre el que comenzar a securizar php, es deshabilitar ciertas funciones potencialmente peligrosas, y que si nuestra programación no utiliza, es 100% recomendable desactivar completamente. Para desactivar funciones, debemos listarla en el fichero de configuración de php (php.ini), utilizando la directiva “disable_functions“. El fichero php.ini normalmente se encuentra en /etc/php.ini, no obstante podéis buscarlo con el comando:

whereis php

Un ejemplo sobre el que podemos comenzar de funciones a deshabilitar es el siguiente:

disable_functions ="system,passthru,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,popen,show_source,pcntl_exec"

En php.net podéis observar las tareas que desempeña cada una y revisar la viabilidad de su desactivación. En otros sitios web van más allá, y amplian mucho más la lista de funciones a desactivar:

disable_functions ="apache_child_terminate, apache_setenv, define_syslog_variables, escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, mysql_pconnect, openlog, passthru, php_uname, phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode"

Aquí ya entran las necesidades de cada uno y la adaptación al entorno de trabajo. Os recomiendo investigar las funciones. Securizar este punto os puede librar de muchos disgustos.

PHP: deshabilitar session ID en URL

Si queremos que las URL’s de nuestros sitios PHP no muestren los ID de sesiones:

http://ejemplo.com/?PHPSESSID=4kgj577sgabvnmhjgkdiuy1956if6ska

Puede deshabilitarse a través del fichero .htaccess (servidores apache + cgi como DSO) o en un fichero php.ini personalizado (servidores apache + cgi ó apache + SUPHP), en los dos casos modificando el parámetro session.trans_id.

En .htaccess:

php_flag session.use_trans_sid off

En php.ini:

session.use_trans_sid = off

IIS: Imposible ejecutar perl o php con Application Pool Isolation

Es posible que tengáis un servidor Windows 2003 server con IIS funcionando correctamente, los websites ejecutan sin problemas php o perl, pero en el momento que aislamos un website (Application Pool Isolation) tanto PERL como PHP dejan de funcionar, dando normalmente el siguiente error:

HTTP Error 403 – Forbidden: Access is denied

Este problema es debido a que cada identidad de application pool (usuario configurado en la aplicación para ejecución de scripts, php, etc) debe ser miembro del grupo IIS_WPG de modo que nos aseguremos que tenga permisos para ejecutar php o perl.

Realizaremos las siguientes modificaciones en las políticas de seguridad para solventar el problema, iremos a:

START > Administrative Tools > Local Security Policy

Seleccionamost Local Policies > User Rights Assignment

En el listado que aparezca, buscamos Adjust memory quotas for a process y pinchamos en las propiedades. Posteriormente Add User or Group > Object Types marcando la casilla de  Groups y OK the Object Types dialogue. Ahora en la ventana Enter the object names to select introduce IIS_WPG y pincha OK.

El mismo proceso debe ser ejecutado en Replace a process level token. Reiniciaremos la máquina y ya debería funcionar correctamente. Todos los miembros de IIS_WPG pueden ejecutar aplicaciones CGI sin problemas.

Vía | Asimo Support

PHP 5.2.8

Ha salido a la luz una nueva versión de php, la PHP 5.2.8, esta versión soluciona un bug encontrado en la reciente versión también publicada 5.2.7 relacionada con el funcionamiento de magic_quotes, bug de seguridad que abría un agujero de seguridad al tener activo “magic_quotes_gpc

Se recomienda actualizar a dicha versión, y si tienes la versión 5.2.7 y no deseas actualizar aplica el siguiente “parche” a tu php.ini para arreglar el problema de magic_quotes:

“filter.default_flags=0″

Más información en php.net