martes, 4 de febrero de 2014

ISCSI en Ubuntu 12.04

ISCSI

iSCSI es un protocolo usado para conectar unidades de disco a través de redes locales sobre TCP/IP. iSCSI actualmente está sustituyendo con bastante éxito a otros protocolos usados para crear redes SAN a través de redes de fibra óptica (Fibre channel).
iSCSI proporciona un excelente rendimiento con adaptadores Ethernet Gigabit, a un coste mucho menor que otras alternativas. Como inconveniente, el uso de la pila TCP/IP para transmitir la información produce una merma de rendimiento, ya que se debe transmitir bastante información con los datos, en forma de cabeceras TCP/IP, aunque esto en la práctica no suele ser para nada determinante.
iSCSI está formado por dos servicios:
  1. Target: Es el servidor iSCSI. 
  2. Initiator: Es el cliente iSCSI.
Para comprender iSCSI debemos de pensar que al compartir una unidad en una red (donde pueda haber intrusos que intenten acceder a esa unidad) es imprescindible usar algún mecanismo para proteger los datos. La protección de los datos se puede hacer de dos formas:
  1. Autenticando al equipo que conecta con el volumen iSCSI mediante un usuario y contraseña: Esto se configura en el servidor al exigir unas credenciales para el acceso al disco.
  2. Encriptando la información en el disco, para que al circular sobre la red no pueda ser capturada: Esto lo podemos configurar en el cliente, al usar algún tipo de sistema de ficheros encriptado dentro de la unidad.

iSCSI Target (el servidor de unidades)

Instalar el iSCSI Target

  • Para instalar el Target en ubuntu debemos instalar el paquete iscsitarget:
    $ sudo apt-get install iscsitarget
  • Tras esto deberemos modificar el fichero '/etc/default/iscsitarget', para hacer que el servicio iscsitarget arranque automaticamente al iniciar el sistema. Para elló deberemos modificar la línea que declara la variable ISCSITARGET_ENABLE para que contenga el valor true:
    ISCSITARGET_ENABLE=true
  • Tras esto, podemos arrancar el servicio iscsitarget con el comando:
    $ sudo service iscsitarget start
  • Si quisieramos parar el servicio debemos usar:
  • $ sudo service iscsitarget restart

Que es una unidad iscsi

Estamos familiarizados con el concepto de discos duros y de particionado típico de los ordenadores personales, pero estos conceptos se pueden ver trastocados cuando accedemos al mundo de los servidores y de Linux:
  • Disco duro: Lo que define un disco duro es ser un dispositivo que basicamente admite dos operaciones: leer y escribir bloques dentro de el, y nuestro disco duro va a tener una cantidad de espacio donde podremos guardar la información, espacio que se usa dividiéndolo en sectores. En resumen, es un bloque de datos en el que podemos leer y escribir.
  • Partición: Por motivos prácticos, los discos duros se dividen en particiones, las cuales tienen un tamaño determinado y en ellas podemos leer y escribir sectores. Existen múltiples esquemas de particionamiento, siendo los más habituales el esquema MBR y el GPT usado en los ordenadores más modernos.  Observa que un disco se puede particionar, pero que no hay ningún motivo práctico que nos impida incluso particionar la propia partición (esto lo hacen algunos sistemas operativos para saltarse el límite de cuatro particiones impuesto por el estilo de particionado MBR).
  • Un volumen creado con un gestor de volúmenes (por ejemplo LVM): Un gestor de volúmenes crea unas entidades denominadas volúmenes físicos que se corresponden con particiones o con unidades de disco. Con esos volúmenes fisicos creamos una entidad dedicada a crear dentro de el volúmenes lógicos denominada grupo de volúmenes (el grupo está formado por varios volúmenes físicos). Dentro de los grupos de volúmenes puedo crear volúmenes lógicos, los cuales, de cara al sistema operativo se comportan como si fueran unidades de disco.
  • Un fichero 'compacto': Un fichero compacto no es más que un fichero que ha sido rellenado de ceros hasta ocupar un tamaño determinado. No deja de ser un lugar donde podremos leer y escribir datos y que tiene un tamaño determinado. Para crear un fichero compacto en Linux podemos usar el comando dd, en el ejemplo creamos un fichero de 2GB de tamaño relleno de ceros:
    $ sudo dd if=/dev/cero of=fichero_compacto bs=512 count=4194304
Todos estos dispositivos pueden ser usados como unidad iscsi, aunque lo menos habitual es el uso de los ficheros compactos, debido al poco rendimiento que proporciona, ya que el fichero está situado dentro de un sistema de ficheros, y sobre el se va a construir otro sistema de ficheros: demasiadas capas de software como para que funcione rapidamente.
La alternativa más usada para crear unidades iSCSI serian los gestores de volúmenes, ya que permiten una flexibilidad que no obtenemos con las unidades de disco (podemos ampliar un volumen sin problemas), y además puede soportar tecnologías como RAID1 o RAID5, que nos van a permitir salvaguardar nuestros datos.

Crear un target (volumen compartido por iscsi)

Cuando compartimos un volumen con iSCSI, el target recibirá uno de los objetos antes descritos (en nuestro caso es un volumen LVM) que compartirá a modo de unida de disco iscsi, y el iniciador (cliente) va a recibir algo idéntico a un disco duro, que podrá formatear o dividir según su conveniencia.
Algunos usuarios confunden las redes SAN con las redes NAS, aunque no tienen nada que ver:

  1. En una red SAN el servidor lo que comparte son unidades de disco, de forma que el cliente va a recibir una unidad de disco, que podrá particionar y formatear a voluntad.
  2. En una red NAS el servidor comparte recursos, tales como carpetas o impresoras. El cliente al recibir una carpeta compartida, podrá crear ficheros y directorios en esa carpeta (lo cual no tiene nada que ver con el disco duro que recibiamos en SAN).
Vamos a crear un target en mi servidor:
  • Creamos un volumen con LVM, de 20GB de espacio que posteriormente compartiremos como una unidad iscsi:
$ sudo lvcreate --name lun0 --size 20G datos
  • Para crear un nuevo target debemos editar el fichero /etc/ietd/ietd.conf, creando el target, para lo cual añado las siguientes líneas:
Target iqn.2014-02.net.emc:repositorio8
IncomingUser emc2 secreto
OutgoingUser
Lun 0 Path=/dev/mapper/datos-lun0,Type=fileio
Alias LUN1
#MaxConnections 6
    • Como puedes ver, la primera línea crea un identificador para el target, el cual ha de ser único a nivel mundial. La nomenclatura oficial es la siguientea: "iqn.<año>-<mes>.<dominio_invertido>:<nombre_asignado_al_target>"
      • iqn: Es siempre es misma cadena
      • año y més: Es la fecha en la que el dominio es válido
      • Dominio invertido: Es el nombre de dominio de nuestra organización (o de la máquina) pero en orden inverso (para mail.telefonica.es sería es.telefonica.mail)
      • El nombre asignado al target: Queda a nuestra elección
    • Incoming user: Es un usuario y contraseña que será pedido al cliente para pode montar nuestra unidad
    • Lun 0 Path=----,Type=fileio: En esta línea estoy indicando el dispositivo que será asociado a nuestro target. En nuestro caso se trata del volumen lvm previamente creado.
    • Alias: Es un alias para el target (no es necesario)
    • MaxConnections: Es el número de conexiones máximo que podremos hacer al target (por defecto solo una ya que es algo raro que varios usuarios usen de forma simultánea una unidad de disco)
  • Ya solo nos queda modificar el fichero '/etc/ietd/initiators.allow, donde se indica para cada target los iniciadores (clientes) tienen permitido su acceso. En nuestro caso particular se va a permitir el acceso a todos los equipos de la red 192.168.1.0/24, con lo cual sitúo dentro del fichero la siguiente línea:
    iqn.2014-02.net.emc:repositorio8 192.168.1.0/24
  • Ya hemos acabado, solo nos queda reiniciar el servidor iscsitarget para que los cambios se apliquen:
    $ sudo service iscsitarget restart

Creación del initiator (cliente)

Para conectarnos al target que hemos creado en el punto anterior, debemos de usar otra máquina con ubuntu, donde deberemos instalar el iniciador iscsi. El iniciador que vamos a usar es el iniciador open-iscsi.
  • En nuestro cliente, instalamos el paquete open-iscsi:
    $ sudo apt-get install open-iscsi
  • Modificamos el fichero de configuración de open-iscsi para que el servicio se autoarranque en el inicio del sistema. Para ello edito el fichero '/etc/iscsi/iscsid.conf' y modificamos la variable node.startup al valor auto:
    node.startup = auto
Ya tenemos instalado el software, ahora debemos conectarnos al target que comparte nuestro servidor (cuya dirección ip es 192.168.1.10), para ello usamos el comando iscsiadm que se encarga de buscar los targets en un servidor, registrarlos, modificar la configuración de conexión al target, conectar y desconectar.
  • Detectamos y registramos en el sistema los targets compartidos por el servidor:
$ sudo iscsiadm --mode discovery --type st --portal 192.168.1.10
192.168.1.10:3260,1 iqn.2014-02.net.emc:repositorio8
El parámetro type indica el tipo de protocolo usado para descubrir los targets, y lo más habitual es que contenga el valor st (abreviatura de send targets).
  • En este momento, nuestro target ya está agregado dentro de la jerarquía de targets detectados, que se almancena dentro del directorio /etc/iscsi/nodes. La información contenida en este directorio solamente debe ser manipulada con el comando iscsadmn, ya que si modificamos los ficheros manualmente, podemos provocar problemas graves al acceder al disco.
  • Para comprobar que tenemos en nuestra base de datos el target descubierto, podemos usar el comando iscsiadm --mode node, que lista los targets que tiene guardados nuestro equipo:
$ sudo iscsiadm --mode node
192.168.1.10:3260,1 iqn.2014-02.net.emc:repositorio8
  • Vamos a indicar que nuestro target utiliza autenticación. Para ello debo indicar tres opciones: El método de autenticación, el usuario y la contraseña:
$ sudo iscsiadm --mode node  --target "iqn.2014-02.net.emc:repositorio8" --portal "192.168.1.10:3260" --op update --name node.session.auth.authmethod --value=CHAP
$ sudo iscsiadm --mode node  --target "iqn.2014-02.net.emc:repositorio8" --portal "192.168.1.10:3260" --op update --name node.session.auth.username --value=emc2
$ sudo iscsiadm --mode node  --target "iqn.2014-02.net.emc:repositorio8" --portal "192.168.1.10:3260" --op update --name node.session.auth.password --value=secreto
  • Ya solo nos queda iniciar sesión en el servidor con la opción --login:
$ sudo  iscsiadm --mode node  --target "iqn.2014-02.net.emc:repositorio8" --portal "192.168.1.10:3260" --login
Logging in to [iface: default, target: iqn.2014-02.net.emc:repositorio8, portal: 192.168.1.10,3260] (multiple)
Login to [iface: default, target: iqn.2014-02.net.emc:repositorio8, portal: 192.168.1.10,3260] successful.
Como puedes ver, estamos conectados al target, el cual va a ser visto por el cliente como un dispositivo scsi (/dev/sdb, /dev/sdc, etc.). Ya solo nos queda usar las herramientas habituales de manipulación de discos duros para poder hacer uso de nuestro disco iscsi.

Particionar y montar nuestro disco duro

Lo primero que debemos hacer es descubrir que letras de unidad usa nuestro disco, para ello, podemos usar el comando fdisk:
$ sudo fdisk -l
...
Disco /dev/sdc: 224.6 GB, 224579813376 bytes
256 cabezas, 63 sectores/pista, 27196 cilindros, 438632448 sectores en total
Unidades = sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
Identificador del disco: 0x00000000

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sdc1               1  4294967295  2147483647+  ee  GPT
...
Como puedes ver, en el ejemplo ya hemos creado una tabla de particiones en el disco /dev/sdc, con una sola partición sdc1. Esto ocurre porque no capturamos la salida de fdisk al hacer el ejemplo, y creamos la tabla de particiones y la partición. Lo que realmente nos encontrariamos en una unidad iscsi la primera vez que accedemos es un disco sin tabla de particiones.
A partir de aquí, puedo particionar el target a voluntad, con fdisk, gparted o cualquier otra aplicación que me permita crear particiones.
Incluso, tengo la opción de usar la unidad sin particionar, para ello, puedo usar el comando mkfs sobre la propia unidad:
$ sudo mkfs.xfs /dev/sdc

Desconectar el target

Cuando queremos desconectar un target debo seguir estos dos pasos:
  1. Desmontar cualquier volumen que este guardado dentro del target, para ello uso el comando umount
  2. Desconectar el target con iscsiadm --logout
$ sudo iscsiadm --mode node --target iqn.2014-02.net.emc:repositorio8 --portal 192.168.1.10:3260 --logout
Logging out of session [sid: 2, target: iqn.2014-02.net.emc:repositorio8, portal: 192.168.1.10,3260]Logout of [sid: 2, target: iqn.2014-02.net.emc:repositorio8, portal: 192.168.1.10,3260] successfulTras esto, ya tenemos desconectado nuestro target

Eliminar un target de la lista de targets

Para eliminar un target, debo usar el comando --op delete:
$ sudo iscsiadm --mode node --target "iqn.2014-02.net.emc:repositorio8" --portal 192.168.1.10:3260 --op delete
Tras el comando anterior, nuestro target ha sido eliminada de la lista de targets de confianza

Referencias


jueves, 3 de octubre de 2013

Añadir una conexión VPN en Windows 8

Muchas veces queremos acceder a la red de nuestra empresa para poder trabajar sobre servidores que existen en ella. Existen básicamente dos formas de hacerlo:

  1. Acceso directo: Para acceder a la red interna de la empresa debemos abrir en el router/s y cortafuego/s de la empresa los puertos correspondientes y hacer las redirecciones necesarias que nos permitan abrir los servicios compartidos de nuestra red. Esta opción es bastante liosa en el sentido de que deberemos configurar router y cortafuegos para cada uno de los servicios que queramos tener accesibles.
  2. VPN: Una red privada virtual consiste en conectar a un servidor VPN de mi empresa. Este tipo de conexión se caracteriza por que usa una conexión de red normal pero encriptando la información, de forma que la conexión es segura y funciona para todos los servicios que oferte mi red. La seguridad de la información transmitida a través está garantizada

Descripción más detallada de la VPN

Básicamente, cuando conecto a través de una VPN, lo que hago es crear una interfaz de red virtual que va a adquirir una IP de la red de mi empresa, de forma que esa interfaz está conectada directamente a la red de la empresa. El símil que mejor explica lo anterior es imaginarnos que en realidad, hemos tirado un cable de red hasta nuestra empresa y lo hemos conectado a una boca ethernet en ella.
Pero claro, dispongo de dos conexiones simultaneas: Mi conexión de red doméstica (tipicamente ADSL via WiFi o por cable Ethernet) y mi conexión virtual VPN y esto provoca a veces ciertos problemas.

Como conectarme a mi VPN

Debo de preguntar a mi administrador de red por los datos de conexión a la VPN de mi empresa, en concreto, y como mínimo, me deberá facilitar:
  1. La dirección IP o nombre de host a la cual deberé conectarme. Por ejemplo 66.66.66.66
  2. El nombre de usuario y contraseña con el que conectarme: En el caso de que en mi empresa esté instalado Active Directory de Microsoft, lo habitual es que sea mi nombre de usuario y contraseña para el dominio como pepe@midominio.es
Para crear la VPN:
  1. Abrimos el 'Centro de redes y recursos compartidos'.
  2. Pulsamos sobre la opción 'Configurar una nueva conexión o red'.
  3. Nos aparece la siguiente ventana:

    Pulsamos en Conectarse a un área de trabajo.
  4. En la siguiente pantalla nos permite elegir entre 'Usar mi conexión a Internet' o 'Llamar directamente', escogemos la primera opción.
  5. Pasamos a la pantalla 'Conectarse a un área de trabajo':

    En esta pantalla deberé de indicar:
    1. Dirección de Internet: Es la dirección IP de la VPN que me proporcionó el administrador de mi red, en el ejemplo '66.66.66.66'.
    2. Nombre de destino: El nombre con el cual quiero que aparezca reflejado la VPN, por ejemplo, 'Mi empresa'.
    3. Usar tarjeta inteligente: Lo marcamos si usamos una tarjeta inteligente para identificarnos en Windows.
    4. Recordar mis credenciales: Lo marcamos si no queremos que nos pida el usuario y contraseña cada vez que iniciemos la VPN.
    5. Permitir que otras personas usen esta conexión: Esta es una opción delicada, de forma general, solamente en mi usuario Windows debería estar disponible la VPN, por mucho que la VPN me pida mis credenciales al iniciar. Si marco la casilla, el resto de usuarios del equipo podrán acceder a la conexión VPN, eso sí, conociendo el usuario y contraseña.
Ya tengo la VPN configurada. Hay que destacar que en Conexiones de red' (aparece mostrando el 'Centro de redes y recursos compartidos' y luego pulsando 'Cambiar configuración del adaptador', o alternativamente, buscando en inicio 'Conexiones de red') me aparecerán normalmente dos nuevas conexiones:
  1. Una primera conexión es la propia VPN, que se denomina Mi Empresa, es la conexión que realmente contiene la configuración de la VPN.
  2. Un bridge de red (Network Bridge): Esta solo aparece si nuestro equipo dispone de varios dispositivos capaces de conectarnos a internet (por ejemplo, un portatil con Tarjeta de red Ethernet y WiFi): Se encarga de puentear la VPN a la forma de conexión que en ese momento esté activa.

Como conectarme

La forma de conexión es muy sencilla:
  1. Pulso el icono de la red en el área de notificación de Windows (el icono que muestra la red que estamos usando al lado del reloj).
  2. En el desplegable que aparece a la derecha, puedes ver que aparece nuestra conexión VPN:
  3. Si pulsas en la conexión aparece un botón conectar, y luego nos pedirá nuestro usuario y contraseña de acceso:
  4. Tras esto deberías de estar conectado.

Problemas con el enrutamiento en el acceso a la VPN

A veces se produce un problema extraño, y es que podemos acceder a cualquier sitio de nuestra red de empresa, pero no podemos acceder a Internet. Esto se produce por que todo el tráfico de red se está redirigiendo hacia la VPN, y en nuestra empresa, el enrutamiento está configurado para que la VPN no enrute hacia el exterior.
La forma de arreglar esto es bastante sencilla: Debemos de seguir estos dos pasos:

  1. Debemos indicar en la conexión VPN que no queremos usar la puerta de enlace de la VPN. Con esto lograremos que la puerta de enlace por defecto sea la de mi conexión a internet.
  2. Debemos configurar rutas de enrutamiento estáticas a las distintas subredes que haya en mi empresa.

Deshabilitar la puerta de enlace por defecto de la VPN

Expliquemos la situación actual: Estamos conectados a una VPN, y todo el tráfico de red se deriva hacia la VPN, de forma que mi equipo está enrutando todo el tráfico de red hacia la VPN (excepto el tráfico de mis redes locales).
  1. Para indicar en la VPN que no queremos usar la puerta de enlace de la VPN deberemos de acceder al 'Conexiones de red', y mostrando el menú contextual de la conexión VPN escoger 'Propiedades', apareciendo la ventana siguiente:
  2. Ahora hacemos doble click en el nodo 'Protocolo de Internet versión 4 (TCP/IPv4)' y en la ventana que aparece, pulsamos el botón 'Opciones avanzadas'. En la pestaña de 'ConfiguraciónIP' nos aparecerá esta ventana:
  3. Ya solo tenemos que desmarcar la casilla 'Usar la puerta de enlace predeterminada en la red remota'.
Ahora podremos comprobar lo que hemos hecho:
  1. Comprobamos con un navegador web que con la VPN activada, entramos en interneet.
  2. Comprobamos de algún modo que hemos dejado de acceder a la red interna de la empresa.
Ya solo necesitamos añadir rutas estáticas a las distintas redes de la empresa.

Añadir rutas estáticas a las redes de la empresa

Expliquemos la situación actual: Como he desconectado la puerta de enlace de la VPN, ahora, estoy conectado a la VPN, pero a nivel de enrutamiento estoy derivando todo el tráfico de red a través de mi conexión normal a internet. Esto hace que no sea capaz de acceder a los servicios de mi empresa, pero si salir a internet.
Para este paso debo de conocer las redes a las cuales quiero acceder, por ejemplo, supongamos que la red interna de la empresa (donde están colgados los servicios de esta es la red 192.168.30.0/24). Esta información me la debe proporcionar el administrador de red de la empresa.
Ya hemos desvelado el misterio, solo debemos añadir una ruta estática a la red interna de mi empresa (si son varias redes, varias rutas). Para ello, debo obtener ciertas informaciónes:

  • Con ipconfig, debo obtener la dirección IP de mi équipo en la VPN:

  • Con 'route print' puedo mostrar las rutas habilitadas en el sistema. También me permite ver los identificadores de las diferentes interfaces de red.

  • Ahora que conozco la IP de la VPN y el identificador de red de la VPN, puedo añadir una ruta hacia la red deseada, por ejemplo '192.168.30.0/24', para ello uso el comando: route add 192.168.30.0 mask 255.255.255.0 <ip_de_la_VPN> if <número de interfaz de la VPN>, en mi caso, se observa en la imagen:

Esta ruta que hemos creado no es persistente de forma que cuando el equipo reinicie, desaparecerá. Si quiero que la ruta sea persistente, debo de añadir -p tras la partícula route: route -p add....
Con esto ya tendré accesible desde mi VPN los equipos de la red de mi empresa, además de disponer de Internet simultáneamente.







martes, 17 de septiembre de 2013

El comando tasksel en Ubuntu

Cuando instalamos Ubuntu usando los antiguos instaladores en modo texto usados por debian, al final del proceso podemos escoger la configuración del sistema: Nos aparece una ventana donde podemos escoger una serie de roles para el sistema que estamos instalando (por ejemplo, el servidor LAMP: Linux Apache MySQL y PHP.
Es un poco engorroso instalar cualquier servidor en Ubuntu e ir instalándolo paquete por paquete con apt-get, y aparte de eso, los roles que nos aparecen en la pantalla que se ha descrito tienen la ventaja de que para cada uno de ellos se instala toda una maraña de software recomendado que nos va a ser muy dificil de reproducir.
El comando tasksel nos va a permitir instalar roles en un sistema ya instalado:
Ejecutar el comando sudo tasksel
Como puedes ver en la imagen, nos llevamos una agradable sorpresa: Nos aparecen todos los roles que aparecían al instalar Ubuntu, y muchos más. Esto es debido, a que en este punto, podemos convertir nuestra distribución Ubuntu estandard en otra distribución kubuntu, lubuntu, etc.

Modo gráfico

Además, si instalamos el gestor de paquetes synaptic (sudo apt-get install synaptic) tendremos acceso a estos roles con la opción de menú "Editar -> Marcar paquetes por tarea", que se nos mostrará de esta forma:
El editor de tareas de synaptic
Como puedes ver, son las mismas tareas que obteniamos en tasksel.

Listar los componentes de una tarea

Otro punto interesante es conocer los paquetes que forman una tarea de tasksel, para ello usamos el propio comando tasksel, como en este ejemplo que mostramos los paquetes que componen la tarea 'LAMP Server':
  1. Para ver el listado de las tareas disponibles usamos:
    # sudo tasksel --list-tasks
  2. Para ver los paquetes que componen una tarea (por ejemplo lamp server):
    # sudo tasksel --task-packages 'lamp server'




domingo, 10 de febrero de 2013

Activar servidor apache para todos los usuarios del sistema

Vamos a convertir una máquina con Ubuntu 12.04 Server en un servidor web donde todos los usuarios podrán insertar páginas web.

Instalar el software

Necesitamos instalar el servidor apache y un servidor ftp:

Instalar apache

Podremos instalar apache de tres maneras:
  1. Con tasksel instalamos Apache-MySQL-PHP: Usamos el comando 'sudo tasksel install lamp-server'.
  2. Instala individualmente la instalación de apache: Sudo apt-get install apache2
  3. Instalando manualmente apache a partir de una descarga de la web de apache: Si compilamos la aplicación podremos realizar una configuración personalizada que será imposible con los paquetes distribuidos con Ubuntu.

Instalar vsftp

Existen varios servidores ftp para Linux, pero el que documenta Ubuntu Server es vsftp. Para instalarlo solamente tenemos que ejecutar: sudo apt-get install vsftpd.

Pasos de la configuración

Activar el módulo userdir

Para que los usuarios puedan acceder a sus propias carpetas de usuario y tener su propio sitio web, debemos de habilitar el módulo usermod (para ver mas información http://httpd.apache.org/docs/2.2/mod/mod_userdir.html). Este módulo se encarga de crear un sitio web para cada usuario del sistema, sitio que estará accesible en el subdirectorio web ~<nombreusuario> (como en http://serve4.emc.home/~emc2).
Para activar el módulo usamos a2enmod userdir, quedando activado con sus valores por defecto, que podremos encontrar en el fichero /etc/apache2/mods-enabled/userdir.conf (además existe un fichero de carga del módulo en /etc/apache2/mods-enabled/userdir.load).
Si queremos configurar el módulo, debemos editar el fichero userdir.conf, aunque es una tarea que nosotros no realizaremos y que se describe en la documentación del módulo.
Ya solo nos queda recargar la configuración en el servidor con sudo service apache2 reload

Crear la estructura de directorios usada por userdir en /etc/skel

Userdir permite servir el directorio public_html de cada usuario como una página web personal. Para que esto funcione, debemos disponer de la carpeta y que esta tenga algún tipo de contenido, solo nos queda crear la carpeta en el directorio del usuario.
Pero si queremos que los usuarios nuevos tengan su propia web en blanco, deberemos crear estos ficheros y  carpetas en el directorio /etc/skel, de forma que cuando se cree un usuario nuevo este tenga activado el soporte para su página web personal:
$ cd /etc/skel
$ mkdir public_html
$ echo Este es mi sitio > public_html/index.html
Tras esto, los nuevos usuarios tendrán su sitio personal en public_html.
En el caso de los usuarios existentes, deberé acceder a su carpeta de usuario y crear el directorio public_html

Como accedo a la web del usuario

mediante la dirección 'http://servidor/~nombre-usuario', como por ejemplo en "http://server4.emc.home/~juan"

Configurar ftp para el acceso de los usuarios a la carpeta public_html

Por defecto, nuestro servidor FTP permite acceso anónimo, pero no permite el acceso a los usuarios del sistema. Vamos a modificar varias líneas del fichero /etc/vsftpd, para lo cual lo abrimos con un editor de textos, como podría ser gedit (con sudo gedit /etc/vsftpd):
  1. Deshabilito el acceso anónimo:
    1. Si queremos deshabilitar el acceso de usuarios anónimos al servidor modifico la línea 'anonymous_enable=Yes' por 'anonymous_enable=No'. 
    2. El servidor ftp usa el directorio /srv/ftp para los usuarios anónimos, podría ser una buena idea borrar el directorio en cuestión, aunque no lo veo demasiado necesario.
    3. En caso de que tenga habilitado el usuario anónimo y quiera permitir que este suba ficheros al servidor, habilito la orden 'anon_upload_enable=YES'
  2. Habilito la autenticación de los usuarios del sistema:
    1. Habilito la línea 'local_enable=YES' que me permitirá usar los usuarios locales con vsftp.
    2. Habilito la escritura para los usuarios locales con 'write_enable=YES'
  3. Asegurando ftp:
    1. Si quiero limitar a que los usuarios solo puedan escribir en su carpeta de usuario a través de ftp habilito 'chroot_local_user=YES'
    2. Si quiero que solo puedan acceder por ftp una lista de usuarios, habilito 'chroot_list_enable=YES'
    3. La lista de los usuarios que pueden iniciar sesión en el sistema la guardo en el fichero '/etc/vsftpd.chroot_list' (un usuario por línea) y tengo que añadir una línea indicando la ubicación del fichero en 'chroot_list_enable=YES'
  4. Usar FTPS:
    1. Si quiero habilitar FTPS (FTP sobre SSL) habilito la línea 'ssl_enable=YES'
    2. Tras habilitar FTPS debo indicar las ubicaciónes de las claves públicas y privadas que va a usar el sistema para encriptar las comunicaciones. Para ello modifico dos variables:
      1. 'rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem' para la clave pública
      2. 'rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key' para la clave privada
      3. Estas dos claves existen por defecto cuando se instala el paquete 'ssl-cert' (para instalarlo, si no existen los ficheros usamos 'sudo apt-get install ssl-cert')
Ni que decir tiene que para que los cambios que hayamos realizado se apliquen debemos de reiniciar el servidor ftp con 'sudo service vsftpd restart'

Enlaces


domingo, 7 de octubre de 2012

ssh-keygen

<h1>ssh-keygen</h1>
<p>Es un comando usado para generar certificados digitales.</p>
<h2>Que es un certificado digital</h2>
<p>Es un fichero que contiene:
<ul>
<li>Una clave pública, </li>
<li>junto con información de identificación de un sujeto o de una máquina (user or host) y </li>
<li>opcionalmente, la clave de una una Autoridad de Certificación (CA)</li>
</ul>
<p>

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.