miércoles, 27 de febrero de 2013

Protección con contraseña del Grub

Como hemos podido apreciar anteriormente en "Recuperar contraseña de root", es una falla de seguridad importante tener a nuestro Grub sin contraseña, ese es el motivo de este post. Debemos agregar dicha contraseña al archivo de configuración del Grub “/boot/grub/grub.cfg ” pero de forma cifrada, por lo tanto deberemos utilizar una herramienta que nos provee Grub para dicha tarea:  grub-mkpasswd-pbkdf2.

Pasos:
  1. Comencemos por ejecutar el comando grub-mkpasswd-pbkdf2 desde una terminal, éste nos pedirá una contraseña y luego que volvamos a ingresarla a efectos de poder validar que ambas sean iguales.
 # grub-mkpasswd-pbkdf2  
 Enter password:  
 Reenter password:  
Your PBKDF2 is grub.pbkdf2.sha512.10000.DA5AD94D9070617993511A5EFD27F711FC53C773B1DCA7E83E2C4C0D538D0976BC0FD5F984C3C16FB07345E96C635A1D53799D5405C924A7C530F9D6EA68DB5C.5742535FBDC75B28FD26183672220E19F11DA653607153D0ECB75ECDE5DC2E854CA5847DC540869ACDCF1081500E9BE8CFF39127C6F671C972E99EF355C5C1D0
  1. El texto en negrita es el que deberemos agregar al archivo /boot/grub/grub.cfg junto con el nombre del usuario. Comencemos por abrir el archivo.
 #vim /boot/grub/grub.cfg  
  1. Una vez abierto el archivo, debemos posicionarnos al final del mismo para allí poder crear un usuario como mínimo y asignarle la contraseña generada de la siguiente manera:
set superusers="administrador"
password_pbkdf2 administrador grub.pbkdf2.sha512.10000.DA5AD94D9070617993511A5EFD27F711FC53C773B1DCA7E83E2C4C0D538D0976BC0FD5F984C3C16FB07345E96C635A1D53799D5405C924A7C530F9D6EA68DB5C.5742535FBDC75B28FD26183672220E19F11DA653607153D0ECB75ECDE5DC2E854CA5847DC540869ACDCF1081500E9BE8CFF39127C6F671C972E99EF355C5C1D0
  1. Guardamos los cambios del fichero y nuestro grub ya está protegido contra la inserción de lineas de comando mediante el grub.

sábado, 23 de febrero de 2013

Recuperar contraseña de root (Debian y Ubuntu)

En el siguiente post explicaremos como recuperar la contraseña de root aprovechando un descuido muy común de los administradores que es el de olvidar colocar contraseña al Grub (esto lo enseñaremos en otro post).
Supongamos que en nuestro caso el administrador del sistema tuvo ese descuido, comencemos a describir los pasos que deberemos dar para recuperar la contraseña de root:

  1. El primer paso será reiniciar el equipo.
  2. Al momento de aparecer la ventana de Grub interrumpiremos el conteo moviendo las flechas de Up/Down.

  3. Nos posicionaremos sobre el kernel que habitualmente inicia y presionaremos la tecla “e


  4. Agregaremos a continuación de “linux /boot /vmlinuz-3.2.0-4-amd64 root=UUID=...... ro” lo siguiente “init=/bin/bash” . Esto hará que en lugar de bootear, Grub provea una línea de comandos (bash). También podríamos modificar el modo en que se monta la raíz, cambiando "ro" por "rw" o bien hacerlo luego de bootear.


  5. Debemos presionar “Ctlr + x” para que se realice el booteo.
  6. Ahora debemos remontar el raíz como lectura/escritura, ya que arranca como sólo lectura y lo necesitamos poder escribir el archivo “/etc/shadow
 # mount -o remoun,rw /  
  1. En este momento estamos en condiciones de ejecutar el comando passwd excepto que nuestro sistema utilice lvm, si no es el caso, se puede pasar directamente al paso numero diez. Si nuestro sistema utiliza lvm, es muy probable que el directorio /usr se encuentre en otro volumen distinto al que se encuentra la raíz (/) por lo tanto éste no solo no estará montado, sino que tampoco estará activo, recuerden que en el /usr/bin es donde está nuestro comando passwd.
  2. Para activar un volumen, debemos utilizar el comando lvchange pasándole como parámetro el path completo al volumen, mediante el comando lvscan podrán ver el estado de todos los volúmenes .
 # lvchange -a y /dev/Group/lvusr  
  1. Una vez activo, ya estamos en condiciones de montarlo mediante el comando mount.
 # mount /dev/Group/lvusr /usr  
  1. Sólo nos resta utilizar el comando passwd, ingresar la nueva contraseña y reiniciar el equipo.
 # passwd  

domingo, 17 de febrero de 2013

Enviar e-mail con Gmail y Python


En esta oportunidad les mostraremos como utilizar la librería smtplib de Python para enviar e-mails utilizando Gmail. Comencemos por importar los módulos necesarios.

import smtplib
import mimetypes
from email.MIMEText import MIMEText
from email.Encoders import encode_base64

Luego crearemos un array con las direcciones destinatarias de nuestro correo.

lista=['juan@dominio.com','pedro@dominio.com']

Creamos el mensaje que vamos a enviar.

mensaje = MIMEText("""Este es un mensaje de prueba""")
mensaje['From']="mi_cuenta@gmail.com"
mensaje['Subject']="Prueba SMTP Gmail"

Nos conectamos con el servidor SMTP de gmail.

mailServer = smtplib.SMTP('smtp.gmail.com',587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()

Realizamos el proceso de autenticación con dicho servidor.

mailServer.login("mi_cuenta@gmail.com","mi_contraseña")

for adr in lista:
      mensaje['To']= adr
      # Enviamos el mensaje
       mailServer.sendmail("mi_cuenta@gmail.com", adr, mensaje.as_string())
Por último solo nos resta cerrar la conexión.

mailServer.close()

martes, 12 de febrero de 2013

Controlar cantidad de objetos generados en Android

Como todos sabemos, la GC de Android no es tan eficiente como la GC de la Máquina Virtual de Java, de modo que cuando desarrollamos en Android, es importante tener en cuenta la generación de objetos, y de ser posible, evitarla dentro de bucles de programa.


Una forma de saber la cantidad de objetos que se crearon en una porción de código, es utilizando algunas herramientas de la clase “Debug”.

Ejemplo:


Debug.startAllocCounting();
  
Persona p = new Persona();
Integer i = new Integer(5);
  
int allocCount = Debug.getThreadAllocCount();
Debug.stopAllocCounting();

Log.d("alloc","Alloc counter:"+allocCount);

Comenzamos el control ejecutando el método “startAllocCounting” luego ponemos las líneas de programa que queremos controlar si generan nuevos objetos o no, y por último llamamos al método “getThreadAllocCount” el cual nos devolverá la cantidad de espacios que se reservaron en memoria para el bloque de código entre ambos métodos.

Si ningún “new” se ejecuta dentro del bloque, el contador devolverá cero, de lo contrario, devolverá un valor distinto de cero.



viernes, 8 de febrero de 2013

Cómo crear un repositorio local para Debian


En este post explicaremos como crear un repositorio para Debian utilizando debmirror. Para ello es necesario tener instalados los siguientes paquetes:

 #apt-get install debmirror rsync apache2   

debmirror es una herramienta que nos permite la creación parcial o total de un repositorio Debian.

rsync es una herramienta para sincronizar los ficheros y directorios que tenemos almacenados en un sitio en otro diferente, minimizando la transferencia de datos (Wikipedia: rsync).

apache2 es un servidor web de codigo abierto, el cual utilizaremos para servir nuestro repositorio en la red local.

Antes de empezar debemos verificar que disponemos del espacio suficiente, en este caso tenemos una partición de 139Gb montada en "/mirror".
 # df -h /mirror/  

Creemos un script llamado "mirror.sh" con el siguiente contenido:
#!/bin/sh  
 HOST=ftp.us.debian.org  
 METODO=rsync  
 DIST=squeeze  
 ARCH=amd64,i386  
 SECTION=main,non-free,contrib   
 DIRECTORIO=/mirror/debian  
 echo "==================================================================="  
 echo "===== Actualizando los repositorios: main, contrib, non-free ======"  
 echo "==================================================================="  
 debmirror \  
      -h ${HOST} \  
      --progress \  
      --dist=${DIST} \  
      --root=/debian \  
      --di-arch=${ARCH} \  
      --section=${SECTION} \  
      --arch=${ARCH} \  
      --method=${METODO} \  
      --nosource \  
      --ignore-release-gpg \  
      --i18n \  
      --rsync-extra=doc,tools,indices \  
      --rsync-options='-aIL' ${DIRECTORIO}  
 echo "======================================================================"  
 echo "Actualizando los repositorios wheezy-updates, main, contrib, non-free"  
 echo "======================================================================"  
 DIST=squeeze-updates  
 SECTION=main,non-free,contrib  
 METODO=rsync  
 ARCH=amd64,i386  
 debmirror \  
      -h ${HOST} \  
      --progress \  
      --dist=${DIST} \  
      --root=/debian \  
      --di-arch=${ARCH} \  
      --section=${SECTION} \  
      --arch=${ARCH} \  
      --method=${METODO} \  
      --nosource \  
      --ignore-release-gpg \  
      --i18n \  
      --rsync-extra=doc,tools,indices \  
      --rsync-options='-aIL' ${DIRECTORIO}  


Ahora le damos permisos de ejecución:
 #chmod +x mirror.sh  

Luego lo ejecutamos, este proceso va a demorar bastante:
 #./mirror.sh  

Unas cuantas horas después... Debemos generar los enlaces con apache:
 #ln -s /mirror /var/www/mirror  

A esta altura ya tenemos nuestro repositorio Debian. Para poder utilizarlo solo nos resta agregarlo a nuestro sources.list de la siguiente manera:

 deb http://NUESTRA_IP/mirror/debian/ squeeze main contrib non-free  
 deb-src http://NUESTRA_IP/mirrordebian/ squeeze main contrib non-free  
 deb http://NUESTRA_IP/mirror squeeze/updates main contrib non-free  
 deb-src http://NUESTRA_IP/mirror squeeze/updates main contrib non-free 




martes, 5 de febrero de 2013

Librería HTTP para Android

Los desarrolladores Android saben lo complicado que es la configuración de la Librería Apache HTTP Components que nos provee la API de Android. Necesitamos setear timeouts, protocolos, y crear por nuestra cuenta Threads, lógica de reintentos, chequeo de conexión a Internet,etc.

En el Laboratorio de Software Libre hemos desarrollado una librería que maneja todas estas cuestiones internamente, proporcionando al programador una herramienta muy fácil de utilizar.

Descargar Http Manager for Android 2.0

La página de descarga nos ofrece bajar la librería (.jar que podemos incluir en el proyecto) o un proyecto de demo (HttpManagerDemo2.0), explicaremos a continuación el proyecto de Demo para mostrar lo fácil que es la utilización de esta librería para realizar requests HTTP hacia un Web Service.

En el proyecto tenemos dos packages

  • ar.com.gnutnfra.httpmanager : Esta es nuestra librería, puede incluirse el JAR en vez de estos archivos.
  • ar.com.gnutnfra.httpmanagerdemo : Aquí tenemos dos clases, una Activity, y una clase que define las URL que utlizará la librería.


Explicaremos la clase "MyProtocol". Es una clase que hereda de "Protocol". El constructor de nuestra clase le pasará a la clase padre la URL base de nuestro Web Service.
 public MyProtocol(String urlBase) {
  super(urlBase);
 }
Luego redefinimos el método "getUrlFromCmd"

 @Override
 public String getUrlFromCmd(int cmd) {
  { 
   switch(cmd)
   {
    case CMD_GET_IMG : return getUrlBase() +   "getImg.php"; 
    case CMD_GET_DATA_1 : return getUrlBase() +  "getDataDetalleReunion.php";
    case CMD_GET_DATA_2 : return getUrlBase() +  "getDataDetalleProyecto.php";
    case CMD_GET_DATA_POST : return getUrlBase() +  "postData.php";
    case CMD_GET_IMG_POST : return getUrlBase() +   "postImg.php";
   }  
   return "";
  }
 }
La idea es definir constantes numéricas que representen las direcciones web que vamos a utilizar, y poner un switch que devuelve la URL según la constante pasada como arguemento. Por ello es que en nuestra clase "MyProtocol" también definimos las constantes para cada URL:

 public static final int CMD_GET_IMG=0;
 public static final int CMD_GET_DATA_1=1;
 public static final int CMD_GET_DATA_2=2;
 public static final int CMD_GET_DATA_POST=3;
 public static final int CMD_GET_IMG_POST=4;
En nuestra Activity, utilizaremos estas constantes para ejecutar los Requests HTTP.

Pasemos ahora al código de la Activity, en donde deberemos implementar una interfaz llamada "HttpManagerListener" la cual nos informará cuando lleguen las respuestas HTTP, o en el caso de error, si no había conexión a Internet, o si se agotaron los reintentos hacia el WS.
public class MainActivity extends Activity implements HttpManagerListener{
Los métodos que esta interfaz nos obligará a implementar son:
  • retriesExceeded : Se ejecuta si los reintentos se agotan al ejecutar un Request.
  • internetConnectionFailed : Se ejecuta si no hay conexión a Internet al ejecutar un Request.
  • newMsg : Se ejecuta cuando llega la respuesta del Request.
Explicaremos ahora como ejecutar un Request.

Primero debemos crear un objeto "MyProtocol" en donde se definen como ya se explicó, las URLs que utilizaremos, y luego un objeto HttpManager, mediante el cual ejecutaremos los Request. Este objeto recibe como parámetros:

  • Un objeto HttpManagerListener (en este caso la propia Activity ya que implementa la interfaz)
  • El Context.
  • Un objeto Protocol (el que creamos anteriormente).
        Protocol protocol = new MyProtocol("http://www.ucpic.byethost7.com/wsPP/");
        httpm = new HttpManager(this,this,protocol);
Ahora podemos ejecutar un Request, existen dos funciones, una para obtener textos como respuestas (XML, JSON,etc) y otra para obtener bytes (Utilizada para obtener archivos de imagen)

Obtener JSON por GET


Primero deberemos crear una lista de pares "Clave-Valor", para ello utilizaremos las mismas listas de la librería de Apache:
        List nameValuePairs = new ArrayList();
        nameValuePairs.add(new BasicNameValuePair("idProy","1"));
En el ejemplo, pasamos la clave "idProy=1". Ahora ejecutamos el request, como se mencionó anteriormente, en vez de la URL utilizaremos las contantes definidas en "MyProtocol", en este caso "MyProtocol.CMD_GET_DATA_1" y ejecutamos el método "txtRequestWithRetries" del objeto HttpManager que habiamos creado.

httpm.txtRequestWithRetries(MyProtocol.CMD_GET_DATA_1,nameValuePairs,HttpManager.PROTOCOL_GET);
Como último parámetro, indicamos que el protocolo será GET, en el caso de ser POST, existe la constante "PROTOCOL_POST"

Recibiendo la respuesta.


Como dijimos con anterioridad, el método "newMsg" se ejecutará al llegar la respuesta, y en su argumento obtendremos un objeto "MsgData", este objeto posee el método "getCommand" el cual corresponderá con la constante con la que hicimos el Request, de modo que en este método colocamos un switch por cada constante que representa una URL en nuestra clase "MyProtocol".
  switch(msg.getCommand())
  {
   case MyProtocol.CMD_GET_DATA_1:
   case MyProtocol.CMD_GET_DATA_POST:
   {
    Log.d("demo","Internet Data:"+msg.getInternetData());
    break;
   }
El objeto "msg" posee el método "getInternetData()" el cual nos devolverá un String con la respuesta desde el Servicio Web. En el caso de que la respuesta sea una imagen, utilizaremos el método "getImgData" el cual nos devolverá un array de bytes.

lunes, 4 de febrero de 2013

Crear paquetes .deb con Debreate

Muchas veces es de gran utilidad poder empaquetar nuestras aplicaciones a efectos de poder distribuirlas con mayor facilidad, en este artículo les mostraremos una herramienta que nos permite de manera gráfica generar paquetes “.deb”. Como ustedes saben, estos paquetes son los utilizados por las distribuciones basadas en Debian.

Antes de comenzar debemos bajar e instalar la herramienta “debreate”, para bajarla debemos de dirigirnos al sitio web de la misma “http://debreate.sourceforge.net”, de allí bajaremos el paquete “debreate_0.7.7_all.deb”, luego desde la línea de comandos lo instalaremos:

 # dpkg –i debreate_0.7.7_all.deb    

Para poder ejecutarlo pulsar Alt+F2 y escribir “debreate”.


Ahora seleccionaremos “File > New Project”, en la parte superior de la aplicación hay dos flechas azules mediante las cuales podremos navegar los distintos pasos que son necesarios de realizar antes de poder "compilar" nuestro paquete. Algo interesante de esta herramienta es que siempre podremos retroceder los pasos, esto es muy útil tanto como para poder controlar como así también para poder agregar información adicional.

Para comenzar debemos pulsar la flecha de la derecha y comenzar a llenar la información de este formulario. Es importante prestar especial atención a dos campos, el primero, la versión, puesto que cuando la incrementemos en futuras construcciones de este paquete, provocará que nuestra aplicación sea actualizada por los usuarios. El otro campo es la arquitectura, mediante el cual indicaremos para qué tipo de arquitectura esta compilada nuestra aplicación.



Al pulsar nuevamente la flecha pasaremos a la ventana de dependencias, aquí podremos aclarar qué aplicaciones deberán estar instaladas para que nuestro paquete funcione correctamente. Agregar una dependencia es muy simple, debemos escribir el nombre de la misma, de ser necesario su versión y pulsar el botón con el símbolo más.


Pulsamos nuevamente la flecha derecha y llegamos al formulario “Files”, en él deberemos indicar cuál es el lugar de destino para cada fichero, es decir es una asociación fichero y ruta destino. En nuestro ejemplo solo seleccionamos un archivo “hola_mundo.py” y elegimos como destino “/usr/bin/”.


Pulsamos nuevamente la flecha y llegamos a un formulario de gran utilidad, en él podremos escribir scripts. Estos tienen infinita cantidad de usos, en nuestro caso realizaremos un Script de post-instalación en el cual realizaremos un enlace hacia nuestro ejecutable. Es importante resaltar que no deben de olvidar tildar “Make this script”.


Al pulsar la flecha nuevamente, llegaremos al formulario de "Changelog", por defecto deshabilitado, se utiliza para control de versiones, el siguiente es el de Copyright, en él escribiremos la licencia. El siguiente formulario “Menu Laucher” nos permitirá agregar a nuestra aplicación al menú, en la misma podremos definir un ícono y la sección del menú que pretendemos ocupar.


Al pulsar nuevamente la flecha llegaremos al último paso, la creación del paquete, aquí solo nos resta pulsar el botón verde, al hacerlo se nos pedirá que indiquemos la ruta donde queremos guardar dicho paquete.


De este modo construimos nuestro primer paquete, recuerden guardar el proyecto así se ahorran todo este trabajo para futuras versiones.