Servidor web en Debian con script


Servidor web en Debian con script

En esta guía dejaré un script básico para que puedas crear tu propio servidor web en Debian. Puedes utilizarlo de manera local como en tu propio VPS.

El script es básico e incluye además seguridad básica, pero tiene lo necesario para que puedas utilizarlo como servidor web.

El script en partes

Comenzamos por la primera linea la cual declara que es un script en BASH.

#!/bin/bash

Acceso a SSH

Si sólo tú administrarás este servidor y lo harás desde lugares específicos, te recomiendo que habilites SSH sólo para ciertas IP de la siguiente forma:

echo "Configurando acceso SSH"
echo "" >> /etc/hosts.allow
echo "sshd: EL-IP-A-PERMITIR" >> /etc/hosts.allow
echo "" >> /etc/hosts.deny
echo "sshd: all" >> /etc/hosts.deny
clear

Con esto editaremos el archivo hosts.allow para permitir sólo los IPs que ingresemos (separadas por un espacio) y en el archivo hosts.deny le diremos que todo lo demás no pueda ingresar.

Actualizando el sistema

Lo siguiente será actualizar el sistema con los comandos habituales.

echo "Actualizando el sistema"
apt-get update -y
apt-get dist-upgrade -y
apt-get autoremove -y
apt-get autoclean -y
clear

Los comandos mostrarán todo lo que descargan, ya que en un momento nos pedirá verificar un archivo para luego ingresar la letra q para continuar la instalación.

Aplicando reglas a IPTABLES

Ahora aplicaremos un poco de seguridad básica al servidor con las siguientes reglas de IPTABLES.

echo "Aplicando reglas IPTABLES"
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
iptables -A INPUT -j DROP
iptables-save > /etc/firewall.conf
echo "#!/bin/sh" > /etc/network/if-up.d/iptables
echo "iptables-restore < /etc/firewall.conf" >> /etc/network/if-up.d/iptables
chmod +x /etc/network/if-up.d/iptables
clear

Las primeras lineas son las reglas que aplicaremos como por ejemplo acceso completo interno, permitir conexiones desde X puertos (SSH, HTTP, HTTPS), etc y lo demás no se acepta.

Luego se guardarán las reglas en el archivo iptables en if-up.d para que al reiniciar el sistema se vuelvan a aplicar las reglas.

Instalación y configuración de Apache

Ahora viene la instalación y configuración de Apache (servidor web).

echo "Instalando Apache"
apt-get install apache2 -y
sed -i '164,168 s/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
a2enmod rewrite
a2dismod mpm_event
a2enmod mpm_prefork
service apache2 restart
clear

La instalación de Apache consiste en un sólo comando que instala la aplicación. Luego edito el archivo apache2.conf para permitir el uso de archivos HTACCESS

Las lineas que preceden son para deshabilitar y habilitar ciertos módulos para un mejor funcionamiento.

Por último se reinicia Apache para que los cambios surtan efecto.

Instalación de MySQL y PHPMyAdmin

El siguiente fragmento del script contiene los comandos para la instalación de la base de datos y el frontend web más utilizado.

echo "Instalando MySQL"
apt-get install mysql-server -y
mysql -pCLAVE-DE-TU-BASE-DE-DATOS -e "DELETE FROM mysql.user WHERE User='';"
mysql -pCLAVE-DE-TU-BASE-DE-DATOS -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
mysql -pCLAVE-DE-TU-BASE-DE-DATOS -e "DROP DATABASE test;"
mysql -pCLAVE-DE-TU-BASE-DE-DATOS -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'"
mysql -pCLAVE-DE-TU-BASE-DE-DATOS -e "FLUSH PRIVILEGES;"
apt-get install phpmyadmin -y
clear

Durante la instalación de la base de datos mysql nos solicitará ingresar la contraseña del usuario root para dicha aplicación.

Las lineas del centro contienen los comandos automatizados del script mysql_secure_installation. Lo único que deberás cambiar será la clave a tu base de datos.

En la instalación de phpmyadmin también solicitará algunas cosas, ingresamos la contraseña de la base de datos antes creada y aceptamos los siguientes pasos.

Instalando PHP y módulos

Ahora instalaremos PHP con los siguientes comandos.

echo "Instalando PHP y modulos"
apt-get -y install php5-fpm
apt-get -y install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-pspell php5-recode php5-tidy php5-xmlrpc php5-xsl php-gettext
apt-get install libapache2-mod-php5
sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 15M/g' /etc/php5/apache2/php.ini
service apache2 restart
clear

Se instalará PHP con algunos módulos necesarios. Además configuro el archivo php.ini para que pueda aceptar 15 MB máximos de subida. Esto me servirá (además de para otras cosas) para poder subir una base de datos de hasta 15MB de peso.

Al final se reiniciará apache para que los cambios surtan efecto.

Configuración virtualhost HTTPS

Si estás en un servidor casero, puedes aplicar este paso. Si estas en un VPS, te recomiendo que no lo hagas, ya que los certificados que se generan no serán validados por los navegadores.

echo "Configurando web https"
mkdir -p /etc/ssl/localcerts
openssl req -new -x509 -days 365 -nodes -out /etc/ssl/localcerts/apache.pem -keyout /etc/ssl/localcerts/apache.key -subj "/C=CL/ST=Valparaiso/L=Valparaiso/O=Francisco Molina/OU=Blog/CN=franciscomolina.cl"
chmod 600 /etc/ssl/localcerts/apache*
a2enmod ssl
mkdir /var/www/franciscomolina
echo "Prueba ssl" > /var/www/franciscomolina/index.html
cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/www.franciscomolina.cl.conf
sed -i '2i NameVirtualHost *:443' /etc/apache2/sites-available/www.franciscomolina.cl.conf
sed -i 's/<VirtualHost _default_:443>/<VirtualHost *:443>/g' /etc/apache2/sites-available/www.franciscomolina.cl.conf
sed -i '5i ServerName www.franciscomolina.cl' /etc/apache2/sites-available/www.franciscomolina.cl.conf
sed -i 's/ServerName www.franciscomolina.cl/ ServerName www.franciscomolina.cl/g' /etc/apache2/sites-available/www.franciscomolina.cl.conf
sed -i 's/DocumentRoot \/var\/www\/html/DocumentRoot \/var\/www\/franciscomolina/g' /etc/apache2/sites-available/www.franciscomolina.cl.conf
sed -i 's/\/etc\/ssl\/certs\/ssl-cert-snakeoil.pem/\/etc\/ssl\/localcerts\/apache.pem/g' /etc/apache2/sites-available/www.franciscomolina.cl.conf
sed -i 's/\/etc\/ssl\/private\/ssl-cert-snakeoil.key/\/etc\/ssl\/localcerts\/apache.key/g' /etc/apache2/sites-available/www.franciscomolina.cl.conf
a2ensite www.franciscomolina.cl.conf
service apache2 restart
clear

Aquí deberán cambiar los datos en la linea de la generación de los certificados (openssl req) en la opción -subj.

También deberán editar el nombre del directorio donde alojarán los archivos de la web https y el nombre del archivo .conf. Básicamente editen todo lo que contiene franciscomolina o franciscomolina.cl.

Al final se habilita el archivo de configuración del sitio y se reinicia apache.

Un poco de seguridad con Fail2ban

Por último instalaremos Fail2ban para dar un poco más de seguridad a nuestro servidor.

echo "Instalando Fail2Ban"
apt-get install openssh-server fail2ban -y
sed -i 's/ignoreip = 127.0.0.1\/8/ignoreip = 127.0.0.1\/8 TUS-IP-SEPARADAS-POR-ESPACIO/g' /etc/fail2ban/jail.conf

echo "" >> /etc/fail2ban/jail.conf
echo "[xmlrpc]" >> /etc/fail2ban/jail.conf
echo "enabled = true" >> /etc/fail2ban/jail.conf
echo "filter = xmlrpc" >> /etc/fail2ban/jail.conf
echo "action = iptables[name=xmlrpc, port=http, protocol=tcp]" >> /etc/fail2ban/jail.conf
echo "logpath = /var/log/httpd/domains/*.log" >> /etc/fail2ban/jail.conf
echo "bantime = 43600" >> /etc/fail2ban/jail.conf
echo "maxretry = 6" >> /etc/fail2ban/jail.conf
echo "" >> /etc/fail2ban/jail.conf
echo "[wplogin]" >> /etc/fail2ban/jail.conf
echo "enabled = true" >> /etc/fail2ban/jail.conf
echo "filter = wplogin" >> /etc/fail2ban/jail.conf
echo "action = iptables[name=wplogin, port=http, protocol=tcp]" >> /etc/fail2ban/jail.conf
echo "logpath = /var/log/httpd/domains/*.log" >> /etc/fail2ban/jail.conf
echo "bantime = 43600" >> /etc/fail2ban/jail.conf
echo "maxretry = 6" >> /etc/fail2ban/jail.conf
echo "[Definition]" > /etc/fail2ban/filter.d/xmlrpc.conf
echo "failregex = ^<HOST> .*POST .*xmlrpc\.php.*" >> /etc/fail2ban/filter.d/xmlrpc.conf
echo "ignoreregex =" >> /etc/fail2ban/filter.d/xmlrpc.conf
echo "[Definition]" > /etc/fail2ban/filter.d/wplogin.conf
echo "failregex = ^<HOST> .*POST .*wp-login\.php.*" >> /etc/fail2ban/filter.d/wplogin.conf
echo "ignoreregex =" >> /etc/fail2ban/filter.d/wplogin.conf
/etc/init.d/fail2ban restart
clear

Sólo son necesarias las 3 primeras lineas para instalar Fail2ban y agregar nuestro IP a la lista de ignoradas para que no nos bloquee por ningún motivo.

Las siguientes lineas son reglas para securizar webs basadas en wordpress. Si utilizarás este CMS, te recomiendo aplicar esas lineas.