martes, 8 de mayo de 2012

Inicio de sesión automático en ssh

Inicio de sesión automático en ssh

Un problema que solemos tener constantemente es tener que introducir la contraseña de los usarios de forma continua cuando conectamos a una máquina remota via SSH.
En linux se resuelve siguiendo estos dos pasos:
  1. Creando un par  clave privada-publica para mi usuario.
  2. Añadiendo la clave pública del par al fichero de claves autorizadas del equipo al cual queremos conectarnos.

Generar el par clave privada - clave pública

Debemos generar un par de clave privada-pública en el equipo desde el cual queremos acceder, de forma, que estos autentifiquen a nuestro usuario frente al servidor ssh.

En Windows

En Windows, debemos usar la utilidad Puttygen, que nos permitirá crear la clave deseada:

Para generar una clave, primero escogemos en los botones de abajo entre las tres opciones de clave:
  1. SSH1(RSA)
  2. SSH2-RSA
  3. SSH2-DSA
En principio el algoritmo RSA aunque es algo más antiguo es seguro, mientras que el DSA es más novedoso y también es considerado seguro.
Tras escoger el algoritmo, debemos pulsar el boton generate, y luego, mover el ratón por la pantalla para que el programa pueda crear nuestra clave.
Tras tener la clave, nos aparecerá una ventana similar a esta:
Como puedes ver, se muestra dos cuadros donde pone Key passphrase: En ellos debemos colocar una clave que usaremos para poder instalar nuestra clave privada, de forma que si perdemos esta, no puedan facilmente obtenerla del archivo.
Ya solo nos queda ver que disponemos de dos botones, uno llamado "Save Public Key" que se usa para guardar la clave pública en un fichero de texto plano.
Para mi clave pública ese texto es el siguiente:
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "dsa-key-20120508"
AAAAB3NzaC1kc3MAAACBALCFITMt1WUK1Ix8BPaqv+nNCd1h0dURKtXvGLiGqBRI
zTamYdqiYUXdOfOEArWgpe3wdXrM2J0FJso6tLw1qk4iVDlISVPhu4EcV1NhZRcb
e4xRi50Q8PlCIbMbaqKiqti993AcPGEx1oan+ExYf1AtoWj83Qykk8UOZwWI6v5d
AAAAFQDWQtzlyi61eHhhyVH27juoTnlWRQAAAIABlRJ1R+aTUfuw0Yrsl4iRvBht
SYibepyzaWCfy0l/xKbnoMsrhlpZ2UlapSYUV1zjZiiu5cA52iV//PpjfD21v/r7
zfWrLpxbGVnkhz+gN/zNgqMquUu1s6+l2yeCHX9ASpG3cfwJOzW/RUvtP9o4vtPU
j0WLv9+jmncc8RXddwAAAIB1SFPkyAmyAdvUahOEfHTV+rgQtoZz0bfzs9uslNoI
3r395u/ozaz8nqs7d5KT0LzkKGM5tnQMJG1VazGNjfL4E5DdcPMXEirZ5jrV5xU5
7jpdZAQVBrkAkYR9Bmasbqbpohb2PLoGYHw5L5A9a1cpRSQ7F9SuDoJ5S6BRhP7A
sA==
---- END SSH2 PUBLIC KEY ----
Y otro botón denominado save private key, que nos guardará en un fichero de certificado ppk la clave privada.
Nota: El fichero ppk contiene tanto la clave privada como la pública.

En Linux

En Linux deberemos crear el par de clave privada-pública con el comando ssh-keygen, que nos creará una clave RSA por defecto:
emc2@server1:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/emc2/.ssh/id_rsa): emc2@server1.emc.lan
emc2@server1.emc.lan already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Passphrases do not match.  Try again.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in emc2@server1.emc.lan.
Your public key has been saved in emc2@server1.emc.lan.pub.
The key fingerprint is:
f9:fc:c2:22:9b:53:59:ef:a8:e5:32:1e:c9:6e:be:11 emc2@server1
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|         ..      |
|        Eo .     |
|       .o=  .    |
|       .=.+o     |
|      oo==+..    |
|      oB**...    |
+-----------------+
Como puedes ver, en primer lugar nos pide un nombre de fichero donde guardar la clave, a lo cual respondemos con emc2@server1.emc.lan.ppk (si no le pongo extensión me dejaría el fichero ppk sin extensión).
Tras ello, me pide una contraseña de paso para instalar el certificado, y despues lo genera.
El programa va a generar dos archivos:
  1. emc2@server1.emc.lan.ppk: Contiene el par clave publica y privada.
  2. emc2@server1.emc.lan.ppk.pub: Contiene la clave pública, y es un fichero de texto normal y corriente.

Añadir al repositorio de claves del servidor ssh nuestra clave pública

Deberemos añadir la clave en cada usuario del servidor al cual queramos conectarnos automaticamente.
Este proceso lo podemos realizar de dos formas:
  1. Editando los ficheros de configuración ssh.
  2. Con el comando ssh-copy-id

Editando los ficheros de configuración del servidor ssh:

Nuestro usuario en el servidor debe tener una carpeta .ssh, que deberá tener los siguientes permisos:
emc2@server1:~$ ls -ld .ssh
drwx------ 2 emc2 emc2 4096 may  8 09:43 .ssh
Como ves, solo es accesible al usuario.
Dentro de esa carpeta, debe existir (y si no lo creamos) denominado 
 en la cual aparecerá un fichero denominado authorized_keys que contiene las claves públicas autorizadas:
emc2@server1:~/.ssh$ ls -l authorized_keys
-rw------- 1 emc2 emc2 618 may  8 09:43 authorized_keys
Como puedes ver, el fichero tiene permisos solo para el propietario.
Debemos editar el fichero que contiene la clave pública que hemos generado en el cliente, y debemos pegar esa clave pública en nuestro fichero authorized_keys, el formato, es el siguiente:
En mi caso el contenido del fichero es el siguiente:
emc2@server1:~/.ssh$ cat authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAACBALCFITMt1WUK1Ix8BPaqv+nNCd1h0dURKtXvGLiGqBRIzTamYdqiYUXdOfOEArWgpe3wdXrM2J0FJso6tLw1qk4iVDlISVPhu4EcV1NhZRcbe4xRi50Q8PlCIbMbaqKiqti993AcPGEx1oan+ExYf1AtoWj83Qykk8UOZwWI6v5dAAAAFQDWQtzlyi61eHhhyVH27juoTnlWRQAAAIABlRJ1R+aTUfuw0Yrsl4iRvBhtSYibepyzaWCfy0l/xKbnoMsrhlpZ2UlapSYUV1zjZiiu5cA52iV//PpjfD21v/r7zfWrLpxbGVnkhz+gN/zNgqMquUu1s6+l2yeCHX9ASpG3cfwJOzW/RUvtP9o4vtPUj0WLv9+jmncc8RXddwAAAIB1SFPkyAmyAdvUahOEfHTV+rgQtoZz0bfzs9uslNoI3r395u/ozaz8nqs7d5KT0LzkKGM5tnQMJG1VazGNjfL4E5DdcPMXEirZ5jrV5xU57jpdZAQVBrkAkYR9Bmasbqbpohb2PLoGYHw5L5A9a1cpRSQ7F9SuDoJ5S6BRhP7AsA== emc2@portatilemc2sev.emc.lan
Ojo: tras ssh-dss no hay un retorno de carro, hay un espacio que corta la propia página web.
Como puedes ver, tendremos:
  1. en primero lugar el protocolo ssh-dss (también podría ser ssh-rss), 
  2. la clave pública que queremos usar (esa la editamos con el block de notas o cualquier editor de textos).
  3. == usuario@nodo que autenticamos.

Usar el comando ssh-copy-id

Con el comando ssh-copy-id la vida es más facil. Pero esto solo lo podemos hacer con clientes Linux.
Para usarlo, solamente ejecutamos:
$ ssh-copy-id usuario@maquina
Ahora la máquina nos pedirá la contraseña de usario, y tras iniciar sesión, añadirá la clave pública a el repositorio de claves del cliente.
Ojo: Para que esto funcione, al crear la clave con ssh-keygen, no debemos haber dado nombre al fichero de certificado, escogiendo el nombre por defecto (~/.ssh/id_rsa.pub).

jueves, 3 de mayo de 2012

Como hacer una copia de seguridad del sector de arranque con Linux

El "Master Boot Record (MBR)" o "Sector de Arranque" es una de las piezas que debemos conocer de nuestro disco duro para poder mantener de forma acertada un equipo con varios sistemas operativos instalados.

El BIOS (Basic Input Output System)

Todos hemos oido hablar del BIOS, es esa pantallita que aparece en un ordenador al arrancar, pero vamos a intentar contextualizar la BIOS dentro del mundo de la informática.

Plataforma de un ordenador

No todos los equipos tienen BIOS. Entendemos por plataforma hardware como una combinación de hardware que va a constituir una computadora.
Por ejemplo, si cogemos un ordenador Apple con un microprocesador PowerPC, tendremos lo que llamamos una plataforma PowerPC.
Tendremos una plataforma PC o tambien llamada x86 cuando tengamos un equipo basado en un microprocesador descendiente del 8086 (como lo son el 80286, 80386, 80486, Pentium, II, III, IV, AMD K6, AMD Athlon, etc) con una placa base compatible con este, memoria y disco duro.
También podremos tener una plataforma PC de 64 bits, también denominada x86_64, que es una nueva plataforma basada en los PC, pero compatible hacia atrás con estos.
Además existen múltiples plataformas: Alpha, Itanium, etc. cada una de ellas con sus características distintivas.

¿Todos los ordenadores tienen BIOS?

Te lo estás imaginando, no, no todos los ordenadores tienen BIOS, solamente los PC's la tienen.
Me parece un error garrafal no comentar a los estudiantes de informática sobre lo específico que es el mundo PC, que aunque domine casi toda la computación, no es lo único disponible. No es necesario enseñar a nadie nuevas plataformas, ya que estas son minoritarias, pero por lo menos, que sepan que no todo el "monte es oregano".
De hecho, ya ha habido intentos de sustituir la obsoleta BIOS, por un sistema más potente de esquema de arranque (el sistema EFI) que además de usar memoria ROM, usaría una pequeña partición en el disco duro para tal cometido. Estos intentos se han topado con el poco interés de los fabricantes de hardware por implementarlos, además del requisito de la compatibilidad con la BIOS.

Pero exactamente, ¿que hace la BIOS?

Como todos sabeis, hay dos tipos generales de memoria, RAM (Random Access Memory) y ROM (Read Only Memory), y que un ordenador para arrancar necesita que se le proporcione un programa, pues bién, debemos introducir de algún modo ese programa, y ese modo es tenerlo guardado en memoria ROM, la cual no va a ser borrada en el arranque del equipo.
Cuando un PC arranca, comienza a ejecutar instrucciones a partir de la dirección de memoria 0x0000 (cero o la primera dirección de memoria), donde casualmente está ubicado el chip BIOS.
En el arranque, el programa BIOS lee una pequeña memoria flash donde se guarda la configuración del ordenador (o también llamado configuración de la BIOS). En esta memoria va a leer cosas como ¿que dispositivos deben ser activados?, ¿cuales no?, ¿orden de arranque de los dispositivos?, ¿fecha y hora?, etc.
Tras leer la flash, la BIOS va a activar y chequear que los dispositivos que componen el PC funcionan correctamente.
Una vez comprobado que todo está bien, el programa BIOS va a cargar en memoria el primer sector del disco duro y va a comenzar a ejecutarlo. Esto es el arranque a partir del disco duro. Si arrancamos a partir de un CD o de otro dispositivo el procedimiento tienen que ser similar: Leer un sector, y proceder a su ejecución.
Lo que mucha gente no sabe, es que la BIOS mantiene una segunda función: Es una especie de API o biblioteca de funciones que permite acceder al hardware. Efectivamente, La BIOS tiene rutinas para leer y escribir en los discos duros, en pantalla, puertos, etc. De hecho los sistemas operativos MS-DOS no tenían sus propias rutinas para estos cometidos ya que llamaban a las rutinas de la BIOS, pero posteriormente, debido a limitaciones en la BIOS, los sistemas operativos no van a usar las rutinas BIOS, sustituyendo estás por sus propias rutinas (en esto también influye que la memoria ROM que forma la BIOS es mucho más lenta de leer que la RAM).

El Master boot Record (MBR)

El MBR es el primer sector del del disco duro. Cuando la BIOS decide que es nuestro disco duro el que debe arrancar el equipo, lee el MBR, lo coloca en memoria y comienza a ejecutarlo.
El MBR está compuesto por tres zonas:
  1. El arranque maestro (446 bytes): No es más que un programa para ser ejecutado por el procesador. Este se encargará de cargar el sistema operativo. Hay que notar que el tamaña de este programa es demasiado pequeño para contener un sistema operativo, por lo cual solamente se podrá hacer cargo de buscar el resto del sistema operativo y cargarlo en memoria. Digamos que el arranque maestro tira del hilo para seguir cargando nuestro sistema operativo.
  2. Tabla de Particiones (64 bytes): Aquí se guarda la configuración de las particiones del disco.
  3. Firma de unidad arrancable (2bytes).

Arranque maestro en Windows

En los sistemas operativos Windows, a grandes rasgos, tras cargarse el MBR, el arranque maestro lee la tabla de particiones y busca la partición activa. A partir de hay cede el control a determinados ficheros de la partición activa.
Como en una plataforma Windows el código de arranque solo sabe ceder el control a la partición activa, este arranque es igual en todos los sistemas Windows.

Arranque maestro en Linux

En los sistemas Linux, se pueden usar multitud de gestores de arranque, pero el que vamos a ver nosotros es el GRUB.
El gestor de arranque GRUB está formado por dos partes:
  1. Stage1: Es el código que se coloca en el arranque maestro (o alternativamente en el primer sector de una partición primaria, pero este caso no es muy frecuente).
  2. Stage2: Es código que se coloca en la partición donde tenemos instalado Linux. Esto es a grosso modo, ya que realmente, el stage2 se coloca dentro de la carpeta /boot/grub.
El stage1 es distinto en cada disco duro, ya que este debe ceder el control al stage2, que se encuentra dentro de una partición, y no disponemos de espacio para incluir los controladores de los sistemas de archivos más usados en Linux. Por esto, debemos de incluir en el stage1 la dirección de disco del stage2 (es decir el número de sector donde está escrito), y esta dirección será distinta en cada disco duro.

El comando dd

El comando dd es usado por los administradores de sistemas para hacer copias de seguridad de discos duros y tareas parecidas. Es un comando peligroso, pero que bien usado, tiene grandes ventajas.
Dd copia dispositivos a nivel físico (es decir, sector a sector) sin pasar a través de un sistema de archivos.
dd admite estos parámetros principales:
dd [if=<fichero|dispositivo>][of=<fichero|dispositivo>][bs=tamaño_sector][count=numero_sectores]
  1. if indica el dispositivo o fichero del cual vamos a leer. Si no lo indicamos, leemos de la entrada estandard.
  2. of indica el fichero o dispositivo en el cual vamos a escribir. Si no lo indicamos, escribimos en la salida estandard.
  3. bs indica el tamaño de sector que vamos a usar, por defecto, 512 bytes.
  4. count indica el numero de sectores que queremos copiar. Si no lo indicamos dd irá copiando de la entrada hasta llegar al final.
Veamos un ejemplo, queremos hacer una copia de un disco duro (/dev/sda) a otro disco duro idéntico (/dev/sdb). Para ello usaremos el siguiente comando:
# dd if=/dev/sda of=/dev/sdb
Estoy leyendo el dispositivo (if) /dev/sda (primer disco duro), y el contenido leido lo guardo en /dev/sdb (segundo disco duro).
El proceso termina cuando se haya leido todo el disco duro del que leo, o cuando en el segundo disco duro se acabe el espacio. Si los dos discos tienen el mismo tamaño, se hará una copia exacta del primero.

Hacemos la copia del sector de arranque

Bueno, para copiar nuestro sector de arranque, tendremos que usar el siguiente comando (suponiendo que el disco sea /dev/sda):
# dd if=/dev/sda of=copia_arranque bs=446 count=1
Que explicado, copia del primer disco duro (/dev/sda) 446 bytes (el tamaño del arranque maestro) en un fichero denominado copia_arranque.

Restaurar la copia del sector de arranque

Para restaurar la copia del sector de arranque, tendremos que invertir entrada y salida en el comando anterior:
# dd if=copia_arranque of=/dev/sda
No nos hace falta indicar cuantos bytes escribir, ya que el fichero copia_arranque solo tiene 446 bytes, y los debe copiar en el primer sector del disco duro.