VPS Ubuntu: Configuración sobre un dominio 2018

El dominio sobre el que descansará el VPS sera pymestic.es, cuyo FQDN quiero que sea vps0.pymestic.net
El índice del artículo podría ser este:

Registros DNS en el panel del dominio
Resolución inversa en el panel del vps
Primera conexión como root vía SSH

Instalación de iredmail
- Comprobad el webmail
- Comprobad el panel de control de email
- Nos están atacando?
- Cambiar puerto SSH
- DKIM: amavisd-new showkeys | testkeys

Qué más cosas vamos a hacer?
- Editar las urls / alias por defecto
- Antivirus: cómo manejarnos con ClamAV [clamav y clamav-update]
- Instalar y configurar rkhunter anti-malware y anti-rootkit
- Resolver errores: 'perl warning Setting locale failed'
- Verificar y cambiar si es necesario la configuración de fecha y hora del sistema Debian
- Importante: Como se ve desde fuera nuestro VPS [nmap]
- fail2ban: modificar configuración para recibir emails de alerta [el analizador de logs e iptables]

Servidor Web Apache
- crear un usuario webmaster
- activar mod rewrite en apache2
- instalar y ocultar phpMyadmin
- crear una base de datos para wordpress
- descargar y descomprimir la ultima release de wordpress
- crear un virtualhost en apache para WordPress
- habilitar el nuevo sitio en apache
- instalar wordpress
- configuración de descarga automática
- instalación del idioma o idiomas preferidos
- Instalar un firewall a WordPress: wordfence
Otras recomendaciones: securizar un poco Apache2 y deshabilitar wp-cron.php
- Opcional: Instalar un servidor de ftp interno (localhost)
- Certificado digital gratuito
	<a href="https://sospedia.net/mozilla-y-google-dejan-de-confiar-en-los-certificados-de-wosign-y-startcom/">[ UPDATED ] Certificado Let's Encrypt</a>
Direcciones web con Utilidades DNS y más

Registros DNS en el panel del dominio

Lo primero es configurar la zona DNS de este dominio, para ello desde el panel de control de mi dominio agrego estas zonas (en la imagen server.pymestic.net se corresponde a vps0.pymestic.es en nuestro ejemplo de hoy):

En el caso del SPF yo permito que todos mis VPS hablen sin problemas entre sí, añado sus IP’s, en vuestro caso puede ser suficiente de momento ‘v=spf1-all‘.

Resolución inversa en el panel del vps

Ahora en Ramnode configuramos el nombre del host, y la red, el PTR de resolución inversa:

En la imagen server.pymestic.net se corresponde a vps0.pymestic.es en nuestro ejemplo de hoy

Como el sistema operativo ya tiene unos años, es un Debian 7, reinstalaremos y esta vez será Ubuntu 16.04 64 bit Server:

Así que pincharemos en reinstalar:

Y elegiremos la distribución Ubuntu 16.04 64 bits.

Primera conexión como root

Tras la instalación conectamos por primera vez como root a ssh:

ssh root@vps0.pymestic.es

Importante comprobar antes de seguir si el FQDN del VPS es correcto. Para ello desde dentro utilizamos el comando hostname con la opción -f:

hostname -f

Si no da el FQDN con el que estamos trabajando ‘vps0.pymestic.es‘ es mejor repasar las DNS. Os adjunto una serie de direcciones web con utilidades para los dolores de cabeza con DNS y servidores de email al final de este artículo.

Lo primero que suelo hacer al iniciar una máquina nueva es actualizarla, aunque se acaba de instalar es posible que quede colgando alguna cosa:

apt-get update && apt-get upgrade

Tras esto me instalo mis cositas, por ejemplo mi editor:
apt-get install nano aptitude host htop

Instalación de iredmail

Cuando tengamos el sistema a nuestro gusto procedemos a descargarnos el bundle iredmail.

En el momento de escribir el post es este: https://bitbucket.org/zhb/iredmail/downloads/iRedMail-0.9.5-1.tar.bz2

Así que desde dentro del servidor con el comando wget lo descargamos:

wget https://bitbucket.org/zhb/iredmail/downloads/iRedMail-0.9.5-1.tar.bz2

Al tratarse de un bz2 descomprimimos así ‘jxvf’:

tar -jxvf iRedMail-0.9.5-1.tar.bz2

Esto nos crea un directorio, nos metemos en el:

cd iRedMail-0.9.5-1/

Y ejecutamos el siguiente script:

bash iRedMail.sh

Se nos harán unas preguntas, donde en la mayoría respetaremos lo que nos ofrece por defecto: /var/vmail

En el caso del servidor web, yo prefiero Apache, así que con las flechas de cursor ‘arriba’ y ‘abajo’ hacemos la selección, y con el ‘ESPACIO’ se fija, por último pulsamos ‘INTRO’ para continuar:

Como backend yo prefiero MySQL, igual que antes con las ‘flechas de cursor’ hacemos la selección, con el ‘ESPACIO’ se fija y con ‘INTRO’ continuamos:

Nos pregunta sobre el primer dominio, leed esta información ya que es importante:

Yo elijo pymestic.net, y a continuación la contraseña para postmaster@pymestic.net, que será el administrador del dominio de correo.

En el siguiente paso nos comenta que DKIM y SPF = Reputación de un servidor de correo, vienen de serie, y podemos elegir que paquetes instalaremos, a mi me gusta roundcube como Webmail, y por supuesto fail2ban para analizar logs y manejar iptables, y por último awstats para las estadísticas:

Continuamos:

La descarga e instalación de todos los paquetes tardará un rato.
Al final muestra un resumen que conviene copiar y guardar para posteriormente repasar y subsanar posibles errores menores, revisar rutas, etc.

Recomiendo siempre usar iptables:

El resumen final de lo que ha sucedido con la instalación, también es importante guardarlo para su posterior revisión, recibiremos un email en el buzón postmaster con mucha información:

********************************************************************
* Start iRedMail Configurations
********************************************************************
[ INFO ] Create self-signed SSL certification files (2048 bits).
[ INFO ] Generate Diffie Hellman Group with openssl, please wait.
[ INFO ] Create required system account: vmail, iredadmin, iredapd.
[ INFO ] Configure Apache web server.
[ INFO ] Configure PHP.
[ INFO ] Configure MySQL database server.
[ INFO ] Setup daily cron job to backup SQL databases with /var/vmail/backup/backup_mysql.sh
[ INFO ] Configure Postfix (MTA).
[ INFO ] Configure Dovecot (POP3/IMAP/Managesieve/LMTP/LDA).
[ INFO ] Configure ClamAV (anti-virus toolkit).
[ INFO ] Configure Amavisd-new (interface between MTA and content checkers).
[ INFO ] Configure SpamAssassin (content-based spam filter).
[ INFO ] Configure iRedAPD (postfix policy daemon).
[ INFO ] Configure iRedAdmin (official web-based admin panel).
[ INFO ] Configure Fail2ban (authentication failure monitor).
[ INFO ] Configure Roundcube webmail.
[ INFO ] Configure Awstats (logfile analyzer for mail and web server).
*************************************************************************
* iRedMail-0.9.5-1 installation and configuration complete.
*************************************************************************
ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).
********************************************************************
* URLs of installed web applications:
*
* - Roundcube webmail: https://server.pymestic.net/mail/
*
* - Web admin panel (iRedAdmin): https://server.pymestic.net/iredadmin/
*
* You can login to above links with below credential:
*
* - Username: postmaster@pymestic.net
* - Password: 
*
********************************************************************
* Congratulations, mail server setup completed successfully. Please
* read below file for more information:
*
*   - /root/iRedMail-0.9.5-1/iRedMail.tips
*
* And it's sent to your mail account postmaster@pymestic.net.
*
********************* WARNING **************************************
*
* Please reboot your system to enable all mail services.
*
********************************************************************

Como dice conviene hacer un reboot del sistema para activar todos los servicios instalados, cuyo resumen es este:

  • postfix
  • dovecot
  • spamassassin
  • clamav
  • roundcube
  • Apache2
  • MySQL
  • fail2ban
  • awstats

En la carpeta siguiente tenéis información ‘vital‘:

root/iRedMail-0.9.5-1/iRedMail.tips

Así que reiniciamos el VPS:

reboot

Comprobad el webmail

Conviene leer el correo que ha llegado a postmaster@ con instrucciones y rutas. En este momento ya debemos poder acceder al webmail vía esta dirección: https://server.pymestic.net. Utilizando como usuario postmaster@pymestic.net y la clave elegida durante el proceso de instalación. Entrad y leer el correo recibido.
Podéis enviar un email desde consola a una cuenta de email de fuera del dominio:
echo "Hola mundo" | mail -s "email desde pymestic.net" jblancov@gmail.com

Comprobad el panel de control de email

De la misma forma el panel de administración lo tenéis disponible aquí: https://server.pymestic.net/iredadmin/. Entrad con las mismas credenciales.

Nos están atacando?

Si miráis las iptables tras 10 minutos de instalación ya tenemos algunas IP’s baneadas por fuerza bruta contra el servicio ssh:

El comando iptables -L -n muestra esto:

Chain fail2ban-sshd (1 references)
target prot opt source destination 
REJECT all -- 223.179.130.237 anywhere reject-with icmp-port-unreachable
REJECT all -- 175.160.243.37 anywhere reject-with icmp-port-unreachable
REJECT all -- 183.94.10.184 anywhere reject-with icmp-port-unreachable
RETURN all -- anywhere anywhere

Cambiar puerto SSH

Conviene pues cambiar el puerto ssh.
Para ello si usamos openssh-server en Debian modificaremos el archivo /etc/ssh/sshd_config:
nano /etc/ssh/sshd_config

Localizamos el puerto actual 22:

Port 22

Y lo cambiamos por otro, que sea bien alto (1024-65535):

Port 19122

En nuestro caso usamos iptables, que por defecto deniegan todo, y teníamos abierto el puerto 22, ahora debemos modificar el fichero /etc/default/iptables para sustituir 22 por nuestro puerto, de lo contrario no se aceptaran las conexiones SSH desde fuera del VPS.

# Keep state.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Loop device.
-A INPUT -i lo -j ACCEPT

# Allow PING from remote hosts.
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# ssh
-A INPUT -p tcp --dport 22 -j ACCEPT

# http, https
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# smtp, submission
-A INPUT -p tcp --dport 25 -j ACCEPT
-A INPUT -p tcp --dport 587 -j ACCEPT

# pop3, pop3s
-A INPUT -p tcp --dport 110 -j ACCEPT
-A INPUT -p tcp --dport 995 -j ACCEPT

# imap, imaps
-A INPUT -p tcp --dport 143 -j ACCEPT
-A INPUT -p tcp --dport 993 -j ACCEPT

# ldap/ldaps
#-A INPUT -p tcp --dport 389 -j ACCEPT
#-A INPUT -p tcp --dport 636 -j ACCEPT

# MySQL service.
# Note: Please make sure MySQL service is not binding to localhost with
#       'bind-address=127.0.0.1'.
#-A INPUT -p tcp --dport 3306 -j ACCEPT

# PostgreSQL service.
#-A INPUT -p tcp --dport 5432 -j ACCEPT

# ftp.
#-A INPUT -p tcp --dport 20 -j ACCEPT
#-A INPUT -p tcp --dport 21 -j ACCEPT

# ejabberd
#-A INPUT -p tcp --dport 5222 -j ACCEPT
#-A INPUT -p tcp --dport 5223 -j ACCEPT
#-A INPUT -p tcp --dport 5280 -j ACCEPT

COMMIT

Dejaremos esta linea así:

# ssh
-A INPUT -p tcp --dport 19122 -j ACCEPT

Ahora hay que reiniciar el servidor.
Conectamos usando el nuevo puerto:

ssh root@pymestic.net -p 19122

La magia la hace el parámetro -p(port).

Cuando podamos conectar (repasad pasos) continuaremos con las DNS para dar de alta el registro DKIM en las DNS del dominio, para así mejorar la reputación del servidor de correo electrónico.

DKIM DNS – amavisd-new showkeys | testkeys

Ahora para completar las DNS y con ello la reputación del correo, con este comando vemos la key DKIM en el servidor, y procedemos a dar de alta un registro en las DNS del dominio:

amavisd-new showkeys

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
 LANGUAGE = (unset),
 LC_ALL = (unset),
 LANG = "es_ES.UTF-8"
 are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
; key#1 1024 bits, i=dkim, d=pymestic.net, /var/lib/dkim/pymestic.net.pem
dkim._domainkey.pymestic.net. 3600 TXT (
 "v=DKIM1; p="
 "MIG...")

Es cómodo si copiais la salida del comando a un bloc de notas, y ponéis el ‘churroen una sola linea quitando las dobles comillas.

El nombre del host ha de ser ‘dkim._domainkey‘ sin las comillas.

Haced un registro TXT en las DNS de vuestro dominio con ese nombre de host y el churro en este formato:

v=DKIM1; p=MIGblablabla...

Después desde el servidor utilizaremos este otro comando:
amavisd-new testkeys
para comprobar que tras la propagación de DNS (esto puede tardar un tiempo), el resultado es PASS. Si transcurren 24 horas y no da PASS, revisad los pasos.

amavisd-new testkeys

Cuando consigamos el pass, tendremos montado un servidor de correo bastante bien configurado.

root@server:~# amavisd-new testkeys
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "es_ES.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
TESTING#1 pymestic.net: dkim._domainkey.pymestic.net = pass

Qué más cosas vamos a hacer

Iremos comentando cosas de fail2ban, el analizador de logs que incorpora, y trabajaremos con iptables para mantener una seguridad casi máxima.

Instalaremos rkhunter y/o chkrootkit dos anti-malware y anti-rootkit, que actualizaremos y dejaremos con todas las firmas de los ficheros del sistema actualizadas en sus bases de datos para analizar futuros cambios en el sistema de ficheros.

Veremos como manejarnos con el Antivirus, compuesto por los paquetes: clamav y clamav-update, el primero el motor del antivirus, el segundo el actualizador de bases de virus.

Tocaremos también la base de datos en MySQL vmail donde se almacena la configuración del correo electrónico, sobre todo la tabla alias que nos permitirá hacer cosas como:

  1. crear alias“,
  2. crear un buzón catch-all” o
  3. crear redirecciones“.

Por ello y para que sea más cómodo instalaremos phpMyadmin. Pero ocultaremos su url, y no la dejaremos escuchando en la ruta por defecto pymestic.net/phpmyadmin, igualmente hay que cambiar los alias y urls que deja la instalación por defecto de iredmail, para ello hay que editar el fichero de los host virtuales SSL de Apache2.

Editar las urls / alias por defecto

Al utilizar software libre y open source tenemos un problema:

Todo el mundo conoce las configuraciones por defecto.

Los sitios web gestionados por Apache2 se almacenan en Debian en la carpeta /etc/apache2/sites-available/:

ls /etc/apache2/sites-available/ -ltr
total 20
-rw-r--r-- 1 root root 1332 Jul  5  2016 000-default.conf
-rw-r--r-- 1 root root 6437 Jan  6 14:14 default-ssl.conf.2017.01.06.14.01.33
-rw-r--r-- 1 root root 7507 Jan  6 14:15 default-ssl.conf

Tenemos que editar ‘default-ssl.conf‘ y localizar los alias hacia el final del fichero:

Alias /iredadmin/static "/opt/www/iredadmin/static/"
WSGIScriptAlias /iredadmin "/opt/www/iredadmin/iredadmin.py/"
Alias /mail "/opt/www/roundcubemail/"
Alias /awstats/icon "/usr/share/awstats/icon/"
Alias /awstatsicon "/usr/share/awstats/icon/"
ScriptAlias /awstats "/usr/lib/cgi-bin/"

Cambiando según nuestras preferencias:

Alias /panel/static "/opt/www/iredadmin/static/"
WSGIScriptAlias /panel "/opt/www/iredadmin/iredadmin.py/"
Alias /emilio "/opt/www/roundcubemail/"
Alias /awstats/icon "/usr/share/awstats/icon/"
Alias /awstatsicon "/usr/share/awstats/icon/"
ScriptAlias /visitas "/usr/lib/cgi-bin/"

Ahora hay que reiniciar el servicio apache2 (el servidor web), aunque con un reload de configuración es suficiente:
service apache2 reload

Y probar alguna de las direcciones con los nuevos alias, por ejemplo el panel.
Las credenciales siempre serán las mismas, buzón postmaster y la contraseña durante la instalación.
Aunque conviene borrarlo, esta y más información la tenéis en el fichero config de la instalación. Y en 

root/iRedMail-0.9.5-1/iRedMail.tips

Es conveniente, editar la página web por defecto que tiene un refresh es otra cosa que deberíamos plantearnos hasta tener una web definitiva y desactivar este virtualhost:
nano /var/www/html/index.html

Antivirus

Veremos como manejarnos con el Antivirus, compuesto por los paquetes: clamav y clamav-update, el primero el motor del antivirus, el segundo el actualizador de bases de virus. Que se ejecuta simplemente así:
freshclam
El antivirus lo podemos ejecutar así:
clamscan -r --infected --log=/root/clamscan-`date +%d-%m-%y.log` /var/www
Con lo que escaneará la carpeta /var/www, pero solo mostrará archivos infectados, y generará un fichero de log en /root/clamscan-`date +%d-%m-%y.log`
El comando date usado entre las comillas del operador grave produce esta salida, para disponer de un log diario:

date +%d-%m-%y
07-01-17

Si queremos hacer un análisis profundo, y de todo el disco, una forma de hacerlo sería:

clamscan / --log=/root/clamavprofundo.log --recursive=yes --infected 

Podemos añadir tantas opciones como queramos (leed el manual):

--detect-pua=yes 
--scan-mail=yes 
--phishing-sigs=yes 
--phishing-scan-urls=yes 
--algorithmic-detection=yes 
--scan-archive=yes 
--scan-html=yes 
--scan-pdf=yes 
--scan-ole2=yes 
--scan-elf=yes 
--scan-pe=yes

Pequeña chuleta de comandos para el antivirus:

Actualizar la base de datos de virus

freshclam

Escanear un directorio

clamscan -r /home/

Eliminar archivos infectados

clamscan --infected --remove --recursive /home

Gestión de los demonios:

/etc/init.d/clamav-daemon start
/etc/init.d/clamav-freshclam start
/etc/init.d/clamav-daemon status
/etc/init.d/clamav-freshclam status

Versión:

clamdscan -V

Como siempre un poco de RTFM no viene mal, así que:

clamscan --help

Instalar y configurar rkhunter anti rootkits

Instalamos el paquete:
aptitude install rkhunter
Hacemos un:
rkhunter --propupd

khunter --propupd
[ Rootkit Hunter version 1.4.2 ]
File updated: searched for 176 files, found 136

Hacemos un update:
rkhunter --update

rkhunter --update
[ Rootkit Hunter version 1.4.2 ]

Checking rkhunter data files...
  Checking file mirrors.dat                                  [ No update ]
  Checking file programs_bad.dat                             [ Updated ]
  Checking file backdoorports.dat                            [ No update ]
  Checking file suspscan.dat                                 [ No update ]
  Checking file i18n/cn                                      [ No update ]
  Checking file i18n/de                                      [ No update ]
  Checking file i18n/en                                      [ No update ]
  Checking file i18n/tr                                      [ No update ]
  Checking file i18n/tr.utf8                                 [ No update ]
  Checking file i18n/zh                                      [ No update ]
  Checking file i18n/zh.utf8                                 [ No update ]

Y estamos listos para lanzarlo:
rkhunter -c --enable all --disable none
Lo que además de guardar en un log todo detalle ‘/var/log/rkhunter.log’, da como resultado este informe:

System checks summary
=====================

File properties checks...
    Required commands check failed
    Files checked: 136
    Suspect files: 0

Rootkit checks...
    Rootkits checked : 375
    Possible rootkits: 0

Applications checks...
    Applications checked: 4
    Suspect applications: 0

The system checks took: 47 seconds

All results have been written to the log file: /var/log/rkhunter.log

One or more warnings have been found while checking the system.
Please check the log file (/var/log/rkhunter.log)

Podemos lanzarlo haciendo que en la salida estandar solo aparezcan los Warnings:
rkhunter -c --enable all --disable none --rwo

rkhunter -c --enable all --disable none --rwo
Warning: Checking for prerequisites               [ Warning ]
         Unable to find 'lsattr' command - all file immutable-bit checks will be skipped.
Warning: The following processes are using deleted files:
         Process: /usr/sbin/dovecot    PID: 445    File: (deleted)/run/dovecot/login-master-notifybc3ade1158dfcc57
         Process: /usr/sbin/mysqld    PID: 933    File: (deleted)/tmp/ib5S4Qt5
         Process: /usr/sbin/apache2    PID: 957    File: 
         Process: /usr/sbin/apache2    PID: 960    File: 
         Process: /usr/sbin/apache2    PID: 961    File: 
         Process: /usr/sbin/apache2    PID: 962    File: 
         Process: /usr/sbin/apache2    PID: 963    File: 
         Process: /usr/sbin/apache2    PID: 981    File: 
         Process: /usr/sbin/apache2    PID: 982    File: 
         Process: /usr/sbin/apache2    PID: 1312    File: 
         Process: /usr/sbin/sshd    PID: 1314    File: 
         Process: /usr/lib/dovecot/imap-login    PID: 1332    File: (deleted)/run/dovecot/login-master-notify6d2c61652831dde4
         Process: /usr/lib/dovecot/imap    PID: 1334    File: (deleted)/var/vmail/vmail1/pymestic.net/p/o/s/postmaster-2017.01.06.14.01.33/Maildir/dovecot-uidlist
         Process: /usr/lib/dovecot/imap-login    PID: 1714    File: (deleted)/run/dovecot/login-master-notify6d2c61652831dde4
Warning: No output found from the lsmod command or the /proc/modules file:
         /proc/modules output: 
         lsmod output: 
Warning: The SSH and rkhunter configuration options should be the same:
         SSH configuration option 'PermitRootLogin': yes
         Rkhunter configuration option 'ALLOW_SSH_ROOT_USER': no

Lo que permite ir al grano, ver y decidir si resolver problemas: como que root no pueda iniciar sesión por SSH, que veremos más adelante.
O por ejemplo instalar el paquete lsattr que parece según la salida anterior que no lo tenemos instalado en nuestro sistema operativo:
aptitude install e2fsprogs
Si volvemos a ejecutar rkhunter nos avisa de que dos comandos no están en la base de datos rkhunter.dat generada mediante la opción propupd que ejecutamos tras su instalación:

whereis lsattr
lsattr: /usr/bin/lsattr /usr/share/man/man1/lsattr.1.gz
root@server:/etc/fail2ban# rkhunter -c --enable all --disable none --rwo
Warning: The file '/usr/bin/chattr' exists on the system, but it is not present in the 'rkhunter.dat' file.
Warning: The file '/usr/bin/lsattr' exists on the system, but it is not present in the 'rkhunter.dat' file.

Debemos pues si estamos seguros reconstruir la base de datos de binarios rkhunter.dat, y esto nos pasará cada vez que instalemos nuevos paquetes o actualicemos los existentes. Así pues, si estamos seguro de que los nuevos binarios (ejecutables) son seguros la rehacemos:
rkhunter --propupd

Y para terminar de forma opcional podríamos hacer unos pequeños ajustes en el fichero de configuración de rkhunter:
nano /etc/rkhunter.conf
Estas variables son susceptibles de ser personalizadas:

  • MAIL-ON-WARNING=”your_user@domain.com”
  • MAIL_CMD=mail -s “[rkhunter] Warnings found for ${HOST_NAME}”
  • ALLOW_SSH_ROOT_USER=yes

Tras tocar los ficheros de configuración, la podemos revisar por si hemos cometido errores con este comando que testea la configuración actual:
sudo rkhunter -C

Además podemos automatizar una tarea para que haga el scan cada cierto tiempo. En Linux manejamos las tareas programadas mediante cron, y para cada usuario tenemos un crontab, que se lista con la opción -l y se edita (con tu editor preferido) con la opción -e:
crontab -l > crontab.backup
Con eso hacemos backup del cron actual a un fichero llamado crontab.backup.

crontab -e
Con esto editamos el cron del usuario actual se supone que root. Al ser la primera vez nos permite elegir editor, yo como siempre nano:

crontab -e 

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic

Choose 1-3 [2]: 2

Si aún no tienes tu editor preferido instalado, puedes hacerlo y después ejecutar este comando select-editor

Y nos muestra el actual:

30   3   *   *   *   /bin/bash /var/vmail/backup/backup_mysql.sh

# iRedAPD: Clean up expired tracking records hourly.
1   *   *   *   *   python /opt/iredapd/tools/cleanup_db.py > /dev/null

# iRedAPD: Convert SPF DNS record of specified domain names to IP
#          addresses/networks every 30 minutes.
*/30   *   *   *   *   python /opt/iredapd/tools/spf_to_greylist_whitelists.py >/dev/null
# iRedMail: Cleanup Amavisd database
1   2   *   *   *   python /opt/www/iredadmin/tools/cleanup_amavisd_db.py >/dev/null

# iRedMail: Cleanup Roundcube SQL database
2   2   *   *   *   /usr/bin/php /opt/www/roundcubemail/bin/cleandb.sh >/dev/null

# iRedMail: update Awstats statistics for web
1   */1   *   *   *   /usr/bin/perl /usr/lib/cgi-bin/awstats.pl -config=web -update >/dev/null

# iRedMail: update Awstats statistics for smtp
1   */1   *   *   *   /usr/bin/perl /usr/lib/cgi-bin/awstats.pl -config=smtp -update >/dev/null

Añadimos al final:
15 02 * * * /usr/bin/rkhunter --cronjob --update --quiet
Dejándolo así:

A las dos y cuarto de la madrugada se ejecutará en modo ‘quiet’ sin necesidad de interacción del usuario ‘quiet’.

Podéis averiguar la versión, por si consultáis en foros así:

rkhunter --versioncheck
[ Rootkit Hunter version 1.4.2 ]

Checking rkhunter version...
  This version  : 1.4.2
  Latest version: 1.4.2

Resolver errores: perl warning Setting locale failed

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "es_ES.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

Para solucionar el error de perl basta con usar un par de comandos:
locale-gen es_ES.UTF-8
Y después:
dpkg-reconfigure locales

El segundo comando preguntara 2 cuestiones. La primera:

Y después:

Por último hacemos update y upgrade, que era uno de los que provocaban el error.

Verificar y cambiar la hora del sistema

De poco sirve monitorizar los servicios de un VPS si no hablamos el mismo uso horario.
Cuando escribo estas líneas son las 10:59 pero el comando date en el servidor escupe esto otro:

date
sáb ene  7 04:58:37 EST 2017

Con este par de comandos lo solucionamos:

cp /etc/localtime /etc/localtime.old
cp /usr/share/zoneinfo/Europe/Madrid /etc/localtime

Ahora sí:

date
sáb ene  7 11:03:57 CET 2017

Una forma menos bruta es mediante el comando:
dpkg-reconfigure tzdata

Importante: Como se ve desde fuera nuestro VPS

nmap pymestic.net

Starting Nmap 6.40 ( http://nmap.org ) at 2017-01-07 11:29 CET
Nmap scan report for pymestic.net (81.4.108.118)
Host is up (0.087s latency).
rDNS record for 81.4.108.118: server.pymestic.net
Not shown: 991 filtered ports
PORT    STATE  SERVICE
22/tcp  closed ssh
25/tcp  open   smtp
80/tcp  open   http
110/tcp open   pop3
143/tcp open   imap
443/tcp open   https
587/tcp open   submission
993/tcp open   imaps
995/tcp open   pop3s

Nmap done: 1 IP address (1 host up) scanned in 6.41 seconds

Con el comando nmap podemos ver que puertos están abiertos.
Tras un reboot de la máquina, el 22 que todavía pululaba:

Starting Nmap 6.40 ( http://nmap.org ) at 2017-01-07 12:56 CET
Nmap scan report for pymestic.net (81.4.108.118)
Host is up (0.088s latency).
rDNS record for 81.4.108.118: server.pymestic.net
Not shown: 993 filtered ports
PORT    STATE SERVICE
25/tcp  open  smtp
80/tcp  open  http
110/tcp open  pop3
143/tcp open  imap
443/tcp open  https
587/tcp open  submission
995/tcp open  pop3s
Nmap done: 1 IP address (1 host up) scanned in 16.31 seconds

fail2ban: modificar configuración para recibir emails

Vamos a modificar el comportamiento por defecto de fail2ban, editando la jaula local. En la carpeta /etc/fail2ban tenemos todo lo necesario:

cd /etc/fail2ban/
root@server:/etc/fail2ban# ls -ltr
total 40
drwxr-xr-x 2 root root  4096 mar 19  2014 jail.d
drwxr-xr-x 2 root root  4096 mar 19  2014 fail2ban.d
drwxr-xr-x 2 root root  4096 ene  6 20:14 action.d
-rw-r--r-- 1 root root  1510 ene  6 20:15 fail2ban.conf
-rw-r--r-- 1 root root 13773 ene  6 20:15 jail.conf
-rw-r--r-- 1 root root  1567 ene  6 20:15 jail.local
drwxr-xr-x 2 root root  4096 ene  6 20:15 filter.d

Editamos jail.local, y lo dejamos así:

# Refer to /etc/fail2ban/jail.conf for more examples.
[DEFAULT]
# time is in seconds. 3600 = 1 hour, 86400 = 24 hours (1 day)
findtime    = 3600
bantime     = 86400
maxretry    = 5
ignoreip    = 127.0.0.1 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 149.202.46.126 81.4.107.197 81.4.108.118 81.4.108.119

destemail = postmaster@pymestic.net
sender = root
action = %(action_mw)s

[sshd]
enabled     = true
filter      = sshd
action      = iptables[name=ssh, port="0:65535", protocol=tcp]
#iptables-allports
                %(mta)s[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
logpath     = /var/log/auth.log

[sshd-ddos]
enabled     = true
filter      = sshd-ddos
action      = iptables-allports
                %(mta)s[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
logpath     = /var/log/auth.log


[roundcube-iredmail]
enabled     = true
filter      = roundcube.iredmail
action      = iptables-multiport[name=roundcube, port="http,https,smtp,submission,pop3,pop3s,imap,imaps,sieve", protocol=tcp]
                %(mta)s[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
logpath     = /var/log/mail.log
findtime    = 3600

[dovecot-iredmail]
enabled     = true
filter      = dovecot.iredmail
action      = iptables-multiport[name=dovecot, port="http,https,smtp,submission,pop3,pop3s,imap,imaps,sieve", protocol=tcp]
                %(mta)s[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
logpath     = /var/log/dovecot.log

[postfix-iredmail]
enabled     = true
filter      = postfix.iredmail
action      = iptables-multiport[name=postfix, port="http,https,smtp,submission,pop3,pop3s,imap,imaps,sieve", protocol=tcp]
                %(mta)s[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
#              sendmail[name=Postfix, dest=root, sender=fail2ban@localhost]
logpath     = /var/log/mail.log

[sogo-iredmail]
enabled     = false
filter      = sogo-auth
action      = iptables-multiport[name=SOGo, port="http,https,smtp,submission,pop3,pop3s,imap,imaps,sieve", protocol=tcp]
                %(mta)s[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
logpath     = /var/log/sogo/sogo.log

Donde los cambios radican en la segunda línea de las acciones:
%(mta)s[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
Y el email de destino se controla con la variable:

destemail = postmaster@pymestic.net

De nuevo la lista ignoreip la tendrás que adaptar a tus necesidades.
Cuando hayas acabado de editar el fichero hay que reiniciar fail2ban:
service fail2ban restart
Y conviene comprobar el status por si hubiesemos cometido algún error:

service fail2ban status
● fail2ban.service - LSB: Start/stop fail2ban
   Loaded: loaded (/etc/init.d/fail2ban)
   Active: active (running) since sáb 2017-01-07 11:57:10 CET; 4s ago
  Process: 1513 ExecStop=/etc/init.d/fail2ban stop (code=exited, status=0/SUCCESS)
  Process: 1546 ExecStart=/etc/init.d/fail2ban start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/fail2ban.service
           └─1556 /usr/bin/python /usr/bin/fail2ban-server -b -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid

ene 07 11:57:10 server fail2ban.filter[1556]: INFO Added logfile = /var/log/mail.log
ene 07 11:57:10 server fail2ban.filter[1556]: INFO Set maxRetry = 5
ene 07 11:57:10 server fail2ban.filter[1556]: INFO Set findtime = 3600
ene 07 11:57:10 server fail2ban.actions[1556]: INFO Set banTime = 86400
ene 07 11:57:10 server fail2ban.jail[1556]: INFO Jail 'sshd' started
ene 07 11:57:10 server fail2ban.jail[1556]: INFO Jail 'sshd-ddos' started
ene 07 11:57:10 server fail2ban.jail[1556]: INFO Jail 'roundcube-iredmail' started
ene 07 11:57:10 server fail2ban.jail[1556]: INFO Jail 'dovecot-iredmail' started
ene 07 11:57:10 server fail2ban.jail[1556]: INFO Jail 'postfix-iredmail' started
ene 07 11:57:10 server fail2ban[1546]: Starting authentication failure monitor: fail2ban.
ene 07 11:57:10 server systemd[1]: Started LSB: Start/stop fail2ban.

Servidor Web Apache

Como es obvio queremos montar nuestra web, mediante WordPress por ejemplo, para empezar fuerte y rápido. Seguiremos estos pasos:

  • crear un usuario webmaster
  • activar mod rewrite en apache2
  • instalaremos y securizaremos phpMyadmin: Hay que saber la clave de root para MySQL, la tenéis en el email que mando a postmaster la instalación de iredmail./li>
  • crear una base de datos para wordpress
  • descargar y descomprimir la última release de wordpress
  • crear un virtualhost en apache para WordPress
  • habilitar el nuevo virtualhost en apache
  • instalar wordpress
  • configuración de descarga automática
  • instalación del idioma o idiomas preferidos
  • probar wordpress y permisos de carpetas de subida de archivos
  • instalación de un firewall a wordpress: wordfence
  • securizar un poco Apache2
  • Opcional: Servidor FTP: vsftpd
  • Opcional: Certificado SSL => https (redirigir todo el tráfico http a https)

crear un usuario webmaster

useradd -s /bin/bash -d /var/www/vhosts -m -g www-data webmaster
Y le damos una clave con passwd:

root@server:/var/www# useradd -s /bin/bash -d /var/www/vhosts -m -g www-data webmaster
root@server:/var/www# passwd webmaster
Introduzca la nueva contraseña de UNIX: 
Vuelva a escribir la nueva contraseña de UNIX: 
passwd: contraseña actualizada correctamente

Para salir del lío, usad con cuidado estos dos comandos:
chown -R webmaster:www-data /var/www/vhosts
chmod -R 775 /var/www/vhosts/

Hacemos un listado de directorio donde se ubican los ficheros para que sirva Apache:

ls -la /var/www/
total 16
drwxr-xr-x  4 root      root     4096 ene  7 14:49 .
drwxr-xr-x 13 root      root     4096 ene  6 20:14 ..
drwxr-xr-x  2 root      root     4096 ene  6 20:14 html
drwxr-xr-x  2 webmaster www-data 4096 ene  7 14:49 vhosts

Nos posicionamos para continuar trabajando ahí.
cd /var/www/
En la carpeta /var/www/vhosts es donde empezaremos a crear los diferentes proyectos web.

activar mod rewrite en apache2

Es necesario para la Re-escritura de url’s utilizada por WordPress y la mayoría de CMS Web y conseguir “urls userfriendly“.
a2enmod rewrite
service apache2 restart
Más info: https://debian-handbook.info/browse/es-ES/stable/sect.http-web-server.html

instalaremos y securizaremos phpMyadmin: Hay que saber la clave de root para MySQL, la tenéis en el email que mando a postmaster la instalación de iredmail.

aptitude install phpmyadmin
Se instalarán los siguiente paquetes NUEVOS:     
  dbconfig-common{a} javascript-common{a} libjs-jquery{a} libjs-sphinxdoc{a} libjs-underscore{a} php-gettext{a} php-tcpdf{a} phpmyadmin 
0 paquetes actualizados, 8 nuevos instalados, 0 para eliminar y 0 sin actualizar.
Necesito descargar 12,6 MB de ficheros. Después de desempaquetar se usarán 46,9 MB.
¿Quiere continuar? [Y/n/?] Y

Introduciremos primero la clave de root, que genero iredmail y nos mando por email, después la del usuario phpmyadmin, recomiendo que useis otra y la anotéis, contestaremos que sí a la pregunta “dbconfig-common” y seleccionaremos Apache como servidor web.

dbconfig-common: writing config to /etc/dbconfig-common/phpmyadmin.conf
Creating config file /etc/dbconfig-common/phpmyadmin.conf with new version
Creating config file /etc/phpmyadmin/config-db.php with new version
granting access to database phpmyadmin for phpmyadmin@localhost: success.
verifying access for phpmyadmin@localhost: success.
creating database phpmyadmin: success.
verifying database phpmyadmin exists: success.
populating database via sql...  done.
dbconfig-common: flushing administrative password
apache2_invoke: Enable configuration phpmyadmin

Acto seguido editaremos el host virtual de configuración para cambiar la url por defecto conocida por ‘todos’ y vector de ataques:
nano /etc/apache2/conf-enabled/phpmyadmin.conf
Dejándolo algo así:

# phpMyAdmin default Apache configuration

#Alias /phpmyadmin /usr/share/phpmyadmin
#jblanco
Alias /databases /usr/share/phpmyadmin

Hacemos un reload de la configuración de Apache:
service apache2 reload

Y probamos a entrar al panel de phpmyadmin siguiendo nuestra nueva url: https://pymestic.net/databases/
Aquí las credenciales son root y la contraseña aleatoria que eligió el instalador, revisa el email.

crear una base de datos para wordpress

Una vez instalado phpmyadmin accederemos como root: https://pymestic.net/databases

Una vez iniciada la sesión, desde la pestaña privilegios añadiremos un nuevo usuario, marcando la casilla para crear una base de datos con el mismo nombre y otorgarle todos los permisos:

descargar y descomprimir la ultima release de wordpress

https://wordpress.org/download/

Conseguid el enlace, para desde dentro del vps descargar con el comando wget.
cd /var/www/vhosts
wget https://wordpress.org/latest.zip

root@server:/var/www/vhosts# wget https://wordpress.org/latest.zip
--2017-01-07 14:59:15--  https://wordpress.org/latest.zip
Resolviendo wordpress.org (wordpress.org)... 66.155.40.250, 66.155.40.249
Conectando con wordpress.org (wordpress.org)[66.155.40.250]:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 8709277 (8,3M) [application/zip]
Grabando a: “latest.zip”
latest.zip                100%[=====================================>]   8,31M  3,22MB/s   en 2,6s   
2017-01-07 14:59:18 (3,22 MB/s) - “latest.zip” guardado [8709277/8709277]
root@server:/var/www/vhosts# 

Para descomprimir podemos usar unzip:
unzip latest.zip

Esto descomprime todo el CMS en la carpeta: /var/www/vhosts/wordpress

crear un virtualhost en apache para WordPress

Tenemos que crear en Apache un virtualhost cuyo DocumentRoot apunte a esa carpeta.

Para ello nos fijamos en uno de los existentes ‘default’:

cat /etc/apache2/sites-available/000-default.conf 
<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

Editamos un nuevo fichero de configuración llamado por ejemplo blog.conf, podemos obviar las almohadillas que son ‘comentarios’:

#blog.conf => /var/www/vhosts/wordpress => www.pymestic.net
<VirtualHost *:80>
        ServerName pymestic.net   
        ServerAlias www.pymestic.net
        ServerAdmin postmaster@pymestic.net
        DocumentRoot /var/www/vhosts/wordpress
        <Directory /var/www/webs/pymestic.es/blog/>
            Options -Indexes +FollowSymLinks +MultiViews
            AllowOverride All
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

habilitar el nuevo sitio en apache

Habilitamos el sitio nuevo y recargamos la configuración de apache:
a2ensite blog.conf
service apache2 reload

Y probamos a abrir en un navegador el sitio: http://pymestic.net

instalar wordpress

Desde la url anterior carga el instalador de pocos pasos de wordpress:

Como menciona necesitará unos pocos datos de nosotros, básicamente las credenciales de la base de datos que acabamos de crear, y un prefijo para las tablas:
– Database name
– Database username
– Database password
– Database host
– Table prefix

Si no tenemos permisos para editar el fichero de configuración copiad el código y editar directamente el archivo:

El motivo de no tener permisos: estamos trabajando como root en la carpeta home del usuario webmaster.
Para resolver esta situación y poder hacer automática la instalación, en particular la escritura por www-data del fichero de configuración de WordPress wp-config.php, ejecutaremos estos dos comandos:
chown -R webmaster:www-data /var/www/vhosts/wordpress/
chmod -R 775 /var/www/vhosts/wordpress/
El primero restituye la propiedad del directorio, se la vuelve a dar al usuario webmaster y al grupo de apache2 www-data.
El segundo establece permisos rwx para usuario (webmaster) y grupo (www-data). Lectura y ejecución (php) para los demás.

Volvemos a intentarlo desde la interfaz web una vez restablecidos los permisos:

Ya lo tenemos preparado para realizar la instalación a falta de algunos datos más:

Completamos el formulario anterior. Y ya lo tenemos.
IMPORTANTE: NO utilizar ‘admin’ como nombre de usuario, y mejor si usamos la contraseña aleatoria que nos ofrece.

configuración de descarga automática

Usar el método descarga directo en WordPress es una forma alternativa a instalar un servidor FTP.
Para ello tenemos editar el fichero wp-config.php, y añadir al final este fragmento de código:

/* jblanco */
define(‘FS_METHOD’,’direct’);
if(is_admin()) {
add_filter('filesystem_method', create_function('$a', 'return "direct";' ));
define( 'FS_CHMOD_DIR', 0751 );
}

Habilitando la descarga directa evitamos tener levantado un servidor FTP en el VPS solo para estos menesteres, ya que desde fuera no se verá (si miráis iptables el puerto 21 no está abierto al exterior), y conviene que sea así, FTP es inseguro.

instalación del idioma o idiomas preferidos

Procedemos a instalar el idioma Español, y ajustar la hora, y el formato para las url.
Desde ajustes localizad Europa / Madrid como Timezone.
Abajo del todo tenemos Site Language, pero solo está disponible English.
En Settings / Permalinks a mi me gusta Post name.
Debemos crear la carpeta languages dentro del directorio wp-content (en el caso de no existir) y subir a dicha carpeta los archivos .po y .mo del idioma correspondiente.
Para Español descargamos estos:
https://downloads.wordpress.org/translation/core/4.7/es_ES.zip

Con wget los descargamos, con unzip lo descomprimimos y con mv lo llevamos al sitio:

mkdir /var/www/vhosts/wordpress/wp-content/languages
wget https://downloads.wordpress.org/translation/core/4.7/es_ES.zip
unzip es_ES.zip 
Archive:  es_ES.zip                                                                                                                                                                                                                          
  inflating: admin-es_ES.po                                                                                                                                                                                                                  
  inflating: admin-network-es_ES.po                                                                                                                                                                                                          
  inflating: continents-cities-es_ES.po                                                                                                                                                                                                      
  inflating: es_ES.po                                                                                                                                                                                                                        
  inflating: admin-es_ES.mo                                                                                                                                                                                                                  
  inflating: admin-network-es_ES.mo                                                                                                                                                                                                          
  inflating: continents-cities-es_ES.mo                                                                                                                                                                                                      
  inflating: es_ES.mo              
mv *.mo *.po /var/www/vhosts/wordpress/wp-content/languages


Ya podemos elegir Español como idioma de la interfaz.
Salta una actualización:

Buen momento para probar si funciona la descarga automática.

    • probar wordpress y permisos de carpetas de subida de archivos

Conviene siempre probar a subir alguna imagen para comprobar que no hay que arreglar permisos.

    • instalación de un firewall a wordpress: wordfence

Me gusta instalar wordfence, la versión gratuita del plugin ya nos ofrece una enorme calidad.

Instalar un firewall a WordPress

Lo localizamos en el repositorio de plugins, lo instalamos y lo activamos. A continuación lo configuramos, desde Wordfence / Options:
Las tres primeras:

– Update Wordfence automatically when a new version is released?
– Where to email alerts
– How does Wordfence get IPs: PHP’s builting
El apartado de Alertas yo recomiendo configurarlo así al principio:

Incluyo todos los escaneos menos el HIGH SENSITIVITY :

Esta es importante “Rate Limiting Rules”:

En el apartado ‘Login Security Options’ conviene añadir unos cuantos usuarios malignos, y bajar los intentos:

Y para acabar, hacia abajo del todo tenemos las ultimas opciones a tocar:

Grabamos y listo. Ya somos un poco más seguros.

Otras recomendaciones: securizar un poco Apache2 y deshabilitar wp-cron.php

En este artículo, que incluye vídeo tutorial, se nos muestra cómo securizar un poco más Apache2. Es importante no dar información por defecto, en Apache debemos ocultar información comprometida: el Sistema Operativo, Debian, la versión de Apache.
En Debian 8:
nano /etc/apache2/conf-available/security.conf
en otras distros:
nano /etc/apache2/conf.d/security
Para ello tocaremos las directivas ServerTokens estableciéndose a Prod, y ServerSignature estableciéndose a Off.

En este otro artículo se nos explica cómo desactivar el script wp-cron.php que se ejecuta cada vez que alguien visita nuestra página web hecha con WordPress. Es muy interesante aplicar este tip, ya que evitamos consumos innecesarios en el VPS , que se pueden dedicar a otros menesteres.

Opcional: Instalar un servidor de ftp interno (localhost)

aptitude install vsftpd
Y permitiremos que los usuarios locales (unix) puedan conectar.
De esta forma, y sin abrir en el firewall el puerto 21, podemos hacer ftp localhost desde los CMS como WordPress para poder actualizar sus componentes.

aptitude install vsftpd
Se instalarán los siguiente paquetes NUEVOS:     
  vsftpd 
0 paquetes actualizados, 1 nuevos instalados, 0 para eliminar y 0 sin actualizar.
Necesito descargar 151 kB de ficheros. Después de desempaquetar se usarán 408 kB.
Des: 1 http://ftp.debian.org/debian/ jessie/main vsftpd amd64 3.0.2-17+deb8u1 [151 kB]
Descargados 151 kB en 0s (3.859 kB/s)
debconf: se retrasa la configuración de los paquetes, ya que «apt-utils» no está instalado
Seleccionando el paquete vsftpd previamente no seleccionado.
(Leyendo la base de datos ... 30295 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar .../vsftpd_3.0.2-17+deb8u1_amd64.deb ...
Desempaquetando vsftpd (3.0.2-17+deb8u1) ...
Procesando disparadores para systemd (215-17+deb8u5) ...
Configurando vsftpd (3.0.2-17+deb8u1) ...
Procesando disparadores para systemd (215-17+deb8u5) ...

Ahora editamos la configuración:
nano /etc/vsftpd.conf
Y nos fijamos de que estén sin comentarios (activas) estas opciones:

      • listen=YES
      • local_enable=YES
      • write_enable=YES
      • local_umask=022
      • allow_writeable_chroot=YES
      • seccomp_sandbox=no

Y comentadas estas:

      • #listen_ipv6=YES
      • #ssl_enable=NO

Grabar y reiniciar el servicio:
service vsftpd restart
Probad a conectar desde localhost:
ftp localhost

ftp localhost
ftp: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.localdomain.
220 (vsFTPd 3.0.2)
Name (localhost:root): webmaster
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0          449616 Jan 04 21:00 es_ES.zip
-rw-r--r--    1 0        0         8709277 Dec 06 19:41 latest.zip
drwxrwxr-x    5 2003     33           4096 Jan 07 16:10 wordpress
226 Directory send OK.
ftp> bye
221 Goodbye.

Un extracto de la configuración que yo he dejado es esta:

cat /etc/vsftpd.conf |grep -v "^#"
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
allow_writeable_chroot=YES
seccomp_sandbox=no

Certificado digital gratuito

Ahora es muy fácil obtener en https://www.startssl.com/ un certificado de clase 1. Os incluyo un vídeo con todo el proceso:

En un momento del proceso deberéis subir el certificado generado en el servidor, para generarlo estos dos comandos:
openssl req -newkey rsa:2048 -keyout pymesticnet.key -out pymesticnet.csr

Con esto generamos el certificado autofirmado en el servidor, después hacemos un cat del fichero pymesticnet.csr

cat pymesticnet.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIC4TCCA...bla...bla...blaabc
-----END CERTIFICATE REQUEST-----

Copiamos desde el primer guión hasta el último y lo pegamos en la web de startssl.com durante el proceso.
Antes de configurar el host virtual SSL en apache quitaremos la PASSPHRASE de la KEY:
openssl rsa -in pymesticnet.key -out pymesticnet.key.plain
Esta es la Key sin clave que usaremos en Apache.
Ahora editamos el host virtual SSL:

nano /etc/apache2/sites-enabled/default-ssl.conf

<IfModule mod_ssl.c>
  <VirtualHost _default_:443>
    ServerName      pymestic.net
    ServerAlias     www.pymestic.net
    ServerAdmin postmaster@pymestic.net
    DocumentRoot /var/www/vhosts/wordpress
    <Directory /var/www/vhosts/wordpress/>
      Options -Indexes +FollowSymLinks +MultiViews
      AllowOverride All
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    SSLEngine on
    SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
    SSLHonorCipherOrder on
    SSLCertificateChainFile /etc/apache2/certificados/1_root_bundle.crt
    SSLCertificateFile /etc/apache2/certificados/2_pymestic.net.crt
    SSLCertificateKeyFile /etc/apache2/certificados/pymesticnet.key.plain
    ...
  </VirtualHost>
</IfModule>

Comprobamos en el host de puerto 80 que lo tenemos así:

cat /etc/apache2/sites-enabled/blog.conf 

<VirtualHost *:80>
        ServerName      pymestic.net
        ServerAlias     www.pymestic.net
        ServerAdmin postmaster@pymestic.net
        DocumentRoot /var/www/vhosts/wordpress
        <Directory /var/www/vhosts/wordpress/>
          Options -Indexes +FollowSymLinks +MultiViews
          AllowOverride All
        </Directory>
        Redirect permanent / https://pymestic.net
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

El resultado se puede ver aquí: http://pymestic.net/
Ha sido un post largo, y crecerá, montar un VPS es algo que requiere cierta destreza con muchos aspectos de la informática: sistemas operativos, redes, y un largo etc de knowhow, aquí te dejo unas direcciones interesantes para comprobar tu trabajo.

Direcciones web con Utilidades DNS y más

  1. http://www.mxtoolbox.com
  2. http://www.dnsqueries.com/es
  3. http://www.spamcannibal.org/
  4. http://www.dnsstuff.com/
  5. http://www.dnsgoodies.com/
  6. http://www.spamhelp.org/shopenrelay/
  7. http://pingability.com/zoneinfo.jsp
  8. http://rbl-check.org/en/

Espero que os sea de utilidad.

Update Junio 2017: 

Evitar enumeración de usuarios en WordPress: configuración del NiceName & Evitar que consigan romper una contraseña nada mejor que configurar Latch en tu WordPress.

Compartid!

4 comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *