Denyhosts e IPtables

Tengo bastante tiempo usando Denyhosts para proteger el servidor de mi trabajo contra intentos de intrusión por fuerza bruta, especialmente por el puerto 22 (servicio de ssh).

Denyhosts funciona perfecto y hace lo que promete; cada que un “hacker” [mejor escrito: script kiddie]  intenta acceder por SSH con un nombre de usuario o una contraseña incorrecta más de 3 veces, Denyhost bloquea su IP agregando una entrada al archivo /etc/hosts.deny
De esa manera, el IP ofensivo ya no puede establecer conexión al servidor por el puerto 22

Editando la configuración del script intenté que Denyhost bloqueara todos los puertos para el atacante y que así no tuviera acceso al servidor; ¡pero no lo conseguí!

Después de muchas horas, al final, hice un pequeño script en bash que lee la lista de IPs en /etc/hosts.deny (agregadas previamente por DenyHost) para agregarlas  a iptables; logrando así, bloquear totalmente al ofensor.

Para ejecutar el script, solo hay que darle permisos de ejecución y opcionalmente, agregarlo al crontab
Espero que a alguien más le sirva este script para bloquear con iptables los IPs registrados por Denyhosts.

#!/bin/bash

# I will be kind to the computers in my network segment
MY_NETWORK_SEGMENT=148.228.204.

# File to store IP address
MY_HOSTS_DENY=/root/.hosts_deny

# Die if /etc/hosts.deny file not found
[ ! -f "/etc/hosts.deny" ] && { echo "File /etc/hosts.deny not found."; exit 1; }

# Filter the /etc/hosts.deny to generate MY_HOSTS_DENY file
grep -vE "^#|^S" /etc/hosts.deny | awk {'print $2'} | grep -v $MY_NETWORK_SEGMENT | sort -n > $MY_HOSTS_DENY

while read -r IP
do
 # check if the IP isn't blank
 if [ -n "$IP" ]
  then
   CURRENT_IP=$(iptables-save | grep $IP)
   # if the current IP does not exists in iptables rules then...
   if [ -z "$CURRENT_IP" ]
    then
     # Die IP, Die!
     iptables -A INPUT -p all -s $IP -j DROP
     echo "IP: $IP banned in ALL ports"
   fi
 fi
done <"${MY_HOSTS_DENY}"

# Clean the mess
rm $MY_HOSTS_DENY

Listas en cascada con jQuery, Kendo UI, XML y PHP

El problema es de lo más básico, sobre todo si se considera desde el punto de vista del usuario.

Desde el punto de vista del programador se trata de enlazar dos listas de selección, llenar las listas con los nodos de un archivo XML creado al vuelo a través de una consulta a una base de datos y filtrar la información dependiendo de la selección en la primera lista.
En forma visual se trata de lo siguiente.

Se tienen dos listas, la segunda lista está deshabilitada y se activa hasta que se haga una selección en la primera lista:

Con un XML (que se puede construir fácilmente con PHP) se llena la primera lista:

Cuando se elije una opción; se activa la segunda lista:

En la segunda lista, se filtran los datos del archivo XML para colocar únicamente los nodos que tengan correspondencia con la primera selección:

Ahora bien, para lograr esto, no se necesita reinventar la rueda pero si hay que poner algunas líneas de programación y comprender el proceso como se muestra a continuación:

Sigue leyendo

Cómo hacer el respaldo de moodle y todos los cursos

Empezaré por escribir que no soy un experto en moodle ni tampoco doy asesorías sobre su uso; lo cierto es que, como muchos; he tenido que ir aprendiendo paso a paso algunas cosas sobre la marcha, mientras se va utilizando esta magnífica plataforma educativa. Lo último con lo que me he tenido que enfrentar es con la realización de respaldos periódicos.

En este mini-micro tutorial, probablemente no logre escribir la octava maravilla, pero al menos espero que el compartir la forma en que yo he resuelto el asunto de los respaldos de moodle, le sirva a alguien más y lo ponga en práctica, o bien; que mejore la idea y la comparta con todos los lectores.

Considero que hay dos maneras de realizar respaldos, veamos la primera:

1.- Dentro de Moodle, en su interfaz gráfica se incluyen las herramientas para hacer respaldos de cada curso, de los alumnos inscritos, calificaciones, tareas, etc:

En el bloque administracion (dentro de tu curso) existe un botón llamado copia de seguridad que te permite crear un respaldo del curso con las opciones que tú elijas.

Este respaldo es un paquete zip que deberás restaurar cuando sea necesario, mediante la opción restaurar  en el bloque de administración del sitio.

El mayor dilema de este método es que se tiene que hacer, curso por curso y eso no es muy grato cuando tienes tantos cursos en la plataforma educativa o cuando quieres que cada determinado tiempo se hagan los respaldos de forma automática.

2.- La otra forma, es a través de un script que ejecuta algunas instrucciones directamente en el servidor; además este script se puede agregar al programador de tareas cron, para que se ejecute periodicamente.

Escencialmente lo que se tiene que respaldar es:

  • La base de datos de Moodle
  • La instalación de Moodle
  • Los archivos y recursos de todos los cursos, usuarios, etc.

He creado este script para hacer esas tres tareas consecutivamente; si te interesa usarlo, unicamente tienes que adaptarlo a tus variables de entorno:

#!/bin/bash
#Comprobamos que el usuario es root (super usuario) quien ejecuta este escript.
if [ $UID != 0 ]; then
 echo "No tienes los privilegios necesarios para ejecutar este script."
 echo "Debes ingresar como root, escribe \"su root\" sin las comillas."
 exit 1
fi

#Fecha actual
FECHA=$(date +%F);

#Hora actual
HORA=$(date +%H-%M-%S);

#Nombre del host en donde se ejecuta mysql (si hay dudas, ver moodle/config.php)
DBHOST=localhost

#Nombre de la base de datos  
DBNAME=moodledatabase

#Nombre del usuario que accede a la base de datos en mysql
DBUSER=moodleuser

#Clave de acceso a la base de datos en mysql
#Por defecto, se solicita cada vez que se ejecuta el script
#Pero se puede definir aqui
DBPASSWORD=""

#Directorio con la instalacion de moodle
MOODLE_DIR=/server/www/htdocs/moodle

#Directorio en donde se guardan los archivos de los cursos, las tareas, etc.
MOODLEDATA_DIR=/server/www/moodledata

#Directorio donde se guardaran los respaldos
BACKUP_DIR=/backups/moodle

#Respaldar la base de datos
if [ "$DBPASSWORD" = "" ]; then
 echo -n "Clave de acceso a la base de datos '$DBNAME' en mysql?: "
 read DBPASSWORD
fi
mysqldump -u $DBUSER -p$DBPASSWORD $DBNAME > $BACKUP_DIR/$DBNAME-$FECHA--$HORA.sql

#Comprimir el archivo de respaldo de la base de datos
echo "Desea comprimir el archivo de respaldo de la base de datos [Y/n]?"
echo -n " Valor por defecto [Y]: "
read COMPRESSDBFILE
if [ "$COMPRESSDBFILE" = "n" ]; then
 sleep 0
else
 bzip2 $BACKUP_DIR/$DBNAME-$FECHA--$HORA.sql
fi

#Hacer el archivo.tar.gz con el respaldo de moodle
tar czPf $BACKUP_DIR/moodle-$FECHA--$HORA.tar.gz $MOODLE_DIR

#Hacer el archivo.tar.gz con los archivos de los cursos, tareas, usuarios, etc
tar czPf $BACKUP_DIR/moodledata-$FECHA--$HORA.tar.gz $MOODLEDATA_DIR

##################################### FIN DEL SCRIPT ##################################

Puedes copiar y pegar el código de arriba y guardarlo en un archivo con extensión .sh o bien, bajar el script de este enlace; después sólo tienes que subirlo a tu servidor, editar las variables como son, el nombre de la base de datos, el nombre del usuario, la ubicacion a los directorios de moodle y el directorio donde se guarda el respaldo; para ejecutar el script tienes que cambiarle los permisos de ejecución; desde tu terminal escribe:

chmod +x backupMoodle.sh

y para ejecutarlo:

./backupMoodle.sh

Finalmente, espero que esa publicación sea de ayuda para más personas.

Script para la gestión de usuarios en bash

#!/bin/bash
#Comprobamos que el usuario es root.
if [ $UID != 0 ]; then
 echo "No tienes los privilegios necesarios para ejecutar este script."
 echo "Debes ingresar como root, escribe \"su root\" sin las comillas."
 exit 1
fi

echo
echo "Administración básica de usuarios y grupos en linux"
echo

while [ "$option" != "0" ]
 do
 clear
  echo
  echo "Opciones:"
  echo "---------"
  echo " 1. Agregar un usuario al sistema."
  echo " 2. Cambiar la clave de acceso de un usuario."
  echo " 3. Editar la información personal de un usuario."
  echo " 4. Borrar a un usuario del sistema."
  echo " 5. Crear grupo."
  echo " 6. Agregar un usuario a un grupo."
  echo " 7. Borrar un grupo."
  echo " 0. Salir."
  echo
  echo -n " Ejecutar: "
   read option
   case $option in
    1 )
     echo
     echo -n "Nombre del usuario a crear?: "
     read username
     echo "Con acceso a la línea de comandos bash [Y/n]?"
     echo -n " Valor por defecto [n]: "
     read shell_access
     if [ "$shell_access" = "Y" ]; then
       TERMINAL='/bin/bash'
     else
      TERMINAL='/bin/false'
     fi
     echo "Crear el directorio de trabajo para el nuevo usuario [Y/n]?"
     echo -n " Valor por defecto [Y]: "
     read home_directory
     if [ "$home_directory" = "n" ]; then
      useradd $username -s $TERMINAL
     else
      useradd $username -m -s $TERMINAL
     fi
     echo
    ;;
    2 )
     echo
     echo -n "Nombre del usuario del que se desea cambiar la clave?: "
     read username
     echo
     passwd $username
     echo
    ;;
    3 )
     echo
     echo -n "Nombre del usuario al cual cambiar la información personal?: "
     read username
     echo
     chfn $username
     echo
    ;;
    4 )
     echo
     echo -n "Nombre del usuario a borrar?: "
     read username
     if [ "$username" = "root" ]; then
      echo "Estúpido script, no puedes eliminar al Dios root"
      exit 0
     else
      echo
      echo "Desea borrar el directorio de trabajo y todo su contenido [Y/n]? "
      echo -n " Valor por defecto [n]: "
      read delete_home
     fi
     if [ "$delete_home" = "Y" ]; then
      userdel -r $username
     else
      userdel $username
     fi
     echo
    ;;
    5 )
     echo
     echo -n "Nombre del grupo a crear?: "
     read group
     echo
     groupadd $group
     echo    
    ;;
    6 )
     echo
     echo -n "Nombre del usuario para agregar al grupo?: "
     read username
     echo -n "Nombre del del grupo para agregar el usuario?: "
     read group
     echo
     groupadd $username $group
     echo
    ;;
    7 )
     echo -n "Nombre del grupo a borrar?: "
     read group
     echo
     groupdel $group
     echo
    ;;
    *) 
    ;;
   esac
  done
echo
exit 0

Charla loca

vaLar dice:
porqué?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
porqué qué?
vaLar dice:
porqué crees que nos deberíamos poner contentos sin preguntar?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
pues porque si
vaLar dice:
pero porqué sí?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
te complicas demasiado, solo ponte contento
vaLar dice:
cómo?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
como que??
vaLar dice:
cómo te pones contento?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
pues sin preguntar
vaLar dice:
qué?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
que de que???
vaLar dice:
sin preguntar qué?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
porque estar contento
vaLar dice:
y porqué?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
por que que??
vaLar dice:
porque estár contento?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
no preguntes
vaLar dice:
porque no?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
porque debes estar contento sin preguntar
vaLar dice:
debo??
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
estar contento sin preguntar
vaLar dice:
tu haces eso?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
yo si, tu no??
vaLar dice:
que cosa?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
estar contento, tu no lo estas????
vaLar dice:
sin preguntar o preguntando?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
necesitas una u otra cosa??
vaLar dice:
que cosa?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
para estar contento
vaLar dice:
tu?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
yo que??
vaLar dice:
necesitas una u otra cosa??
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
de que me hablas??
vaLar dice:
de estar contento, tu no lo estas????
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
yo si, pero tu parece que necesitas una razon
vaLar dice:
yo si, tu no??
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
yo no
solo estoy contento por eso no pregunto
vaLar dice:
porqué debes estar contento sin preguntar??
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
pues estar solo por estar
vaLar dice:
aah
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
tu necesitas un motivo?
vaLar dice:
todo en la vida tiene un motivo, o no?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
no se, tu dime
vaLar dice:
no, por favor.. tú iluminame
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
yo quien soy como para iluminarte???
vaLar dice:
tu eres tú
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
pero a poco parezco foco como para iluminarte??
vaLar dice:
si tu no fueras tu, quien serías?
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
no se, tu quien crees que seria??
vaLar dice:
si tu no fueras tu, serías tú nuevamente, al ser el otro tu
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
como??, no entiendo, podrias explicarmelo?
vaLar dice:
no
es lógica difusa
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
que es logica difusa?
vaLar dice:
es la lógica que se basa en lo relativo de lo observado
Yo diría que nos pusiéramos todos contentos sin preguntar porque dice:
no entendi, pero gracias por explicarmelo
vaLar dice:
la lógica matemática se basa en las matemáticas y lo demostrable
la logica difusa, toma conceptos de las observaciones, no de lo demostrable
Yo diría que nos pusieramos todos contentos sin preguntar porque dice:
sigo sin entender, pero muchas gracias
vaLar dice:
por nada.

Tantas cosas por decir

Bueno, realmente he tenido poco tiempo para escribir en este blog y más que nada es por las diversas actividades en las que me he visto involucrado, una de ellas y la más importante es que mi novia y yo andamos de un lado a otro con los preparativos para la boda, ya sea ir a ver el salón, las bases para los centros de mesa, su vestido de novia, el diseño en photoshop de la invitación, el papel para imprimir las invitaciones, la tinta para la impresora, el papel para los sobres y así… mil cosas más que si bien, ocupan casi todo nuestro tiempo “libre” realmente no nos quejamos porque lo hemos disfrutado mucho Landy y yo; a mi me gustó el instante en que ella escogió el color del papel para los sobres y bueno, a mi me tocó ingeníarmelas para cortar los pliegos de papel y desperdiciar lo menos posible en base a una plantilla que hice. Por su parte, Landy ha estado haciendo unas mariposas de papel (origami) y las ha decorado tan bien, que estoy seguro que a mas de uno, le gustarán nuestras invitaciones 100% hechas por nosotros.

El fin de semana pasado, definitivamente nos dimos un respiro y nos la pasamos en la cocina, desde temprano fuimos a conseguir conejos frescos y compramos un par de mamíferos en un criadero, como a 30 minutos de distancia en un pueblito; después de escogerlos la señora que nos los vendió los sacrificó y los metió a una bolsa, nosotros pagamos y nos fuimos a su casa, ahí saqué mi super navaja Wallis (que tiene mucho filo por cierto) y les quité la piel, justo como recordé que me habían enseñado cuando yo tenía como 12 años. Total que ese día hasta mi suegro nos ayudó a trocear los conejos y aunque tardaron mucho en cocinarse, la verdad valió la pena la espera porque todos cenamos un adobo de conejo muuuy rico, 100% hecho por todos nosotros. (su papá, su hermano, ella y yo)

Pantallazo-OpenSolaris-11En el trabajo, pues las cosas van normales, aunque un nuevo reto se ha presentado pues nos han hecho la entrega de un nuevo servidor de Sun microsystems con el sistema operativo Unix Solaris 10, del cual, aunque los del departamento de sistemas (Juan, Roberto, Paco y yo) tenemos ciertas nociones o experiencia en Linux, con Solaris es otro universo porque realmente Linux no es Unix…
Como sea, estamos haciendo lo mejor que podemos para poder configurar y migrar nuestros datos y aplicaciones al nuevo servidor.
Por mi parte, para familiarizarme un poco más con unix, he instalado OpenSolaris en mi laptop (desde la cual estoy escribiendo esto) y he tenido que aprender almenos unos 30 comandos de Unix para cosas que ya sabía hacer en Linux.

De la maestría, pues qué decir… las clases de 5 a 10 pm cada martes y jueves a veces me resultan agotadoras y me dan más ganas de no ir que de ir, sin embargo continúo asistiendo, desvelándome, haciendo tareas, exposiciones y cosas por el estilo, por ejemplo, hace poco, dentro del equipo de trabajo, a mi me correspondió hacer la presentación de un caso para la materia de “Desarrollo organizacional” en la cual el planteamiento fue un caso de la revista Harvard Business Review que se llama “Mano conocida o Sangre nueva”. En parte, tengo la fortuna de estar en un equipo de trabajo que sí trabaja y eso es un gran apoyo incluso moralmente.

Finalmente, hace no mucho se derivó una charla-queja-opinión-desacuerdo sobre mi blog y las cosas que publico en la red… el punto central fue una publicación que he tenido que remover porque los argumentos ajenos me parecieron válidos, pero fuera de eso, creo que escribir aquí sobre cuestiones personales (no cuestiones privadas) no infringe ninguna ley moral o civil; incluso creo que más beneficios me ha dado que problemas.
Gracias a mi blog: (y a mi tesis): mi actual jefe (jefazo, sin afán de ser barbero) me localizó y me ofreció el trabajo que tengo actualmente.
Gracias a mi cuenta de flickr: me han pedido “permiso” en dos ocasiones (algo es algo) para publicar fotografìas mías (no de mi) en medios impresos.
Gracias a mi blog: localizaron mi CV y me invitaron a dar un taller de php en el tec de monterrey, campus puebla que si bien, aún no se concreta porque está programado para el 25 de septiembre, yo ya he aceptado la invitación y bueno, sólo resta esperar que así suceda y no se me frustre el asunto, como ocurrió con mi idea (vaga) de que iría a aguascalientes a presentar un proyecto en la primera semana de septiembre…

Finalmente, creo que cada día se debe aprender algo nuevo.