domingo, 27 de enero de 2008

Segurización de un servidor VHCS2 sobre Ubuntu Server 6.06 - Apache 2 / PHP / Postfix / FTP / iptables

Segurización de PHP

Una de las primeras cosas que hacemos para segurizar el servidor, es cambiar el php.ini, que en el caso de esta versión de sistema operativo, se encuentra ubicado en /etc/php4/apache2/php.ini.
Se le agregarán las siguientes entradas:

disable_functions = system, exec, shell_exec, passthru, pcntl_exec, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, popen, pclose, ini_alter, virtual, openlog, escapeshellcmd

allow_url_fopen = Off

register_globals = Off

Se debió quitar de la lista una serie de valores que originalmente estaban, como ser:

putenv: Con este valor, no funciona el Squirrelmail.
set_time_limit: Con este valor, no funciona el Webmail OverLook3.

Finalmente, deberemos reiniciar el servidor web para efectivizar los cambios realizados. Eso, como veremos en general en todos los casos, lo hacemos con /etc/init.d/apache2 stop y /etc/init.d/apache2 start.

Segurización de Apache 2

Se cambió el shell por omisión del usuario dueño de la ejecución de apache 2 (en mi caso es el www-data). El shell era /bin/sh, y ahora se configuró el /usr/sbin/nologin.
Al mismo tiempo, se cambió el directorio del usuario del apache, que por mosión era el /home/www-data, por el /dev/null.
Esos dos cambios se realizaron editando directamente el archivo /etc/passwd, localizando la entrada del usuario www-data, y cambiando sus campos para que queden así:

www-data:x:33:33:www-data:/dev/null:/usr/sbin/nologin

Luego se bajó y subió el servidor apache con el comando /etc/init.d/apache2 stop y /etc/init.d/apache2 start.
Se verificó que las páginas existentes funcionen bien, y con eso tenemos el primero de nuestros procesos de segurización de apache 2 finalizado.

Segurización de SSH - Uso de fail2ban

El sistema fail2ban es famoso por reaccionar ante muchos intentos de login fallidos por parte de una direccion IP en particular, impidiendo que se le proporcione el mismísimo promt del ssh.
Este comando reacciona incorporando reglas de iptables en forma automática.
Para implementarlo en Ubuntu 6.06 (viejo al día de la fecha, pero muy buen servidor), se deberá instalar con el típico comando de la suite apt:

# apt-get install fail2ban

Una vez instalado, se podrá recorrer su configuración verificando el archivo /etc/fail2ban.conf, que entre otras cosas, deberá tener:

[DEFAULT] (esta sección tendrá los valores mínimos necesarios para que fail2ban funcione correctamente)
...
logtargets = /var/log/fail2ban.log (archivo donde se logueará el comportamiento de fail2ban)
maxfailures = 5 (cantidad de intentos de login antes de estar baneado)
bantime = 600 (tiempo que el servidor no permitirá conexiones desde esa dirección IP)
...

[MAIL] (esta sección indicará las configuraciones destinadas a enviar un mail cada vez que se banee una dirección IP)
...
enabled = true
host = mail.firulete.com
port = 25
user = webmaster@firulete
password = firulete01
from = fail2ban@firulete.com
to = webmaster@serverremoto.com
...

Luego de estas configuraciones, sólo tendremos que reinicializar el servicio fail2ban con los comandos /etc/init.d/fail2ban stop y /etc/init.d/fail2ban start.
Podremos verificar que el programa está en ejecución mediante un "ps aux | grep fail2ban", que nos entregará algo del estilo "/usr/bin/python /usr/bin/fail2ban".


En breve estaré agregando las secciones correspondientes a la forma de segurizar el servidor de correo, Postfix, el FTP server, y la forma cómo configurar el sistema iptables2 para que tengamos, aparte de todo, un excelente firewall en nuestro servidor VHCS2.

Instalacion de Windows XP, Linux Ubuntu 7.10 y Solaris Express Developer Edition snv_70b en una Dell D630

Ante todo, como el disco de esta máquina tiene ni más ni menos que 120 GB, lo dividimos en particiones.
Generamos una de 60 GB para Windows, una de 4 GB para el swap de Linux, una de 26 GB para el / de Linux, y una de 30 GB para Solaris Express Developer Edition snv_70b (OpenSolaris, para los amigos).
Para realizar esta instalación, ante todo, implementamos Windows, que es el que mas problemas puede traernos a la hora de pensar en que su boot loader, de instalarse al final, borraría todas las demas opciones de sistemas operativo.

Instalacion de Ubuntu 7.10

Luego, implementamos Ubuntu, y para ello sólo tendremos que utilizar las dos particiones que comenté más arriba.
Por un lado, creamos una partición de swap (en mi caso será la segunda partición del disco) de 4 GB, dado que la Dell D630 tiene 2 GB de RAM; y por el otro, generamos una partición de / de 26 GB.
La instalación luego de estas sencillas consideraciones deberá continuar como es común, dado que el instalador de Ubuntu detectará nuestra tarjeta gráfica, que si bien no está completamente soportada, por lo menos nos permitirá disfrutar de una definición de 1440x900.
No debemos olvidar, dado que luego lo necesitaremos, copiar FUERA DE ESTA MÁQUINA el archivo /boot/grub/menu.lst. Es importantísimo que este copiado, y que sea fuera de esta máquina. Si aún usas papel, es una excelente idea copiarlo a mano, no es tanto!
Dado que SXDE detectará la partición de swap como si fuera una mas de SXDE, deberemos desactivarla, y cambiarle el flag de partición, de linux-swap, a algo del estilo ext2, por ejemplo.
Para hacer eso, hay dos caminos, ambos sencillos.
Uno es utilizar el comando fdisk, con el cual podremos seleccionar la opcion "t", para hacer un toggle del flag de la partición, y otro, que es que yo estuve usando, es la instalación de la utilidad "gparted".
Al abrirlo, podremos ver esa partición, que en mi caso es la segunda del disco, desactivarla, y luego cambiarle su flag por el de ext2. No olvides presionar el botón "Apply" del "gparted" luego de hacer los cambios!
Luego de ejecutar la instalación por omisión, hay ciertas cosas que no quedaron funcionando del todo.
Una de ellas es el sonido. Lo que hice para que funcione fue lo siguiente:

# more /proc/asound/devices
2: : timer
3: : sequencer

Instalé el paquete linux-backports-modules, y agregué las siguientes líneas en el archivo /etc/modprobe.d/alsa-base:

options snd-hda-intel model=dell-m42

Al rebootear, las cosas han cambiado un poco. Al hacer un "more /proc/asound/devices", aparece lo siguiente:

2: : timer
3: : sequencer
4: [ 0- 1]: digital audio playback
5: [ 0- 0]: digital audio playback
6: [ 0- 0]: digital audio capture
7: [ 0- 1]: hardware dependent
8: [ 0- 0]: hardware dependent
9: [ 0] : control

Inmediatamente instalé el paquete alsamixergui, para poder hacer el ajuste fino del volumen. Levanté un poco el volumen, y con el xmms, pude escuchar mis mp3 sin ningún problema.

Otra cosa que no funcionó bien desde el principio fueron los efectos de pantalla. Para ello, lo que hice fue agregar en el archivo /etc/xdg/compiz/compiz-manager la siguiente línea:

SKIP_CHECKS=yes

Nuevamente rebooteé, y probé los efectos. Funcionaron, pero debo cuidarme de no enloquecer con algunos, porque pueden "colgarme" la interface gráfica.

Instalación de SXDE

En la lista de instalaciones, finalmente llegamos al SXDE.
Para instalarlo no hay mucha ciencia, dado que con sólo presionar "F12" en nuestra máquina cuando está arrancando, y luego, en el menú de booteo, seleccionar la entrada de CD/DVD, el SXDE comenzará su proceso de instalación.
La "falta de ciencia" se debe a que, en esta versión de Osol, no podremos especificarle el tamaño de las particiones, por lo que sólo le diremos que utilice el espacio que queda, que será de 30 GB.
Cuando termina de instalarse (aproximadamente una hora, en la Dell D630), rebootearemos el sistema, y veremos con alegría la ventana de login. Pero esto recién empieza!
Tocamos el archivo /boot/grub/menu.lst, para agregarle las entradas de Linux, dado que el boot loader por omisión, ahora, es el implementado por SXDE.
Se le agregan las siguientes entradas:

title Ubuntu 7.12, kernel-2.6.22-14-generic
root (hd0,2)
kernel /boot/vmlinuz-2.6.22-14-generic root=UUID=1ddc3c8e-168b-4f68-ab82-36203ed5dd1b ro quiet splash
initrd /boot/initrd.img-2.6.22-14-generic

Estas entradas, que parecen tan crípticas, son un extracto del /boot/grub/menu.lst de la partición de Linux, que habiamos copiado antes.

Una vez que hayamos salvado esta porción del archivo, y hayamos rebooteado con Linux Ubuntu, no olvidemos volver a configurar el espacio de swap, es decir, dejarlo como estaba antes. Para eso, volvemos a ejecutar el "gparted", tal como lo hicimos en la sección anterior.

Luego de rebootear para ver que todo funciona bien, tendremos un gran problema, y es ver que nuestra tarjeta de red, una Broadcom NetXtreme, basada en el chipset 5755M, no levanta para nada.
Luchando contra el hardware, encontre un link que apuntaba a poder bajar un driver del sitio "opendrivers".
Luego de bajarlo, lo instale con:

# pkgadd -d ./BRCMbcme.pkg

...y la tarjeta de red, luego de un

# ifconfig bcme0 plumb
# ifconfig bcme0 192.9.200.3 netmask 255.255.255.0 up

...quedó funcionando.

domingo, 20 de enero de 2008

Virtualización de linux 2.4 y 2.6 con Brandz en OpenSolaris

Procedimiento rápido para la generación de una Brand Linux 2.4 y 2.6 con OpenSolaris (SXDE, SXCE y OpenSolaris)

Éste es un procedimiento para generar una zona de linux 2.4 ó 2.6, usando el esquema de virtualización BrandZ de OpenSolaris.
Como habrán podido notar, no se soporta aún la implementación de una Brand desde el CD de instalación de la misma distro de GNU/Linux, por lo que se deberá generar, previamente, usando un sistema operativo ya instalado, mediante los comandos:
# cd /
# tar jcf distro24.tar.bz --exclude distro24.tar.bz --exclude dev --exclude proc --exclude sys --exclude boot *
Sencillamente, para generar una brand de linux 2.4, que por omisión posee sus archivos xml de configuración en el sistema operativo inmediatamente después de haber sido implementado, se deberán seguir estos pasos:


# mkdir /zones (éste será el directorio donde se depositarán los archivos correspondientes a la zona que vamos a crear)
# zonecfg -z linux24 (éste será el nombre que le daremos a esta zona)
linux24: No such zone configured (lógicamente, como aún no existe, aparecerá este mensaje)
Use 'create' to begin configuring a new zone.
zonecfg:linux24> create -t SUNWlx (aquí creamos la nueva zona, basándonos en el template SUNWlx)

Si el brand a generar fuera del tipo de kernel 2.6, habría que ejecutar, en lugar del anterior, el siguiente comando:
zonecfg:linux24> create -t SUNWlx26 (aquí creamos la nueva zona, basándonos en el template SUNWlx26, similar al anterior)

zonecfg:linux24> set zonepath=/zones/linux24 (aquí anunciamos cuál será el path donde se ubicarán los archivos de esta zona)
zonecfg:linux24
> set autoboot=true (esto sólo lo agregamos si queremos que cuando bootee el equipo, es decir, la zona global, también bootee la zona linux24)
zonecfg:linux24> add capped-memory (al principio no hacía esto, pero luego de ver cómo una zona podía comerse toda mi RAM, lo tomé como buena práctica)
zonecfg:linux24:capped-memory> set physical=128m (sólo le doy 128 Mbytes. Soy tacaño)
zonecfg:linux24:capped-memory> set swap=256m (el doble de RAM para el swap, también limitado, y también una buena práctica para evitar que los recursos sean comidos por esta zona)
zonecfg:linux24:capped-memory> end (finalización de la configuración de la memoria limitada)
zonecfg:linux24> add net (aquí agregamos una interface de red a la zona)
zonecfg:linux24:net> set address=192.9.200.105/24 (aquí configuramos la dirección de red de esta interface de red, nótese cómo el prompt cambió, y ahora tiene como último elemento la palabra "net")
zonecfg:linux24:net> set physical=bge0 (le decimos que la tarjeta de red por la cual se deberá salir es la bge0)
zonecfg:linux24:net> end (finalizamos la configuración de la tarjeta de red)
zonecfg:linux24> add attr
zonecfg:linux24:attr> set name="audio" (agregamos un atributo, que será la utilización de una interface de audio)
zonecfg:linux24:attr> set type=boolean
zonecfg:linux24:attr> set value=true
zonecfg:linux24:attr> end
zonecfg:linux24> commit (hacemos efectivos los cambios)
zonecfg:linux24> exit (salimos de la configuración de la zona linux24)
# zoneadm -z linux24 install -d /Documents/distro24.tar.bz2 (atención, antes de poder instalar la zona, debemos poseer un archivo con el árbol de archivos de una distro basada en el kernel 2.4, tareada y bzipeada)

- Aquí veremos aparecer mensajes como éstos:
Installing zone 'linux24' at root directory '/zones/linux24'
from archive '/Documents/centos_fs_image.tar.bz2'
This process may take several minutes.
Setting up the initial lx brand environment.
System configuration modifications complete.
Setting up the initial lx brand environment.
System configuration modifications complete.
Installation of zone 'linux24' completed successfully.
Details saved to log file:
"/zones/linux24/root/var/log/linux24.install.2453.log"

# zoneadm -z linux24 boot (booteamos la zona linux24)
# zlogin -C linux24 (le decimos -C para que arranque la consola, y podamos ejecutar los pasos de configuración que faltan)

- Aquí finalizará la instalación de la zona linux. Salir de la
consola con ~.

# zlogin linux24 (ahora sí, con el sentimiento del deber cumplido, nos logueamos a esta zona)

Luego, algo importante a realizar, si es que vas a realizar instalaciones de productos que tienen grandes dependencias con los nombres de los servidores, es cambiar el archivo /etc/hosts de forma tal que contenga entradas como las siguientes:

127.0.0.1 localhost.localdomain localhost
192.9.200.105 linux24.hecsa.com.ar linux24

Ahora bien, para bajar esta zona linux 2.4, sólo tendremos que ejecutar:

# zoneadm -z linux24 halt

Nada más para una zona linux con kernel 2.4 (medio viejo al día de la fecha, pero sirve para unas cuantas cosas, como en mi caso, que pruebo si me funcionan viejos programas).

Esto que has visto en las notas de más arriba, lo reproduje bajándome el archivo SUNWlx26.xml, e instalando un CentOS 4 update 5, es decir, una distro basada en RPM's, y con kernel 2.6.x, y me anduvo perfectamente.

UN DETALLE INTERESANTE es que hay diferencias notables de espacio cuando la máquina virtualizada está en funcionamiento, y cuando se baja:

a) Funcionando:

-bash-3.2# du -ks ./*
5817 ./bin
1 ./boot
3 ./dev
42021 ./etc
12 ./home
1 ./initrd
86294 ./lib
1 ./lost+found
4 ./media
1 ./misc
1 ./mnt
3128241 ./native
1 ./opt
21 ./proc
289 ./root
17527 ./sbin
1 ./selinux
1 ./srv
28 ./tftpboot
44 ./tmp
1759444 ./usr
47876 ./var

b) Sin funcionar:

-bash-3.2# du -ks ./*
5817 ./bin
1 ./boot
1 ./dev
42021 ./etc
12 ./home
1 ./initrd
86294 ./lib
1 ./lost+found
4 ./media
1 ./misc
1 ./mnt
21 ./native
1 ./opt
1 ./proc
290 ./root
17527 ./sbin
1 ./selinux
1 ./srv
28 ./tftpboot
43 ./tmp
1759444 ./usr
47876 ./var

Dónde es que está la diferencia? Fíjense en el directorio /native. Ahí tienen unos 3 GB.
Eso se debe a que cuando no está funcionando todos sus directorios, que son dev, etc, lib, proc, tmp, usr y var, están vacíos, pero cuando arranca la máquina virtualizada, se llena con contenidos típicos del GNU/Linux que está en ejecución.

Ahora bien, si la prueba salió bien, y queremos eliminar esa zona, qué comandos utilizaríamos? Eso es bien sencillo, sólo hay que ejecutar dos comandos (atención, no hay undo de estos comandos, así que a ejecutarlos con bastante cuidado!):

# zoneadm -z linux24 uninstall
# zonecfg -z linux24 delete

Así de sencillo!

Apéndice: Diferencias entre el archivo SUNWlx.xml y el SUNWlx26.xml

A simple vista (con perdón de la palabra), las diferencias que existen entre el archivo SUNWlx.xml y el SUNWlx26.xml es sólo la línea, por lo que la sección que la contiene quedaría:



Eso es todo, y con esta línea extra se podrá generar el archivo en cuestión.

Suerte con las pruebas!!!


HeCSa.