Instalación de mod_security 2.1.7_1 en FreeBSD 7.x

# cd /usr/ports/www/mod_security2
# make install clean
# vi /usr/local/etc/apache22/httpd.conf
LoadFile /usr/local/lib/libxml2.so
LoadModule mod_security2    libexec/apache22/mod_security2.so

<IfModule security2_module>
    SecRuleEngine On
</IfModule>
# /usr/local/etc/rc.d/apache22 restart

Nota: la instalación con la versión 2.1.3 no se pudo realizar ya que el Makefile no realizaba correctamente el enlace con libxml2 y fallaban las reglas que requerían procesamiento de XML. Se recomienda actualizar a una versión superior.

El siguiente paso consiste en configurar las reglas de seguridad que apliquen a su negocio. Para esto edite apropiadamente los siguientes archivos bajo la ruta /usr/local/etc/apache22/Includes.

  • mod_security2.conf
  • no-accf.conf
  • mod_security2/ (directorio de reglas)

Enlaces

Configurando Apache 2.2.x/PHP 5.2.x con FastCGI mod_fcgid en FreeBSD 7.x

Descargar compilar e instalar el paquete mod_fcgid y sus posibles dependencias.

# cd /usr/ports/www/mod_fcgid
# make install clean

Verificar que la instalación de PHP cuente con el soporte de FastCGI.

# /usr/local/bin/php-cgi -v

Configurar a Apache para que utilice el nuevo módulo de FCGI.

# vi /usr/local/etc/apache22/httpd.conf

Agregar al final del archivo httpd.conf.

LoadModule fcgid_module libexec/apache22/mod_fcgid.so

<IfModule mod_fcgid.c>
    AddHandler fcgid-script .fcgi
    FCGIWrapper /usr/local/bin/php-cgi .php
</IfModule>

Ubicar la sección del directorio del DOCUMENT_ROOT y complementarla con la nueva opción.

<Directory "/home/web">
    # ...
    Options ExecCGI
</Directory>

Reiniciar el servicio de Apache para que se tengan en cuenta los cambios realizados.

# /usr/local/etc/rc.d/apache22 restart

Consultar la salida de phpinfo() para verificar su correcto funcionamiento.

Instalación de PHP 5.x CGI en FreeBSD 7

Descargar, compilar e instalar la última versión de la distribución de PHP5. Remover los archivos binarios resultantes de la compilación después de instalar.

# cd /usr/ports/lang/php5

# make config
CLI
CGI
SUHOSIN
MULTIBYTE
IPV6
FASTCGI
PATHINFO
# make install clean

Compilar e instalar las extensiones de PHP que se consideren necesarias. El sistema de ports descargará e instalará cualquier paquete adicional que se requiera como dependencia de las extensiones elegidas.

# cd /usr/ports/lang/php5-extensions
# make config
BCMATH
BZ2
CALENDAR
CTYPE
CURL
DOM
EXIF
FILTER
FTP
GD
GETTEXT
HASH
ICONV
IMAP
JSON
LDAP
MBSTRING
MCRYPT
MHASH
MING
MSSQL
MYSQL
MYSQLI
NCURSES
ODBC
OPENSSL
PCRE
PDF
PDO
PDO_SQLITE
PGSQL
POSIX
READLINE
SESSION
SIMPLE_XML
SOAP
SOCKETS
SPL
SQLITE
TIDY
TOKENIZER
WDDX
XML
XMLREADER
XMLRPC
XMLWRITER
XSL
ZIP
ZLIB
# make install clean

Modificar el archivo de configuración de Apache (httpd.conf) para especificar como manejar los archivos con la extensión .php.

# vi /usr/local/etc/apache22/httpd.conf
<IfModule dir_module>
    DirectoryIndex index.php index.html index.htm
</IfModule>

Agregar al final de httpd.conf.

ScriptAlias /php-cgi "/usr/local/bin/php-cgi"
AddHandler php-handler .php
Action php-handler /php-cgi

<Location "/php-cgi">
    Options None
    Order allow,deny
    Allow from all
</Location>

Crear un archivo de configuración de PHP (php.ini) a partir de los archivos base incluídos en la distribución (dist para desarrolladores o recommended para ambientes en producción).

# cp /usr/local/etc/php.ini-recommended /usr/local/etc/php.ini

# vi /usr/local/etc/php.ini

(Quitar el comentario)

session.save_path = "/tmp"

Crear un archivo de prueba para verificar el funcionamiento del CGI de PHP recién instalado.

# vi /home/web/test.php
    <?php echo phpinfo (); ?>

Consultar la dirección del servidor (http://webserver.mydomain.com/test.php) con un navegador web. Si la instalación fue exitosa se deberá visualizar una página similar a la mostrada a continuación.

Configuración del módulo SSL en Apache 2.2.x en FreeBSD 7

Se configura el inicio automático de Apache para que incluya el módulo de SSL.

# vi /etc/rc.conf
apache2_flags="-DSSL"

Se establecen las ubicaciones donde se creará el certificado SSL.

# cd /usr/local/etc/apache22
# mkdir ssl.key
# mkdir ssl.crt
# chmod 0700 ssl.key
# chmod 0700 ssl.crt

Se crea el certificado SSL del servidor. Se deberán tener en cuenta las recomendaciones mencionadas en el artículo de soporte SSL para PGSQL. En particular, se deberá reemplazar la contraseña (MyPassPhrase) por una propia y privada.

# openssl genrsa -des3 -out server.key 1024
Enter pass phrase for server.key: MyPassPhrase

Solicitud de firma del certificado: Certificate Signing Request (CSR).

# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key: MyPassPhrase
Verifying - Enter PEM pass phrase: MyPassPhrase

Country Name (2 letter code) [AU]: CO
State or Province Name (full name) [Some-State]: Caldas
Locality Name (eg, city) []: Manizales
Organization Name (eg, company) [Internet Widgits Pty Ltd]:  Personal Development
Organizational Unit Name (eg, section) []: Educacion
Common Name (eg, YOUR name) []: webserver.mydomain.com
Email Address []:jimezam@gmail.com
A challenge password []: Certificado&2008k
An optional company name []: Smiley World

Realización de la autofirma del certificado.

# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Enter pass phrase for server.key: MyPassPhrase

Ubicación de los certificados en sus ubicaciones finales.

# rm server.csr
# mv server.key ssl.key
# mv server.crt ssl.crt
# chmod 0400 ssl.key/server.key
# chmod 0400 ssl.crt/server.crt

Configuración de Apache para activar el módulo de SSL.

# vi /usr/local/etc/apache22/extra/httpd-ssl.conf
<VirtualHost _default_:443>
    DocumentRoot "/home/web"
    ServerName webserver.mydomain.com:443
    ServerAdmin jimezam@gmail.com
    ErrorLog /var/log/ssl-error.log
    TransferLog /var/log/ssl-access.log
    SSLCertificateFile "/usr/local/etc/apache22/ssl.crt/server.crt"
    SSLCertificateKeyFile "/usr/local/etc/apache22/ssl.key/server.key"
</VirtualHost>
# vi /usr/local/etc/apache22/httpd.conf
Include etc/apache22/extra/httpd-ssl.conf

Reiniciar el servicio de Apache.

# /usr/local/etc/rc.d/apache22 restart
Enter pass phrase: MyPassPhrase

Realizar la verificación de su funcionamiento consultando las siguientes direcciones web.

  • http://webserver.mydomain.com
  • https://webserver.mydomain.com

Cada vez que se inicie el servicio, como en el paso anterior, se solicitará la clave asignada. Esta característica fue diseñada por razones de seguridad, es necesaria ya que la llave RSA privada del archivo server.key se encuentra encriptada con ella, sin embargo es posible removerla bajo consideración del administrador. Para remover esta capa de seguridad se deben ejecutar los pasos siguientes.

# cd /usr/local/etc/apache22/ssl.key
# cp server.key server.key.orig
# openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.orig: MyPassPhrase
# /usr/local/etc/rc.d/apache22 restart

Enlaces:

Creación de un VirtualHost con Apache 2.2.x en FreeBSD 7

Activar el acceso al archivo de configuración de VirtualHosts.

# vi /usr/local/etc/apache22/httpd.conf

Include etc/apache22/extra/httpd-vhosts.conf

Para configurar un Huesped Virtual se debe especificar la información básica de este de manera similar a como se especificó la información del sitio.

# vi /usr/local/etc/apache22/extra/httpd-vhosts.conf

<VirtualHost *:80>

    ServerAdmin jimezam@mydomain.com

    DocumentRoot "/home/web"

    ServerName webserver.mydomain.com

</VirtualHost>

<VirtualHost *:80>
    ServerAdmin jimezam@mydomain.com
    DocumentRoot "/home/sistemas"
    ServerName sistemas.mydomain.com
    ServerAlias www.sistemas.mydomain.com
    ErrorLog "/var/log/sistemas-error_log"
    TransferLog "/var/log/sistemas-access_log"

    <Directory /home/sistemas>
        Allow from all
    </Directory>
</VirtualHost>

La modificación anterior indica que se crea el Huesped Virtual para el sitio sistemas.mydomain.com el cual tiene como raíz de su árbol de directorios web a /home/sistemas y a jimezam@mydomain.com como la dirección de correo de su administrador. Se especifican además la ubicación de los archivos de registro de acceso (CustomLog) y de error (ErrorLog). Lo mas conveniente es separarlos de los archivos de registro del sitio principal para facilitar su posterior depuración y manejo.

Un parámetro opcional permite establecer un alias del huesped virtual (ServerAlias) el cual es útil si se desea permitir el acceso a este con las www al comienzo.

La primera sección de VirtualHost corresponde con el huesped por defecto, es decir, el que será llamado en el caso en que la solicitud (nombre DNS) no corresponda con ninguno de los ServerName de los VirtualHost definidos a continuación, para nuestro caso, el definido inicialmente cuando no había huespedes virtuales.

Es importante tener en cuenta la sección Directory en el interior del VirtualHost ya que es necesaria debido a un sutil cambio en la configuración estándar de Apache 2.2.x la cual producirá sin esta modificación errores 403 en la consulta con el navegador y mensajes de registro del estilo de: client denied by server configuration error.

Crear el directorio al cual hace referencia el DocumentRoot del huesped virtual.

# mkdir /home/sistemas

# chown jimezam:jimezam /home/sistemas

El nombre del dominio de cada ServerName deberá ser resuelto por un DNS (o por un archivo hosts local en su defecto) para poder ser utilizado.

Instalación y configuración inicial de Apache 2.2.x en FreeBSD 7

Instalación.

Obtener de los ports las fuentes, compilarlas e instalar la versión 2.2.x bajo el árbol /usr/local.

# cd /usr/ports/www/apache22

# make install

Agregar la opción suExec.

Ejecución automática al inicio del sistema operativo.

Habilitar el inicio automático del servicio HTTP, con él cada vez que se inicie el sistema operativo se iniciará el servidor de páginas.

# vi /etc/rc.conf

apache22_enable=”YES”
apache22_http_accept_enable=”YES”

Inicio/detención manual del servidor de páginas.

Inicio, detención y reinicio del servicio de Apache de manera manual.

# /usr/local/etc/rc.d/apache22 [start | stop | restart]

Configuración del servidor de páginas.

Configuración básica del servidor de páginas.

# vi /usr/local/etc/apache22/httpd.conf

Modificar la dirección de correo de la persona de contacto del servidor (webmaster) y del nombre DNS del servidor (incluyendo su dominio).

 ServerAdmin webmaster@mydomain.com
 ServerName webserver.mydomain.com:80

Especificar la ubicación en disco del árbol de directorios publicados a través de web y sus características.

 DocumentRoot "/home/web"
 <Directory "/home/web">
     Options Indexes FollowSymLinks
     AllowOverride None
     Order allow,deny
     Allow from all
 </Directory>

Permitir la consulta automática de los archivos index.html e index.htm si el URL de la solicitud no especifica un nombre de archivo explícito.

 <IfModule dir_module>
     DirectoryIndex index.html index.htm
 </IfModule>

Permitir el acceso a los sitios web de los usuarios del sistema operativo a través del símbolo ~ (Ejemplo: http://webserver.mydomain.com/~jimezam/).

 Include etc/apache22/extra/http-userdir.conf

Creación del directorio al cual hace nueva referencia el árbol de directorios web (DocumentRoot).

# mkdir /home/web

# chown www:www /home/web

Revisar los registros de la aplicación.

/var/log/httpd-access.log contiene la información de las peticiones exitosas que ha servido Apache.

/var/log/httpd-error.log contiene la información de los errores y peticiones fallidas que ha tenido el servidor de páginas.

Hosting con phpSuExec

Uno de los servidores contratados de hosting de la Fundación donde trabajo fue actualizado recientemente. Inicialmente tenía PHP4 y desarrollaron en él un sistema de información basado en la variable register_globals encendida. Ahora con PHP5 register_globals se encuentra desactivada por defecto y por ende, nada funciona.

La solución es muy sencilla, agregar la siguiente línea al archivo .htaccess que se encuentra en el raíz del sitio web.

    <ifmodule mod_php5.c>
        php_flag register_globals on
    </ifmodule>

Sin embargo esto no funcionó para el servidor. Por el contrario generaba un error 500. Investigué un poco mas y empecé a esclarecer la situación. Al parecer la actualización del hosting se realizó utilizando phpSuExec (1) que es la apropiación de PHP del soporte suExec que provee Apache. Esto permite que el demonio de Apache que atiende las peticiones de los diferentes dominios alojados en un hosting compartido se ejecute bajo el mismo usuario de la cuenta mejorando con esto la seguridad de las cuentas individuales. Esto trae consigo otras repercusiones como las observadas, en especial, la que impide que se definan variables PHP en el archivo .htaccess; conclusión: la solución anterior ya no es válida.

Con phpSuExec se deben crear archivos php.ini que se ubican, al igual que los .htaccess, en el árbol web del sitio, en ellos se definen las variables PHP necesarias. A diferencia de los segundos, el alcance de los archivos php.ini es local al mismo directorio, es decir, no es recursivo, así que en rigor es necesario crear en (o enlazar a) el archivo php.ini a cada uno de los directorios donde se necesite.

Esta restricción resulta altamente tediosa, tanto por la tarea mecánica misma de andar copiando archivos como por la de mantenerlos actualizados y ubicados en los directorios que son. Por suerte (y gracias al sitio de Jumba Support Wiki) encontré que es posible indicarle a Apache que un php.ini específico es el que tendrá vigencia a lo largo y ancho del árbol de directorios web utilizando una directiva PHPRC en el .htaccess. Esto nos evitará la necesidad de andar copiando/enlazando archivos en cada subdirectorio, claro está que es útil solamente en el caso en que necesitemos un único php.ini para todo el sitio (99% de los casos ?).

Para implementar esta solución se debe crear/editar un archivo .htaccess en el directorio raíz del sitio web e incluír la siguiente línea.

    SetEnv PHPRC /home/proyecto/public_html

Téngase en cuenta que la ruta /home/proyecto/public_html deberá ser la ruta real donde se ubicará le archivo php.ini.

“client denied by server configuration” en Apache 2.2.4

Esta vez estoy instalando Apache 2.2.4 y encontré un problema. Cuando ya estaba todo supuestamente listo e intentaba solicitar una página del Document_Root me respondía el servidor con un 403 (forbidden). Muy extraño. En los registros aparecían mensajes como el siguiente:[Tue Aug 07 17:06:14 2007] [error] [client 192.168.1.2] client denied by server configuration: /data/www/index.html

Encontré que la versión 2.2.x ajusta de una manera mas restrictiva los permisos sobre el directorio raíz (‘/’). En httpd.conf dice lo siguiente:

<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>

Comentando la última línea: “Deny from all” se solucionó el inconveniente.