AUTOMATITZACIÓ DE TASCAS SHELLSCRIPTS
He fet 3 diferents automatitazacions:
- IMPORTACIÓ MASSIVA D’USUARIS
sudo nano /usr/local/bin/import_users_ldap.sh
#!/bin/bash
# Script de importación masiva de usuarios a LDAP desde CSV
# Servidor: 10.0.10.4
LDAP_BASE=”dc=localhost,dc=local”
LDAP_ADMIN=”cn=admin,dc=localhost,dc=local”
LDAP_USERS_OU=”ou=users,dc=localhost,dc=local”
LOG_FILE=”/var/log/ldap/import_$(date +%Y%m%d_%H%M%S).log”
TEMP_DIR=”/tmp/ldap_import_$$”
CREDENTIALS_FILE=”/tmp/ldap_import_$$/credenciales.txt”
CSV_FILE=”$1″
# Crear directorio de logs si no existe
mkdir -p /var/log/ldap
# Función de logging
log() {
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1” | tee -a “$LOG_FILE”
}
# Generar contraseña segura
generate_password() {
tr -dc ‘A-Za-z0-9’ < /dev/urandom | head -c 12
}
# Obtener siguiente uidNumber
get_next_uid() {
LAST_UID=$(ldapsearch -x -b “$LDAP_USERS_OU” “(objectClass=posixAccount)” uidNumber 2>/dev/null | grep “uidNumber:” | awk ‘{print $2}’ | sort -n | tail -1)
if [ -z “$LAST_UID” ]; then
echo 10001
else
echo $((LAST_UID + 1))
fi
}
# Validar CSV
validate_csv() {
if [ ! -f “$CSV_FILE” ]; then
echo “ERROR: El archivo $CSV_FILE no existe”
exit 1
fi
HEADER=$(head -n 1 “$CSV_FILE”)
EXPECTED=”uid,givenName,sn,mail,gidNumber”
if [ “$HEADER” != “$EXPECTED” ]; then
echo “ERROR: Formato de CSV incorrecto”
echo “Formato esperado: $EXPECTED”
echo “Formato recibido: $HEADER”
exit 1
fi
}
# Crear usuario
create_user() {
local uid=$1
local given_name=$2
local surname=$3
local email=$4
local gid=$5
local uid_number=$6
local password=$7
local cn=”$given_name $surname”
local home_dir=”/home/$uid”
cat > “$TEMP_DIR/${uid}.ldif” <<EOF
dn: uid=$uid,$LDAP_USERS_OU
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: $uid
cn: $cn
sn: $surname
givenName: $given_name
mail: $email
uidNumber: $uid_number
gidNumber: $gid
homeDirectory: $home_dir
loginShell: /bin/bash
EOF
ldapadd -x -D “$LDAP_ADMIN” -w “$ADMIN_PASS” -f “$TEMP_DIR/${uid}.ldif” >> “$LOG_FILE” 2>&1
if [ $? -eq 0 ]; then
ldappasswd -x -D “$LDAP_ADMIN” -w “$ADMIN_PASS” -s “$password” “uid=$uid,$LDAP_USERS_OU” >> “$LOG_FILE” 2>&1
if [ $? -eq 0 ]; then
echo “[OK] Usuario $uid creado”
log “Usuario $uid creado – UID: $uid_number – Email: $email”
echo “$uid:$password:$email” >> “$CREDENTIALS_FILE”
return 0
else
echo “[ERROR] Fallo al establecer contraseña para $uid”
log “ERROR: Fallo contraseña para $uid”
return 1
fi
else
echo “[ERROR] Fallo al crear usuario $uid”
log “ERROR: Fallo al crear $uid”
return 1
fi
}
# Main
main() {
echo “=========================================”
echo ” IMPORTACION MASIVA DE USUARIOS LDAP”
echo “=========================================”
echo “”
if [ -z “$CSV_FILE” ]; then
echo “Uso: $0 <archivo.csv>”
echo “”
echo “Formato del CSV:”
echo “uid,givenName,sn,mail,gidNumber”
echo “ejemplo: jperez,Juan,Perez,jperez@localhost.local,5001”
exit 1
fi
echo -n “Contraseña del administrador LDAP: “
read -s ADMIN_PASS
echo “”
echo “”
mkdir -p “$TEMP_DIR”
validate_csv
TOTAL_USERS=$(($(wc -l < “$CSV_FILE”) – 1))
echo “Usuarios a importar: $TOTAL_USERS”
echo “”
log “Iniciando importación de $TOTAL_USERS usuarios”
NEXT_UID=$(get_next_uid)
log “Siguiente uidNumber: $NEXT_UID”
SUCCESS=0
FAILED=0
while IFS=, read -r uid given_name surname email gid; do
if [ “$uid” = “uid” ]; then
continue
fi
PASSWORD=$(generate_password)
if create_user “$uid” “$given_name” “$surname” “$email” “$gid” “$NEXT_UID” “$PASSWORD”; then
((SUCCESS++))
else
((FAILED++))
fi
NEXT_UID=$((NEXT_UID + 1))
done < “$CSV_FILE”
echo “”
echo “=========================================”
echo ” RESUMEN”
echo “=========================================”
echo “Usuarios creados: $SUCCESS”
echo “Usuarios fallidos: $FAILED”
echo “”
if [ -f “$CREDENTIALS_FILE” ]; then
echo “CREDENCIALES GENERADAS:”
echo “———————–“
echo “Usuario:Contraseña:Email”
cat “$CREDENTIALS_FILE”
echo “”
echo “Credenciales guardadas en: $CREDENTIALS_FILE”
fi
echo “Log completo en: $LOG_FILE”
log “Importación finalizada – Exitos: $SUCCESS – Fallos: $FAILED”
}
main
Donar permissos:
sudo chmod +x /usr/local/bin/import_users_ldap.sh
Archiu CSV de prova:
sudo nano ~/usuarios_nuevos.csv
uid,givenName,sn,mail,gidNumber
mlopez,Maria,Lopez,mlopez@localhost.local,5002
agarcia,Ana,Garcia,agarcia@localhost.local,5001
crodriguez,Carlos,Rodriguez,crodriguez@localhost.local,5003
lmartinez,Laura,Martinez,lmartinez@localhost.local,5004
pdiaz,Pedro,Diaz,pdiaz@localhost.local,5001
PROVA DE FUNCIONAMENT
2. MONITOR DE ESTAT DEL SERVEI LDAP
sudo nano /usr/local/bin/monitor_ldap.sh
#!/bin/bash
# Monitor de estado LDAP
# Servidor: 10.0.10.4
LDAP_BASE=”dc=localhost,dc=local”
REPORT_FILE=”/var/log/ldap/monitor_$(date +%Y%m%d_%H%M%S).txt”
ALERT_FILE=”/var/log/ldap/alertas.log”
MAX_CONNECTIONS=100
# Crear directorio de logs
mkdir -p /var/log/ldap
# Contadores
WARNINGS=0
ERRORS=0
OK=0
# Función de alerta
alert() {
local level=$1
local message=$2
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] [$level] $message” | tee -a “$ALERT_FILE”
case $level in
“ERROR”)
((ERRORS++))
;;
“WARNING”)
((WARNINGS++))
;;
“OK”)
((OK++))
;;
esac
}
# Iniciar reporte
init_report() {
cat > “$REPORT_FILE” <<EOF
========================================
MONITOR DE ESTADO LDAP
Servidor: 10.0.10.4
Fecha: $(date ‘+%Y-%m-%d %H:%M:%S’)
========================================
EOF
}
# Verificar servicio
check_service() {
echo “1. ESTADO DEL SERVICIO” >> “$REPORT_FILE”
echo “———————-” >> “$REPORT_FILE”
if systemctl is-active –quiet slapd; then
alert “OK” “Servicio slapd activo”
echo “[OK] Servicio ACTIVO” >> “$REPORT_FILE”
else
alert “ERROR” “Servicio slapd NO activo”
echo “[ERROR] Servicio INACTIVO” >> “$REPORT_FILE”
fi
UPTIME=$(systemctl show slapd –property=ActiveEnterTimestamp –value)
echo “Activo desde: $UPTIME” >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
}
# Verificar conectividad
check_connectivity() {
echo “2. CONECTIVIDAD” >> “$REPORT_FILE”
echo “—————” >> “$REPORT_FILE”
if ldapsearch -x -b “$LDAP_BASE” -s base -LLL > /dev/null 2>&1; then
alert “OK” “Conectividad LDAP correcta”
echo “[OK] Puerto 389 respondiendo” >> “$REPORT_FILE”
else
alert “ERROR” “Fallo conectividad LDAP”
echo “[ERROR] Puerto 389 no responde” >> “$REPORT_FILE”
fi
CONNECTIONS=$(ss -tn 2>/dev/null | grep :389 | wc -l)
echo “Conexiones activas: $CONNECTIONS” >> “$REPORT_FILE”
if [ $CONNECTIONS -gt $MAX_CONNECTIONS ]; then
alert “WARNING” “Conexiones elevadas: $CONNECTIONS”
echo “[WARNING] Conexiones por encima del umbral” >> “$REPORT_FILE”
fi
echo “” >> “$REPORT_FILE”
}
# Estadísticas
check_statistics() {
echo “3. ESTADISTICAS” >> “$REPORT_FILE”
echo “—————” >> “$REPORT_FILE”
TOTAL_USERS=$(ldapsearch -x -b “ou=users,$LDAP_BASE” “(objectClass=posixAccount)” 2>/dev/null | grep “^dn:” | wc -l)
TOTAL_GROUPS=$(ldapsearch -x -b “ou=groups,$LDAP_BASE” “(objectClass=posixGroup)” 2>/dev/null | grep “^dn:” | wc -l)
echo “Total usuarios: $TOTAL_USERS” >> “$REPORT_FILE”
echo “Total grupos: $TOTAL_GROUPS” >> “$REPORT_FILE”
alert “OK” “Usuarios: $TOTAL_USERS | Grupos: $TOTAL_GROUPS”
echo “” >> “$REPORT_FILE”
}
# Verificar usuarios huérfanos
check_orphans() {
echo “4. VERIFICACION DE INTEGRIDAD” >> “$REPORT_FILE”
echo “——————————” >> “$REPORT_FILE”
VALID_GIDS=$(ldapsearch -x -b “ou=groups,$LDAP_BASE” “(objectClass=posixGroup)” gidNumber 2>/dev/null | grep “gidNumber:” | awk ‘{print $2}’ | sort -u)
ORPHANS=0
while read -r line; do
if [[ $line == dn:* ]]; then
CURRENT_UID=$(echo “$line” | cut -d’,’ -f1 | cut -d’=’ -f2)
elif [[ $line == gidNumber:* ]]; then
USER_GID=$(echo “$line” | awk ‘{print $2}’)
if ! echo “$VALID_GIDS” | grep -q “^${USER_GID}$”; then
echo “[WARNING] Usuario huerfano: $CURRENT_UID (GID: $USER_GID)” >> “$REPORT_FILE”
alert “WARNING” “Usuario huerfano: $CURRENT_UID (GID: $USER_GID)”
((ORPHANS++))
fi
fi
done < <(ldapsearch -x -b “ou=users,$LDAP_BASE” “(objectClass=posixAccount)” dn gidNumber 2>/dev/null)
if [ $ORPHANS -eq 0 ]; then
echo “[OK] No hay usuarios huerfanos” >> “$REPORT_FILE”
alert “OK” “Sin usuarios huerfanos”
fi
echo “” >> “$REPORT_FILE”
}
# Espacio en disco
check_disk() {
echo “5. RECURSOS” >> “$REPORT_FILE”
echo “———–” >> “$REPORT_FILE”
DB_SIZE=$(du -sh /var/lib/ldap 2>/dev/null | awk ‘{print $1}’)
FREE_SPACE=$(df -h /var/lib/ldap 2>/dev/null | tail -1 | awk ‘{print $4}’)
echo “Tamaño BD LDAP: $DB_SIZE” >> “$REPORT_FILE”
echo “Espacio libre: $FREE_SPACE” >> “$REPORT_FILE”
alert “OK” “BD: $DB_SIZE | Libre: $FREE_SPACE”
echo “” >> “$REPORT_FILE”
}
# Verificar backups
check_backups() {
echo “6. BACKUPS” >> “$REPORT_FILE”
echo “———-” >> “$REPORT_FILE”
if [ -d /var/backups/ldap ]; then
LAST_BACKUP=$(ls -t /var/backups/ldap/data_*.ldif 2>/dev/null | head -1)
if [ -n “$LAST_BACKUP” ]; then
BACKUP_DATE=$(stat -c %y “$LAST_BACKUP” | cut -d’ ‘ -f1)
BACKUP_AGE=$(( ($(date +%s) – $(stat -c %Y “$LAST_BACKUP”)) / 86400 ))
echo “Ultimo backup: $BACKUP_DATE” >> “$REPORT_FILE”
echo “Antiguedad: $BACKUP_AGE dias” >> “$REPORT_FILE”
if [ $BACKUP_AGE -gt 2 ]; then
alert “WARNING” “Backup desactualizado: $BACKUP_AGE dias”
echo “[WARNING] Backup antiguo” >> “$REPORT_FILE”
else
alert “OK” “Backup reciente: $BACKUP_AGE dias”
echo “[OK] Backup actualizado” >> “$REPORT_FILE”
fi
else
alert “ERROR” “Sin backups disponibles”
echo “[ERROR] No hay backups” >> “$REPORT_FILE”
fi
else
alert “WARNING” “Directorio backups no existe”
echo “[WARNING] No configurado” >> “$REPORT_FILE”
fi
echo “” >> “$REPORT_FILE”
}
# Logs
check_logs() {
echo “7. LOGS (ultimas 24h)” >> “$REPORT_FILE”
echo “———————” >> “$REPORT_FILE”
ERROR_COUNT=$(journalctl -u slapd –since “24 hours ago” -p err –no-pager 2>/dev/null | wc -l)
echo “Errores detectados: $ERROR_COUNT” >> “$REPORT_FILE”
if [ $ERROR_COUNT -gt 0 ]; then
alert “WARNING” “$ERROR_COUNT errores en logs”
echo “[WARNING] Errores presentes” >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “Ultimos errores:” >> “$REPORT_FILE”
journalctl -u slapd –since “24 hours ago” -p err –no-pager 2>/dev/null | tail -5 >> “$REPORT_FILE”
else
alert “OK” “Sin errores en logs”
echo “[OK] Sin errores” >> “$REPORT_FILE”
fi
echo “” >> “$REPORT_FILE”
}
# Resumen final
finalize_report() {
cat >> “$REPORT_FILE” <<EOF
========================================
RESUMEN
========================================
Comprobaciones OK: $OK
Advertencias: $WARNINGS
Errores: $ERRORS
Reporte guardado en: $REPORT_FILE
Log de alertas en: $ALERT_FILE
========================================
EOF
echo “”
echo “=========================================”
echo ” RESUMEN”
echo “=========================================”
echo “Comprobaciones OK: $OK”
echo “Advertencias: $WARNINGS”
echo “Errores: $ERRORS”
echo “”
echo “Reporte: $REPORT_FILE”
echo “Alertas: $ALERT_FILE”
}
# Main
main() {
echo “=========================================”
echo ” MONITOR LDAP”
echo ” Iniciando verificaciones…”
echo “=========================================”
echo “”
init_report
check_service
check_connectivity
check_statistics
check_orphans
check_disk
check_backups
check_logs
finalize_report
}
main
Donar permissos:
sudo chmod +x /usr/local/bin/monitor_ldap.sh
PROVA DE FUNCIONAMENT
Si volem programar la execució automatica:
sudo crontab -e
Afegir:
# Monitor cada 6 horas 0 */6 * * * /usr/local/bin/monitor_ldap.sh
3. SISTEMA DE SNAPSHOTS I AUDITORIA
sudo nano /usr/local/bin/snapshot_ldap.sh
#!/bin/bash
# Sistema de Snapshots y Auditoria LDAP
# Servidor: 10.0.10.4
LDAP_BASE=”dc=localhost,dc=local”
SNAPSHOT_DIR=”/var/backups/ldap_snapshots”
AUDIT_LOG=”/var/log/ldap/auditoria.log”
DIFF_DIR=”/var/backups/ldap_diffs”
RETENTION_DAYS=30
# Crear directorios
mkdir -p “$SNAPSHOT_DIR”
mkdir -p “$DIFF_DIR”
mkdir -p /var/log/ldap
# Logging
log_audit() {
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1” | tee -a “$AUDIT_LOG”
}
# Crear snapshot
create_snapshot() {
local timestamp=$(date +%Y%m%d_%H%M%S)
local snapshot_file=”$SNAPSHOT_DIR/snapshot_$timestamp.ldif”
log_audit “Creando snapshot…”
slapcat -n 1 > “$snapshot_file” 2>/dev/null
if [ $? -eq 0 ]; then
gzip “$snapshot_file”
log_audit “Snapshot creado: snapshot_$timestamp.ldif.gz”
echo “$snapshot_file.gz”
return 0
else
log_audit “ERROR: Fallo al crear snapshot”
return 1
fi
}
# Comparar snapshots
compare_snapshots() {
local current_snapshot=$1
local timestamp=$(date +%Y%m%d_%H%M%S)
local diff_file=”$DIFF_DIR/diff_$timestamp.txt”
local previous_snapshot=$(ls -t “$SNAPSHOT_DIR”/snapshot_*.ldif.gz 2>/dev/null | sed -n ‘2p’)
if [ -z “$previous_snapshot” ]; then
log_audit “No hay snapshot anterior para comparar”
return
fi
log_audit “Comparando snapshots…”
local temp_current=”/tmp/current_$$.ldif”
local temp_previous=”/tmp/previous_$$.ldif”
gunzip -c “$current_snapshot” > “$temp_current”
gunzip -c “$previous_snapshot” > “$temp_previous”
{
echo “=========================================”
echo “COMPARACION DE CAMBIOS LDAP”
echo “Fecha: $(date +’%Y-%m-%d %H:%M:%S’)”
echo “=========================================”
echo “”
echo “Snapshot actual: $(basename $current_snapshot)”
echo “Snapshot anterior: $(basename $previous_snapshot)”
echo “”
echo “CAMBIOS DETECTADOS:”
echo “===================”
diff -u “$temp_previous” “$temp_current” || true
} > “$diff_file”
local additions=$(grep “^+dn:” “$diff_file” 2>/dev/null | wc -l)
local deletions=$(grep “^-dn:” “$diff_file” 2>/dev/null | wc -l)
log_audit “Cambios: $((additions + deletions)) (Adiciones: $additions, Eliminaciones: $deletions)”
if [ $((additions + deletions)) -gt 0 ]; then
echo “”
echo “CAMBIOS DETECTADOS:”
echo ” Adiciones: $additions”
echo ” Eliminaciones: $deletions”
echo ” Archivo diff: $diff_file”
echo “”
echo “Resumen:”
grep “^[+-]dn:” “$diff_file” | head -20
else
echo “No se detectaron cambios”
fi
rm -f “$temp_current” “$temp_previous”
}
# Listar snapshots
list_snapshots() {
echo “=========================================”
echo ” SNAPSHOTS DISPONIBLES”
echo “=========================================”
echo “”
if [ ! -d “$SNAPSHOT_DIR” ] || [ -z “$(ls -A $SNAPSHOT_DIR 2>/dev/null)” ]; then
echo “No hay snapshots disponibles”
return
fi
echo “Archivo Fecha Tamaño”
echo “—————————————————————-“
ls -lh “$SNAPSHOT_DIR”/snapshot_*.ldif.gz 2>/dev/null | awk ‘{printf “%-32s %-20s %s\n”, $9, $6″ “$7” “$8, $5}’ | while read line; do
echo “$line” | sed ‘s|.*/||’
done
echo “”
echo “Total: $(ls “$SNAPSHOT_DIR”/snapshot_*.ldif.gz 2>/dev/null | wc -l) snapshots”
echo “Espacio usado: $(du -sh “$SNAPSHOT_DIR” 2>/dev/null | awk ‘{print $1}’)”
}
# Limpiar antiguos
cleanup_old() {
log_audit “Limpiando snapshots antiguos (>$RETENTION_DAYS dias)…”
DELETED=$(find “$SNAPSHOT_DIR” -name “snapshot_*.ldif.gz” -mtime +$RETENTION_DAYS | wc -l)
find “$SNAPSHOT_DIR” -name “snapshot_*.ldif.gz” -mtime +$RETENTION_DAYS -delete
find “$DIFF_DIR” -name “diff_*.txt” -mtime +$RETENTION_DAYS -delete
log_audit “Limpieza completada: $DELETED archivos eliminados”
echo “Snapshots eliminados: $DELETED”
}
# Restaurar
restore_snapshot() {
local snapshot_file=$1
if [ -z “$snapshot_file” ]; then
echo “ERROR: Debe especificar el archivo snapshot”
echo “”
list_snapshots
echo “”
echo “Uso: $0 restore <archivo_snapshot>”
return 1
fi
if [ ! -f “$snapshot_file” ]; then
echo “ERROR: Snapshot no encontrado: $snapshot_file”
return 1
fi
echo “ADVERTENCIA: Esta operacion restaurara el directorio LDAP”
echo “Snapshot: $(basename $snapshot_file)”
echo “”
echo -n “Escriba ‘SI’ para confirmar: “
read confirm
if [ “$confirm” != “SI” ]; then
echo “Operacion cancelada”
return 1
fi
log_audit “Iniciando restauracion desde: $(basename $snapshot_file)”
echo “Creando backup de seguridad…”
local safety_backup=”$SNAPSHOT_DIR/pre_restore_$(date +%Y%m%d_%H%M%S).ldif”
slapcat -n 1 > “$safety_backup” 2>/dev/null
gzip “$safety_backup”
echo “Deteniendo servicio…”
systemctl stop slapd
echo “Limpiando base de datos…”
rm -rf /var/lib/ldap/*
echo “Restaurando datos…”
gunzip -c “$snapshot_file” | slapadd -n 1 2>/dev/null
chown -R openldap:openldap /var/lib/ldap
echo “Reiniciando servicio…”
systemctl start slapd
if systemctl is-active –quiet slapd; then
echo “”
echo “[OK] Restauracion completada”
log_audit “Restauracion exitosa desde: $(basename $snapshot_file)”
return 0
else
echo “”
echo “[ERROR] El servicio no inicio”
log_audit “ERROR: Fallo restauracion”
return 1
fi
}
# Main
main() {
case “$1” in
snapshot)
echo “=========================================”
echo ” CREAR SNAPSHOT”
echo “=========================================”
snapshot=$(create_snapshot)
if [ $? -eq 0 ]; then
compare_snapshots “$snapshot”
fi
;;
list)
list_snapshots
;;
cleanup)
cleanup_old
;;
restore)
restore_snapshot “$2”
;;
*)
echo “Sistema de Snapshots LDAP”
echo “”
echo “Uso: $0 {snapshot|list|cleanup|restore}”
echo “”
echo “Comandos:”
echo ” snapshot – Crear snapshot y comparar”
echo ” list – Listar snapshots disponibles”
echo ” cleanup – Limpiar snapshots antiguos”
echo ” restore – Restaurar desde snapshot”
echo “”
echo “Ejemplos:”
echo ” $0 snapshot”
echo ” $0 list”
echo ” $0 restore $SNAPSHOT_DIR/snapshot_20260206_120000.ldif.gz”
;;
esac
}
main “$@”
Donar permissos:
sudo chmod +x /usr/local/bin/snapshot_ldap.sh
PROVA DE FUNCIONAMENT