Script para comprobar el estado de varios certificados SSL

Hola, hoy os dejo un script que he desarrollado para comprobar el estado de los certificados SSL de varios dominios.

 
#!/bin/bash

############################################
# SCRIPT CREATED BY: Laura Mora i Aubert   #
# SCRIPT DATE: 2021-04-01                  #
# WEBSITE: blackhold.nusepas.com           #
# INFO: Script that checks domain ssl      #
#       certificates                       #
#       tested with openssl 1.1            #
# LICENSE: creative commons (by:sa)        #
############################################

############################################
#             INSTRUCTIONS                 #
############################################
#                                          #
# 1. Create a file on /root/scripts/ with  #
#    the content of this file              #
# 2. Edit $ADMIN_MAIL with your mail       #
# 3. Edit $DOMAINS array with your domains #
# 3. Give permissions and run the script   #
# 4. Put your script on /etc/crontab or    #
#    /etc/cron.d/check_ssl with this line  #
# # check ssl certificates
# 0  7    * * *   root /root/scripts/check_certificates.sh /var/log/ssl_checks/check_certificates-$(date "+\%Y\%m\%d").log && cat /var/log/ssl_checks/check_certificates-$(date "+\%Y\%m\%d").log |mail -s "[Check Certificates] your-server-name" your-admin-email@domain.com 
#                                          #
# That's all folks! have a nice day :)     #
#                                          #
# - Blackhold                              #
#                                          #
############################################

ADMIN_MAIL="your-admin-email"
DOMAINS=(
# control domains
"google.com"
"expired.badssl.com"
"wrong.host.badssl.com"
# my domains
"capa8.net"
"aspertic.org"
"cacavaca.capa8.net"
)

for DOMAIN in "${DOMAINS[@]}"
do
    echo "---------------------------"
    echo "domain ${DOMAIN} is: "

    touch check_ssl.txt
    echo | openssl s_client -servername ${DOMAIN} -connect ${DOMAIN}:443 check_ssl.txt 2/dev/null
    if [ `cat check_ssl.txt |wc -l` != 0 ]
    then
        cat check_ssl.txt | openssl x509 -noout -dates check_ssl.txt
    else	
        echo "Verify return code: -1 (certificate does not exist)" check_ssl.txt
    fi

    # badssl.com
    # ok: Verify return 

Añadir un chivato al ssh cuando alguien hace login

Con tanto ransomware, accesos indebidos a sistemas y demás ataques varios a sistemas, la concienciación de tener los sistemas al día está al día y supongo que algo habréis notado queridos lectores que mi actividad éstas últimas semanas ha sido frenética. Mi objetivo es ponerlos a punto y cada vez mas ir mejorando la seguridad sin que se vea afectada la usabilidad.

Está claro que un sistema conectado a la red es victima de intentos de acceso continuos y sólo nos interesan los que han tenido éxito. Es por esto que hoy os traigo un pequeño “tip” para avisar de los accesos a nuestro sistema, sean legítimos o no.

Hace años tenía implantada esta política de seguridad en mis servidores y me sirvió para paliar un ataque aún mayor. La primera reacción fue echar el malhechor de mis sistemas, al mismo tiempo que cambiaba las contraseñas de todos los servidores (ahí aprendí que tenemos que ir con mucho cuidado con nuestra política de passwords).

Éste post se basa en esta respuesta del foro de ubuntu y un poco a mi friki-artesanía.

Lo primero será crear los dos scripts y los pondremos donde ejecutemos los scripts del sistema

root@frontal1-nginx:~# vi /root/scripts/login-notify-pam.sh
#!/bin/sh

/root/scripts/login-notify-script.sh &
root@frontal1-nginx:~# vi /root/scripts/login-notify-script.sh
#!/bin/sh

sleep 3
# Change these two lines:
sender="noreply-valido@capa8.net"
recepient="cuenta-de-notificaciones@capa8.net"

if [ "$PAM_TYPE" != "close_session" ]; then
    host="`hostname`"
    subject="SSH Login: $PAM_USER from $PAM_RHOST on $host"
    # Message to send, e.g. the current environment variables.
    message="Algú ($PAM_RHOST) ha entrat al sistema $host per SSH!\n\n`ps aux 

msmtp: enviar correos electrónicos autenticados des de un servidor

Hace unos años hice un post sobre ssmtp. Éste post es exactamente lo mismo pero enseño a configurar msmtp ya que ssmtp ya no está disponible.

Lo primero será instalarlo:

root@asterisk10:~# apt install msmtp

Y lo segundo configurarlo, atención en el /home del usuario que va a ejecutar scripts que requieran mandar correos electrónicos, en el caso de root, su home es /root

root@asterisk10:~# vi .msmtprc
# Set default values for all following accounts.
defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        ~/.msmtp.log

# Noreply
account        noreply
host           mail.capa8.net
port           587
from           noreply@capa8.net
user           noreply@capa8.net
password       **************

# A freemail service
#account        freemail
#host           smtp.freemail.example
#from           joe_smith@freemail.example
#...

# Set a default account
account default : noreply

Por otro lado instalaremos un cliente de mail, en este caso bsd-mailx

root@asterisk10:~# apt install bsd-mailx

Al ejecutar mailx con el pipe mail, nos sacará un error de que no encuentra sendmail, así que lo engañaremos un poco y le diremos que cuando busque sendmail use msmtp creando en ~ el fichero .mailrc

root@asterisk10:~# vi .mailrc
set sendmail=/usr/bin/msmtp

Ahora para mandar un mail de prueba podremos usar algo similar a ésto

root@asterisk10:~# echo "Blackhold blog rules" | mail correo@dominio.com

Y listos, ahora ya podemos mandar mails sin problemas. A lo mejor te interesa configurar el postmaster (fichero /etc/aliases) del usuario root para que mande los mails del sistema a donde le digas. Más información aquí.…

Debian 10: Problema al hacer dpkg -i paquete.deb

Acabo de instalar mi primera debian con entorno gráfico con cinnamon y veo que le faltan bastantes cosillas

# apt -y install mate-terminal pluma glances mtr net-tools dnsutils

Y también que al hacer dpkg -i de algun paquete me suelta éste error:

# dpkg -i google-chrome-stable_current_amd64.deb 
dpkg: avís: no s'ha trobat «ldconfig» en el PATH o no és executable
dpkg: avís: no s'ha trobat «start-stop-daemon» en el PATH o no és executable
dpkg: s'ha produït un error: no s'han trobat 2 programes esperats al PATH, o no són executables
Nota: el PATH del root normalment ha de contenir /usr/local/sbin, /usr/sbin i /sbin

El motivo es que necesitamos definir los directorios donde se encuentran los binarios del sistema:

# echo 'export PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin' /home/aspertic/.bashrc
# echo 'export PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin' /root/.bashrc

Salimos de la sesión de terminal del usuario y la volvemos a iniciar y ta-dá!

Recuerdo que si un paquete no deja instalar las dependencias, tenemos que forzar la instalación manual con apt -f install

root@aspertic01:/home/aspertic/Baixades# dpkg -i teamviewer_14.5.1691_amd64.deb 
S'està seleccionant el paquet teamviewer prèviament no seleccionat.
(S'està llegint la base de dades… hi ha 173445 fitxers i directoris instal·lats actualment.)
S'està preparant per a desempaquetar teamviewer_14.5.1691_amd64.deb…
S'està desempaquetant teamviewer (14.5.1691)…
dpkg: problemes de dependències impedeixen la configuració de teamviewer:
 teamviewer depèn de libqt5gui5 (= 5.5) | qt56-teamviewer; tot i així:
  El paquet libqt5gui5 no està instal·lat.
  El paquet qt56-teamviewer no està instal·lat.

 [...]

dpkg: s'ha produït un error en processar el paquet teamviewer (--install):
 problemes de dependències - es deixa sense 

Ejemplo script de backup

Aquí os dejo uno de los scripts de backup que uso para hacer la copia de seguridad de los servidores con proxmox. Espero que os sea de ayuda :)

#!/bin/bash

## lmdb-backup (proxmox)
#### Loc: ******
#### OS: Debian 9 (container lxc)
#### Up: 2019/08/28 11:45 (Blackhold)

BACKUP_DIR="/mnt/hd_extern/backups_lmdb"
ID[0]="server1:x.x.x.x1"
ID[1]="server2:x.x.x.x2"

for INFO in "${ID[@]}"
do
    HOST=`echo ${INFO} |awk -F ':' '{print $1}'`
    IP=`echo ${INFO} |awk -F ':' '{print $2}'`
    BACKUP_DIR_SERVER="${BACKUP_DIR}/${HOST}"

    if [[ ! -e ${BACKUP_DIR_SERVER} ]]; then
        mkdir ${BACKUP_DIR_SERVER}
        mkdir ${BACKUP_DIR_SERVER}/daily
        mkdir ${BACKUP_DIR_SERVER}/monday
        mkdir ${BACKUP_DIR_SERVER}/15
        mkdir ${BACKUP_DIR_SERVER}/28
        mkdir ${BACKUP_DIR_SERVER}/lastmonth
    fi

    rsync -av --delete root@${IP}:/var/lib/vz2/dump/ ${BACKUP_DIR}/${HOST}/daily/dump/
    rsync -av --delete root@${IP}:/var/lib/vz2/template/ ${BACKUP_DIR}/${HOST}/daily/template/

    if [[ $(date +%e) -eq 28 ]]; then
        echo Backup final de mes
        rsync -av --delete ${BACKUP_DIR}/${HOST}/28/dump/ ${BACKUP_DIR}/${HOST}/lastmonth/dump/
        rsync -av --delete ${BACKUP_DIR}/${HOST}/28/template/ ${BACKUP_DIR}/${HOST}/lasthmonth/template/

        rsync -av --delete ${BACKUP_DIR}/${HOST}/daily/dump/ ${BACKUP_DIR}/${HOST}/28/dump/
        rsync -av --delete ${BACKUP_DIR}/${HOST}/daily/template/ ${BACKUP_DIR}/${HOST}/28/template/
    fi

    if [[ $(date +%e) -eq 15 ]]; then
        echo Backup dia 15
        rsync -av --delete ${BACKUP_DIR}/${HOST}/daily/dump/ ${BACKUP_DIR}/${HOST}/15/dump/
        rsync -av --delete ${BACKUP_DIR}/${HOST}/daily/template/ ${BACKUP_DIR}/${HOST}/15/template/
    fi

    if [[ $(date +%u) -eq 1 ]]; then
        echo Backup dilluns
        rsync -av --delete ${BACKUP_DIR}/${HOST}/daily/dump/ ${BACKUP_DIR}/${HOST}/monday/dump/
        rsync -av --delete ${BACKUP_DIR}/${HOST}/daily/template/ ${BACKUP_DIR}/${HOST}/monday/template/
    fi
done

Y lo añado en cron

root@lmdb-backup:~# vi /etc/cron.d/lmdb
# backup planets - activated on 2019-08-18 - blackhold
30 1    * * *   root    /root/scripts/backup_nodes_planet_lmdb.sh

Por supuesto, para hacer funcionar el script es necesario instalar rsync y también poner la clave pública del servidor de backups en el autorized_keys (ssh) de los servidores que queramos hacer copia de seguridad. Recomiendo fervientemente que ninguno de los servidores ni contenedores, tenga acceso directo …

Convertir pdf a jpg

Normalmente cuando tengo que editar un pdf lo abro con inkscape, pero esta vez me encuentro un pdf que son unos planos y la conversión con inkscape se lo toma con la calmísima, así que total como sólo necesito una imagen, voy a convertir el contenido del pdf a imagen y me ahorro varias horas de espera…

¿Cómo?

# convert -verbose -density 150 -trim plano.pdf -quality 100 -flatten -sharpen 0x1.0 plano.jpg

Ahora a cargarlos en el inkscape como imagen y a redimensionar a mi gusto :)

EOF…

El tiempo en la consola

Navegando por las redes sociales me he encontrado una entrada curiosa:

Brutal alias per tenir el temps a la consola:
alias weather='curl -s wttr.in | sed -n "1,7p"'

Así que me he puesto a jugar :P la ciudad por defecto que me detecta es Madrid, pero no me gusta esta geolocalización:

$ curl -s wttr.in/Barcelona | sed -n "1,7p"
Weather for City: Barcelona, Spain

    \  /       Partly cloudy
  _ /"".-.     14 – 15 °C     
    \_(   ).   ↖ 11 km/h      
    /(___(__)  10 km          
               0.0 mm 

Además lo quiero en otro idioma que no sea inglés (en catalán no se deja, snif):

$ curl -H "Accept-Language: es" -s wttr.in/Barcelona | sed -n "1,7p"
El tiempo en: Barcelona, Spain

    \  /       Parcialmente nublado
  _ /"".-.     14 – 15 °C     
    \_(   ).   ↖ 11 km/h      
    /(___(__)  10 km          
               0.0 mm 

En ésta cuenta de twitter hay mas información sobre ésta página.

Tontería del día :)…

ssmtp: mandar mails con un smtp externo rápido y fácil!

Que si exim, que si sendmail, que si la madre que los parió! configuraciones con ficheros de configuración quilométricos e inentendibles! llega la solución a vuestros problemas! ssmtp! rápido, sencillo y apto para cualquier administrador de sistemas, además que dispone de un fichero de configuración hyper corto!

Empezamos pues

# apt-get install ssmtp

Esto te va a borrar cualquier software que tengas de envío de correos electrónicos en el sistema.

Modificamos el fichero de configuración

# vi /etc/ssmtp/ssmtp.conf
#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=nombre@dominio.com

# The place where the mail goes. The actual machine name is required no 
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=SERVIDOR_SMTP
AuthUser=USUARIO
AuthPass=PASSWORD
UseTLS=YES
UseSTARTTLS=YES
# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
hostname=NOMBRESERVIDOR.DOMINIO.COM

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
#FromLineOverride=YES

Cerramos el fichero de configuración y listos (si, no hay nisiquiera servicio a reiniciar ni aplicar configuraciones!)

# echo "hola" | mail -s "test" admin@dominio.com
# mutt -a /var/log/backups/Backup_XXX-20161010.log -- admin@dominio.com

Lo primero a lo cutre y lo segundo adjuntando un mail.

Fuente: stackexchange

Notas:
Me he encontrado usando un servidor de correo que no me permitía mandar correos electrónicos si no le definía correctamente el from, para ello tendremos que modificar el fichero /etc/ssmtp/revaliases y dejarlo así:

root:info@xxx.cat:mail.xxx.cat

Luego si vamos a usar mutt en el crontab para mandar mails también se lo definimos

0  4    * * *   root /root/scripts/xxx-owncloud.sh /var/log/backups/Backup_xxx_cloud-$(date "+\%Y\%m\%d").log && mutt -a /var/log/backups/Backup_xxx_cloud-$(date "+\%Y\%m\%d.log") -e 'my_hdr From:info@xxx.cat' -s "[Backup-xxxCloud] xxx Cloud" -- info@xxx.cat

Ver el estado de la bateria por comandline

laura@carboni:~$ upower -i $(upower -e | grep 'BAT') | grep -E "state|to\ full|percentage"
    state:               discharging
    percentage:          37%
laura@carboni:~$ upower -i $(upower -e | grep 'BAT') | grep -E "state|to\ full|percentage"
    state:               charging
    time to full:        3,0 hours
    percentage:          36%

otra forma

laura@carboni:~$ acpi -V
Battery 0: Charging, 38%, 01:03:31 until charged
Battery 0: design capacity 5266 mAh, last full capacity 4733 mAh = 89%
Adapter 0: on-line
Thermal 0: ok, 53.0 degrees C
Thermal 0: trip point 0 switches to mode critical at temperature 103.0 degrees C
Cooling 0: x86_pkg_temp no state information available
Cooling 1: intel_powerclamp no state information available
Cooling 2: Processor 0 of 10
Cooling 3: Processor 0 of 10
Cooling 4: Processor 0 of 10
Cooling 5: Processor 0 of 10

Añadir fecha en el history

Modificamos el fichero .bashrc y al final añadimos lo siguiente

export HISTTIMEFORMAT="%h/%d - %H:%M:%S "

Hacemos logout y volvemos a hacer login y al escribir history éste es el resultado:

root@tesla-lists:~# history
 1778  Sep/22 - 22:15:41 w
 1779  Sep/22 - 22:15:41 last
 1780  Sep/22 - 22:15:41 w
 1781  Sep/22 - 22:15:41 history
 1782  Sep/22 - 22:15:41 vi .bashrc 
 1783  Sep/22 - 22:15:43 history