Tag Archives: Windows

Cambiar una contraseña de Windows 7 desde Linux Ubuntu 14.04 utilizando chntpw

Introducción

A continuación se describen los pasos necesarios para modificar una contraseña de un usuario de Windows desde Linux Ubuntu, para seguirlos es necesario poder montar la partición física donde se encuentra instalado Windows desde la máquina que ejecuta el Linux.

Este procedimento es útil para recuperar el acceso de usuarios que han olvidado su contraseña (especialmente los administradores).

Instalación de chntpw

$ sudo aptitude install chntpw

Identificar el sistema operativo del usuario

En una terminal montar la partición donde se encuentra el Windows que contiene al usuario cuya contraseña se va a modificar y ubicarse en el directorio System32/config.

$ cd /windows/Windows/System32/config

Gestionar la información de la cuenta

Listar la información de las cuentas de usuario disponibles en el sistema operativo.

$ sudo chntpw -l SAM

chntpw version 0.99.6 110511 , (c) Petter N Hagen
Hive <SAM> name (from header): <SystemRootSystem32ConfigSAM>
ROOT KEY at offset: 0x001020 * Subkey indexing type is: 666c <lf>
File size 262144 [40000] bytes, containing 6 pages (+ 1 headerpage)
Used for data: 247/20352 blocks/bytes, unused: 18/4032 blocks/bytes.


* SAM policy limits:
Failed logins before lockout is: 0
Minimum password length        : 0
Password history count         : 0
| RID -|---------- Username ------------| Admin? |- Lock? --|
| 01f4 | Administrador                  | ADMIN  | dis/lock |
| 01f5 | Invitado                       |        | dis/lock |
| 03e8 | Usuario                        | ADMIN  |          |

Modificar la contraseña del usuario Usuario.

$ sudo chntpw -u Usuario SAM

Puede elegir una de las siguientes opciones a realizar sobre la contraseña.

  • Dejar la cuenta sin contraseña (1).
  • Especificar una nueva contraseña para la cuenta (2).
  • Promover al usuario a Administrador (3).
  • Desbloquear y activar la cuenta (4).

Recursos

Errores "Connection reset by peer" durante la conexión a Windows con rdesktop

Introducción

Durante la conexión a máquinas Windows desde Linux Ubuntu utilizando el protocolo Remote Desktop y a rdesktop como herramienta se empezaron a obtener errores de conexión como el siguiente.

ERROR: recv: Connection reset by peer

El problema

rdesktop permite la conexión de escritorio remoto entre máquinas Windows y otros sistemas operativos como Linux, sin embargo no soporta aún el nivel de autenticación de red que implementa por defecto el servicio de Remote Desktop.

La solución

En la máquina Windows que se encuentra ejecutando el servidor de Remote Desktop acceder a la opción del panel de control de Allow remote access to your computer o acceder directamente a las System Properties.

Allow Remote Access - Remote Desktop
Allow remote access to your computer

En la pestaña de Remote y bajo la sección de Remote Desktop seleccionar la opción Allow connections from computers running any version of Remote Desktop (less secure).  Por defecto se encuentra seleccionada la tercera opción.

Allow connections from any Remote Desktop protocol’s version

Otra alternativa

Como otra alternativa de conexión al escritorio remoto que parece no tener el problema de rdesktop con la autenticación de red es freerdp el cual se invoca desde la línea de comando de la siguiente manera.

$ xfreerdp -u USERNAME -d DOMAIN -p PASSWORD HOST

Esta herramienta incluye un parámetro adicional (-g) que encontré muy interesante y que permite escalar en un porcentaje específico la ventana local en la que se despliega el escritorio remoto.

Recursos

Instalación de Windows XP en un netbook desde una unidad USB

Introducción.

Instalar Windows XP en una netbook (portátil liviano sin unidad de DVD) desde una memoria USB no fue tan fácil y placentero como fue la instalación de Windows 7.  Después de algunas pruebas estos fueron los pasos que se siguieron.

Crear la unidad USB de instalación.

Para crear la unidad USB de instalación se utilizó WinToFlash.  Este procedimiento es muy simple, sólo se debe especificar cual es la unidad en la que se encuentran los archivos (CDROM) de instalación de Windows y cual es la unidad (USB) hacia la cual se realizará la copia.

Instalación del sistema operativo.

Una vez creada la unidad USB de instalación se debe iniciar el sistema desde ella y realizar normalmente los pasos de instalación de Windows XP.

Corregir el inicio de la unidad USB.

Finalizada la instalación del sistema operativo se intenta reiniciar y falla mostrando un error relacionado con la falta de archivos del sistema, comúnmente hal.dll.  Esto aparentemente se debe a que el instalador consideró a la unidad USB  como primer disco y al disco duro real como segundo, generando estas referencias incorrectas en el archivo boot.ini.

Para corregir esto es necesario editar este archivo y modificar la referencia a la partición en la que buscará al sistema operativo durante su inicio.  Por facilidad (para mi) utilicé un Linux (Peppermint) que inicia desde LiveUSB que casualmente tenía preparado para otra prueba.  En el ambiente Windows  imagino que se requerirá de un disco de arranque que permita acceder a través de la consola de texto a los comandos básicos del DOS.

Este es un ejemplo de boot.ini en el que se supone que hay un Windows XP Home Edition instalado en la primera partición del primer disco duro del equipo (como habitualmente sucede).

[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)WINDOWS=”Microsoft Windows XP Home Edition” /fastdetect

El parámetro rdisk (marcado en rojo) es el que se genera incorrectamente y aparece inicialmente con el valor de 1 (segundo disco duro).

Cambiar la ruta de los archivos de instalación.

Una vez superado el problema anterior el sistema operativo deberá iniciar sin problemas.  De manera opcional elegí copiar los archivos del sistema operativo al disco duro del netbook para que estén disponibles si se hace necesaria la instalación de algún componente adicional sin que se necesite insertar nuevamente la unidad USB preparada al comienzo de este procedimiento.

Para lograr esto además de copiar físicamente los archivos del CDROM de instalación al un directorio del disco duro, es necesario actualizar la referencia que tiene el sistema operativo de esta ruta.  Para hacer esto se debe ejecutar el programa regedit (hágalo como Administrador si obtiene problemas de permisos) y acceda a la siguiente rama en el panel izquierdo.

HKEY_LOCAL_MACHINE > Software > Microsoft > Windows > CurrentVersion > Setup.

Ubicado en esa rama identifique la variable SourcePath en el panel derecho y modifique su valor a la ruta absoluta donde se encuentra el directorio i386 de los archivos de instalación de Windows: c:instaladoreswindowsxpi386 en mi caso específico.

Google Chrome y los puertos inseguros: ERR_UNSAFE_PORT

Introducción.

Aparentemente Google Chrome incluye características de seguridad obligatorias como esta que impide que el usuario acceda a servidores a través de ciertos puertos considerados inseguros aunque eso sea realmente lo que se desea.

Error puertos inseguros de Google Chrome
Error puertos inseguros de Google Chrome

A continuación se define el procedimiento necesario para indicarle a Chrome que efectivamente se desea acceder a esos puertos.

Procedimiento.

La única opción es indicarle a Chrome desde el momento de su ejecución cuales son los puertos que se consideran seguros para permitir conexiones mas allá de los estándar.  Para hacer esto es necesario indicar el parámetro –explicitly-allowed-ports seguido por la lista de puertos separados por comas.  Por ejemplo:

$ /usr/bin/google-chrome –explicitly-allowed-ports=4444,5555,6666

Por facilidad, especialmente en la plataforma Windows, se recomienda modificar el acceso directo a la aplicación para que la modificación perdure.

Recuperar la sesión de Firefox

Introducción.

Firefox tiene una característica que permite recuperar el conetenido de su sesión (las pestañas abiertas) aún después de que ha ocurrido un problema grave de ejecución como es el caso cuando el proceso termina abruptamente o el equipo se apaga sin cerrarse convenientemente.

La siguiente vez que se utiliza Firefox, este permite elegir si se desea iniciar una nueva sesión o si por el contrario se desea restaurar la versión anterior.

Yo acostumbro aprovechar esta característica para trabajar en ciertas páginas web durante varias sesiones sin tomar nota de sus URLs, confiando en que la restauración de sesión las abrirá nuevamente.  Esto ha sido confiable salvo algunas pocas oportunidades en las cuales he perdido la sesión, especialmente molesto cuando por error propio presiono el botón de iniciar una nueva sesión en lugar del de restaurar.

Por suerte Firefox permite recuperar la copia de seguridad de la sesión aún si se ha decidido iniciar una nueva.  El procedimiento es muy simple y se explica a continuación.

Procedimiento.

Tan pronto como se desee recuperar la copia de seguridad de la sesión anterior escribir en la barra de direcciones la siguiente instrucción.

about:sessionrestore

La última sesión disponible se recuperará inmediatamente restaurando las pestañas que se tenía abiertas.

La configuración de la restauración de sesión permite ajustar otros comportamientos relacionados como el forzar a que siempre se restaure la sesión si hay una disponible, restaure automáticamente la siguiente sesión únicamente o desactivar esta característica.

Enlaces.

Calculando hashes (MD5 y SHA1) con C#/Mono

Introducción.

Una función de hashing recibe un bloque de datos arbitrarios y genera de manera determinística un arreglo de bytes con el valor de su hash, el cual tiene como característica el ser único para los datos procesados.

Los valores de hash tienen múltiples usos, entre ellos se utilizan en la criptografía para garantizar que la información de un mensaje no ha sido modificada.  Con este mismo uso, comúnmente se utiliza para determinar si la descarga de archivos ha sido exitosa o no (md5sum).

Existen varios algortimos de hashing, los mas conocidos son MD5 de 128 bits y SHA1 de 160 bits.  El primero de ellos es muy utilizado actualmente, especialmente para el almacenamiento de contraseñas, sin embargo ya no se considera seguro por lo cual es conveniente utilizar el segundo mencionado.

Implementación en C#/Mono.

Para la implementaciones que se describen a continuación se utilizaron los siguientes namespaces.

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

Calcular el hash de una cadena.

El primer paso es crear instancias de los algoritmos de hashing.

HashAlgorithm md5  = HashAlgorithm.Create("MD5");
HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");

Posteriormente se calcula el valor del hash de la cadena texto (text) especificada.

Byte[] md5Data  = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(text));
Byte[] sha1Data = sha1.ComputeHash(UTF8Encoding.UTF8.GetBytes(text));

Finalmente su valor puede ser manipulado o entregado al usuario.

Console.WriteLine("MD5:  " + BitConverter.ToString(md5Data).Replace("-", ""));
Console.WriteLine("SHA1: " + BitConverter.ToString(sha1Data).Replace("-", ""));

Calcular el hash de un archivo.

El procedimiento es muy similar al cálculo de hash de una cadena, pero a diferencia de este, los datos provienen de un flujo de archivo al cual se le calcula su valor.

FileStream fs = File.OpenRead(filename);

md5Data  = md5.ComputeHash(fs);
sha1Data = sha1.ComputeHash(fs);

fs.Close ();

Acceder a un servicio RDP de Windows a través de un túnel SSH

Introducción.

Esta semana fue necesario acceder remotamente a unos servidores para desplegar en ellos un proyecto.  El servidor web es visible a través de Internet y utiliza GNU/Linux, este expone además del http el servicio ssh al exterior utilizando el puerto 45729.  En la red interna (por obvias razones) se encuentra un segundo servidor con Windows XP SP3 sobre el cual se ejecuta la base de datos MSSQL.

Estructura general de la red
Estructura general de la red

Trivialmente el acceso al servidor web es muy sencillo gracias al SSH.  La transmisión de archivos al servidor Windows también puede ser fácilmente implementada gracias al cliente de Samba que permite una interacción transparente con el protocolo SMB de este sistema operativo.  Pero qué pasa si es necesario acceder a la consola grafica de Windows ?  Desafortunadamente en esta etapa de despliegue es necsario hacer verificaciones y algunos cambios en la base de datos MSSQL y no fue posible encontrar herramientas de administración remotas o web que fueran realmente efectivas.  La única opción sería acceder al escritorio a través de Internet.

Para hacer esto, el primer paso es activar el servicio de escritorio remoto (Remote Desktop Protocol) en Windows XP y autorizar su acceso desde la red LAN.

El segundo paso consiste en garantizar el acceso remoto a través de Internet.  Para esto se deberá aprovechar el protocolo SSH del servidor GNU/Linux.

Una primera aproximación es utilizar el ForwardX11 del servicio SSH a través del cual es posible unrrutar el protocolo de la interfaz gráfica de usuario (X11) hacia el cliente a través de la conexión segura.  Después de establecida la conexión se utiliza la aplicación rdesktop, local al servidor web, y su presentación es redirigida hacia el cliente gracias al protocolo SSH.

Esta aproximación fue exitosa, sin embargo los tiempos de respuesta aunque tolerables, fueron muy largos.

Una segunda aproximación consiste en la creación de un túnel SSH entre el servicio de RDP del servidor con Windows XP y el servidor GNU/Linux que pueda ser accedido desde Internet a través de conexiones seguras.  Esta aproximación, que se describe a continuación, nos dió unos mejores tiempos de respuesta a través de una implementación simple pero mas elegante que la anterior.

Procedimiento.

Como se mencionó anteriormente, el primer paso es la activación del servicio de escritorio remoto en la máquina Windows XP SP3 que se encuentra en la red privada, esto se debe realizar localmente.

El siguiente paso consiste en establecer el túnel entre el cliente y el servidor web (GNU/Linux) a través de Internet involucrando al servidor de bases de datos (Windows XP) asociándolo a un puerto específico del primero.  Para hacer esto se debe ejecutar el siguiente comando desde el cliente.

$ ssh -L 33389:192.168.3.1:3389 -l usuario mi.servidor.com -p 45729 -Nf

mi.servidor.com es el nombre FQDN con el que se accede al servidor GNU/Linux que expone a Internet el servicio de SSH a través del cual se ingresa a la red remota.  El puerto que utiliza en este caso el servicio SSH es el 45729.  De manera similar, la dirección del servidor Windows XP es la 192.168.3.1 y el puerto (por defecto) que utiliza el servicio de RPD es el 3389 con el cual se establece un túnel con el puerto local 33389.

El proceso después de autenticado se envía automáticamente a background retornando el control del shell gracias al parámetro -N especificado, sin embargo es posible verificar el establecimiento del túnel de la siguiente manera.

$ ps -fea | grep ssh

jimezam  25009     1  0 14:46 ?        00:00:00 ssh -L 33389:192.168.3.1:3389 -l usuario mi.servidor.com -p 45729 -Nf

Esquema general del túnel SSH
Esquema general del túnel SSH

En términos generales, el túnel SSH le permite al cliente acceder al servicio RDP remoto (192.168.3.1:3389) desde localhost:33389 de manera transparente a través del servicio SSH de mi.servidor.com.

Finalmente en el cliente se accede al escritorio remoto utilizando una aplicación como rdesktop de la siguiente manera.

$ rdesktop -z localhost:33389

La ejecución de este comando mostrará localmente la consola gráfica de la máquina Windows XP.

Escritorio remoto del servidor Windows XP
Escritorio remoto del servidor Windows XP

Una nota acerca de clientes en Windows.

Este procedimiento puede adaptarse para el uso de clientes Windows utilizando herramientas adicionales como el caso de Putty para el establecimiento del túnel SSH y la aplicación para conexión a escritorios remotos de Windows.

El primero de ellos es software libre y puede obtenerse en la página web de Putty mientras que el segundo hace parte de las herramientas incluídas en Windows XP y se accede a través de los siguientes menúes.

Inicio > Accesorios > Conexión a escritorio remoto.

Conexión al escritorio remoto de Windows XP
Conexión al escritorio remoto de Windows XP

Enlaces.

Georreferenciando de manera fácil y simple con GeoNames utilizando C#/Mono

Introducción.

Últimamente he tenido ganas de desarrollar en C# para retomar este lenguaje que tengo un poco abandonado y al mismo tiempo probar los avances que ha tenido el proyecto Mono.  Que mejor inicio que desarrollar una aplicación muy simple para georreferenciar ciudades aprovechando el servicio web de Geonames, esta a su vez me servirá para complementarla y solucionar un problema de información que tengo para otro proyecto.

Como se podrá apreciar, el código es muy sencillo ya que no utilizo ninguna librería adicional a las estándar, sin embargo es interesante y puede serle de utilidad a alguien mas.

Cuál es la necesidad ?

El problema que se tiene es la necesidad de georreferenciar ubicaciones, es decir, conociendo su nombre obtener su ubicación en términos de latitud y longitud.

Si estoy en Manizales, Caldas, Colombia estaré realmente en latitud 5.07, longitud -75.52056.

Es necesario tener en cuenta que muchas veces el servicio de georreferenciación retorna múltiples resultados ya que pueden haberse referenciado varios sitios con el mismo nombre, haberse cambiado el nombre de la ubicación o tenerse varios hitos de diferente nivel administrativo.  En Geonames esto último se identifica mediante los campos de características.  Consulte el sitio web de Geonames para mas información acerca de los feature codes.

Cómo es el servicio web ?

El servicio web de búsquedas de Geonames recibe una cadena de texto con la ubicación que se desea georreferenciar y retorna una cadena de texto en formato XML (en este caso) con los resultados obtenidos.

Por ejemplo, la consulta de Manizales, Caldas, Colombia se realizaría a través del siguiente URL.

http://ws.geonames.org/search?lang=es&type=xml&style=FULL&q=Manizales,Caldas,Colombia

Retornará el siguiente resultado.

<geonames style="FULL">
    <totalResultsCount>2</totalResultsCount>
    <geoname>
        <toponymName>Manizales</toponymName>
        <name>Manizales</name>
        <lat>5.07</lat>
        <lng>-75.52056</lng>
        <geonameId>3675443</geonameId>
        <countryCode>CO</countryCode>
        <countryName>Colombia</countryName>
        <fcl>P</fcl>
        <fcode>PPLA</fcode>
        <fclName>city, village,...</fclName>
        <fcodeName>seat of a first-order administrative division</fcodeName>
        <population>357814</population>
        <alternateNames>Manisales,Manisalesas,Manizales,Манисалес</alternateNames>
        <elevation/>
        <continentCode>SA</continentCode>
        <adminCode1>37</adminCode1>
        <adminName1>Caldas</adminName1>
        <adminCode2/>
        <adminName2/>
        <alternateName lang="en">Manizales</alternateName>
        <alternateName lang="pl">Manizales</alternateName>
        <alternateName lang="lt">Manisalesas</alternateName>
        <alternateName lang="bg">Манисалес</alternateName>
        <alternateName lang="cs">Manizales</alternateName>
        <alternateName lang="link">http://en.wikipedia.org/wiki/Manizales</alternateName>
        <alternateName lang="de">Manizales</alternateName>
        <alternateName lang="sv">Manizales</alternateName>
        <alternateName lang="es">Manizales</alternateName>
        <alternateName lang="no">Manizales</alternateName>
        <alternateName lang="pt">Manizales</alternateName>
        <timezone dstOffset="-5.0" gmtOffset="-5.0">America/Bogota</timezone>
        <score>1.0</score>
    </geoname>
    <geoname>
        <toponymName>Manizales</toponymName>
        <name>Manizales</name>
        <lat>5.08333</lat>
        <lng>-75.5</lng>
        <geonameId>3675444</geonameId>
        <countryCode>CO</countryCode>
        <countryName>Colombia</countryName>
        <fcl>A</fcl>
        <fcode>ADM2</fcode>
        <fclName>country, state, region,...</fclName>
        <fcodeName>second-order administrative division</fcodeName>
        <population/>
        <alternateNames/>
        <elevation/>
        <continentCode>SA</continentCode>
        <adminCode1>37</adminCode1>
        <adminName1>Caldas</adminName1>
        <adminCode2>3675444</adminCode2>
        <adminName2>Manizales</adminName2>
        <timezone dstOffset="-5.0" gmtOffset="-5.0">America/Bogota</timezone>
        <score>0.3448537290096283</score>
    </geoname>
</geonames>

Finalmente la tarea de la aplicación que consuma el servicio será procesar el documento XML y obtener la información que necesite.

Cómo es la implementación ?

Las librerías (namespaces) utilizados son los siguientes.

using System;
using System.Net;
using System.Text;
using System.Xml;
using System.Collections.Generic;

Se prepara el URL para consumir el servicio con la ubicación a geocodificar.  En este caso, especifico una por defecto si no suministra una.

string location = (args.Length == 0) ? "Manizales, Caldas, Colombia" : args[0];
string url = "http://ws.geonames.org/search?lang=es&type=xml&style=FULL&q=" + location;

Se consume el servicio web y se obtiene la cadena de texto con la respuesta en formato XML.

WebClient client = new WebClient();
string xml = client.DownloadString(url);

Se crea un objeto para manipular el documento XML recién recibido, se obtienen los nodos relacionados con la respuesta de la georreferenciación (geoname)  y se verifica que haya registros, de lo contrario no habrá nada que hacer.

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

XmlNodeList geonames = doc.GetElementsByTagName("geoname");

if(geonames.Count == 0)
 throw new Exception("There is no geonames in the result!");
else
 Console.WriteLine("I found " + geonames.Count + " places!n");

Se recorren los resultados obtenidos extrayéndoles la información georreferenciada que se requiera.

foreach(XmlElement place in geonames)
{
 Console.WriteLine("* LUGAR: " + place["name"].InnerText + "n");

 Console.WriteLine("tNombre: "          + place["name"].InnerText);
 Console.WriteLine("tDepartamento: "    + place["adminName1"].InnerText);
 Console.WriteLine("tLatitud: "         + place["lat"].InnerText);
 Console.WriteLine("tLongitud: "        + place["lng"].InnerText);
 Console.WriteLine("tPaís: "            + place["countryName"].InnerText +
                   " (" + place["countryCode"].InnerText + ")");
 Console.WriteLine("tPoblación: "       + place["population"].InnerText + " habitantes");
 Console.WriteLine("tPaís: "            + place["countryName"].InnerText +
                   " (" + place["countryCode"].InnerText + ")");
 Console.WriteLine("tCaracterísticas: " + place["fcl"].InnerText + "/" + place["fcode"].InnerText +
                   "> " + place["fclName"].InnerText + " (" + place["fcodeName"].InnerText + ")");

 Console.WriteLine();
}

Cómo construyo el programa ?

Si se utiliza VisualStudio/MonoDevelop sólo es necesario abrir la solución (incluída en el paquete de demostración) y ejecutar el comando de Build o Run del menú.

Si se desea realizar manualmente deberá ejecutarse un comando como el siguiente.

$ gmcs “/out:GeoCoderSimple.exe” “/r:/usr/lib/mono/2.0/System.dll” “/r:/usr/lib/mono/2.0/System.Xml.dll” /t:exe “geonames_search_raw/Main.cs

Donde geonames_search_raw/Main.cs es el código fuente de la aplicación y GeoCoderSimple.exe será el archivo binario resultante.

Cómo ejecuto el ejemplo ?

Ya sea invocándolo desde el IDE o desde línea de comando, el programa recibe un argumento.  En caso de obviarse este argumento se utilizará el valor por defecto.

$ ./GeoCoderSimple.exe

I found 2 places!

* LUGAR: Manizales

 Nombre: Manizales
 Departamento: Caldas
 Latitud: 5.07
 Longitud: -75.52056
 País: Colombia (CO)
 Población: 357814 habitantes
 País: Colombia (CO)
 Características: P/PPLA> city, village,... (seat of a first-order administrative division)

* LUGAR: Manizales

 Nombre: Manizales
 Departamento: Caldas
 Latitud: 5.08333
 Longitud: -75.5
 País: Colombia (CO)
 Población:  habitantes
 País: Colombia (CO)
 Características: A/ADM2> country, state, region,... (second-order administrative division)

Enlaces.

Acceder al escritorio remoto de GNU/Linux Ubuntu 10.04 utilizando FreeNX

Introducción.

Después de experimentar el acceso al escritorio remoto de GNU/Linux a través de XDMCP (con Xephyr y como una terminal) encontré que los resultados fueron satisfactorios pero con algunas desventajas: la seguridad y la velocidad.  En pocas palabras no es prudente utilizar XDMCP en un ambiente diferente a LAN ya que su tráfico no está encriptado y el puerto abierto puede convertirse en un problema de seguridad.

Por esta razón decidí probar un software muy conocido pero que nunca utilizado.  FreeNX es la versión libre del NXServer de NoMachine, el cual es descrito de la siguiente manera en su sitio de Launchpad.

NX technology is a computer program that handles remote X Window System connections, and attempts to greatly improve on the performance of the native X11 protocol to the point that it can be usable over a slow link such as a dial-up modem … The open source alternative to NoMachines’s commercial NX Server.

En términos generales me gustaron mucho los resultados, es rápido y aparentemente seguro (su tráfico se envía a través de SSH). El servidor inclusive puede servir de proxy para acceder a servidores RDP (Windows), VNC o de impresoras mediante los paquetes freenx-rdp, freenx-vnc y freenx-smb respectivamente.

En la instalación, a pesar de no ser compleja, encontré un par de bugs para Ubuntu 10.04 que fueron resueltos.  Este procedimiento se describe a continuación.

Instalar el servidor.

Instalar los paquetes.

$ sudo aptitude install python-software-properties

$ sudo add-apt-repository ppa:freenx-team

$ sudo aptitude update

$ sudo aptitude install freenx-server

Crear las llaves de acceso (opcional).

Como mencioné inicialmente, FreeNX utiliza el protocolo SSH para su transporte, por este motivo puede aprovechar la riqueza de opciones de autenticación que provee este servicio.  Por defecto el servidor instala una pareja de llaves por defecto, utilizarlas constituye un riesgo de seguridad.  Por este motivo se sugiere que se creen y popularicen las llaves propias.  Si la seguridad no es una preocupación, puede obviar este paso y continuar con la instalación del cliente.

Si recibe un mensaje de error al ejecutar nxsetup indicándole que el comando no fue encontrado, realice primero los pasos descritos en la sección de solución de problemas.

$ sudo sudo /usr/lib/nx/nxsetup –install

——> It is recommended that you use the NoMachine key for
easier setup. If you answer “y”, FreeNX creates a custom
KeyPair and expects you to setup your clients manually.
“N” is default and uses the NoMachine key for installation.

Do you want to use your own custom KeyPair? [y/N] y
Setting up /etc/nxserver …done
Generating public/private dsa key pair.
Your identification has been saved in /etc/nxserver/users.id_dsa.
Your public key has been saved in /etc/nxserver/users.id_dsa.pub.
The key fingerprint is:
90:d2:6b:93:58:35:09:7b:e4:cd:43:db:83:9b:e2:bf root@jimezam-notebook
The key’s randomart image is:
+–[ DSA 1024]—-+
|      ..+..      |
|     . *.= +     |
|    . * o * o    |
|     + =   + .   |
|    . = S o      |
|     . o .       |
|        .        |
|         .       |
|          E.     |
+—————–+
Setting up /var/lib/nxserver/db …done
Setting up /var/log/nxserver.log …done
Adding user “nx” to group “utmp” …done
Setting up known_hosts and authorized_keys2 …Unique key generated; your users must install

/var/lib/nxserver/home/.ssh/client.id_dsa.key

on their computers.
done
Setting up permissions …done
Setting up cups nxipp backend …
cp: `/usr/lib/cups/backend/ipp’ and `/usr/lib/cups/backend/ipp’ are the same file

Copie la llave a los equipos cliente, la cual posteriormente podrá ser importada desde el cliente de NX.

$ sudo scp /var/lib/nxserver/home/.ssh/client.id_dsa.key usuario@mi-cliente:~/client.id_dsa.key

Después de importada la llave en el cliente de NX de mi-cliente, se recomienda que remueva el archivo ~/client.id_dsa.key.

Crear nuevas llaves (Servidor)

Es posible que por motivos de seguridad posteriormente desee crear nuevas llaves para reemplazar las existentes después de una cierta cantidad de tiempo.  Para hacer esto ejecute el siguiente comando.

$ sudo dpkg-reconfigure freenx-server

Seleccione el tipo de llaves a utilizarse, utilice la opción Create new custom keys para crear un nuevo par.

Selección del tipo de llaves
Selección del tipo de llaves

Seleccione el tipo de autenticación a utilizarse, en este caso se utilizará el servicio SSH.

Selección del tipo de autenticación
Selección del tipo de autenticación

Finalmente transmita la nueva llave a los clientes para permitirles acceder nuevamente al servidor.

Instalar el cliente.

Instalar el paquete.

Descargue el paquete correspondiente a su sistema operativo de la siguiente dirección.

http://www.nomachine.com/select-package-client.php

Para este caso, Ubuntu 10.04 de 64 bits, se descargo el paquete NX Client DEB for Linux – x86_64.  A continuación se instala el paquete recién descargado.

$ sudo dpkg -i nxclient_3.4.0-7_x86_64.deb

CUPS Printing Backend

The NX Client set-up procedure detected that your “IPP CUPS” printing
backend doesn’t allow printing from the NX session. In order to have
printing support in your NX system, you need to set proper permissions
on the IPP backend. Please execute:

chmod 755 /usr/lib/cups/backend/ipp

$ sudo chmod 755 /usr/lib/cups/backend/ipp

Ejecutar el cliente.

$ /usr/NX/bin/nxclient &

Crear una nueva cuenta de conexión con el asistente (cliente).

Presione el botón Next para iniciar el asistente de creación de cuentas.

Iniciar el asistente de creación de cuentas
Iniciar el asistente de creación de cuentas

Especifique la siguiente información relacionada con la conexión al servidor.

  • Session: nombre de la sesión (a gusto del usuario).
  • Host: dirección IP o nombre del servidor FreeNX.
  • Port: puerto donde se está ejecutando el servicio SSH.
  • Connection Type: tipo de acceso a la red, en este caso es una red LAN.
Información de conexión al sevidor
Información de conexión al sevidor

Especifique la siguiente información relacionada con el administrador de ventanas a ejecutarse en el servidor.

  • Tipo: en este caso será una conexión nativa (Unix) y se ejecutará GNOME.
  • Size: se permite utilizar el máximo tamaño disponible.
Información del escritorio
Información del escritorio

Presione el botón Finish para terminar el asistente.

Finalizar la instalación
Finalizar la instalación

Realizar una conexión con el servidor.

Registro de usuarios
Registro de usuarios

Seleccione el tipo de sesión (Session) que se creó anteriormente a través del asistente y especifique su información de autenticación (Login y Password) para acceder al servidor.  Presione el botón Login para iniciar la sesión.

Si el servidor cuenta con sus propias llaves personalizadas (ver proceso de instalación) será necesario importarlas en el cliente para poder registrarse exitosamente (ver siguiente apartado).

Importar las llaves del servidor en el cliente.

Si el servidor cuenta con sus propias llaves personalizadas (que es lo mas conveniente) es necesario importarlas en el cliente para que se realice exitosamente la conexión al mismo.  Para esto es necesario transferir la llave (client.id_dsa.key) de manera segura desde el servidor hasta el cliente (ver comando scp en la instalación del servidor).

Para importar el archivo de llave seleccione editar la configuración de la sesión presionando el botón Configure del diálogo de registro (ver anterior).

Configuración de sesión
Configuración de sesión

Presione el botón Key… e importe o pegue la llave proveniente del archivo client.id_dsa.key traído desde el servidor.  Después de importado se recomienda que remueva de manera segura este archivo.

Importar llave
Importar llave

Solución de problemas.

No existe la aplicación nxsetup.

Si obtiene el siguiente mensaje de error, el paquete de freenx-server no incluyó erróneamente la aplicación nxsetup la cual es necesaria para realizar su instalación completa.

nxsetup: command not found

Para corregir este problema realice los pasos descritos a continuación.

$ cd /usr/lib/nx

$ sudo wget “https://help.ubuntu.com/community/FreeNX?action=AttachFile&amp;do=get&amp;target=nxsetup.tar.gz”

$ sudo mv “FreeNX?action=AttachFile&amp;do=get&amp;target=nxsetup.tar.gz” nxsetup.tar.gz

$ sudo tar zxvf nxsetup.tar.gz

$ sudo rm nxsetup.tar.gz

Enlaces.

Recuperar el GRUB de GNU/Linux Ubuntu 10.04 después de instalar Windows

Introducción.

Después de instalar Windows sucedió lo que se esperaba, el MBR del disco duro fue sobreescrito por el instalador y el GRUB fue removido.  Como consecuencia de esto ya no es posible acceder a Linux, únicamente a Windows.

Este es el procedimiento necesario para recuperar el GRUB de un GNU/Linux Ubuntu 10.04 instalado previamente a la instalación de Windows 7.

Recuperar el GRUB.

Para hacer esto es necesario iniciar el equipo con una versión en vivo de GNU/Linux Ubuntu 10.04, esto se logra con el CD de instalación o con su respectiva LiveUSB.  Se debe especificar durante su inicio que la intención es la de probar el sistema operativo mas no de instalarlo nuevamente.

A continuación es necsario identificar cual es el disco y la partición raíz (donde se encuentre /boot) de GNU/Linux. La forma mas simple de hacer esto es utilizando el administrador de unidades y medios (Disk Utility) ejecutando el siguiente comando o seleccionando el menú System > Administration > Disk Utility.

$ /usr/bin/palimpsest

Particiones del disco duro
Particiones del disco duro

En este caso, el directorio raíz se encuentra en la partición 5 del primer disco duro, es decir, su dispositivo es /dev/sda5.

Desde una terminal se procede a montar la partición mencionada anteriormente con mediante als siguientes instrucciones.

$ mkdir /tmp/raiz

$ sudo mount /dev/sda5 /tmp/raiz

Finalmente se solicita que se recree el GRUB en el MBR basado en la información encontrada.

$ sudo grub-install –root-directory=/tmp/raiz /dev/sda

Importante: es necesario tener en cuenta que el GRUB se crea sobre el disco duro elegido (sda), no sobre una partición específica (sda5).

Al reiniciar el sistema operativo ya deberá aparecer el GRUB permitiéndole elegir cual de los sitemas operativos registrados iniciar.

Agregar Windows a la lista de selección.

En este caso primero instalé Ubuntu y después instalé Windows lo que motivó en primera instancia que se perdiera el MBR.  Esto trae consigo un problema secundario: al recuperar el GRUB este no contiene una referencia a Windows ya que cuando fue creado aún no se había instalado el segundo sistema operativo.

Para solucionar este problema se deben instalar las herramientas del GRUB de la siguiente manera.

$ sudo aptitude install grub-pc

Con ellas, cada vez que se actualice su información se revisarán las particiones existentes en búsqueda de nuevos sistemas operativos que se configurarán automáticamente para aparecer en el GRUB la próxima vez que se reinicie el sistema.

$ sudo update-grub2

Para este caso específico, la partición de Windows 7 (NTFS) corresponde con el dispositivo /dev/sda2 motivo por el cual se agrega automáticamente la siguiente opción en el archivo /boot/grub/grub.cfg.

menuentry “Windows 7 (loader) (on /dev/sda2)” {
insmod ntfs
set root=’(hd0,2)’
search –no-floppy –fs-uuid –set 4a3c22f43c22db29
chainloader +1
}