Author Archives: Fede Diaz - Page 2

Instalando Windows 7 desde USB

Si disponemos de algún netbook que no tiene lectora de DVD y queremos instalar un sistema operativo deberemos usar alguna memoria usb. En esta entrada vamos a explicar como hacerlo con Windows 7 en Linux. Microsoft proporciona un programa para graba una imagen iso dentro del USB.

Necesitaremos un pen drive de al menos 4GB que será el /dev/sdb en esta guía.

El primer paso es crear una partición en el dispositivo, si ya contiene una podemos pasar al siguiente punto.

Para crear una partición usamos fdisk, en una terminal escribimos:

# fdisk /dev/sdb

y veremos algo como esto:

Orden (m para obtener ayuda): p

Disco /dev/sdb: 4127 MB, 4127194624 bytes
127 heads, 62 sectors/track, 1023 cylinders, 8060927 sectores en total
Units = sectores of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0x0006a639

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema

Creamos la partición contestando de menera predeterminada

Orden (m para obtener ayuda): n
Acción de la orden
e   Partición extendida
   p   Partición primaria (1-4)
p
Número de partición (1-4, valor predeterminado 1): 1
Primer sector (2048-8060926, valor predeterminado 2048):
Se está utilizando el valor predeterminado 2048
Last sector, +sectores or +size{K,M,G} (2048-8060926, valor predeterminado 8060926):
Se está utilizando el valor predeterminado 8060926

Orden (m para obtener ayuda): p

Disco /dev/sdb: 4127 MB, 4127194624 bytes
127 heads, 62 sectors/track, 1023 cylinders, 8060927 sectores en total
Units = sectores of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0x0006a639

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sdb1            2048     8060926     4029439+  83  Linux

Para salir escribimos w e intro

A continuación debemos formatear la partición que tiene el dispositivo, debe ser NTFS, o el sistema no iniciará:

# mkfs.ntfs /dev/sdb1

Ya tenemos el dispositivo listo, ahora copiamos el contenido del DVD de Windows 7.

# mount /dev/sdb1 /mnt/pen
# mount -o ro /dev/dvd /mnt/dvd
# cp -r -v /mnt/dvd/* /mnt/pen/

Si no tenemos DVD pero disponemos de una imagen iso las opciones de montaje son:

# mount -t iso9660 -o ro,loop /path/to/iso /mnt/dvd

Y el resto queda igual.

El último paso consiste en hacer bootable el pen drive para ello nos tenemos que descargar (en Debian wheezy no está en los repositorios) este programa. Cuando lo tengamos descomprimimos, compilamos e instalamos.

# mkdir -p sandbox; cd sandbox
# wget -c http://sourceforge.net/projects/ms-sys/files/ms-sys%20stable/2.2.1/ms-sys-2.2.1.tar.gz/download
# tar zxf ms-sys-2.2.1.tar.gz
# make && make install

Con esto podemos crear discos de inicio para sistemas Windows así:

# ms-sys -7 /dev/sdd

El -7 indica que sea un mbr para Windows 7

Ahora sólo tenemos que iniciar el PC con el pen conectado e indicar en la BIOS que arranque desde dispositivo externo.

Enumeración NFS

Si tenemos algunos servidores conectados a internet es posible que nos interese compartir entre ellos algunos archivos mediante NFS. El problema viene que al crear el servidor conectado directamente a internet cualquiera puede consultar los directorios compartidos.

Esto es lo que se conoce como enumeración NFS y no hay solución vinculada al protocolo.

La solución que propongo consiste en tener en cada servidor dos interfaces de red, una de ellas la configuraremos como privada, la otra quedará expuesta a internet. Ahora cuando algún usuario no autorizado escanee nuestros puertos verá algo así:

# nmap -sS servidor.com

Starting Nmap 5.21 ( http://nmap.org ) at 2011-07-25 20:35 CEST
Nmap scan report for servidor.com (xxx.xxx.xxx.xxx)
Host is up (0.060s latency).
Not shown: 990 closed ports
PORT     STATE    SERVICE
***
2049/tcp open     nfs
***

Nmap done: 1 IP address (1 host up) scanned in 5.92 seconds

Mostrando el servidor NFS corriendo y abierto. Así podría crear una enumeración como la que sigue

# showmount --all servidor.com
All mount points on servidor.com:
192.168.8.2:/path/to/share
192.168.8.3:/path/to/share
192.168.8.4:/path/to/share
192.168.8.5:/path/to/share
192.168.8.6:/path/to/share
...

En el listado vemos las distintas máquinas que están conectadas al servidor y el directorio que tienen montado.

Para resolver esto usaremos los ficheros /etc/hosts.allow y /etc/hosts.deny para evitar conexiones sólo desde máquinas de confianza.

El contenido de /etc/hosts.allow sería:

portmap: 192.168.8.0/24
nfsd: 192.168.8.0/24

y para el caso de /etc/hosts.deny

nfsd: ALL
portmap:ALL

El software de NMap seguiré mostrando el puerto abierto, pero ahora cuando intenten obtener un listado de lo compartido por NFS obtendrán esto:

# showmount --all servidor.com
clnt_create: RPC: Program not registered

Desde la red privada podremos seguir consultando las comparticiones con showmount, las opciones que le podemos pasar al comando son:

       -a or --all
              List both the client hostname or IP address and mounted directory in host:dir format. This
              info should not be considered reliable. See the notes on rmtab in rpc.mountd(8).

       -d or --directories
              List only the directories mounted by some client.

       -e or --exports
              Show the NFS server's export list.

Montar un Servidor Web

Hay muchas formas de llevar a cabo la tarea de desplegar un servidor Web, incluso se puede optar por algún servicio que nos ofrezca un panel de control para administrar el contenido perdidiendo la capacidad de administrar físicamente los servicios. Como digo, existen muchas maneras de hacer esto, esta es una de ellas.

Introducción

No entramos en detalles sobre el hardware de la máquina, ya está instalado un sistema GNU/Linux Debian Squezee. Hemos contratado un servidor que incluye nombre DNS para nuestro dominio midominio.com.

El usuario

La ejecución del servidor debe ser bajo un usuario no privilegiado y sin shell válida en el sistema. En Debian, tras instalar Apache, se crea un usuario www-data para esta tarea, pero lo vamos a cambiar por otro por no mantener, en la medida de lo posible, los valores por defecto. Nuestro usuario será webuser que es bastante descriptivo de la labor que tendrá.

Creamos el grupo y el usuario y le asignamos contraseña:

# groupadd webuser
# useradd -d /home/webuser -s /bin/false -g webuser -m webuser
# passwd webuser
Introduzca la nueva contraseña de UNIX:
Vuelva a escribir la nueva contraseña de UNIX:
passwd: contraseña actualizada correctamente

Con esto contamos con el usuario, vamos a instalar Apache.

Instalando Apache

Vamos a instalarlo mediante la utilidad tasksel que es gráfica de consola y nos ahorra escribir.

# tasksel

De las opciones disponibles, elegimos la de Servidor Web, como vemos en la imagen, luego le damos a aceptar.

Tasksel

Tasksel

Instalará Apache y todas las dependencias.

Instalando

Instalando

Ya podemos pasar a configurar el servidor.

Configurando Apache

La configuración que trae Debian para Apache es la que me hace elegir esta distribución frente a otras como CentOS que también es conocida por estar presente en muchos servidores web de internet. El primer fichero que vamos a configurar es /etc/apache2/envvars y añadimos el usuario y grupo que hemos creado.

# vim /etc/apache2/envvars
[...]
export APACHE_RUN_USER=webuser
export APACHE_RUN_GROUP=webuser
[...]

A continuación deshabilitamos los VirtualHosts que vienen por defecto para crear el nuestro, podemos crear tantos como sean necesarios.

# a2dissite 000-default
Site default disabled.
Run '/etc/init.d/apache2 reload' to activate new configuration!

Ahora creamos nuestro sitio empezando por crear la estructura de directorios. Para ello vamos a crear siguiendo la filosofía que vi en SuSE y me gustó.

# mkdir -p /server/midominio.com 

De esta forma, contamos con el directorio /server y de él colgaran todos los servidores virtuales.

Ajustamos los permisos del directorio:

# chown -R webuser.webuser /server

Configuramos ahora las stanzas para nuestro servidor, para ello creamos un nuevo fichero /etc/apache2/sites-available/misitio.

# vim /etc/apache2/sites-available/midominio.com
NameVirtualHost *:80
<VirtualHost *:80>
        ServerName midominio.com
        ServerAlias www.midominio.com
        ServerAdmin Email protegido.

        DocumentRoot /server/midominio.com/
        <Directory />
                Options FollowSymLinks
                AllowOverride all
        </Directory>
        <Directory /server/midominio.com/>
                Options FollowSymLinks Multiviews Indexes
                AllowOverride all
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.midominio.com.log
        LogLevel warn
        CustomLog /var/log/apache2/error.midominio.com.log combined
        ServerSignature Off
</VirtualHost>

Comentamos que permitimos AllowOverride a all para que podamos customizar el sitio a través de .htaccess y no tener que tocar mucho la configuración del servidor. También personalizamos los archivos de logs por si añadimos más servidores distinguir entre ellos.

Habilitamos el sitio.

# a2ensite misitio

Ya podemos arrancar el servidor.

# apache2ctl graceful

Ahora ya podemos abrir un navegador web y entrar en el sitio, aunque no tiene contenido, cosa que resolveremos ahora.

En nuestro panel de control habilitamos que tanto midominio.com como www.midominio.com resuelvan a nuestra web, luego podemos usar un truco como este para que por defecto se utilice las uves dobles que es mejor desde el punto de vista SEO.

Añadir contenido, el servidor FTP

El usuario no tiene shell, luego no podemos iniciar una sesión en el servidor para crear los archivos html que queramos servir ni copiarlos por ssh, así que desplegamos un servidor FTP, por razones más históricas que otra cosa, uso Proftpd que tiene una configuración modular similar a la de Apache. Tiene soporte de VirtualHost pero la limitación del protocolo hace que no se pueda usar el mismo puerto en todos los servidores, esto es, cada VirtualHost que configures estará asociado a un puerto.

Pasamos a instalarlo.

# apt-get install proftpd

Lo instalamos como servidor independiente.

La configuración es esta:

# /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file.
# To really apply changes reload proftpd after modifications.

# Includes DSO modules
Include /etc/proftpd/modules.conf

# Set off to disable IPv6 support which is annoying on IPv4 only boxes.
UseIPv6				off
# If set on you can experience a longer connection delay in many cases.
IdentLookups			off

ServerName			"Mi servidor FTP"
ServerType			standalone
DeferWelcome			off

MultilineRFC2228		on
DefaultServer			on
ShowSymlinks			on

TimeoutNoTransfer		600
TimeoutStalled			600
TimeoutIdle			1200

DisplayLogin                    welcome.msg
DisplayChdir               	.message true
ListOptions                	"-l"

DenyFilter			\*.*/

# Use this to jail all users in their homes
# DefaultRoot			~

# Users require a valid shell listed in /etc/shells to login.
# Use this directive to release that constrain.
# RequireValidShell		off

# Port 21 is the standard FTP port.
Port				0

# In some cases you have to specify passive ports range to by-pass
# firewall limitations. Ephemeral ports can be used for that, but
# feel free to use a more narrow range.
PassivePorts                  49152 65534

# If your host was NATted, this option is useful in order to
# allow passive tranfers to work. You have to use your public
# address and opening the passive ports used on your firewall as well.
# MasqueradeAddress		1.2.3.4

# This is useful for masquerading address with dynamic IPs:
# refresh any configured MasqueradeAddress directives every 8 hours
<IfModule mod_dynmasq.c>
# DynMasqRefresh 28800
</IfModule>

# To prevent DoS attacks, set the maximum number of child processes
# to 30.  If you need to allow more than 30 concurrent connections
# at once, simply increase this value.  Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd)
MaxInstances			30

# Set the user and group that the server normally runs at.
User				webuser
Group				webuser

# Umask 022 is a good standard umask to prevent new files and dirs
# (second parm) from being group and world writable.
Umask				022  022
# Normally, we want files to be overwriteable.
AllowOverwrite			on

# Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords:
# PersistentPasswd		off

# This is required to use both PAM-based authentication and local passwords
# AuthOrder			mod_auth_pam.c* mod_auth_unix.c

# Be warned: use of this directive impacts CPU average load!
# Uncomment this if you like to see progress and transfer rate with ftpwho
# in downloads. That is not needed for uploads rates.
#
# UseSendFile			off

TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log

<IfModule mod_quotatab.c>
QuotaEngine off
</IfModule>

<IfModule mod_ratio.c>
Ratios off
</IfModule>

# Delay engine reduces impact of the so-called Timing Attack described in
# http://security.lss.hr/index.php?page=details&ID=LSS-2004-10-02
# It is on by default.
<IfModule mod_delay.c>
DelayEngine on
</IfModule>

<IfModule mod_ctrls.c>
ControlsEngine        off
ControlsMaxClients    2
ControlsLog           /var/log/proftpd/controls.log
ControlsInterval      5
ControlsSocket        /var/run/proftpd/proftpd.sock
</IfModule>

<IfModule mod_ctrls_admin.c>
AdminControlsEngine off
</IfModule>

<VirtualHost midominio.com>
        ServerName "midominio.com"
        Port 21
        DefaultRoot /server/midominio
        <Limit LOGIN>
                AllowUser webuser
                AllowGroup webuser
                DenyAll
        </Limit>
        RequireValidShell off
        AllowOverwrite on
</VirtualHost>

Hemos cambiado el puerto FTP por el 0 para usar el 21 para el VirtualHost e indicamos que el usuario (webuser) no requiere de una shell valida.

Ahora podemos usar un cliente FTP, por ejemplo Filezilla para subir ficheros al servidor.

Y ya hemos terminado, hemos creado un servidor web desde cero, aun quedan cosas por hacer pero lo básico está cubierto, os invito a seguir navegando por el blog y veáis como configurar mod_deflate para servir contenido comprimido, mod_evasive para evitar ataques DDOS, o mod_expires para almacenar contenido estático en la caché del usuario.

Cerrar la Sesión de Consola por Inactividad

Al acceder por consola para administrar algún sistema, podemos cometer la imprudencia de dejar la sesión abierta. Para prevenir esto que puede desembocar en alguna infiltración porque alguien pase por ahí podemos hacer uso de la variable TMOUT.

La sintaxis es la siguiente.

TMOUT=segundos

Donde segundos son los segundos de inactividad que se esperará para cerrar la sesión.

Al incluir esta variable en el .bashrc mejorará la seguridad de nuestros sistemas, al menos en el de root.

Cluster de Almacenamiento con GlusterFS 3 y CentOS 5.6

En el artículo de hoy vamos a montar un cluster de almacenamiento con dos servidores CentOS. Para la implementación del cluster vamos a usar GlusterFS, que es un sistema de ficheros en espacio de usuarios (FUSE). Sigue la arquitectura clásica de cliente-servidor y puede escalar hasta varios PetaBytes.

Introducción.

Para este tutorial vamos a utilizar dos servidores:

  • server1 192.168.2.100
  • server2 192.168.2.101

Y un cliente:

  • client1 192.168.2.102

Todos los componentes deben poder resolver los nombres de los demás, si no se puede por DNS debes editar el fichero /etc/hosts:

# /etc/hosts
192.168.2.100   server1
192.168.2.101   server2
192.168.2.102   client1

Configuración de los servidores.

Antes de empezar con GlusterFS, vamos a preparar el sistema añadiendo las herramientas de desarrollo y librerías. En cada uno de los servidores ejecutamos:

# yum groupinstall 'Development Tools'
# yum groupinstall 'Development Libraries'
# yum install libibverbs-devel fuse-devel

Descargamos el software y lo compilamos:

# mkdir sandbox
# cd sandbox
# wget http://download.gluster.com/pub/gluster/glusterfs/3.0/LATEST/glusterfs-3.0.8.tar.gz
# tar zxvf glusterfs-3.0.8.tar.gz
# cd glusterfs-3.0.8
# ./configure

Al finalizar deberemos ver esto:

GlusterFS configure summary
===========================
FUSE client        : yes
Infiniband verbs   : yes
epoll IO multiplex : yes
libglusterfsclient : yes
argp-standalone    : no
fusermount         : no

Entonces compilamos e instalamos.

# make && make install

Enlazamos con las librerías dinámicas.

# ldconfig

Podemos ahora comprobar que se ha instalado correctamente.

# glusterfs --version

glusterfs 3.0.8 built on May 13 2011 20:20:55
Repository revision: v3.0.8
Copyright (c) 2006-2009 Gluster Inc. 
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.

Vamos ahora a crear una estructura de directorio desde el que exportar el volumen. En este tutorial queremos compartir /home por lo que vamos a montar una porción de disco sobre el directorio que exportamos con Gluster para más adelante montar en el cliente en /home.

Creamos los siguientes directorios.

# mkdir -p /data/{exports,export-ns} /etc/glusterfs

En /etc/glusterfs/glusterfsd.vol añadimos el fichero de configuración para nuestro volumen.

volume posix
  type storage/posix
  option directory /data/exports
end-volume

volume locks
  type features/locks
  subvolumes posix
end-volume

volume brick
  type performance/io-threads
  option thread-count 8
  subvolumes locks
end-volume

volume server
  type protocol/server
  option transport-type tcp/server
  option auth.addr.brick.allow 192.168.2.*
  subvolumes brick
end-volume

Para aumentar la seguridad, sólo se permiten las direcciones listadas en la línea option auth.addr.brick.allow, admite comodines y varias direcciones separadas por comas. En este ejemplo hemos dado acceso a todo el rango 192.168.2.0/24.

Como hemos compilado sin pasar ninguna opción previa al configure, vamos a crear un enlace simbólico para que el sistema encuentre el binario.

# ln -s /usr/local/sbin/glusterfsd /sbin/glusterfsd

Ya podemos arrancar el demonio y configurar su nivel de arranque.

# chkconfig --levels 35 glusterfsd on
# /etc/init.d/glusterfsd start
Starting glusterfsd:                           [  OK  ]

Ahora vamos a añadir una partición en /etc/fstab la cual montaremos en /data/exports

# vim /etc/fstab
/dev/sda3     /data/exports     ext3     defaults     0 0

En cada servidor se hace esto, es lo que ofreceremos a los clientes a través de Gluster.

Configuración de los clientes.

Pasamos ahora a la configuración de los clientes, empezamos instalando las dependencias de compilación y librerías para acabar montando el volumen Gluster en /home. Estos pasos hay que hacerlos en cada cliente.

# yum groupinstall 'Development Tools'
# yum groupinstall 'Development Libraries'
# yum install libibverbs-devel fuse-devel

Ahora cargamos el módulo fuse que se encargará de hacer de interface con el Kernel.

# modprobe fuse

Configuramos el sistema para que cargue el módulo con cada arranque.

# echo "modprobe fuse" >> /etc/rc.modules
# chmod +x /etc/rc.modules

En cada cliente descargamos e instalamos el software. Tal y como hemos hecho antes.

# mkdir sandbox
# cd sandbox
# wget http://download.gluster.com/pub/gluster/glusterfs/3.0/LATEST/glusterfs-3.0.8.tar.gz
# tar zxvf glusterfs-3.0.8.tar.gz
# cd glusterfs-3.0.8
# ./configure

Al finalizar deberemos ver esto:

GlusterFS configure summary
===========================
FUSE client        : yes
Infiniband verbs   : yes
epoll IO multiplex : yes
libglusterfsclient : yes
argp-standalone    : no
fusermount         : no

Entonces compilamos e instalamos.

# make && make install

Enlazamos con las librerías dinámicas.

# ldconfig

Podemos ahora comprobar que se ha instalado correctamente.

# glusterfs --version

glusterfs 3.0.8 built on May 13 2011 20:20:55
Repository revision: v3.0.8
Copyright (c) 2006-2009 Gluster Inc. 
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.

Creamos el directorio de configuración de GlusterFS.

# mkdir /etc/glusterfs

Añadimos lo siguiente al fichero glusterfs.vol

vim /etc/glusterfs/glusterfs.vol

volume remote1
  type protocol/client
  option transport-type tcp/client
  option remote-host server1
  option remote-subvolume brick
end-volume

volume remote2
  type protocol/client
  option transport-type tcp/client
  option remote-host server2
  option remote-subvolume brick
end-volume

volume stripe
  type cluster/stripe
  option block-size 1MB
  subvolumes remote1 remote2
end-volume

volume writebehind
  type performance/write-behind
  option window-size 1MB
  subvolumes stripe
end-volume

volume cache
  type performance/io-cache
  option cache-size 512MB
  subvolumes writebehind
end-volume

Y ya podemos montar el volumen en /home:

 # glusterfs -f /etc/glusterfs/glusterfs.vol /home

Podemos consultar que está montado ejecutando mount:

# mount

glusterfs#/etc/glusterfs/glusterfs.vol on /home type fuse (rw,allow_other,default_permissions,max_read=131072)

También ver el espacio disponible con df:

# df -hT

S.ficheros    Tipo  Tamaño Usado  Disp Uso% Montado en
/dev/sda1     ext3    2,9G  1,7G  1,1G  63% /
tmpfs        tmpfs    125M     0  125M   0% /dev/shm
glusterfs#/etc/glusterfs/glusterfs.vol
              fuse    6,5G  143M  6,1G   3% /home

Para hacer el montaje permanente, añadimos la siguiente línea a /etc/fstab

/etc/glusterfs/glusterfs.vol  /home             glusterfs          defaults,_netdev  0  0

Fallos.

Si has llegado hasta aquí significa que todo ha ido bien, si has encontrado algún problema los ficheros de logs de Gluster se encuentra en:

/usr/local/var/log/glusterfs/

Revisa que todas las máquinas resuelven los nombres, que la línea auth.addr.brick.allow está bien configurada y que has escrito correctamente los nombres de los directorios. Estos son problemas comunes.

Por ejemplo, si algún cliente no está autorizado a montar el volumen, pasará esto:

# glusterfs -f /etc/glusterfs/glusterfs.vol /home
# mount 

/dev/sda1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
glusterfs#/etc/glusterfs/glusterfs.vol on /home type fuse (rw,allow_other,default_permissions,max_read=131072)

# df -hT

S.ficheros    Tipo  Tamaño Usado  Disp Uso% Montado en
/dev/sda1     ext3    2,9G  1,7G  1,1G  63% /
tmpfs        tmpfs    125M     0  125M   0% /dev/shm
/dev/sda3     ext3    6,5G  143M  6,1G   3% /data/exports
df: «/home»: Argumento inválido

Vemos que se ha producido un error que no es muy descriptivo del problema real que está ocurriendo ya que sí ha montado el volumen.

Conclusión.

Este sistema proporciona escalabilidad y tolerancia. El echo de exportar un directorio nos permite montar en ese directorio el disco físico un volumen LVM, un RAID, combinaciones de ambos, sistemas NAS o DAS y así montar nuestro propio DropBox! ;)