Proteger un sitio web con autenticación en Apache

Categoría(s): Apache, Línea de comandos, Website

En mas de una ocasión estamos tentado a utilizar nuestro sitio web para publicar un directorio, y así tener un acceso expedito a la información que queramos tomar en cualquier momento. Sin embargo, puede suceder  que te encuentras de manos atadas porque no puedes acceder debido a las restricciones puesta por el Firewall de la oficina donde se te “prendió el bombillo” y quieres buscar allí lo que necesitas

En caso de restricciones la mejor manera que acceder es via HTTP -puerto- que siempre estará abierto y disponible.

En ese caso, cae bien ir a tu propio sitio web y bajar lo necesario. No obstante, es importante tener una manera de garantizar que tu información sólo sea accesible por ti mismo –o a quienes considere confiable- con algún tipo de mecanismo de autenticación.

En este pequeño tutorial,  pondré un ejemplo de como hacerlo, considerando que tienes tu sitio web  con un VirtualHost declarado.

Suponiendo que la configuración de tu VirtualHost, sea mas o menos así:

    DocumentRoot "/usr/local/www/apache22/data"
    ServerName misitioweb.epico.net 
 
         Options Indexes +FollowSymLinks -Multiviews
          AllowOverride All
         Order allow,deny
         Allow from all
         RedirectMatch ^/$ "http://misitioweb.epico.net/personal/"

Es importante habilitar esta instrucción así, pues es la que activa el uso de las directivas en el archivo “.htaccess”.

AllowOverride All

Ahora crearé un archivo dentro del directorio “personal” que apunta a la URL publicada que servirá para invocar la autenticación del Apache, y lo salvaré como “.htaccess“:

AuthName "Mi Info Personal - Acceso exclusivo"
     AuthType Basic
     AuthUserFile /usr/home/jhon/documents/.htpasswd
     AuthGroupFile /dev/null
     require user jhon

Ahora crearé un archivo con los parámetros que se usaran para la autenticación:

htpasswd -c .htpasswd jhon

De esta manera, también estoy asignando la contraseña de acceso al usuario.

Además, si crees que a futuro podría necesitar darle acceso a otras personas, entonces se hará un cambio en el archivo “.htaccess“, y agregare las siguientes lineas:

AuthGroupFile AuthUserFile /usr/home/jhon/documents/.htgroup
require group member-users

Ahora elimino la línea:

 require user jhon

Para concluir, ahora sólo se necesita reiniciar el servidor web y comprobar el acceso a tu sitio web con una ventana semejante.

authorizationrequired-googlechrome

Seguir leyendo» Sin comentarios

Cambio de contraseña de cuentas en Zimbra

Categoría(s): Línea de comandos, Perl, Zimbra

La plataforma Zimbra brinda una interfaz gráfica que permite la administración de las cuentas de usuario. Sin embargo, cuando quiere delegar en otras personas –con limitado acceso- tareas frecuentes como el simple cambio de la contraseña de usuario  –siempre hay usuario que nunca anota y cada lunes olvidan sus claves– entonces es necesario poder cambiar la contraseña desde la  línea de comandos del sistema.

Aquí comparto un modesto script que he escrito en Perl, y que me ha servido de mucho.

#!/usr/bin/perl -w
# por WJPP, 30/4/2009
#
#  ultima edicion:
#  Thu Nov 12 16:01:40 VET 2009
#
#  CHANGELOGS
#
#  26/5/2009 - activar la solicitud de cambio
#               de contraseña.
#
#
# Objetivo: Asignar una nueva contraseña al usuario de
#               Zimbra en base a la fecha y hora al
#               momento que se procesa el cambio.
#
# version
my $vers = "1.3";
 
use strict;
use Term::ANSIColor;
use Digest::MD5 qw(md5 md5_hex md5_base64);
sub gdfs { # get date from system
# recibir fecha del sistema
  my ($sec,$min,$hour,$mday,$mon,$year,
       $wday,$yday,$isdst) = localtime time;
       return sprintf("%02d-%02d-%4d_%02d.%02d.%02d",
       $mday,$mon+1,$year+1900,$hour,$min,$sec);
}# endof gdfs 
 
my $fechahoy = &gdfs();
 
print color("green"),"\n\t Asignar nueva contraseña al usuario Zimbra - Vers. $vers \n",color("reset");
print "\t-----------------------------------------------------------\n";
 
if ($#ARGV != 0) { # valida entrada de argumento
    print color("magenta"),"\n\tUso: $0  \n",color("reset");
    print color("yellow"),"Debe indicar  email del usuario\n", color("reset");
    exit;
}
   my $emailx = $ARGV[0]; # email del usuario
   # tomo solo 8 caracteres del MD5 de la fecha
   my $md5pass = substr(md5_hex($fechahoy),0,8);
   print "\tEmail ......................: ";
   print color("bold blue"),$emailx,color("reset");print "\n";
   print "\tnueva contraseña asignada ..: ";
   print color("white on_blue"),$md5pass,color("reset");print "\n\n\n";
   ## actualiza la contraseña en el LDAP del Zimbra
   if ( system("su - zimbra -c \'zmprov sp $emailx $md5pass \' ") !=0) {
      die "No se pude actualizar la contraseña en el Zimbra\n" ; }
      else { # activa la solicitud de cambio de contraseña para el proximo inicio de sesion
         system("su - zimbra -c \'zmprov ma $emailx zimbraPasswordMustChange TRUE\' ");
         print color("white on_red"),"\t Notifique al usuario acerca de su nueva contraseña ",color("reset");print
"\n";
   } # endif system
die "Fin..\n";

ejemplo del uso:

sudo ./assignpass.pl prueba01@winner.sytes.net

Cabe destacar que al usar el sudo por supuesto el usuario que ejecuta el comando debe ser miembro de un grupo permitido.

Seguir leyendo» Sin comentarios

Remover correos diferidos en Zimbra

Categoría(s): Línea de comandos, Perl, Zimbra

Postfix gestiona los correos con ayuda de una serie de colas y asigna un ID a cada uno desde el momento que se envian o  se reciben, pasando por diversas etapas dependiendo de su estado de entrega o recepción.

Durante este proceso puede darse situaciones que se producen debido a dominio inexistentes, relay rechazados, “timeout in connection”, “connection refused”,  denegados por spam, etc, etc, que   causan que los correos sean pasado a una cola de diferidos -deferred/defer–. En este caso, dichos correos ocupan un espacio  de disco  así como recursos de sistema que manejan los intervalos  de tiempo para los proximos intentos de entrega a los buzones.

A fin de solventar esta situación, he escrito un script en Perl que se convierte en una pequeña herramienta conjunta al monitoreo,  que servirá para eliminar todos esos correos  indeseados y aligerar un poco el servidor de correo que en mi caso, está basado en Zimbra.

#!/usr/bin/perl
#
# por Willians Patiño, 5.11.2009, 2:56pm
# ultima edicion:
# jue nov  5 19:07:11 VET 2009
#
#  Postfix gestiona los correos con ayuda de una serie de colas
#  y asigna un ID a cada uno desde el momento que se envian o
#  se reciben. Durante este proceso puede darse situaciones, que
#  causen que los correos sean pasado a una cola de diferidos.
#  (deferred). En este caso, dichos correos ocupan un espacio
#  de disco  asi como recursos de sistema que manejan los intervalos
#  de tiempo para los proximos intentos de entrega a los buzones.
#
#  En este sentido, este script se convierte en una herramienta
#  adicional al monitoreo, a fin de eliminar todos estos correos
#  y reducir la carga de procesamiento de la plataforma de correos
#  Zimbra.-
 
#
# Objeto: Eliminar los corres diferidos por Zimbra, en base a un ID
# segun el dominio spammer.-
#
#
# Uso: deldefer.pl
#
# requerimiento: ser miembro del grupo zimbra para ejecucion
 
use strict;
use Term::ANSIColor;   ## colorear salida en pantalla
use File::Find;
use File::Basename;
 
# valida  argumentos
if ($#ARGV != 0) {
    print "\n\tUso: $0  \n";
    exit;
}
 
my $dominio = $ARGV[0];     # dominio a buscar
# directorio de diferidos en zimbra
my $directorio = "/opt/zimbra/data/postfix/spool/deferred";
# comando postfix en zimbra
my $POSTSUPER = "/opt/zimbra/postfix/sbin/postsuper";
 
print "\t Eliminar diferidos por $dominio\n";
# deferred
chdir($directorio) or die "no se pudo cambiar al directorio";
&rrod($directorio,$dominio);
 
die "fin..\n";
## end of program
 
sub rrod { #recursive reading of directory
   # Lectura recursiva de directorio
   my ($xdir, $xdom) = @_;
   print "buscar en $xdir\n";
   my @dir = @ARGV=qw(.);
   find(\&buscadir, @dir);
 
   sub buscadir {
      my $fpath=$File::Find::name;
      my $fname=basename($fpath);
      #print "Directorio: $fpath\n";
      #print "Archivo: $fname\n";
      my $foundcounter = 0;
      &fdif($fname, $xdom);
   }
} # end of rrod
 
sub fdif { # find domain inside file
   # buscar dominio en archivo
   my ($ffile, $fdomain) = @_;
   open (FILENAME, $ffile) or die "No puede abrir $ffile : $!";
 
  while (my $bufferfile = ) {
      #print "leyendo $bufferfile\n";
      if ($bufferfile =~/$fdomain/) { ## si halla dominio en archivo
      #print "$ffile\n";
      &ddebi($ffile);
      }
   }
   close(FILENAME);
} # end of fdif
 
sub ddebi { # delete deferred email by ID
   # eliminar correos diferidos segun ID
   my ($queuemailid) = @_;
   #print "\tEliminado $queuemailid\n";
   if ( system("$POSTSUPER -d $queuemailid -p") != 0 ) {
      print "\tNo se pude eliminar $queuemailid error de $POSTSUPER\n ";
   }
   else {
   #print "\tEliminado $queuemailid\n";
   }
} # end of ddebi

El requerimiento para correr este script, es que el usuario que lo ejecute sea miembro del grupo “zimbra” y la sintaxis de ejecución es la siguiente:

sudo ./deldefer.pl t02.com.ch

Con este ejemplo, he removido cualquier diferido con el dominio to2.com.ch

Seguir leyendo» Sin comentarios