En esta segunda entrada complementaria a los Mods del Servidor, vamos a personalizar aún más si cabe algunos detalles adicionales de nuestro Servidor. Antes de empezar con la parte de Modding, necesitamos instalar una dependencia, que nos dara información sobre la temperatura de nuestro sistema.

sudo apt-get update && sudo apt-get -y install lm-sensors

A continuación debemos de ejecutar un script instalado que nos detecta la configuración de nuestro Servidor y…

sudo sensors-detect

le damos continuamente a la tecla INTRO (para que tome la respuesta por defecto que es siempre que sí y de esta forma buscará todos los chips que podría analizar) hasta que nos salga la siguiente pregunta: Do you want to add these lines to /etc/modules automatically? (yes/NO). En este momento copiad y guardad en un documento de texto temporal lo que tenéis por encima entre los dos cut here (por ejemplo a mí me ha salido lo siguiente):

#----cut here----
# Chip drivers
coretemp
#----cut here----

Le damos nuevamente a INTRO para que no añada esas líneas automáticamente al fichero de modulos ya que las agregaremos manualmente para evitar posibles fallos de incompatibilidad, para ello editamos el fichero:

sudo nano /etc/modules

Y agregamos la siguientes lineas al final del fichero:

# Chip drivers
coretemp

Guardamos los cambios (Ctrl+O) y salimos del editor de texto (Ctrl+X). Muestro como ha quedado mi fichero:

pi@overclock:~$ cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
#
# Chip drivers
coretemp

pi@overclock:~$

Recomiendo reiniciar el Servidor para activar los cambios:

sudo reboot

Tras el reinicio ya podremos ver la información que hemos configurado:

sensors

En mi caso la información devuelta es la siguiente:

pi@overclock:~$ sensors
acpitz-virtual-0
Adapter: Virtual device
temp1:        +27.8°C  (crit = +119.0°C)
temp2:        +29.8°C  (crit = +119.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +33.0°C  (high = +84.0°C, crit = +100.0°C)
Core 0:         +30.0°C  (high = +84.0°C, crit = +100.0°C)
Core 1:         +30.0°C  (high = +84.0°C, crit = +100.0°C)
Core 2:         +29.0°C  (high = +84.0°C, crit = +100.0°C)
Core 3:         +27.0°C  (high = +84.0°C, crit = +100.0°C)

pi@overclock:~$

$USER/.BASHRC

El .bashrc es un archivo script que se ejecuta cada vez que una nueva sesión de terminal server se inicia en el modo interactivo. Esto es lo que ocurre cuando se inicia TTY o simplemente abrir una nueva pestaña de terminal. Este fichero contiene una serie de configuraciones para la sesión de terminal. Vamos a editarlo para mejorarlo:

cd /home/$USER && nano .bashrc

Buscamos la línea (alrededor de la nº46 podemos comprobarlo con Control+C) #force_color_prompt=yes y la descomentamos quedando en el fichero sin la # de la siguiente forma:

force_color_prompt=yes

Nos movemos con el editor al final del fichero y añadimos el siguiente script:

# MOTD
show_temp(){
    sensors | grep -oP 'Core 0.*?\+\K[0-9]+'
}
let upSeconds="$(/usr/bin/cut -d. -f1 /proc/uptime)"
let secs=$((${upSeconds}%60))
let mins=$((${upSeconds}/60%60))
let horas=$((${upSeconds}/3600%24))
let dias=$((${upSeconds}/86400))
UPTIME=`printf "%d dias, %02dh%02dm%02ds" "$dias" "$horas" "$mins" "$secs"`
read one five fifteen rest < /proc/loadavg
echo "$(tput setaf 2)
`date +"%A, %e %B %Y, %r"`
`uname -srmo`$(tput setaf 1)
Tiempo de actividad..: ${UPTIME}
Memoria RAM..........: `cat /proc/meminfo | grep MemFree | awk {'print $2'}`kB (Free) / `cat /proc/meminfo | grep MemTotal | awk {'print $2'}`kB (Total)
Promedios de carga...: ${one}, ${five}, ${fifteen} (1, 5, 15 min)
Procesos activos.....: `ps ax | wc -l | tr -d " "`
IP conexion por SSH..: $(echo $SSH_CLIENT | awk '{ print $1}')
Temperatura Sistema..: $(show_temp)ºC
$(tput sgr0)"

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y creamos el siguiente archivo:

nano .inputrc

Con el siguiente contenido:

# Flecha arriba
"\e[A":history-search-backward
# Flecha abajo
"\e[B":history-search-forward

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y reiniciamos para ver los cambios.

Adjunto resultado de lo que veremos:

Linux overclock 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5 (2019-06-19) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have mail.
Last login: Wed May  8 20:26:30 2019 from 192.168.1.80

miércoles,  8 julio 2019, 09:09:02
Linux 4.19.0-5-amd64 x86_64 GNU/Linux
Tiempo de actividad..: 9 dias, 14h23m47s
Memoria RAM..........: 27151572kB (Free) / 32831084kB (Total)
Promedios de carga...: 0.08, 0.09, 0.09 (1, 5, 15 min)
Procesos activos.....: 236
IP conexion por SSH..: 192.168.1.112
Temperatura Sistema..: 32.0ºC

pi@overclock:~$

LORDPEDAL BOT

Adicional al Canal de Telegram donde público enlaces de interés, también dispongo en la red de un BOT que podeis usar para notificar eventos en vuestro sistema con ayuda de unos scripts.

En Telegram podeís encontrarlo con el alías @Lordpedalbot. Cuando lo arranques te dará la bienvenida y te notificará el ID que tienes en la red Telegram, este ID debes de anotarlo, porque será una variable que uses en los scripts que modificaremos a continuación.

PROTECCIÓN TSHH

La función de este bash script es la de informarte vía Telegram de una anomalía en la temperatura del sistema y proceder a un apagado del mismo de forma controlada. Vamos a crear el script:

cd /home/$USER/scripts && nano tshh.sh && chmod +x tshh.sh

Y le agregamos el siguiente contenido:

#!/bin/bash
#
# https://lordpedal.gitlab.io
# Another fine release by theBOSS
#
# Fichero Log
data=`date`
usu=`uname`
ini=`echo "Script alarma de temperatura ejecutada con éxito"`
rutalog=/home/$USER
# ID Telegram
telegram=79593223
# Temperatura máxima
overheat=70
# Calcula temperatura y crea temporales de calculo
sensors | grep -oP 'Core 0.*?\+\K[0-9]+' > termopar
# Ejecuta alarma y aviso por telegram
while read tempactual
do
if [ "$tempactual" -ge "$overheat" ]
then
echo "$data - $usu - $ini. Ejecutada protección de temperatura. Alcanzados $tempactualºC" >> $rutalog/tshh.log
/usr/bin/curl --silent --output /dev/null --data-urlencode "chat_id=$telegram" --data-urlencode "text=Temperatura del Sistema:$tempactualºC. Por seguridad ejecutado el protocolo de apagado sistema" "https://api.telegram.org/bot289352425:AAHBCcKicDtSFaY2_Gq1brnXJ5CaGba6tMA/sendMessage"
# Apaga el sistema
sudo poweroff
else
echo "Temperatura de sistema: $tempactualºC"
fi
done<termopar
# Borra los temporales generados
rm termopar

Recuerda que el valor del ID de Telegram debes de sustituirlo por el tuyo propio y el valor overheat cambialo según rangos de temperatura de tu procesador obtenido tras ejecutar: sensors, en mi caso el rango que obtenía era de (high = +84.0°C, crit = +100.0°C) por eso defino 70°C como valor más conservador.

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y programamos el sistema para que el script sea ejecutado cada 15segundos:

crontab -e

Y añadimos al final el fichero, recuerda sustituir pi por tu usuario:

*/1 * * * * /home/pi/scripts/tshh.sh >/dev/null 2>&1
*/1 * * * * sleep 15 && /home/pi/scripts/tshh.sh >/dev/null 2>&1
*/1 * * * * sleep 30 && /home/pi/scripts/tshh.sh >/dev/null 2>&1
*/1 * * * * sleep 45 && /home/pi/scripts/tshh.sh >/dev/null 2>&1

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y listo ya tendriamos la protección activa. El fichero en mi caso queda de la siguiente forma:

pi@overclock:~$ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
#
*/1 * * * * /home/pi/scripts/tshh.sh >/dev/null 2>&1
*/1 * * * * sleep 15 && /home/pi/scripts/tshh.sh >/dev/null 2>&1
*/1 * * * * sleep 30 && /home/pi/scripts/tshh.sh >/dev/null 2>&1
*/1 * * * * sleep 45 && /home/pi/scripts/tshh.sh >/dev/null 2>&1
pi@overclock:~$

NOTIFICACION ARRANQUE

La función de este bash script es la de informarte vía Telegram de que el Servidor esta online. Vamos a crear el script:

cd /home/$USER/scripts && nano overspeed.sh && chmod +x overspeed.sh

Y le agregamos el siguiente contenido:

#!/bin/bash
#
# https://lordpedal.gitlab.io
# Another fine release by theBOSS
#
# ID Telegram
telegram=79593223
# Mensaje Online
mensaje='Overclock Server Online ... Another fine release by theBOSS'
# Inicia bucle chequeo de Red
while true
do
    # Comprueba disponibilidad de Red
    if ping -c 1 -W 5 google.com 1>/dev/null 2>&1
    then
        # Red disponible
        echo "Conexion establecida..."
        /usr/bin/curl --silent \
                --output /dev/null \
                --data-urlencode "chat_id=$telegram" \
                --data-urlencode "text=$mensaje" \
                "https://api.telegram.org/bot289352425:AAHBCcKicDtSFaY2_Gq1brnXJ5CaGba6tMA/sendMessage"
        # Termina bucle disponibilidad de Red
        break
    else
        # Red no disponible
        echo "Conexion no establecida..."
    fi
    # Espera 1s y reinicia bucle
    sleep 1
done

Recuerda que el valor del ID de Telegram debes de sustituirlo por el tuyo propio y el valor mensaje cambialo por tu mensaje personalizado.

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y programamos el sistema para que el script sea ejecutado tras reinicio de sistema y disponibilidad de red:

crontab -e

Y añadimos al final el fichero, recuerda sustituir pi por tu usuario:

@reboot /home/pi/scripts/overspeed.sh >/dev/null 2>&1

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y listo ya tendriamos la notificación activa. El fichero en mi caso queda de la siguiente forma:

pi@overclock:~$ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
#
*/1 * * * * /home/pi/scripts/tshh.sh >/dev/null 2>&1
*/1 * * * * sleep 15 && /home/pi/scripts/tshh.sh >/dev/null 2>&1
*/1 * * * * sleep 30 && /home/pi/scripts/tshh.sh >/dev/null 2>&1
*/1 * * * * sleep 45 && /home/pi/scripts/tshh.sh >/dev/null 2>&1
@reboot /home/pi/scripts/overspeed.sh >/dev/null 2>&1
pi@overclock:~$

SSH FAIL2BAN

Fail2ban es una herramienta de seguridad escrita en Python fundamental para cualquier servidor.

La principal función de Fail2ban es securizar un servidor del siguiente modo:

  1. Evitando accesos indeseados a nuestro equipo o servidor.
  2. Evitando ataques de fuerza bruta para que un tercero averigüe nuestra contraseña o tumbe el servidor.

Por un lado está monitorizando las autenticaciones que una determinada IP hace a un determinado/s puerto/s y servicio/s. Para ello está consultando permanente los logs de autenticación de nuestro sistema como por ejemplo el /var/log/auth.log. Vamos a proceder a instalarlo:

sudo apt-get update && sudo apt-get -y install fail2ban

Una vez instalado vamos a configurarlo:

cd /etc/fail2ban && sudo nano jail.conf

Adjunto a modo resumen las opciones a buscar y modificar:

ignoreip = 127.0.0.1/8
bantime  = 600
maxretry = 5

Y segundo como las dejaremos (en mi caso la IP es de rango 192.168.1.0):

ignoreip = 127.0.0.1/8 192.168.1.0/24
bantime  = 3600
maxretry = 3

Una vez finalizada la edición, guardaremos los cambios (Ctrl+O), saldremos del editor de texto (Ctrl+X) y lo activaremos en local:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Ahora vamos a crear una configuración específica para aprovecharnos de notificaciones vía Telegram:

cd /etc/fail2ban/action.d && sudo nano telegram.conf

Y le agregamos el siguiente contenido:

# Fail2Ban configuration file
#
# Author: Lordpedal
#

[Definition]

# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
#
actionstart = /etc/fail2ban/scripts/fail2ban-telegram.sh start 

# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
#
actionstop = /etc/fail2ban/scripts/fail2ban-telegram.sh stop

# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
actioncheck = 

# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
#
actionban = /etc/fail2ban/scripts/fail2ban-telegram.sh ban <ip>

# Option:  actionunban
# Notes.:  command executed when unbanning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
#
actionunban = /etc/fail2ban/scripts/fail2ban-telegram.sh unban <ip>

[Init]

init = 21121981

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y crearemos el script de notificación:

cd /etc/fail2ban && sudo mkdir scripts && cd scripts && sudo nano fail2ban-telegram.sh && sudo chmod +x fail2ban-telegram.sh

Agregamos el bash script:

#!/bin/bash
#
# https://lordpedal.gitlab.io
# Another fine release by theBOSS
#
while true
do
    if ping -c 1 -W 3 google.com 1>/dev/null 2>&1
    then
        echo ""
        break
    else
        echo ""
    fi
    sleep 1
done
# Opciones ejecucion
info=`hostname -f`
function show_uso {
  echo "Fail2ban Telegram by Lordpedal"
  echo ""
  echo "Usar: $0 opcion <ip>"
  echo ""
  echo "Opcion: start      (Inicia notificaciones)"
  echo "        stop       (Detiene notificaciones)"
  echo "        ban <ip>   (Banea IP especificada) Ej: ban 192.168.1.2"
  echo "        unban <ip> (Desbanea IP especificada) Ej: unban 192.168.1.2"
  echo ""
  exit
}

# Notificacion
function send_msg {
  # ID Telegram
  telegram=79593223
  # Enlace BOT
  url="https://api.telegram.org/bot289352425:AAHBCcKicDtSFaY2_Gq1brnXJ5CaGba6tMA/sendMessage"
  # Envia mensaje
  curl -s -X POST $url -d chat_id=$telegram -d text="$1"
  exit
}

# Chequea argumentos de script
if [ $# -lt 1 ]
then
  show_uso
fi

# Ejecuta una accion depende del argumento
if [ $# -lt 1 ]
then
  show_uso
fi

# Ejecuta una accion depende del argumento
if [ "$1" = 'start' ]
then
  msg="Seguridad+Fail2ban+ha+sido+iniciada+en+el+host+$info"
  send_msg $msg
elif [ "$1" = 'stop' ]
then
  msg="Seguridad+Fail2ban+ha+sido+detenida+en+el+host+$info"
  send_msg $msg
elif [ "$1" = 'ban' ]
then
  msg=$([ "$2" != '' ] && echo "Seguridad+Fail2ban+ha+baneado+a+$2+en+el+host+$info" || echo "Seguridad+Fail2ban+ha+baneado+una+ip+en+el+host+$info" )
  send_msg $msg
elif [ "$1" = 'unban' ]
then
  msg=$([ "$2" != '' ] && echo "Seguridad+Fail2ban+ha+desbaneado+a+$2+en+el+host+$info" || echo "Seguridad+Fail2ban+ha+desbaneado+una+ip+en+el+host+$info" )
  send_msg $msg
else
  show_uso
fi

Ahora vamos a finalizar la activación de ssh:

cd /etc/fail2ban/jail.d && sudo nano jail-debian.local

Y le agregamos el siguiente contenido:

[sshd]
port     = 69
filter   = sshd
action = iptables[name=SSH, port=69, protocol=tcp]
         telegram

Recuerda que el valor port debes de sustituirlo por el que configurastes en la sección SSH. Si no lo cambiastes por defecto se usa el 22.

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y reiniciamos Fail2ban para activar los cambios realizados:

sudo systemctl restart fail2ban

NOTIFICACIONES TRANSMISSION

Ya vimos anteriormente como configurar el gestor de descargas de Torrents y preconfiguramos un script que se ejecutaba al finalizar la descarga. Ahora vamos a remodelar dicho script:

cd /home/$USER/scripts && nano torrents.sh

Y veremos el script como lo definimos:

#!/bin/bash
SERVER="127.0.0.1:9091"

TORRENTLIST=`transmission-remote $SERVER --list | sed -e '1d;$d;s/^ *//' | cut --only-delimited --delimiter=" "  --fields=1`

for TORRENTID in $TORRENTLIST
do
    DL_COMPLETED=`transmission-remote $SERVER --torrent $TORRENTID --info | grep "Percent Done: 100%"`

    STATE_STOPPED=`transmission-remote $SERVER --torrent $TORRENTID --info | grep "State: Seeding\|Stopped\|Finished\|Idle"`

    if [ "$DL_COMPLETED" ] && [ "$STATE_STOPPED" ]; then
        transmission-remote $SERVER --torrent $TORRENTID --remove
    else
        echo "Torrent #$TORRENTID no esta completo. Ignorado."
    fi
done

Y a continuación como lo dejaremos para que ser notificados por Telegram:

#!/bin/bash
SERVER="127.0.0.1:9091"
# ID Telegram
telegram=79593223
TORRENTLIST=`transmission-remote $SERVER --list | sed -e '1d;$d;s/^ *//' | cut --only-delimited --delimiter=" "  --fields=1`

for TORRENTID in $TORRENTLIST
do
    DL_COMPLETED=`transmission-remote $SERVER --torrent $TORRENTID --info | grep "Percent Done: 100%"`

    STATE_STOPPED=`transmission-remote $SERVER --torrent $TORRENTID --info | grep "State: Seeding\|Stopped\|Finished\|Idle"`

    if [ "$DL_COMPLETED" ] && [ "$STATE_STOPPED" ]; then
        transmission-remote $SERVER --torrent $TORRENTID --remove
    else
        echo "Torrent #$TORRENTID no esta completo. Ignorado."
    fi
done
/usr/bin/curl --silent \
    --output /dev/null --data-urlencode "chat_id=$telegram" \
    --data-urlencode "text=$TR_TORRENT_NAME descargado correctamente en la ruta $TR_TORRENT_DIR" \
    "https://api.telegram.org/bot289352425:AAHBCcKicDtSFaY2_Gq1brnXJ5CaGba6tMA/sendMessage"

Recuerda que el valor del ID de Telegram debes de sustituirlo por el tuyo propio.

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y a partir de este momento tendremos notificaciones una vez hayan finalizado las descargas.