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: