Unión a Dominio Active Directory de un 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

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:

  1. Validación de privilegios root.
  2. Verificación de variables requeridas o argumentos.
  3. Detección de la distribución Linux.
  4. Instalación automática de dependencias necesarias.
  5. Resolución DNS del dominio.
  6. Verificación de membresía existente.
  7. Unión al dominio AD.
  8. 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:

VariableDescripciónObligatoriaEjemplo
DOMAIN_NAMENombre del dominio (FQDN)✅ Síexample.local
ORGANIZATIONAL_UNITRuta de la OU donde crear el objeto del equipo (LDAP)❌ No"OU=Servidores,DC=example,DC=local"
AD_USER_NAMEUsuario con permisos para unir equipos al dominio✅ Síadminjoin
AD_PASSWORDContraseña del usuario✅ Sí
FORCE_RESTARTReiniciar tras la unión (true o vacío)❌ Notrue

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 o ntpd).
  • 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 y realmd).
  • 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:

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.