Automatización de la Configuración de Sincronización Horaria en Linux

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

La correcta sincronización horaria en los sistemas Linux es un componente crítico para garantizar la coherencia en los registros del sistema, la integridad de las operaciones en red, la autenticación Kerberos, la replicación entre servidores, y otras tareas sensibles al tiempo. Este artículo presenta un script Bash que automatiza la detección, configuración e instalación del servicio de sincronización horaria en función de la distribución y del servicio ya presente en el sistema.

El script utiliza un servidor NTP genérico (ntp.empresa.local), que puede ser sustituido fácilmente por uno interno o externo según el entorno del usuario.

#!/bin/bash

set -e

# === Variables ===
NTP_SERVER="${NTP_SERVER:-ntp.ejemplo.local}"
LOGFILE="/var/log/time_sync_config.log"

# === Función de log ===
log() {
    local MSG="$1"
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $MSG" | tee -a "$LOGFILE"
}

# === Requiere root ===
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log "Este script debe ejecutarse como root."
        exit 1
    fi
}

# === Detectar distribución del sistema operativo ===
detect_os() {
    if [[ -f /etc/os-release ]]; then
        . /etc/os-release
        OS_ID=$ID
        OS_VERSION=$VERSION_ID
        log "Sistema detectado: $OS_ID $OS_VERSION"
    else
        log "No se pudo detectar el sistema operativo."
        exit 1
    fi
}

# === Detectar qué servicio de tiempo está presente ===
detect_time_service() {
    for svc in chronyd ntpd ntpsec-timesyncd systemd-timesyncd; do
        if systemctl list-unit-files | grep -q "^$svc"; then
            TIME_SERVICE="$svc"
            log "Servicio detectado: $TIME_SERVICE"
            return
        fi
    done

    TIME_SERVICE="none"
    log "No se encontró ningún servicio de tiempo instalado."
}

# === Configurar chronyd ===
configure_chrony() {
    log "Configurando chrony..."
    CONF_FILE="/etc/chrony.conf"
    [[ -f /etc/chrony/chrony.conf ]] && CONF_FILE="/etc/chrony/chrony.conf"

    sed -i 's/^server /# &/' "$CONF_FILE"
    echo "server $NTP_SERVER iburst" >> "$CONF_FILE"

    systemctl enable chronyd
    systemctl restart chronyd
    log "chrony configurado con $NTP_SERVER"
}

# === Configurar ntp ===
configure_ntp() {
    log "Configurando ntp..."
    CONF_FILE="/etc/ntp.conf"

    sed -i 's/^server /# &/' "$CONF_FILE"
    echo "server $NTP_SERVER iburst" >> "$CONF_FILE"

    systemctl enable ntp
    systemctl restart ntp
    log "ntp configurado con $NTP_SERVER"
}

# === Configurar ntpsec ===
configure_ntpsec() {
    log "Configurando ntpsec..."
    CONF_FILE="/etc/ntp.conf"

    sed -i 's/^server /# &/' "$CONF_FILE"
    echo "server $NTP_SERVER iburst" >> "$CONF_FILE"

    systemctl enable ntpsec-timesyncd
    systemctl restart ntpsec-timesyncd
    log "ntpsec configurado con $NTP_SERVER"
}

# === Configurar systemd-timesyncd ===
configure_systemd_timesyncd() {
    log "Configurando systemd-timesyncd..."
    CONF_FILE="/etc/systemd/timesyncd.conf"

    sed -i 's/^NTP=.*/# &/' "$CONF_FILE" || true
    sed -i 's/^#NTP=.*/# &/' "$CONF_FILE" || true
    grep -q "^NTP=" "$CONF_FILE" || echo "NTP=$NTP_SERVER" >> "$CONF_FILE"

    systemctl enable systemd-timesyncd
    systemctl restart systemd-timesyncd
    log "systemd-timesyncd configurado con $NTP_SERVER"
}

# === Instalar y configurar ntp si no hay ninguno ===
install_and_configure_ntp() {
    log "Instalando y configurando ntp..."
    if [[ "$OS_ID" =~ (debian|ubuntu) ]]; then
        apt update -y
        apt install -y ntp
    elif [[ "$OS_ID" =~ (rhel|centos|rocky|almalinux) ]]; then
        yum install -y ntp
    else
        log "Distribución no soportada para instalar ntp."
        exit 1
    fi
    TIME_SERVICE="ntpd"
    configure_ntp
}

# === Lógica principal ===
main() {
    check_root
    detect_os
    detect_time_service

    case "$TIME_SERVICE" in
        chronyd)
            configure_chrony
            ;;
        ntpd)
            configure_ntp
            ;;
        ntpsec-timesyncd)
            configure_ntpsec
            ;;
        systemd-timesyncd)
            configure_systemd_timesyncd
            ;;
        none)
            install_and_configure_ntp
            ;;
        *)
            log "Servicio de tiempo desconocido: $TIME_SERVICE"
            exit 1
            ;;
    esac

    log "Configuración de sincronización horaria completada correctamente."
    log "SUCCESS"
}

main

Objetivo

Permitir la configuración automática y uniforme del servicio de sincronización horaria en sistemas Linux, adaptándose dinámicamente a la distribución y al servicio de tiempo instalado. En caso de no detectar ninguno, se encargará de instalar y configurar el servicio ntp.

Servicios Soportados

El script detecta y configura automáticamente los siguientes servicios de sincronización horaria:

  • chronyd
  • ntpd
  • ntpsec-timesyncd
  • systemd-timesyncd

Si no se detecta ninguno, se instala y configura ntpd utilizando el gestor de paquetes correspondiente.

Personalización

El script utiliza una variable NTP_SERVER que puede ser definida como variable de entorno, o tomará por defecto el valor ntp.empresa.local. Esto permite adaptar el script a entornos corporativos con servidores NTP internos.

Funcionamiento del Script

1. Requisitos y Comprobaciones Iniciales

  • Verifica que se ejecuta con privilegios de root.
  • Detecta la distribución y versión del sistema operativo.
  • Detecta si ya hay algún servicio de tiempo instalado.

2. Configuración por Servicio

Para cada servicio detectado, el script:

  • Comenta las líneas existentes de servidores NTP.
  • Añade el servidor definido ($NTP_SERVER).
  • Activa y reinicia el servicio correspondiente.

3. Instalación Automática

En caso de no detectarse ningún servicio, se instala ntp mediante apt o yum, según la distribución.

Registro de Ejecución

Todas las operaciones se registran en /var/log/time_sync_config.log para facilitar auditoría y resolución de problemas.

Ejecución del Script

sudo ./configurar_ntp.sh

También puede definirse un servidor NTP personalizado en la ejecución:

NTP_SERVER=ntp.midominio.org sudo ./configurar_ntp.sh

Ventajas

  • Automatización completa: No requiere intervención manual.
  • Adaptable: Funciona en distribuciones Debian/Ubuntu y RHEL/CentOS/Rocky/AlmaLinux.
  • Auditable: Todo el proceso queda registrado.
  • Seguridad: Requiere permisos de root para garantizar cambios efectivos.

Conclusión

Este script proporciona una solución fiable y extensible para estandarizar la sincronización horaria en entornos Linux heterogéneos. Ideal para entornos corporativos, despliegues automatizados y tareas de hardening del sistema.

Para mejorar la precisión o redundancia, puede modificarse el valor de NTP_SERVER para incluir múltiples servidores NTP o usar configuraciones de pools según las necesidades específicas de la organización.

Compartir:

Binario 0
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.