Proteger las contraseñas guardadas en Firefox con una contraseña maestra

Cada vez que guardamos una clave en Firefox, la misma está disponible para cualquier otra persona que tenga acceso al navegador. La solución más drástica sería desactivar el guardado de contraseñas en Firefox, pero como es algo realmente útil vamos a ir por otro camino.

Un usuario puede acceder a las contraseñas guardadas desde:

  • Botón de identidad del sitio: icono a la izquierda de la url en la barra de direcciones
    1. Presionar el icono
    2. Presionar el botón “Más información…”
    3. Presionar el botón “Ver contraseñas guardadas” en la solapa Seguridad
  • Opciones
    • Abrir el menú Herramientas > Opciones
    • Presionar el botón “Contraseñas guardadas” en la solapa Seguridad

Una vez allí, al presionar “Mostrar contraseñas” solicita una simple confirmación y listo, tenemos a la vista TODAS las contraseñas almacenadas en el navegador.

Adcionalmente, tenemos que saber que aún sin conocer las contraseñas, con el solo hecho de ingresar al login de un sitio donde se hayan almacenado las credenciales de acceso, podremos ingresar!

Para protegernos de ambos casos, Firefox provee de la posibilidad de establecer una contraseña maestra, la cual se solicitará antes de:

  • utilizar las credenciales guardadas para completar los campos de un formulario de login
  • mostrar las contraseñas guardadas

Para configurarla debemos:

  • Abrir el menú Herramientas > Opciones
  • Marcar la opción “Usar una contraseña maestra” en la solapa Seguridad
  • Ingresar la contraseña nueva y su confirmación
  • Confirmar con Aceptar la creación
  • Aceptar nuevamente para completar el cambio de las opciones
Anuncios

Acceder a Plex desde distintos dispositivos y ubicaciones

Si contamos con Plex funcionando en un equipo del hogar, sabemos que puede ser accedido desde otros dispositivos de la red local (LAN), y en ciertos casos de manera remota (Internet), mediante una aplicación instalada en el dispositivo de las provistas por Plex:

  • Plex Mobile App
    • Soporte para iOS, Android, Windows Phone 8, and Windows 8
    • 😦 Tiene costo en cada uno.
  • Plex for connected TVs and streaming devices:
    • Soporte para Chromecast, Roku, Google TV, Smart TVs
    • 😦 Algunas tienen costo.
  • Plex Home Theater on a dedicated computer
    • Soporte para Mac y Windows
    • 😦 No tiene soporte para Linux

Es por eso que existiendo la alternativa de utilizar un simple navegador web es muy buena ya que no nos obliga a instalar nada.

La desventaja es que debemos utilizar la dirección IP del equipo donde se proveen los contenidos. Para contrarrestarla basta definir un dominio de manerla local en cada uno de los dispositivos o bien, en el servidor DNS si es que disponemos de uno en la red local.

Ahora, hay 2 situaciones que pueden molestarnos:

situación 1: no poder acceder desde el exterior (léase Internet)

situación 2: tener que definir el dominio local en cada dispositivo (por no tener DNS local) para las personas en la red local

Para tratar la situación 1, podemos crear una cuenta en Plex, desde donde vinculamos nuestro servidor Plex local y podremos accederlo desde cualquier lugar navegando por la Web. Los pasos son:

  1. Acceder a la instalación local de Plex
  2. Abrir Ajustes (icono arriba a la derecha de una llave inglesa en cruz con un destornillador)
  3. Elegir la solapa Servidor
  4. Seleccionar la opción “Conectar” de las listadas a la derecha
  5. Ingresar los datos de nuestra cuenta en Plex y presionar Ingresar
    • Si no tenemos cuenta podemos crearla ahí mismo seleccionando “Regístrate”
  6. Veremos que indica “Conectado como NOMBRE USUARIO” y “Conectando con el servidor…”. Esperamos unos segundos
  7. Se informa “El servidor está mapeado al puerto xxxxxx”

Solo basta con acceder por web a https://plex.tv/ y al presionar LAUNCH, accederemos a nuestro Plex (Si seleccionamos SERVERS podremos ver los servidores PLEX vinculados con esa cuenta)

Pero esto:

  • no soluciona la situación 2
  • obliga a registrar una cuenta en Plex
  • no permite que personas sin cuenta accedan a mi Plex (y no quiero darles los datos de mi cuenta)

Una propuesta que trata todos estos puntos es la de implementar un proxy reverso con Apache. Recuerden seguir el instructivo para configurar un proxy reverso con Apache, utilizando un dominio externo configurado mediante un DDNS y realizando la redirección de puerto en el router de la LAN. El VirtualHost tendría esta estructura:

<VirtualHost *:<PUERTO_EXTERNO> >
  ServerName <DOMINIO_EXTERNO>

  #Configuracion Proxy Reverso
  ProxyRequests Off
  ProxyPreserveHost Off
  ProxyPass / http://<PLEX_IP>:<PUERTO_PLEX>/
  ProxyPassReverse / http://<PLEX_IP>:<PUERTO_PLEX>/
</VirtualHost>

De esta manera permitiría a cualquier persona que conozca el domino externo acceder a al Plex interno. Adicionalmente la persona debería agregar un /web al final de la URL para acceder correctamente a la interfaz web.

 

La protección mínima que podemos implementar (se podría llegar a utilizar HTTPS) es aplicar una autenticación básica al VirtualHost definido:

  <Location />
    AuthType Basic
    AuthName "Restricted area"
    AuthUserFile <PATH_PASSWORDS>/.htpasswd_plex
    Require valid-user
  <Location />

donde PATH_PASSWORDS es la ubicación donde guardamos el .htpasswd que hayamos creado para el acceso a Plex (similar a proteger un directorio con htaccess).

 

Para evitar que la persona deba escribir /web al final de la URL, podemos implementar una reescritura de la URL cuando corresponda de la siguiente manera:

  1. Activar el módulo rewrite de Apache
    1. En la ubicación donde instalamos Apache, abrir con un editor de textos el archivo: conf\httpd.conf
    2. Descomentar la línea: LoadModule rewrite_module modules/mod_rewrite.so
  2. Agregar al VirtualHost definido:
  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^/web
  RewriteCond %{HTTP:X-Plex-Device} ^$
  RewriteCond %{QUERY_STRING} ^$
  RewriteRule ^/$ /web/$1 [R,L]

Estas directivas agregar /web/ cuando la URL no lo contenga, no sea un dispositivo Plex el que intenta conectarse y el querystring (pares de clave valor después de ?) sea vacío.

 

Estructura completa de VirtualHost

Esta es lstructura completa del VirtualHost para acceder a un Plex de una LAN mediante la implementación de un proxy reverso con Apache, autenticación básica y reescritura de URL para acceder a la interfaz web (sin especificar /web/)

<VirtualHost *:<PUERTO_EXTERNO> >
  ServerName <DOMINIO_EXTERNO>

  #Autenticacion
  <Location />
    AuthType Basic
    AuthName "Restricted area"
    AuthUserFile <PATH_PASSWORDS>/.htpasswd_plex
    Require valid-user
  <Location />

  #Configuracion Proxy Reverso
  ProxyRequests Off
  ProxyPreserveHost Off
  ProxyPass / http://<PLEX_IP>:<PUERTO_PLEX>/
  ProxyPassReverse / http://<PLEX_IP>:<PUERTO_PLEX>/
  
  #Agregar /web/ cuando corresponda
  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^/web
  RewriteCond %{HTTP:X-Plex-Device} ^$
  RewriteCond %{QUERY_STRING} ^$
  RewriteRule ^/$ /web/$1 [R,L]
</VirtualHost>

Ejemplo completo de VirtualHost

<VirtualHost *:80 >
  ServerName plex.externo.com

  #Autenticacion
  <Location />
    AuthType Basic
    AuthName "Restricted area"
    AuthUserFile c:/passwords/.htpasswd_plex
    Require valid-user
  <Location />

  #Configuracion Proxy Reverso
  ProxyRequests Off
  ProxyPreserveHost Off
  ProxyPass / http://192.168.0.5:32400/
  ProxyPassReverse / http://19.168.0.5:32400/
  
  #Agregar /web/ cuando corresponda
  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^/web
  RewriteCond %{HTTP:X-Plex-Device} ^$
  RewriteCond %{QUERY_STRING} ^$
  RewriteRule ^/$ /web/$1 [R,L]
</VirtualHost>

Basado en:

http://matt.coneybeare.me/how-to-map-plex-media-server-to-your-home-domain/

http://www.dbzoo.com/blog/plex_virtual_hosting

Bloquear acceso a directorios mediante reglas de reescritura de Apache

Si nuestra aplicación web contiene directorios, dependiendo la configuración de Apache, el contenido de los mismos podría ser accedido conociendo la URL completa al archivo. Ya sabemos evitar que los buscadores indexen páginas de nuestro sitio y ahora vamos a ser un poco más estrictos, no permitiendo acceder a ciertos directorios por web mediante el módulo rewrite de Apache.

Activar el módulo rewrite y permitir htaccess en directorios del VirtualHost

  1. En la ubicación donde instalamos Apache, abrir con un editor de textos el archivo: conf\httpd.conf
  2. Descomentar la línea: LoadModule rewrite_module modules/mod_rewrite.so
  3. En el VirtualHost correspondiente, dentro de la etiqueta Directory establecer: AllowOverride All
  4. Reiniciar el servicio de apache

Proteger directorios

  1. En la ubicación donde se encuentran los directorios a proteger, crear un archivo .htaccess
  2. Abrir este archivo con un editor de textos e indicar en su contenido:
 Options -Indexes
 RewriteEngine on
 RewriteCond %{REQUEST_URI} ^.*/<DIRECTORY>/.*$
 RewriteRule .*$ <FORBIDDEN_URL>

donde DIRECTORY es el directorio que deseamos proteger para que no pueda ser accedido y FORBIDDEN_URL es una url a la cual redirigir cuando se intente acceder a este directorio por web. No hace falta decir que:

  • se pueden bloquear todos los directorios que deseemos, incluso especificando subdirectorios, agregando más líneas de RewriteCond debajo de la presentada
  • los directorios no especificados podrán ser accedidos.

Ejemplo: Suponiendo que tenemos un blog en http://myblogtest y no queremos que se permita el acceso a los archivos de log contenidos en http://myblogtest/archive/logs, creamos el archivo .htaccess en http://myblogtest:

 Options -Indexes
 RewriteEngine on
 RewriteCond %{REQUEST_URI} ^.*/archive/logs/.*$
 RewriteRule .*$ http://myblogtest/forbidden.html

De esta manera se podrá acceder a http://myblogtest/archive/file1.zip, pero cuando intentemos http://myblogtest/archive/logs/process1.log automáticamente redireccionará a http://myblogtest/forbidden.html

Alternativamente podemos querer indicar solamente los directorios a los cuales permitimos el acceso web. Entonces el contenido del .htaccess es el siguiente:

 Options -Indexes
 RewriteEngine on
 RewriteCond %{REQUEST_URI} !^.*/<DIRECTORY>/.*$
 RewriteRule .*$ <FORBIDDEN_URL>

donde DIRECTORY es el directorio al que permitimos el acceso y FORBIDDEN_URL es una url a la cual redirigir cuando se intente acceder por web a cualquier directorio que NO sea el indicado.

Formulario de login seguro que fomenta el recordar datos de acceso

A menos que hayamos desactivado el guardado de contraseñas, los navegadores propondrán almacenarla cuando formulario de login se presente en la pantalla.

La idea es plantear un formulario de login, ver los inconvenientes que se presentan y analizar soluciones, compatibles con casi todas las versiones de Firefox, Chrome e Internet Explorer (no puedo asegurar que lo que aquí se exponga funcione en todos los casos ni tampoco que sea para siempre).

Cuestiones genéricas a saber sobre el administrador de contraseñas de los navegadores

  • Aplica solamente en el ámbito del navegador que se esté usando
  • Solicita confirmación para guardar con los datos que están en los campos al momento de hacer el submit, principalmente cuando existe un input submit.
  • Tiene que haber un input password para que entre en acción.
  • Asocia el password al valor ingresado en el input de texto inmediatamente superior al de tipo password en el dominio en que se encuentra.
    • Si no lo hubiera, o bien no tuviera un valor, entonces se asocia el password directamente al dominio en que se encuentra.
  • En IE no se activa cuando el submit se realiza mediante javascript.

Formulario de login

<form action="index.cgi" method="post" id="login_form" name="login_form">
  Email: <input type="text" name="e" id="email" /><br />
  Password: <input type="password" name="p" id="password" /><br />
  <input type="submit" value="Login" id="login_button" />
</form>

OBS: en el atributo action del formulario se indica el script que procesará los datos ingresados, en este caso index.cgi pero podría ser cualquiera.

El problema en este caso es que la clave se comunica de manera plana.

  • Solución 1: Si se usara el protocolo HTTPS para la comunicación, la conexión de extremo a extremo estaría cifrada. Es lo más recomendado, pero vamos a considerar que no contamos con el certificado requerido para implementarlo y utilizamos HTTP común, a fin de hacer más interesante el ejemplo.
  • Solución 2: Cifrar la clave utilizando la función criptográfica que deseen. En el ejemplo utilizaremos SHA-512 que es bastante seguro y se puede obtener rápidamente mediante javascript.

OBS: Utilizaremos el framework Prototype de javascript para simplificar el código, pero pueden utilizar javascript puro o algún otro framework como jQuery.

Para implementar la solución 2, invocamos una función cuando se realice el submit del formulario para que lo procese. En ella ciframos la clave, de manera que cuando se comuniquen los datos, la misma viaje solamente de manera cifrada.

<script type="text/javascript">
  Event.observe(window, 'load', function(){
    Event.observe( 'login_form', 'submit', formProcess);
  });
  function formProcess(){
    //agregar validaciones
    $('password').value = hex_sha512($('password').value);
    return true;
  }
</script>

OBS: Se debe reemplazar el comentario //agregar validaciones por las validaciones del lado del cliente, correspondientes al procesamiento del formulario

Un detalle de color: tal como planteamos la solución, a la vista aparecen por un instante más caracteres en el campo justo antes de empezar a cargar la página después del submit (resultado del cifrado de la clave)

Mejora visual 1: podemos agregar un input hidden:

<input type="hidden" name="ps" id="secret">

donde guardamos la clave cifrada y luego borramos el contenido del campo password (de lo contrario viajaría la clana nuevamente)

$('secret').value = hex_sha512($('password').value);
$('password').value = '';

Entonces la clave ingresada desaparece por un instante justo antes de empezar a cargar la página después del submit.

Mejora visual 2: contamos la cantidad de caracteres de la clave ingresada y los reemplazamos por el caracter ‘x’:

$('secret').value = hex_sha512($('password').value);
var pass_len = $('password').value.length;
$('password').value = Array(pass_len+1).join("x");

A la vista, no cambia nada cuando hacemos el submit, pero hemos cifrado la clave.

OBS: Si pensaron hacer un disable del input password es posible que en ciertos navegadores no proponga recordarles la contraseña (ej. chrome). La mejora 2, se podría realizar también agregando OTRO input hidden y disabled (ubicado inmediatamente despúes de password) que se complete con la clave antes de borrarla, y que el procesamiento del formulario oculte el input password y se ponga visible el disabled.

Formulario completo

A continuación les dejo el código del formulario completo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Test Site</title>

    <script type="text/javascript" src="sha512.js"></script>
    <script type="text/javascript" src="prototype.js"></script>

    <script type="text/javascript">
      Event.observe(window, 'load', function(){
        Event.observe( 'login_form', 'submit', formProcess);
      });
      function formProcess(){
        //agregar validaciones
        $('secret').value = hex_sha512($('password').value);
        var pass_len = $('password').value.length;
        $('password').value = Array(pass_len+1).join("x");
        return true;
      }
    </script>
  </head>
  <body>
    <form action="index.cgi" method="post" id="login_form" name="login_form">
      Email: <input type="text" name="e" id="email" /><br />
      Password: <input type="password" name="p" id="password" /><br />
      <input type="hidden" name="ps" id="secret">
      <input type="submit" value="Login" id="login_button" />
    </form>
  </body>
</html>

 

Desactivar el guardado de contraseñas en los navegadores

Los principales navegadores tienen una funcionalidad incluida que permite guardar las contraseñas (y el nombre usuario) en los formularios de acceso de las aplicaciones web. Por lo general, se encuentra activada por defecto y es muy cómo contar con ella en la computadora del hogar. Cuando detecta que nos hemos identificado, nos consulta si queremos guardar los datos ingresados para no tener que volver a tipearlos en futuras ocasiones.

Pero si el equipo es compartido o nos encontramos en la empresa tal vez no deseemos contar con dicha característica. Para desactivar el guardado de contraseñas (y borrar las que se hayan guardado) debemos seguir los siguientes pasos, dependiendo el navegador:

Chrome

  1. Escribir en la barra de navegación chrome://settings/, o bien
    1. Abrir el menú de Chrome (desde el icono de las 3 líneas horizontales)
    2. Seleccionar la opción “Configuración”
  2. Buscar “Contraseñas” mediante el buscador situado arriba a la derecha, o bien
    1. Ir hasta el final y hacer click sobre “Mostrar opciones avanzadas…”
    2. Buscar el apartado Contraseñas y formularios
  3. Desmarcar la opción “Preguntar si quieres guardar tus contraseñas web”
  4. Presionar sobre “Administrar contraseñas guardadas
    1. Borrar cada uno de los registros

Internet Explorer

  1. Ir a “Herramientas” desplegando la barra de menú, o bien
    1. Abrir el menú de Herramientas (desde el icono de engranaje)
  2. Seleccionar “Opciones de Internet”
  3. Abrir la solapa Contenido
  4. Presionar el botón Configuración en el apartado Autocompletar
  5. Desmarcar la opción “Nombres de usuario y contraseñas en formularios”. Se desactiva la opción “Preguntar antes de guardar las contraseñas”
  6. Presionar el botón “Eliminar el historial de Autocompletar…
    1. Desmarcar la opción “Conservar los datos de sitios web favoritos”
    2. Marcar solamente la opción “Contraseñas” (se pueden marcar otras opciones si así se lo desea)
    3. Confirmar con Eliminar
  7. Confirmar con Aceptar
  8. Cuando se concluya la limpieza, aparece en la parte inferior del navegador el mensaje “Internet Explorer terminó de eliminar el historial de exploración seleccionado”

Firefox

  1. Ir a “Herramientas” desplegando la barra de menú, o bien
    1. Abrir el menú de Firefox (desde el icono de las 3 líneas horizontales)
  2. Seleccionar Opciones
  3. Elegir el bloque de Seguridad
  4. Desmarcar la opción “Recordar contraseñas para los sitios” en el apartado Contraseñas
  5. Presionar el botón “Contraseñas guardadas…
    1. Presionar el botón “Eliminar todo”
    2. Presionar Cerrar
  6. Confirmar con Aceptar

Si nos encontramos en un lugar temporal como ser la casa de un amigo, una notebook de un compañero o un cibercafé, lo mejor es usar la navegación privada y evitar todo tipo de inconvenientes.

Abrir una nueva ventana para navegación privada

Una vez que tenemos el navegador abierto podemos necesitar acceder a la navegación privada donde, una vez que cerremos esa ventana, no quedará rastro de lo que hayamos realizado. Para abrir rápidamente una ventana nueva con la navegación privada, debemos utilizar los siguientes atajos según el navegador:

Desbloquear acceso web a nuestro equipo en Windows

Si contamos en nuestro equipo con un servidor web (Apache por ejemplo) y brindamos servicios a través de él, es probable que por defecto otros equipos no tengan acceso web al nuestro por seguridad.

Para permitir este tipo de conexiones, debemos agregar una regla al firewall de Windows permitiendo las conexiones que se realicen al puerto que usa nuestros servidor web (por defecto:80). Los pasos son sencillos:

  1. Acceder a Panel de Control > Firewall
  2. Elegir la opción “Configuración avanzada” del panel izquierdo
  3. Seleccionar el item “Reglas de entrada”
  4. Elegir “Nueva regla…” del panel izquierdo de Acciones
  5. Seleccionar la opción “Puerto”
  6. Elegir TCP y completar en Puertos locales específicos con el número de puerto deseado (ej: 80)
  7. Mantenemos la opción “Permitir la conexión”
  8. Elegir el ámbito de aplicación por perfil (recomendación Privado)
    • Dominio: red con un controlador de dominios
    • Privado: red no conectada directamente a Internet, con un dispositivo intermediario que asegura la conexión
    • Público: red conectada directamente a Internet, más insegura
  9. Completar con un nombre claro “Acceso web puerto 80” o “Apache TCP puerto 80”
  10. Terminar el proceso con Finalizar

Desde ahora los accesos a nuestro equipo a través del puerto elegido serán permitidos.