Unirse a un dominio de Active Directory desde un sistema Linux puede ser un proceso complejo, especialmente en entornos empresariales heterogéneos. El script ad_join.sh
automatiza este procedimiento para sistemas basados en Debian/Ubuntu y Red Hat/CentOS/Rocky, permitiendo una integración sencilla, segura y reproducible.
Este artículo explica el funcionamiento del script, sus requisitos, cómo utilizarlo y las mejores prácticas para su implementación en entornos de producción.
Funcionalidad del Script
ad_join.sh
realiza los siguientes pasos:
- Validación de privilegios root.
- Verificación de variables requeridas o argumentos.
- Detección de la distribución Linux.
- Instalación automática de dependencias necesarias.
- Resolución DNS del dominio.
- Verificación de membresía existente.
- Unión al dominio AD.
- Reinicio opcional del sistema.
#!/bin/bash
set -e
# === Variables de entorno o argumentos ===
DOMAIN_NAME="${DOMAIN_NAME:-$1}"
OU_PATH="${ORGANIZATIONAL_UNIT:-$2}"
AD_USER="${AD_USER_NAME:-$3}"
AD_PASS="${AD_PASSWORD:-$4}"
FORCE_RESTART="${FORCE_RESTART:-$5}"
LOGFILE="/var/log/ad_join.log"
# === Logging ===
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 "Access Denied. Please run as root."
exit 1
fi
}
# === Comprueba entrada ===
check_required_inputs() {
[[ -z "$DOMAIN_NAME" ]] && { log "DOMAIN_NAME is required"; exit 1; }
[[ -z "$AD_USER" ]] && { log "AD_USER_NAME is required"; exit 1; }
[[ -z "$AD_PASS" ]] && { log "AD_PASSWORD is required"; exit 1; }
}
# === Detección de sistema operativo ===
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS_ID=$ID
OS_VERSION_ID=$VERSION_ID
else
log "Unsupported Linux distribution"
exit 1
fi
}
# === Instala dependencias si faltan ===
install_dependencies() {
log "Checking and installing required packages..."
if [[ "$OS_ID" =~ (debian|ubuntu) ]]; then
apt update -y
DEBIAN_FRONTEND=noninteractive apt install -y realmd sssd adcli oddjob oddjob-mkhomedir samba-common-bin packagekit
elif [[ "$OS_ID" =~ (centos|rhel|rocky|almalinux) ]]; then
yum install -y realmd sssd adcli oddjob oddjob-mkhomedir samba-common-tools
else
log "Unsupported OS: $OS_ID"
exit 1
fi
}
# === Comprueba resolución DNS ===
check_dns_resolution() {
if getent hosts "$DOMAIN_NAME" > /dev/null; then
log "DNS resolution for $DOMAIN_NAME succeeded"
else
log "Cannot resolve domain name $DOMAIN_NAME"
exit 1
fi
}
# === Comprueba si ya es miembro de dominio ===
check_domain_membership() {
realm list | grep -iq "^realm-name: $DOMAIN_NAME"
}
# === Unión al dominio ===
join_domain() {
log "Attempting to join domain $DOMAIN_NAME..."
echo "$AD_PASS" | realm join --user="$AD_USER" "$DOMAIN_NAME" ${OU_PATH:+--computer-ou="$OU_PATH"} || {
log "Domain join failed"
exit 1
}
log "Domain join succeeded"
}
# === Reinicia si se solicita ===
restart_if_requested() {
if [[ "$FORCE_RESTART" == "true" ]]; then
log "Restarting system in 1 minute..."
shutdown -r +1 "System will restart to complete domain join."
fi
}
# === Programa principal ===
main() {
check_root
check_required_inputs
detect_os
install_dependencies
log "********************************************************************************"
log "Starting domain join process for $DOMAIN_NAME"
if check_domain_membership; then
log "System is already joined to $DOMAIN_NAME"
exit 0
fi
check_dns_resolution
join_domain
restart_if_requested
log "****************************** finished ****************************************"
}
main
Variables y Parámetros
El script acepta las siguientes variables de entorno o argumentos:
Variable | Descripción | Obligatoria | Ejemplo |
---|---|---|---|
DOMAIN_NAME | Nombre del dominio (FQDN) | ✅ Sí | example.local |
ORGANIZATIONAL_UNIT | Ruta de la OU donde crear el objeto del equipo (LDAP) | ❌ No | "OU=Servidores,DC=example,DC=local" |
AD_USER_NAME | Usuario con permisos para unir equipos al dominio | ✅ Sí | adminjoin |
AD_PASSWORD | Contraseña del usuario | ✅ Sí | — |
FORCE_RESTART | Reiniciar tras la unión (true o vacío) | ❌ No | true |
Ejemplo de uso interactivo seguro
read -p "Domain Name: " DOMAIN_NAME
read -p "Username: " AD_USER_NAME
read -s -p "Password: " AD_PASSWORD
echo
export DOMAIN_NAME AD_USER_NAME AD_PASSWORD
sudo ./ad_join.sh
Esto evita que las credenciales queden registradas en el historial del shell.
Estructura Interna
El script se estructura en bloques bien definidos:
Verificación de entorno
check_root
check_required_inputs
detect_os
Se aseguran los privilegios de root, la disponibilidad de entradas necesarias y la compatibilidad con la distribución Linux.
Instalación de dependencias
install_dependencies
Utiliza apt
o yum
para instalar herramientas como realmd
, sssd
, adcli
, etc.
Unión al dominio
join_domain
Ejecuta realm join
con las credenciales proporcionadas, y opcionalmente especifica una OU.
Reinicio (opcional)
restart_if_requested
Si se solicita, se programa un reinicio en un minuto.
Requisitos previos
- DNS correctamente configurado con resolución hacia los controladores de dominio.
- Reloj sincronizado (recomendado: usar
chrony
ontpd
). - Usuario de AD con privilegios para unir equipos al dominio.
- Acceso root en la máquina Linux.
Casos de uso comunes
- Provisionamiento automático de equipos Linux en entornos corporativos.
- Integración de servidores a políticas de GPO (mediante
sssd
yrealmd
). - Auditoría y control centralizado mediante Active Directory.
Seguridad y buenas prácticas
- No almacenar contraseñas en texto plano. Usar variables de entorno o entrada interactiva.
- Limitar el acceso al script y al archivo de log (
/var/log/ad_join.log
). - Auditar el sistema tras la unión: verificar
/etc/sssd/sssd.conf
,realm list
, etc.
Registro (Log)
Toda la actividad del script se guarda en /var/log/ad_join.log
, incluyendo errores, intentos de unión y acciones administrativas. Esto facilita la trazabilidad y depuración.
Conclusión
El script ad_join.sh
proporciona una solución robusta y automatizada para unir sistemas Linux a Active Directory. Reduce errores humanos, estandariza procedimientos y acelera el despliegue de máquinas en entornos empresariales.
Compartir: