martes, 7 de octubre de 2014

Exportar e importar datos en LDAP

Os paso un par de comandos muy útiles para realizar backups de un LDAP.

Para exportar todos los datos de LDAP en un archivo plano:

slapcat -l /ruta/archivobackup.ldif

Para importar los datos del fichero a LDAP:

slapadd -c -l backup.ldif

Usar comando sudo sin contraseña

El comando sudo de Unix es muy útil, ya que permite ejecutar comandos de nivel de administración como si fuéramos un superusuario. Para la ejecución del comando nos solicitará la contraseña de superusuario o de algún usuario definido en el fichero /etc/sudoers, el cual define qué usuarios pueden lanzar comandos sudo.

Cuando definimos scripts, el comando sudo puede suponer un inconveniente, especialmente cuando pretendemos automatizar tareas, tales como backups, ya que precisa de una intervención del usuario para introducir la contraseña.

Para llevar a cabo esta clase de tareas sin que se requiera la contraseña de superusuario, debemos realizar modificaciones en el fichero /etc/sudoers. Pero esto no se puede hacer directamente, ya que tiene permisos de sólo lectura. Para ello, debemos ejecutar el siguiente comando:

sudo visudo

La herramienta visudo está concebida especialmente para editar con seguridad el fichero /etc/sudoers, permitiendo, además, verificar la sintaxis y los errores.

Dentro del fichero /etc/sudoers podemos definir un grupo de programas autorizados y prohibidos a ejecutar con sudo, mediante la directiva Cmnd_Alias:

Cmnd_Alias AUTORIZADO = /ruta/programa1, /ruta/programa2
Cmnd Alias PROHIBIDO = !/ruta/programa1, !/ruta/programa2
usuario ALL = (ALL) AUTORIZADO
usuario ALL = PROHIBIDO

En realidad, podemos definir en un mismo grupo los programas permitidos y prohibidos. La diferencia entre ambos estaría en que los programas prohibidos deben llevar como prefijo el signo de admiración (!).

Si deseamos asignar todos los permisos sudo a un usuario específico, podríamos utilizar, directamente, una línea como ésta:

usuario ALL = (ALL) ALL

Si deseamos que, además, no requiera de contraseña, se utilizaría la siguiente línea:

usuario ALL = (ALL) NOPASSWD: ALL

Obviamente, esto no sería muy recomendado por seguridad. Podría definirse esta política de seguridad únicamente a ciertos programas:

Cmnd_Alias AUTORIZADO = /ruta/programa1, /ruta/programa2
usuario ALL = (ALL) NOPASSWD: AUTORIZADO

El archivo /etc/sudoers tiene una gran capacidad de configuración, además de lo visto anteriormente. Podemos, por ejemplo, definir alias para usuarios, así como también grupos de usuarios. Para más información, se puede consultar la ayuda que ofrece Unix:

man 8 sudo
man 5 sudoers
man 8 visudo

lunes, 6 de octubre de 2014

Programar eventos en Linux con CRON

Linux (y otros sistemas operativos basados en UNIX) posee una poderosa herramienta que permite programar eventos. Gracias a ello, podremos configurar que, cada cierto tiempo, se lance algún comando o programa. Esto es realmente útil, para tareas periódicas, tales como backups o copias de seguridad, transferencia de datos de un sistema a otro, copia de ficheros entre programas, etc.

CRON es un administrador de procesos en segundo plano (o demonios), y se encarga de revisar, a cada minuto, la lista de tareas o procesos programados en el fichero crontab, el cual está ubicado en /etc/crontab. Dentro de este fichero podemos configurar el intervalo en el que se ejecutarán las tareas, automatizando éstas. Cuando CRON revisa crontab, comprueba si hay alguna tarea o proceso que ejecutar en ese momento.

Para editar el crontab, ejecutar el siguiente comando:

sudo crontab -e

Con esto, se abrirá el editor para modificar el crontab correspondiente al usuario actual.

Las líneas de este fichero tienen el siguiente formato:

m h dom mon dow [usuario] comando

donde:

  • m: (minute) Minuto (0 a 59)
  • h: (hour) Hora (0 a 23)
  • dom: (day of month) Día del mes (1 a 31)
  • mon: (month) Mes (1 a 12)
  • dow: (day of week) Día de la semana (0 (domingo) a 6 (sábado))
  • usuario: Nombre del usuario Unix que lanza la tarea
  • comando: Comando Unix que ejecuta la tarea

Los parámetros m, h, dom, mon y dow pueden tener valores especiales:

  • * : (asterisco) Cualquier valor
  • valor1[,valor2...] : (lista separada por comas) Cualquiera de los valores especificados en la lista

Ejemplos:

  • 30 * * * * root sudo apt-get update & sudo apt-get dist-upgrade:Actualiza el sistema (Debian, Ubuntu, Mint...) cada minuto 30, a todas horas, todos los días y todos los meses
  • 0 23 * * 1,3,5 echo "Se ha ejecutado":A las 23:00 horas los lunes(1), miércoles(3) y viernes(5)
  • 0 23 * * mon,wed,fri echo "Se ha ejecutado":A las 23:00 horas los lunes(mon), miércoles(wed) y viernes(fri)
  • 30 7 1 * * root /etc/backup/backup.sh:Lanza el script backup.sh a las 7:30 de día 1 de cada mes, cualquier día de la semana

Existen algunas plantillas que facilitan el uso de los parámetros de frecuencia:

  • @hourly root sudo apt-get update & sudo apt-get dist-upgrade:Actualiza el sistema (Debian, Ubuntu, Mint...) en el primer minuto de cada hora (0 * * * * ...)
  • @daily root sudo apt-get update & sudo apt-get dist-upgrade:Actualiza el sistema (Debian, Ubuntu, Mint...) una vez al día, a las 00:00 horas (0 0 * * * ...)
  • @midnight root sudo apt-get update & sudo apt-get dist-upgrade:Actualiza el sistema (Debian, Ubuntu, Mint...) una vez al día, a las 00:00 horas (0 0 * * * ...)
  • @weekly root sudo apt-get update & sudo apt-get dist-upgrade:Actualiza el sistema (Debian, Ubuntu, Mint...) una vez a la semana (domingos, a las 00:00 horas) (0 0 * * 0 ...)
  • @monthly root sudo apt-get update & sudo apt-get dist-upgrade:Actualiza el sistema (Debian, Ubuntu, Mint...) una vez al mes (día uno, a las 00:00 horas) (0 0 1 * * ...)
  • @yearly root sudo apt-get update & sudo apt-get dist-upgrade:Actualiza el sistema (Debian, Ubuntu, Mint...) una vez a la año (día 1 de Enero, a las 00:00 horas) (0 0 1 1 * ...)
  • @annually root sudo apt-get update & sudo apt-get dist-upgrade:Actualiza el sistema (Debian, Ubuntu, Mint...) una vez a la año (día 1 de Enero, a las 00:00 horas) (0 0 1 1 * ...)

Otros parámetros de crontab:

  • crontab -l: Muestra las tareas CRON del usuario actual
  • crontab -r: Elimina el crontab

Para ver el log de CRON:

sudo nano /var/log/syslog

Puede ocurrir que en el log aparezca un error como éste:

CRON[8380]: (CRON) info (No MTA installed, discarding output)>/p>

Esto se debe a que CRON necesita tener configurado un servidor de correo para las notificaciones. Por ello, será necesario instalar postfix

sudo apt-get install postfix

Otra forma de evitar estos mensajes es cambiar la salida de las notificaciones, añadiendo al final de cada tarea en crontab lo siguiente:

[tarea] >/dev/null 2>&1