Esta recetilla explica como cambiar la password en un Active Directory, como el de la UCLM. De paso os pongo un scriptito para facilitar un poco lidiar con esas “políticas de seguridad” tan agresivas que les ha dado por poner a las universidades…

Ingredientes

Todos son paquetes debian:

  • pwgen
  • krb5-user
  • coreutils
  • scriptillo de esta receta

Configurando el KDC y el admin server

Bueno, esto ya lo he contado, así que pasamos al siguiente punto. Venga, va, para los vagos, ahí va lo que teneis que poner en el /etc/krb5.conf si estais en la UCLM:

...
[libdefaults]
        default_realm = UCLM.ES
...
[realms]
        UCLM.ES = {
                kdc = alarcos.uclm.es
                admin_server = alarcos.uclm.es
        }
...

Obviamente si no estais en la UCLM tendreis que averiguar vuestro Kerberos realm, vuestro KDC y vuestro admin server. En Active Directory creo que le llaman PDC, que alguien me corrija si no tiene nada que ver.

Cambiando la clave con kpasswd

Está chupao cambiar la clave, incluso si ha expirado:

$ kpasswd usuario

Tonto, ¿eh? Si usais varios dominios o no teneis puesto el default_realm podeis usar:

$ kpasswd usuario@UCLM.ES

Políticas de seguridad y de inseguridad

Una regla de sentido común es cambiar frecuentemente la clave y que la clave no sea trivial o deducible. De esta regla de sentido común surge un ente llamado “política de claves” que es lo mismo pero por la fuerza. Osea, que será el propio Active Directory el que te fuerce a cambiar tu clave periódicamente. Y no contento con esto además exigirá que sea diferente a cualquiera de las recientes, y encima pedirá que tenga mayúsculas y minúsculas, y que tenga números, o caracteres de puntuación.

Los que tenemos la memoria de un grillo lo tenemos fácil. Un bonito postit pegado en el monitor. Modelo de seguridad empresarial…

Globalmente a todas estas cositas que nos hacen la vida más interesante se le llama política de seguridad. Aquí, en la UCLM, gozamos de esto en muchas áreas. Evidentemente no voy a criticar yo esta política, pero tengo que hacerlas convivir con mis limitaciones… ¿de qué estábamos hablando…? ¡Ah, si!

Renovando la clave

A veces tienes una clave a la que le has cogido cariño y la quieres tener otro poquito más contigo. Según la política de la UCLM la tendrías que eliminar de tu vida para siempre… ¡qué pena! ¿no?

Bueno, hay una solución, cambias la clave por otra cualquiera, luego por otra más, luego por otra más… y al final vuelves a cambiar la clave por la original. Fácil, ¿eh? ¿Cuántas veces hay que cambiar? Mmmm, interesante pregunta, hace medio año parecía que bastaba con 11, ahora parece que se necesitan 70. Ya veis que ni nos podemos plantaer hacerlo de forma interactiva.

Cambiando la clave de forma no interactiva

Aunque no lo mencione la página de manual kpasswd permite su uso no interactivo:

$ printf "clave-antigua\nclave-nueva\nclave-nueva\n" | kpasswd usuario

Y esto es precisamente lo que aprovecho en el scriptito siguiente.

Un scriptillo

#!/bin/bash

declare -a REQUIRED
REQUIRED=(
    "printf"
    "kpasswd"
    "seq"
    "cat"
    "pwgen"
    )

# chpw OLD_PASSWD NEW_PASSWD
#
# Change Kerberos/Active Directory password
chpw() {
    if [ "$DEBUG" ]; then
        echo "$1 -> $2"
        return 0
    fi

    if ! printf "$1\n$2\n$2\n" | kpasswd "$USER" >/dev/null ; then
        echo "Error setting passwd! I believe last password was '$1'" 1>&2
        return 1
    fi
}

# force_chpw OLD_PASSWD NEW_PASSWD
#
# Change Kerberos/Active Directory password circumventing the password
# change policy
force_chpw() {
    declare -a TMPPWD
    TMPPWD=( $(pwgen -c -n -N $NFORCE 10 ) )

    if ! chpw "$1" "${TMPPWD[0]}" ; then
        return 1
    fi
    [ -z "$DEBUG" ] && printf "."

    for i in $(seq 0 $((${#TMPPWD[@]} - 2 )) ) ; do
        if ! chpw "${TMPPWD[$i]}" "${TMPPWD[ $(($i + 1 )) ]}" ; then
            return 1
        fi
        [ -z "$DEBUG" ] && printf "."
    done

    if chpw "${TMPPWD[$((${#TMPPWD[@]} - 1))]}" "$2" ; then
        printf "\nYour password is now '$2'\n"
    fi
}

do_help() {
    cat <<EOF
Usage: $0 [OPTIONS]
Change Kerberos/Active Directory passwords.

   --user USERNAME      Set the user name (Kerberos principal).
   --oldpw PASSWORD     Previous password. By default prompt the user.
   --newpw PASSWORD     New password. By default prompt the user.
   --force NUM          Circumvent the password policy forcing NUM password
                          changes.
   --help               This help.
EOF
}

main() {
    CHPWCMD=chpw
    while test $# -gt 0 ; do
        case "$1" in
            --user)
                USER="$2"
                shift
                ;;
            --oldpw)
                OPWD="$2"
                NPWD="$2"
                shift
                ;;
            --newpw)
                NPWD="$2"
                shift
                ;;
            --force)
                CHPWCMD=force_chpw
                NFORCE="$(( $2 ))"
                shift
                ;;
            --help)
                do_help
                exit 0
                ;;
            *)
                do_help
                exit 1
                ;;
        esac
        shift
    done

    [ "z$OPWD" = z ] && printf "Previous password: " && read -s OPWD && echo
    [ "z$NPWD" = z ] && printf "New password: "      && read -s NPWD && echo

    $CHPWCMD "$OPWD" "$NPWD"
}


# Check required programs
for i in `seq 0 $((${#REQUIRED[@]} - 1))` ; do
    if ! type -t "${REQUIRED[$i]}" > /dev/null ; then
        echo "Missing required command '${REQUIRED[$i]}'" 1>&2
        exit 1
    fi
done

main "$@"

Autoexplicativo y con ayuda, ¿qué más quereis?

Ejemplos

Supongamos que el scriptillo se llama chpw y que lo tengo en mi PATH.

  • Renovar la clave:
$ chpw --force 70 --oldpw MiClave
......................................................................
Your password is now 'MiClave'
  • Cambiar la clave:
$ chpw --oldpw MiClaveAntigua --newpw MiClaveNueva
Your password is now 'MiClaveNueva'
  • Renovar la clave de otro usuario. Por ejemplo, cuando te llaman por teléfono desde la playa diciendo que no pueden leer el correo porque les ha expirado la password.
$ chpw --force 70 --user Usuario --oldpw MiClave
......................................................................
Your password is now 'MiClave'
  • Poner las claves de forma interactiva (sin echo):
$ chpw --force 70
Previous password:
New password:
......................................................................
Your password is now 'XXXX'

Precauciones

Si hay algún error que no cunda el pánico. El scriptillo debería decir la última clave que funcionó correctamente:

$ chpw --force 10
Previous password:
New password:
..........
Error setting passwd! I believe last password was 'Eb1en4choo'

Así que solo queda cambiarla:

$ chpw --force 60 --oldpw Eb1en4choo --newpw MiClave
............................................................
Your password is now 'MiClave'

Por supuesto si pasas las claves como argumentos cuidadito con la historia de bash, a no ser que quieras tener un backup de tus claves en texto plano…

export HISTFILE=/dev/null

De todas formas ya sabes que si metes la pata tres veces seguidas conseguirás un bonito bloqueo de tu cuenta. Por eso si quieres probar primero con gaseosa usa el modo de depuración.

$ DEBUG=1 chpw --force 5 --oldpw MiClave
MiClave -> DaiPeni3au
DaiPeni3au -> leo2Iequoh
leo2Iequoh -> CiNoong4za
CiNoong4za -> ChieBeb7ga
ChieBeb7ga -> eeJ4epheiG
eeJ4epheiG -> MiClave

Your password is now 'MiClave'

Disclaimer

Standard disclaimer applies. Si bloqueas tu cuenta o te insultan cuando pidas que te reseteen la password, ya sabes: se siente.



blog comments powered by Disqus