Procedimiento para creación remota de usuarios de zimbra

El primer paso es conocer el comando y los parámetros a usar con zimbra.
Este comando es zmprov y se debe ejecutar con el usuario de zimbra

# su - zimbra

Para crear una cuenta con mucho detalle se hace de la siguiente manera:


zimbra@mail:~$ /opt/zimbra/bin/zmprov ca qqq@usac.edu.gt majemaje1 displayName 'Jorge Emilio Villatoro Castillo' givenName 'Jorge Emilio' sn 'Villatoro Castillo' street 'Sótano Edificio de Rectoría Deptartamento de Procesamiento de Datos' telephoneNumber '25439651' postalCode '98082301'

Ello mostrará información como las fotos adjuntas de la herramienta web de administración:






Dado que se nos ha requerido crear la cuenta de forma automática, ello requiere de ejecución remota, con parámetros previamente validados de los usuarios que solicitan vía un formulario web el requerimiento.
Se ha elegido rsh por su simpleza, y agregado a esto se utiliza encripción asimétrica para la ejecución.

Dado que usar root es muy riesgoso y usar el usuario de zimbra también, se utiliza un usuario creado únicamente para este propósito (sin home y sin password), lo llamaremos cuca (Creador de Usuarios para Crearlos Automáticamente) y le asignámos un rol de sudo.

#echo "cuca ALL=NOPASSWD:/opt/zimbra/bin/zmprov *" > /etc/sudoers

También debemos agregar al usuario cuca en el grupo de zimbra listado en /etc/group
Con ello nos aseguramos que este usuario pueda ejecutar ese comando específicamente y no otro.

Para que sea muy seguro el rsh usamos rsa y creamos el conjunto de llaves de la siguiente manera:

#ssh-keygen -t rsa -b 2048 -f /home/usuario/llaves/llavin-rsa

No colocamos ninguna frase, tan sólo se oprime la tecla de ENTER dos veces, y al final del proceso contamos con nuestro par de llaves, la pública y la privada.
Seguidamente se copia la llave pública en el servidor remoto donde queremos ejecutar el comando zmprov.

# scp /home/usuario/llaves/llavin-rsa.pub usuarioremoto@serverremoto:/home/usuarioremoto/.ssh

Dentro del servidor remoto ejecutamos lo siguiente:

# cd /home/usuarioremoto/.ssh
# cat llavin-rsa.pub >> authorized_keys

Con esto realizado, ya es posible ejecutar comandos desde nuestra máquina local a la remota, pero es posible ponerle aún más seguridad y asegurar que solamente esp osible leer esa clave desde una determinada ip, por lo que se agrega al inicio del archivo de ahtorized_keys lo siguiente:

from="10.0.0.10"

por lo que el archivo quedaría así:

from="10.0.0.10" ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwVr3EDNpC0tOXVC1ABHJSyORo3S4YCzoy
JbRFRE4FQ8z8vcWT+Y0b3e0OxGP8ZjeOzlS8uk2ysSX1WiSoQ3RqZFM6zaUGR1rLr
qqtmZpA2WIs0bGGnv6LtQKb6GNrIEjLJRZXFU3UPOqcItrS/TJWUGj7EXEuLJ3WUM
O32ahbDiSynf9kMSqbEiMI9xa9UbsegzfuylX5p8jGbidxLXAonkAJiGrplVTGkWckH0
GRoZgCgZrOzy7lP3TCqbYPYUDZeMrpEz2DK1gTv45OSnCTT6kKKjQAC6udEEW64
L0aDIKWeo3UEzEQPiHzZX0PsbaEbGaR08iDZ6xPhieRrRQ== jaimeco@10.10.0.10


Bien, de manera que con esto ya es posible ejecutar remotamente el comando zmprov desde la máquina con dirección IP 10.10.0.10 conectando de la siguiente forma:

Máquina local

$ ssh -i /home/usuario/llaves/llavin-rsa usuario@serverremoto "/opt/zimbra/bin/zmprov ga qqq@usac.edu.gt"

# name qqq@usac.edu.gt
cn: Jorge Emilio Villatoro
description: datos de ubicacion
displayName: Jorge Emilio Villatoro
givenName: Jorge Emilio
initials: 980829
mail: qqq@usac.edu.gt
objectClass: organizationalPerson
objectClass: zimbraAccount
objectClass: amavisAccount
sn: Villatoro
uid: qqq
userPassword: VALUE-BLOCKED
[...]

Por lo que tenemos asegurado a un único usuario, sin contraseña de sistema, para que pueda remotamente ejecutar únicamente un y sólo un comando únicamente desde una determinada ip con una única llave privada de encripción asimetrica.


Adicional a ello luego modifiqué el archivo autorized_keys en el server remoto de la siguiente forma:

from="10.0.0.7",command="/home/cuca/.ssh/valido" ssh-rsa AAAAB3.....{el resto de la llave}


El contenido del script /home/cuca/.ssh/valido es:
*******************************************************************
#!/usr/bin/perl -w
# Script para validacion de comando de ssh desde server remoto.
# Autores: joser-at-usac.edu.gt & jaimeco-at-usac.edu.gt
# Versión 1.0
# Fecha creacion: 28JUN2010
# Fecha modificacion: 28JUN2010
# Motivo Modificacion:--

$zimbra=substr($ENV{SSH_ORIGINAL_COMMAND},0,22);
#print "$zimbra\n";

if($zimbra eq "/opt/zimbra/bin/zmprov")
{
system($ENV{SSH_ORIGINAL_COMMAND});
}

exit 0;
********************************************************************

Se eligió perl porque la variable de ambiete SSH_ORIGINAL_COMMAND no pasaba bien a la STDIN con /bin/sh.
Cualquier otro comando que no contenga /opt/zimbra/bin/zmprov NO será ejecutado. Aumentando la seguridad de nuestro procedimiento.

A continuación el script de creación remota de usuarios de correo zimbra utilizando perl.

***********************************************************************************
#!/usr/bin/perl -w

# Script para crear cuentas de correo electrónico automaticamente a zimbra 6.0.5
# para la USAC, pasando argumentos de php de rmendizabal-at-usac.edu.gt
# y enviando el comando vía ssh con encripcion asimetrica hacia mail.usac.edu.gt
# Autor: Jaime Cabrera jaimeco-at-usac.edu.gt
# Version: 1.0
# Fecha creacion: 05JUL2010
# Fecha ultima modificacion: 05JUL2010

#print "@ARGV\n"; # Todos los argumentos pasados con "".
#print "$ARGV[0]\n"; # Cuenta en la forma usuario@dominio.
#print "$ARGV[1]\n"; # contraseña.
#print "$ARGV[2]\n"; # displayName.
#print "$ARGV[3]\n"; # givenName.
#print "$ARGV[4]\n"; # sn.
#print "$ARGV[5]\n"; # street.
#print "$ARGV[6]\n"; # telephoneNumber.
#print "$ARGV[7]\n"; # postalCode. # Acá coloco el número de regper.

#print "\n";
$c_='"';
$crear = "ssh -i /home/cuca/rsa-keys/llave-zimbra cuca\@mail.usac.edu.gt '/opt/zimbra/bin/zmprov ca $c_$ARGV[0]$c_ ";
$crear = $crear . " $c_$ARGV[1]$c_ displayName $c_$ARGV[2]$c_ givenName $c_$ARGV[3]$c_ sn $c_$ARGV[4]$c_";
$crear = $crear . " street $c_$ARGV[5]$c_ telephoneNumber $c_$ARGV[6]$c_ postalCode $c_$ARGV[7]$c_ zimbraPasswordMustChange TRUE' ";

#print "$crear\n\n";

# Creando la cuenta
system($crear);

# Logs sobre la creación dirigidos a correosnuevos.log
$FECHA = `date +%d%b%Y_%H:%M:%S`;
chomp($FECHA);
open(LOG,">>correosnuevos.log");
$bitacora = "$FECHA --> $ARGV[0], $ARGV[2], $ARGV[5], Tel: $ARGV[6].";
print LOG "$bitacora\n";

exit 0;

******************************************************************************

El script tiene la peculiaridad que el usuario debe cambiar su contraseña al ingresar la primera vez, con esto se garantiza la confidencialidad.

Comentarios

  1. ¡¡Esto me irá de fábula!!

    Veo que controlas Zimbra así que aprovecho para lanzarte una pregunta.

    Estoy intentando instalar un servidor FTP en el mismo servidor que ZCS 6 para aprovechar los usuarios del ldap pero no encuentro suficiente documentación. Creía que con un FTP con soporte para pam tendría suficiente pero ahora veo que el ldap de zimbra no define la home folder del usuario así que no sé como enjaular los usuarios FTP dentro de sus respectivas carpetas. ¿Alguna idea?

    Solo he sido capaz de encontrar lo siguiente:

    http://www.zimbra.com/forums/developers/1065-example-using-zimbra-s-ldap-server-other-things-besides-email.html

    El script parece que soluciona mis necesidades pero no me gusta emplear scripts que no entiendo lo que hacen.

    Gracias!!!!

    ResponderEliminar
  2. Te soy honesto, no entiendo bien que es lo que queres hacer con el FTP. Aunque zimbra tiene comandos para consultar ldap, por ejemplo:

    #zmprov sa maje@dominio.com

    Como ya posteaba macc en este mismo sitio podría ayudarte a autenticar.

    ResponderEliminar
  3. El comando completo es:

    #zmprov sa mail=maje@dominio.com

    ResponderEliminar
  4. Hola ... gracias me sirvio artisimo todo lo que dice aqui ... lo modifique un poco haciendolo como un menu, todavia me faltan los scrits de modificacion y eliminacion o cierre de la cuenta. Les adjunto el codigo modificado. Una vez mas Gracias !!

    #!/usr/bin/perl -w

    print "Datos CREACION\n";
    print "----------------\n\n";
    print "Cuenta en la forma nombre.apellido:\n";
    chomp($cuenta=<>);
    $bf="@";
    $cuenta=$cuenta.$bf."bancofie.com.bo";
    print "\n";
    print "Nombre y Apellido:\n";
    chomp($nombre=<>);
    print "\n";
    $comilla="'";
    print "Cargo:\n";
    chomp($cargo=<>);
    print "\n";
    print "Nombre a mostrar:\n";
    chomp($nombre_mostrar=<>);
    print "\n";
    $grupo_mostrar="grupo".$bf."bancofie.com.bo";
    print "Grupo de la forma $grupo_mostrar:\n";
    chomp($grupo=<>);
    print "\n";
    print "Tamaño bandeja (bajisimo, bajo, medio, nacional, alto):\n";
    chomp($bandeja=<>);
    print "\n";
    $pass="bancofie";
    $bfservidor=$bf."servidor";

    print "\n";
    $doble_comilla='"';
    $crear1 = "ssh cur$bfservidor.bancofie.com.bo $doble_comilla/opt/zimbra/bin/zmprov ca $cuenta password displayName $comilla$nombre_mostrar$comilla givenName $comilla$nombre$comilla street $comilla$cargo$comilla$doble_comilla";
    print "Crear1: $crear1\n\n";
    system($crear1);
    $crear2 = "ssh cur$bfservidor.bancofie.com.bo $doble_comilla/opt/zimbra/bin/zmprov adlm $grupo $cuenta$doble_comilla";
    print "Crear2: $crear2\n\n";
    system($crear2);
    $crear3 = "ssh cur$bfservidor.bancofie.com.bo $doble_comilla/opt/zimbra/bin/zmprov sac $cuenta $bandeja$doble_comilla";
    print "Crear3: $crear3\n\n";
    system($crear3);
    $crear4 = "ssh cur$bfservidor.bancofie.com.bo $doble_comilla/opt/zimbra/bin/zmprov sp $cuenta $pass$doble_comilla";
    print "Crear4: $crear4\n\n";
    system($crear4);
    $crear5 = "ssh cur$bfservidor.bancofie.com.bo $doble_comilla/opt/zimbra/bin/zmprov ma $cuenta zimbraPasswordMustChange TRUE$doble_comilla";
    print "Crear5: $crear5\n\n";
    system($crear5);

    $crear = "$doble_comilla/opt/zimbra/bin/zmprov ca $cuenta password displayName $comilla$nombre_mostrar$comilla givenName $comilla$nombre$comilla street $comilla$cargo$comilla adlm $grupo $cuenta$doble_comilla sac $cuenta $bandeja$doble_comilla sp $cuenta $pass ma $cuenta zimbraPasswordMustChange TRUE$doble_comilla";

    #addDistributionListMember $grupo
    print"\n\n";
    print "$crear\n\n";

    # Logs sobre la creación dirigidos a correosnuevos.log
    $FECHA = `date +%d%b%Y_%H:%M:%S`;
    chomp($FECHA);
    open(LOG,">>correosnuevos.log");
    $bitacora = "$FECHA --> $cuenta, $nombre_mostrar, $cargo.";
    print LOG "$bitacora\n";

    exit 0;

    ResponderEliminar

Publicar un comentario

Entradas populares