CoffMan Blog Victor Fariña Infante , info about my own projects and thoughts.

31May/060

Encriptacion de directorios y archivos en Linux con encfs

La encriptacion de sistemas de archivos, directorios y archivos es algo que siempre ha estado ahí, pero con la inclusion en el nucleo 2.6 de la api de encriptacion CryptoAPI han aparecido nuevas aplicaciones, aunque la que aquí voy a usar es sencilla de instalar, de usar y no requiere un nucleo 2.6 Sobre todo está enfocado a :

  • Administradores de Sistemas que quieren guardar cuidadosamente sus scripts
  • Simples usuarios quue quieren guardar su informacion sensible
  • Trabajadores que no desean que los administradores de la empresa vean sus archivos
  • .... seguro que un monton de usos mas ...

Vamos a suponer que estamos usando una Debian, de lo contrario adapta los comandos como creas conveniente. Lo primero es bajarse encfs  (#apt-get install encfs deberia servir). esto nos baja e instala encfs y fuse si no lo tuvieramos instalado. FUSE es acronimo de filesystem Userspace, y nos permite montar y desmontar sistema de archivos con un usuario normal. FUSE debe ser introducido en el kernel de linux, o bien como modulo  o bien en el propio kernel. Para meterlo como modulo tenemos estas opciones:

  • Instalamos fuse-source
    • (#apt-get install  fuse-source) y nos vamos al directorio del mismo y lo descomprimimos
    • cd /usr/src ; bunzip2 fuse-src.tar.bzip2 ; tar zvf fuse-src.tar
      • Ahora compilamos e instalamos : cd /usr/src/modules/fuse/kernel/ ; ./configure ; make ; make install
      • el modulo deberia estar listo y lo cargamos con modprobe fuse
  • Existe un paquete llamado fuse-modules que  seguramente lo instale automaticamente pero no lo probé aun
  • desde el menu de compilacion del nucleo seleccion en Filesystems->fuse añadir como Modulo y listo

Ahora creamos un directorio para meter todos los datos privados como un usuario normal si lo preferimos: **mkdir ~/.privado/ ~/privado/ (necesitaremos los 2 directorios)** Nos aseguramos que el module fuse está cargado: #**modprobe fuse** Añadimos a nuestro usuario al grupo fuse #**usermod -Gfuse coffman** (para que linux coja este cambio puede ser necesario que reinicies la sesión) Creamos el sistema de archivos: encfs ~/.privado/ ~/privado/ Creando nuevo volumen cifrado. Por favor, seleccione una de las siguientes opciones: introduzca "x" para modo de configuración para expertos, introduzca "p" para el modo preconfigurado paranoico, cualquier otra cosa o una línea vacía seleccionarán el modo estándar. ?>p

Configuración paranoica seleccionada.

Configuración finalizada. El sistema de ficheros que se va a crear tendrá las siguientes propiedades: Cifrado del sistema de ficheros: "ssl/aes", versión 2:1:1 Codificación de nombres de ficheros: "nameio/block", versión 3:0:1 Tamaño de clave: 256 bits Block Size: 512 bytes, including 8 byte MAC header Cada fichero contiene una cabecera de 8 bytes con datos únicos del IV. Los nombres de ficheros se codificarán usando el modo de encadenamiento de IV. El IV de los datos del fichero está encadenado al IV del nombre del fichero.

A continuación se le pedirá una contraseña para el sistema de ficheros. Debe recordar esta contraseña, ya que no existe absolutamente ningún mecanismo de recuperación. No obstante, la contraseña puede cambiarse después con encfsctl. Nueva contraseña Encfs: ******* Verifique la contraseña Encfs: *******

Con esto ya deberiamos tener el directorio ~/privado/ protegido perfectamente ... Para desmontar el directorio : $ fusermount -u ~/privado/

Listo... nuestros datos ya estan a salvo, siempre que los metamos en el directorio ~/privado , claro está ;)

Filed under: Tecnología No Comments
30May/060

Tutorial minimalista sobre comunicacion RMI en Java

Esto no pretende ser un tutorial ni mucho menos, mas bien una pequeñas prueba de concepto para la tecnologia RMI.

Recientemente me ha tocado colaborar en un proyecto con una parte cliente y una parte servidor , ambas en entornos unix y separadas fisicamente por firewalls. De modo que para comunicar las 2 partes del software estoy evaluando varias posibilidades, y para cada una de ellas tendre un ejemplo basico de funcionamiento.

En esta primera parte la evaluacion será de RMI Para la prueba construiremos el "Hola Mundo" en version cliente/servidor Los archivos necesarios serán:

  • Hello.java (Una interface con lo basico)
  • HelloImpl.java (El Objeto servidor en si mismo, con metodo main para poder ejecutarse)
  • HelloClient.java (El cliente java)

 

Estos 3 archivos componen la parte servidora (objetos en el lado del servidor) Hello.java

import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote { String sayHello() throws RemoteException; }

 

 

HelloImpl.java

        import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; import java.rmi.server.UnicastRemoteObject;

public class HelloImpl extends UnicastRemoteObject implements Hello {

public HelloImpl() throws RemoteException { super(); }

public String sayHello() { return "Hola, holita..."; }

public static void main(String args[]) {

// Create and install a security manager if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); }

try { HelloImpl obj = new HelloImpl();

// Bind this object instance to the name "HelloServer" Naming.rebind("//192.168.0.18/HelloServer", obj);

System.out.println("HelloServer bound in registry"); } catch (Exception e) { System.out.println("HelloImpl err: " + e.getMessage()); e.printStackTrace(); } } }

policy

 

grant { // Allow everything for now permission java.security.AllPermission; };

Este es para la parte cliente HelloClient.java

import java.rmi.Naming; import java.rmi.RemoteException; public class HelloClient { static String message = "blank"; static Hello obj = null; public static void main(String args[]) { try { obj = (Hello)Naming.lookup("//192.168.0.18" + "/HelloServer"); message = obj.sayHello(); } catch (Exception e) { System.out.println("HelloApplet exception: " + e.getMessage()); e.printStackTrace(); } System.out.println("MENSAJE:"+message); }

}

Una vez que tenemos y revisamos estos archivos, compilamos y generamos los proxys para que el cliente**** remoto pueda acceder al objeto servidor (que simplemente devuelve un mensaje)

javac Hello.java HelloImpl.java rmic HelloImpl

Lo cual nos genera los .class de Hello.java y HelloImpl.java . Ademas de esto, el comando rmic, genera unos proxys para copiar en el lado cliente son: HelloImpl_Stub.class y HelloImpl_Skel.class

El archivo policy lo necesitamos en el lado del servidor para dar seguridad al acceso a nuestro objeto, el ejemplo es INSEGURO para un entorno de producción. Ahora que tenemos toda la parte del servidor lista, ejecutamos el rmiregistry que levanta un servidor  escuchando en el puerto 1099, Este programa se encarga de recibir peticiones de Clientes que intentan localizar objetos servidores y les indica donde se encuentran fisicamente.

Una vez que tenemos levantado el rmiregisty , Levantamos nuestro objeto de lado del servidor:

java -Djava.security.policy=$HOME/Programacion/java/rmi/policy HelloImpl

haciendo referencia al archivo policy antes creado.

En el lado cliente compilamos HelloClient.java y copiamos el Stub y el Skel generados en el servidor, de modo que tengamos:

HelloClient.class HelloImpl_Skel.class HelloImpl_Stub.class

y ejecutamos : java HelloClient , que como resultado deberia dar : vic@coffdeb:rmi$ java HelloClient MENSAJE:Hola, holita...

Filed under: Tecnología No Comments
20May/060

Transferir archivos entre nokia 6630 y Linux via Bluetooth

El topic suena interesante , eh ?? pues aun encima es mas fácil de lo que parece, empecemos con los pasos a seguir ...

Debemos tener un nucleo que tenga compilado ó en forma de modulo lo siguiente :

hci_usb (seguramente ya lo tengamos metido)
rfcomm (para las comunicaciones)
l2cap (idem)
bluetooth (logico, no ?)
No pienso explicar como recompilar el nucleo , hay cientos de páginas que dicen como hacerlo ...

Instalamos tambien los paquetes relacionados con bluetooth, pongo el caso de la debian, si usais otra distribución ejecutar el comando equivalente.

apt-get install bluez-utils bluez-pin bluez-firmware bluez-hcidump bluetooth

La transferencia de archivos la vamos a hacer "a mano" pues la interface grafica a mi aun no me funciona ...

Antes de empezar metemos el bluetooth en una ranura USB y vemos los LOGS que deberia aparecer algo como esto :

Jun  1 18:57:48 localhost kernel: usb 4-2: new full speed USB device using uhci_hcd and address 3 Jun  1 18:57:48 localhost kernel: Bluetooth: HCI USB driver ver 2.9 Jun  1 18:57:48 localhost kernel: usbcore: registered new driver hci_usb Jun  1 18:57:48 localhost usb.agent[22990]:      hci_usb: loaded successfully Jun  1 18:57:48 localhost usb.agent[22989]:      hci_usb: loaded successfully

Con lo que
1.- Descubrimos la ID de nuestro teléfono movil (es único para cada telefono y este es un ejemplo)

zoidberg:~# hcitool scan Scanning ... 00:16:4E:0C:2B:91       O jato

2.- Ponemos una password (p.ej. 1111) al bluetooth del PC:

# echo "1111" > /etc/bluetooth/pin

3.- Vemos el canal que usa nuestro móvil para el envio y recepción de archivos (que es el de Nombre OBEX File Transfer) :

vic@zoidberg:Elephant$ sdptool browse 00:16:4E:0C:2B:91 Browsing 00:16:4E:0C:2B:91 ... Service Name: Hands-Free Audio Gateway Service RecHandle: 0x10000 Service Class ID List: "Handfree Audio Gateway" (0x111f) "Generic Audio" (0x1203) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 1 Language Base Attr List: code_ISO639: 0x454e encoding:    0x6a base_offset: 0x100 Profile Descriptor List: "Handfree Audio Gateway" (0x111f) Version: 0x0101 Service Name: OBEX File Transfer Service RecHandle: 0x1000a Service Class ID List: "OBEX File Transfer" (0x1106) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 10 "OBEX" (0x0008) Language Base Attr List: code_ISO639: 0x454e encoding:    0x6a base_offset: 0x100 Profile Descriptor List: "OBEX File Transfer" (0x1106) Version: 0x0100 ...

En mi caso el número de Canal para la transferencia de archivos es el 10 (OBEX File Transfer).
Ponemos al bluethooth del ordenador en espera de conexiones en ese canal ...

sdptooladd−−channel=10OPUSHsdptool add --channel=10 OPUSH obexserver

Vinculamos desde el telefono movil ... dandole en Bluetooth->buscar dispositivos-> ... -> Asociar
y a enviar archivos ...
Cada vez que queramos enviar un archivo tenemos que volver a ejecutar el obexserver****Links:http://www.e-oss.net/wordpress/?p=12http://usefulinc.com/software/gnome-bluetoothhttp://es.wikibooks.org/wiki/Hacks_para_sistemas_operativos_Unix-like/Redes/Bluetooth/Linux

Filed under: Tecnología No Comments