# Unión a Dominio Active Directory de un Linux

- Link: https://binariocero.com/linux/union-a-dominio-active-directory-de-un-linux
- Published: 2025-08-02T11:15:56+02:00
- Author: Juan José Fernández Durán

![Loading](https://binariocero.com/wp-content/plugins/page-views-count/ajax-loader-
2x.gif)

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.**

    ```wp-block-code
    #!/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

    ```wp-block-preformatted
    read -p "Domain Name: " DOMAIN_NAMEread -p "Username: " AD_USER_NAMEread -s -p "Password: " AD_PASSWORDechoexport DOMAIN_NAME AD_USER_NAME AD_PASSWORDsudo ./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

    ```wp-block-preformatted
    check_rootcheck_required_inputsdetect_os
    ```

Se aseguran los privilegios de root, la disponibilidad de entradas necesarias y 
la compatibilidad con la distribución Linux.

### Instalación de dependencias

    ```wp-block-preformatted
    install_dependencies
    ```

Utiliza `apt` o `yum` para instalar herramientas como `realmd`, `sssd`, `adcli`,
etc.

### Unión al dominio

    ```wp-block-preformatted
    join_domain
    ```

Ejecuta `realm join` con las credenciales proporcionadas, y opcionalmente especifica
una OU.

### Reinicio (opcional)

    ```wp-block-preformatted
    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.
