miércoles, mayo 30, 2007

PARTE 2. Instalación y Configuración LAMP (Linux, Apache2, MySQL5 y PHP5) con algunas consideraciones de seguridad.

Instalación de Apache
(tips de seguridad: http://httpd.apache.org/docs/2.0/misc/security_tips.html)
Instalamos Apache2, la documentación (siempre necesaria), Lynx que es un navegador que trabaja en modo texto y los certificados para SSL. Trabajaremos como usuario root.

apt-get install apache2-mpm-prefork apache2-doc lynx ca-certificates

Ejecutamos

/etc/init.d/apache2 force-reload

para cargar todos los módulos de la instalación. Ya tenemos apache instalado. Lo comprobamos: http://localhost o bien desde la shell: lynx localhost
Ahora procederemos a configurar nuestros VIRTUALHOST (de tipo name-based). Para ello creamos un directorio donde guardaremos la data de todos nuestros virtualhosts fuera de la ruta pública (/var/www/), p. ej:

mkdir /var/virtualhosts/

Vamos a trabajar con el dominio pruebazona.cl creado en el post anterior referente a BIND9. Antes de comenzar con la configuración, debo destacar un par de cosas antes que son importantes.

- El directorio /etc/apache2/sites-available/ contiene las directivas de configuración de apache para cada virtualhost
- El directorio /etc/apache2/sites-enabled/ contiene los sitios habilitados para trabajar bajo virtualhost
- Para habilitar un Virtualhost ya existente en sites-available basta con ejecutar: a2ensite dominio.com (por ejemplo: a2ensite pruebazona.cl).

IMPORTANTE: En /var/virtualhosts/ vamos a guardar los datos propiamente tal, es decir, el contenido completo de nuestros sitios webs (scripts, html, etc) y en /etc/apache2/sites-available (y enabled) estará la configuración respectiva de apache para cada virtualhost. OK, aclarado este punto, proseguimos.
Creamos nuestro sitio web (que mostrará www.pruebazona.cl)

mkdir /var/virtualhosts/pruebazona/
vim /var/virtualhosts/pruebazona/index.html

Y creamos un contenido para index.html:


USTED ESTA VIENDO www.pruebazona.cl




Guardamos y ahora creamos la configuración para ese VirtualHost:

vi /etc/apache2/sites-available/pruebazona.cl

NOTA: (Usamos la directiva para definir el sitio virtual y la directiva para indicar cual será el directorio públicamente accesible)



#Configuración básica
ServerAdmin webmaster@pruebazona.cl
ServerName www.pruebazona.cl
DocumentRoot /var/virtualhosts/pruebazona/


Order Deny,Allow
Allow from all
# No mostrar indexes (índices) para los directorios
Options -Indexes




Guardamos, salimos y habilitamos el sitio nuevo:

a2ensite pruebazona.cl

Debemos recargar Apache para que tomen los cambios:

/etc/init.d/apache2 reload


Si funciona nuestro DNS, entonces podriamos apuntar a www.pruebazona.cl y ver el contenido de la página que creamos en http://www.pruebazona.cl

TIPS DE APACHE:
- Habilitar y deshabilitar módulos de apache funciona de la misma manera que los virtualhost. Usamos a2enmod para habilitar y a2dismod para deshabilitar.
- Si queremos habilitar SSL sobre Apache, solamente agregamos la línea
Listen 443
al archivo /etc/apache2/ports.conf
- Para crear certificados auto-firmados para utilizar con SSL, podemos usar el siguiente comando que nos creará un certificado "válido" por 10 años.

apache2-ssl-certificate -days 3650


Instalación de PHP5


apt-get install libapache2-mod-php5

Como método de seguridad, utilizamos la configuración recomendada de PHP en vez de la original:

mv /etc/php5/apache2/php.ini /etc/php5/apache2/php.ini.original
cp /usr/share/doc/php5-common/examples/php.ini-recommended /etc/php5/apache2/php.ini

Le decimos a PHP "que se esconda":

vim /etc/php5/apache2/php.ini

y cambiamos este valor: expose_php = on por expose_php = off

Eso es todo. Para probar que Apache está interpretando PHP, creamos el siguiente SCRIPT:

vim /var/www/prueba.php

y agregamos:

phpinfo();
?>

La función phpinfo() nos listará todo el entorno de PHP en http://localhost/prueba.php. Es muy importante eliminar este archivo una vez creado, ya que proporciona mucha información útil para un atacante.

MYSQL
Instalamos el servidor MySQL y el módulo de conexión a MySQL de PHP.

apt-get install mysql-server php5-mysql

Creamos un password para el usuario root de MySQL:

/usr/bin/mysqladmin -u root password 'cualquierpassword'

probamos que esté ejecutándose MySQL:

mysql -u root -p
password:

instalamos phpMyAdmin

apt-get install phpmyadmin

Y listo. Ahora, para darle más seguridad a phpmyadmin, podemos eliminar la versión del banner y aplicarle doble contraseña con .htaccess que veremos en los pasos posteriores. Para eliminar el peligroso banner:

vim /usr/share/phpmyadmin/libraries/Config.class.php

Aproximadamente en la línea 83 encontramos este texto:

/**
* sets system and application settings
*/
function checkSystem()
{
$this->set('PMA_VERSION', '2.9.1.1-Debian-2ubuntu1');
/**
* @deprecated
*/
$this->set('PMA_THEME_VERSION', 2);
/**
* @deprecated
*/
$this->set('PMA_THEME_GENERATION', 2);

La variable PMA_VERSION debemos editarla y dejarla a nuestro propio gusto:

/**
* sets system and application settings
*/
function checkSystem()
{
$this->set('PMA_VERSION', 'QUE TE IMPORTA MI VERSION FUCKIN' LAMMER');
/**
* @deprecated
*/
$this->set('PMA_THEME_VERSION', 2);
/**
* @deprecated
*/
$this->set('PMA_THEME_GENERATION', 2);


SEGURIDAD DE LOS SERVICIOS INSTALADOS

Apache
Inmediatamente agregamos un poco de seguridad a Apache en apache2.conf ajustando los siguientes parámetros


# Prohibimos acceso a ubicaciones del sistema de archivos
Order Deny,Allow
Deny from all
# Prevenimos el uso de archivos .htaccess en todos los directorios
# excepto aquellos que especifiquemos explícitamente
AllowOverride None
# No mostramos el contenido de los índices.
Options -Indexes


# Limitamos la información saliente de Apache.
ServerSignature Off
ServerTokens Prod


COMO PROTEGER LOS DIRECTORIOS CON CONTRASEÑA:
Indicamos a APACHE que debe aceptar los .htaccess en apache2.conf


Options Indexes Includes FollowSymLinks MultiViews
AllowOverride AuthConfig
Order allow,deny
Allow from all


Creamos un directorio SEGURO donde almacenamos la contraseña. FUERA DE LA RUTA WWW

mkdir /data/

Creamos el directorio en la ruta www

mkdir /var/www/protegido/
cd /var/www/protegido/

con vim creamos un archivo llamado ".htaccess" sin comillas y agregamos el siguiente código:

vim .htaccess

Código:

AuthUserFile /data/.htpasswd
AuthName “ACCESO RESTRINGIDO”
AuthType Basic


require valid-user


cambiamos al directorio /data/ y creamos el archivo de password:

cd /data/
htpasswd -c .htpasswd usuario

Ingresamos la password deseada y finalizamos recargando apache:

/etc/init.d/apache2 reload

y probando el directorio protegido por contraseña http://localhost/protegido/

MySQL
=====
Como consideración general no se debe ocupar el usuario "root" de MySQL para configurar los sitios web ni nada. Se deben
crear usuarios y passwords para cada sitio web o aplicación MySQL que levanta. Además se debe restringir MySQL solo a trabajar en localhost.

1 comentario:

  1. Muy Buenas , exelente informacion, tengo varias dudas, primero en tu articulo - "Instalación y configuración segura de un servidor DNS con BIND"
    Cuando mencionas el instalar el vim y remplazar el texto ambas entradas que das son identicas, y segundo que es lo que me recomiendas empezar a leer para montar un servidor web de una escuela donde laboro y mi idea es poner sobre un dominio varios subdominios para mis alumnos tengan su pagina personal ejm www.dominio.edu/paginadejuanito y integrar la seguridad que propones en tus articulos, disculpame si las preguntas son tontas pero es que apenas estoy empezando gracias

    ResponderBorrar