Instalación de un Servidor de Prácticas de Tecnologías de Internet

En este artículo se explica el proceso por el que se instaló un servidor de prácticas en la EPSA. Incluye temas diversos como instalación de Debian, compilación del kernel, personalización, etc.. Espero que os sea interesante.

 

0.- INTRODUCCION  
 

El objetivo de este trabajo académicamente dirigido es la instalación y administración de un servidor Unix para la realización de prácticas de Tecnologías Internet en dicho entorno.

Una de las ideas principales de este proyecto es de que esté basado 100% en software libre. El servidor del que se va a disponer es realmente modesto así que habremos de ajustar perfectamente el funcionamiento de cada uno de los servicios para que el rendimiento y la comodidad de los usuarios sea máxima.

A continuación comienza la explicación de cada una de las decisiones, problemas y configuraciones que hubo de irse realizando durante la duración del trabajo.

El presente documento se encuentra protegido mediante licencia "copyleft". Se utiliza este tipo de licencia en alas de la libre circulación del mismo y el máximo aprovechamiento por parte de la comunidad de software libre, espero que os sea útil.

 
  1.- SELECCIÓN DEL SISTEMA OPERATIVO: *BSD vs LINUX  
 

Nuestro primer paso es la selección del sistema operativo que vamos a instalar en el servidor. Para evitar coste alguno la elección se realizará entre sistemas operativos pertenecientes al mundo del software libre.

Las alternativas que barajamos en este caso son:

- *BSD: Un sistema operativo basado en el kernel BSD como pueden ser FreeBSD, OpenBSD o NetBSD.
- GNU/Linux: Una distribución de GNU/Linux como puede ser RedHat, Debian o Slackware.

Los objetivos son que el sistema operativo pueda funcionar en el hardware algo antiguo del servidor, que el rendimiento sea el mayor posible para ofrecer una mejor experiencia a los usuarios y que el sistema sea estable y seguro.

En el tema de seguridad uno de los más destacados es OpenBSD ya que ha tenido tan solo un error de seguridad en su instalación básica durante los últimos 7 años. Todos ellos tienen un rendimiento muy elevado incluso con un hardware tan limitado. Una de las ventajas de Linux es que funciona en cualquier ordenador x86 con al menos un procesador 386 y 1Mb de RAM.

Otro factor importante es la experiencia que se tenga en el uso de los sistemas operativos a utilizar. En mi caso es muy superior en sistemas Linux que en los *BSD. Lo que inclina bastante la balanza hacia el primero.
A pesar de ello se realizaron diversas pruebas con distintos tipos de BSD y Linux en el servidor decantándonos al final por Linux.

Ahora entramos en una nueva tesitura: ¿qué distribución vamos a utilizar? Actualmente existen numerosas distribuciones de linux orientadas hacia muchísimos sectores. A continuación las alternativas que se plantearon: (RedHat, Slackware, Debian o Gentoo). Inicialmente se descartaron distribuciones como Mandrake o Suse, en mi opinión, más orientadas al mundo del escritorio que al de los servidores. Aunque claro, como todo linux es cuestión de personalizarlo.

Inicialmente descartamos Gentoo, una distribución fantástica, ya que al utilizar paquete al estilo BSD, es decir compilados en la propia máquina da un rendimiento fantástico, debido a que el procesador Pentium de nuestro servidor no se aleja mucho del 386 el rendimiento que podemos obtener de compilar los paquetes puede ser mínimo. No deseábamos ni el bonito escritorio de RedHat ni necesitábamos de su alta detección de hardware y auto configuración. La sencillez y potencia de Debian y Slackware nos decantaba claramente hacia ellas. Decantándonos finalmente por Debian debido a su potente sistema de paquetes (.deb) y su fácil actualización (mediante la herramienta apt).


Así que finalmente utilizaremos Debian GNU/Linux y más concretamente por su versión Woody (3.0.1), actualmente versión estable del proyecto Debian.


2.- SELECCIÓN Y MONTAJE DEL HARDWARE DEL SERVIDOR  
 

Disponemos de 3 ordenadores Pentium entre los que seleccionar el candidato a ser el futuro servidor de prácticas de Tecnologías Internet. Tras un par de horas de pruebas y comprobaciones, sólo se puede llegar a una conclusión: Ninguno de ellos está completamente operativo. Como última solución vamos a intentar juntar el hardware suficiente para formar un servidor completo:

PC-1: Caja, placa, disquetera, memoria RAM y tarjeta de video.
PC-2: Fuente de alimentación, CD-ROM.
PC-3: CPU, disco duro y tarjeta de red.

 

Bueno parece que al final ya tenemos servidor de practicas.

Procesador: Pentium 200Mhz
Memoria: 128 Mb
Disco duro: 2,5 Gb
Tarjeta de video S3 Trio
Tarjeta de red RTL-8029
CD-Rom 24x

 
  3.- INSTALACIÓN DEL SISTEMA BASE  
 

Comenzamos con un pequeño percance en el arranque del primer cd de debian, la máquina no reconoce el arranque del cd. A continuación se realizó una prueba con Knoppix (una excelente distribución basada en debian que permite ejecutar un sistema linux completo desde el cd, sin necesidad de instalar) para ver si podíamos tener algún problema con debian, pero el sistema funcionó a la perfección. Utilizamos el segundo cd de nuestra debian-woody por fin conseguimos arrancar la instalación. En principio instalaremos con el kernel estable de debian: 2.2.20 para una vez instalado compilar nuestro propio kernel (en ese momento 2.4.20).

IDIOMA:
Seleccionamos el idioma y el teclado en español.

PARTICIONAMIENTO:
Disponemos de un disco duro de 2,5 Gb y realizamos el siguiente particionamiento:

/dev/hda1 on /boot type ext2 (rw) 10Mb
/dev/hda2 SWAP 256Mb
/dev/hda3 on /tmp type ext2 (rw,nosuid,nodev) 256Mb
/dev/hda5 on /home type ext2 (rw,nosuid,nodev) 1Gb
/dev/hda6 on / type ext2 (rw) 1Gb

BOOT: Una pequeña partición boot, que sólo estará montada cuando instalemos nuevas versiones del kernel. La marcaremos como partición de arranque.
SWAP: Creamos una partición de intercambio de 256Mb. En este caso el doble de la memoria RAM, ya que no disponemos de mucha memoria.
TMP: Creamos una partición temporal, separada del resto del sistema para reducirle los privilegios, ya que esta tiene permiso de escritura para todo el mundo.
HOME: Aqui es donde guardaran los ficheros de prácticas los alumnos.
RAIZ: Partición principal que albergará todo el sistema.

MODULOS:
En la sección de módulos tan sólo seleccionamos el que nos dará soporte para la red: NE-2000 y compatibles.

RED:
La configuración se de red se realizará mediante DHCP, teniendo ya una IP fija asignada para nuestra dirección MAC en el servidor DHCP de la universidad.

Como nombre del servidor elegimos Tutatis, que era el de uno de los PCs que ahora conforman este servidor.

LILO:
Como gestor de arranque instalamos LILO en el MBR (Master Boot Record), luego lo modificaremos para que nos permita arrancar con el kernel que compilemos.

REINICIO:
A continuación se reinicia el servidor para arrancar con el kernel que acabamos de instalar.

PASWORDS:
Utilizaremos shadow passwords basadas en MD5 para el sistema.
A continuación introducimos la password que queramos para el superusuario y también podemos hacer una cuenta para un usuario normal.

PAQUETES:
Personalmente prefiero hacer la selección de los paquetes a instalar manualmente en lugar de usar dselect o tasksel para seleccionarlos. Así que instalamos sólo el sistema base desde los cd-roms y el resto lo haremos por red mediante apt.


4.- PERSONALIZANDO EL SISTEMA  
 

Bueno y una vez aquí ya tenemos el sistema instalado, ahora procedemos a realizar algunos cambios en la configuración:

EXT2 -> EXT3

- Pasamos las unidades de ext2 a ext3. Creamos el journal para los sistemas de ficheros ya que esto nos va a dar un reinicio más rápido ante fallos y evita la posibilidad de perder información.

tune2fs -j /dev/hda5
tune2fs -j /dev/hda6

Ahora modificamos /etc/fstab para que estas se monten como ext3 en vez de ext2.

FUENTES DE PAQUETES


- Para usar apt y que los paquetes se instalen mediante red, modificamos /etc/apt/sources.list y le indicamos que queremos descargarlos de rediris (al estar la universidad conectada directamente a rediris y tras varias pruebas, este fue el servidor que nos daba una media de descarga más rápida) en nuestro caso. También eliminamos las líneas concernientes al cd-rom ya que sólo vamos a usar la red para las instalaciones. La última línea nos provee de actualizaciones de seguridad en caso de que algún paquete cambie debido a un bug.

/etc/apt/sources.list

deb ftp://ftp.rediris.es/pub/linux/distributions/debian/ stable main non-free contrib
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free

deb http://security.debian.org/ stable/updates main

Si no conoces ninguna fuente de paquetes, lo más sencillos es utilizar apt-setup y seleccionar una de las que allí aparecen.
Una vez hecho esto actualizamos la base de datos de paquetes y actualizamos aquellos que tengan una versión más moderna:

apt-get update
apt-get upgrade

ELIMINANDO SERVICIOS INNECESARIOS:

Vamos a ver que servicios se están ejecutando en este momento en la máquina, mirando que puertos están a la escucha:

netstat -l --inet -n

Entre ellos encontramos todos los referentes a inetd como son echo, daytime, etc... como no los vamos a necesitar los comentamos en /etc/inetd.conf y de paso aprovechamos para instalar la versión mejorada: xinetd.

apt-get remove inetd
apt-get install xinetd

Como no queremos ninguno de los servicios que estaban en inetd le indicamos que no queremos que herede de él la configuración sino que la deje en blanco.

Como no vamos a utilizar servicios RPC (Llamada a procedimiento remoto) <portmap> ni servicios de impresión <lpr>, desinstalamos estos paquetes:

apt-get remove portmap lpr

MOTD

- Cambiamos el mensaje del día, modificando /etc/motd para saludar a los usuarios cuando inicien sesión:

/etc/motd

Linux Tutatis 2.4.20 #1 Tue May 20 12:53:11 CEST 2003 i586 unknown

########################################################
## ¡¡ Bienvenido a TUTATIS !! ##
## Servidor de prácticas de Tecnologías Internet ##
## E.P.S.A. ##
#######################################################

INSTALAMOS PAQUETES ADICIONALES

Instalamos unos cuantos paquetes útiles:

- Manuales de programación: manpages-dev
- Editores de texto: vi, joe, mc
- Compiladores: gcc, cpp, make
- Compresores: bzip2 y gzip
- Lynx: navegador web en modo consola
- Bitchx: cliente de irc
- Dnsutils: utilidades de dns
- Descargas: wget
- Paginador: less

apt-get install manpages-dev vi joe mc gcc cpp make bzip2 gzip lynx bitchx dnsutils wget less

MONITORIZANDO LOS USUARIOS:

Para controlar el uso del servidor y debido a la existencia de una cuenta generica para todos los alumnos vamos a realizar una monitorizacion extra de las acciones realizadas por los usuarios.

Para ello utilizaremos el paquete snoopy que vigila mediante una modificación en la llamada del sistema operativo execve() de la librería libc los comandos utilizados. Así podemos controlar todas las acciones de los usuarios consultando /var/log/auth.log. Para instalarlo:

apt-get install snoopy


5.- Compilando el kernel . . .  
 

Para optimizar y personalizar el servidor vamos a compilar un kernel con las opciones que nosotros queramos.
Para ello descargamos el kernel.

wget ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.20.tar.bz2

Lo movemos a /usr/src y lo descomprimimos:

mv linux-2.4.20.tar.bz2 /usr/src
tar jxvf linux-2.4.20.tar.bz2

Vamos a hacerlo en modo consola con ayuda de ncurses, así q las instalamos:

apt-get install libncurses5-dev

Y comenzamos la configuración:

make menuconfig

Ahora vamos seleccionando las opciones que queramos y estén disponibles en nuestro servidor. Señalo las más destacables a continuación:

-Loadable module support: NO
En este caso vamos a crear un kernel sin módulos con toda la funcionalidad en el propio kernel. Además así evitamos el bug del ptrace que existía en las versiones 2.4.20 del kernel de linux.

-Procesor Type: Pentium-Classic

-Dentro de Networking Options, seleccionaremos Socket Filtering (no seleccionada por defecto) para tener soporte DHCP.

-En Network Devices / Ethernet 10-100 seleccionamos el driver compatible con nuestra tarjeta RTL-8029: PCI NE2000 and clones support.

-Deshabilitamos elementos de los q no disponemos como: SCSI, USB, Sonido y algunos q no vamos a utilizar como soporte NFS.

-Es recomendable salvar la configuración a un fichero aparte con la opción SAVE, para poder recuperarla cuando queramos: tutatis.kernel.conf en nuestro caso.

-Le damos a salir y grabamos esta configuración actual.

Y por último lo compilamos:

make dep clean bzImage


Si hubiésemos optado por utilizar módulos, ahora deberíamos hacer:

make modules modules_install

Cuando termina de compilarse, tenemos el nuevo kernel disponible en arch/i386/boot/bzImage y procedemos a copiarlo a la partición de boot.

cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.20

En debian se suele crear un link desde el raíz a esta imagen, pero yo prefiero no hacerlo (simplemente un tema de estética o organización), sería

ln -s /boot/vmlinuz-2.4.20 /vmlinux-2.4.20

Ahora procedemos a actualizar el lilo.conf para que incluya el nuevo kernel. Esta es la configuración (sin comentarios) que nos ha quedado. Hemos añadido la nueva imagen /boot/vmlinuz-2.4.20 y la hemos señalado por defecto. Además para las pruebas iniciales hemos activado el prompt para poder cambiar al kernel anterior en el arranque en caso de problemas.

/etc/lilo.conf

lba32
boot=/dev/hda
root=/dev/hda6
install=/boot/boot-menu.b
map=/boot/map

delay=20
prompt
timeout=100

vga=normal

default=Linux4

image=/boot/vmlinuz-2.2.20
label=Linux
read-only

image=/boot/vmlinuz-2.4.20
label=Linux4
read-only

Por último ejecutamos lilo para que se escriba el nuevo sector de arranque y reiniciamos con nuestro nuevo y flamante kernel:
lilo -vv
reboot


6.- Conexión remota  
 

En este servidor se van a utilizar las siguientes cuentas:

root : presente en todo sistema linux para tareas administrativas.
admin: usuario para conectarnos remotamente.
alumno: usuario genérico que utilizaran todos los alumnos para realizar prácticas.

SSH:

El servidor va a estar ubicado en el centro de datos de la escuela politécnica, y el acceso a él es bastante complicado, así que lo vamos a administrar remotamente mediante openssh.

Para instalar el servicio:

apt-get install ssh

En las preguntas de configuración indicamos que queremos que se ejecute el demonio servidor de ssh: sshd. Y automáticamente se añade para que se ejecute en el arranque, en nuestro caso runlevel 2.

Realizamos algunas modificaciones en la configuración para aumentar la seguridad (sólo se presentan las líneas que han sido modificadas):

/etc/ssh/sshd_config

Protocol 2
PermitRootLogin no
X11Forwarding no

Así sólo permitimos acceder con la versión 2 del protocolo (la v1 tiene algunos fallos de seguridad), no permitimos a root entrar directamente sino que tendrá que hacerlo con un usuario y luego utilizar su y deshabilitamos el reenvío de X ya que no las vamos a utilizar.


7.- PRACTICA 1 FTP + TELNET  
 

En esta práctica los alumnos aprenderán a utilizar los protocolos de FTP y TELNET, para lo que instalaremos los correspondientes servidores.

Utilizaremos proftpd como servidor de ftp, y lo instalamos asi:

apt-get install proftpd

Realizamos dos pequeños cambios en la configuración. El primero para indicar el nombre del servidor y el segundo para que sólo se pueda acceder por ftp al directorio personal. El acceso anónimo al ftp viene deshabilitado por defecto. (sólo se presentan las líneas que han sido modificadas):

/etc/proftpd.conf

ServerName Tutatis (Técnologias Internet)
DefaultRoot ~/

A continuación editamos (por comodidad) el fichero /etc/ftpusers, en él se encontraran todos los usuarios que no tienen derecho a acceder por ftp. Por costumbre se suelen poner ahi todos los usuarios y comentamos los que tienen derecho a acceder, quedando así el fichero:

# /etc/ftpusers: list of users disallowed FTP access. See ftpusers(5).
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
nobody
#admin
#profesor
#alumno

Para dar servicio de telnet utilizaremos telnetd, el cual será iniciado desde el superservidor xinetd cada vez que haya una petición a su puerto. Limitamos el uso de telnet tan sólo a la red perteneciente a la universidad mediante only_from. Aquí tenemos como quedaría el fichero de configuración:

/etc/xinetd.conf

service telnet
{
socket_type = stream
protocol = tcp
wait = no
user = telnetd
group = telnetd
server = /usr/sbin/in.telnetd
only_from = 161.67.0.0/24
}

Debemos reiniciar xinetd para que los cambios tengan efecto:

/etc/init.d/xinetd restart


8.- PRACTICA 2 Creación de Páginas Web  
 

Los alumnos deben de crear un sitio web y subirlo al servidor para visualizarlos desde internet. Para ello vamos a instalar el servidor web por excelencia Apache.

apt-get install apache

La única modificación en la configuración ha sido la reducción del número de procesos hijos que creará el servidor para servir las páginas, debido a las limitaciones tanto de procesador como de RAM de nuestro servidor. (sólo se presentan las líneas que han sido modificadas):

/etc/apache/httpd.conf

MinSpareServers 3
MaxSpareServers 10
StartServers 3

Para facilitar el acceso de los alumnos a la hora de visualizar las páginas hemos creado un enlace desde /var/www (lugar donde se albergan las páginas web) al directorio de usuario con el siguiente comando:

ln -s /var/www/alumno /home/alumno

Ahora cualquier fichero que suban los alumnos podrá ser visualizado por web en http://161.67.17.44/alumno/ .
También hemos creado una página web de inicio desde la que acceder al listado de contenidos de los alumnos


9.- PRACTICA 3 CGIs  
 

En esta práctica el alumno debe de aprender a crear sus propios CGIs utilizando el lenguaje de programación C. Para ello ya le hemos provisto de acceso por ftp para poder subir el código fuente al servidor y del compilador gcc para que pueda compilarlos.

Para permitir el acceso de los alumnos al directorio de cgis vamos a realizar los siguientes pasos:

mkdir /usr/lib/cgi-bin/alumno
chown alumno /usb/lib/cgi-bin/alumno
ln -s /usr/lib/cgi-bin/alumno /home/alumno/cgi-bin

Hemos creado un cgi de ejemplo llamado holamundo.c como modelo de cgi, pero los alumnos pueden subir sus propios códigos fuente a través del servidor de ftp.


holamundo.c

int main()
{
printf("Content-Type: text/html\n\n");
printf("<html>Hola mundo</html>\n");

return(0);
}

Ahora sólo tenemos que compilarlo y copiarlo en el directorio de cgis:
gcc -o holamundo.c holamundo
cp holamundo /home/alumno/cgi-bin/

Para comprobar que funciona visualizamos la siguiente página en un navegador:

http://161.67.17.44/cgi-bin/alumno/holamundo


10.- PRACTICA 4 PHP + MySQL  
 

En la siguiente práctica los alumnos aprenderán la creación de páginas dinámicas mediante el uso del lenguaje de scripting PHP y el acceso a la base de datos MySQL.

Instalamos los paquetes necesarios:

apt-get install php4 php4-mysql php4 mysql-server mysql-common mysql-client

Debemos realizar las siguientes modificaciones en la configuración de apache para que se cargue el modulo de php, se interprete como pagina principal las index.php y se ejecuten páginas php:

/etc/apache/httpd.conf

LoadModule php4_module /usr/lib/apache/1.3/libphp4.so
DirectoryIndex index.html index.php index.htm index.shtml index.cgi
AddType application/x-httpd-php .php


Para comprobar que php funciona correctamente crearemos una pagina de información general sobre php:

/var/www/info.php

<? phpinfo();?>

Y la visualizamos en el navegador: http://161.67.17.44/info.php


Ahora debemos de encargarnos de crear una base de datos para acceder desde las páginas en php. Lo primero que debemos hacer es ponerle password al administrador de mysql:

mysqladmin -u root 'new-password'

A continuación ya podemos crear una nueva base de datos a la que acceder:

mysql -u root -p

CREATE DATABASE tecnologiasinternet

Lo siguiente sería crear usuarios con derechos a utilizar esa base de datos que utilizaremos para autentificarnos desde las páginas y crear tablas con el contenido que deseemos. (Esta parte queda fuera de lo que se pretende cubrir con este documento).

Un pequeño ejemplo de acceso a mysql desde php, autentificación de usuarios contra la base de datos:

ejemplo.php

<?
$cDB = mysql_connect("127.0.0.1","tecnologiasinternet","1234BX-") or die("FALLA LA CONEXION");
mysql_select_db("tecnologiasinternet",$cDB) or die ("FALLA LA SELECCION DE LA BASE DE DATOS");

$a = mysql_query("select Usuario from Usuarios_TB where Nombre='$user' AND Password='$pass'") OR DIE(mysql_error());
if (mysql_num_rows($a) == 0) DIE("Acceso denegado, has de entrar como un usuario correcto primero.");
else $login = 'OK';
?>


11.- Conclusiones  
 

Sobre la plataforma de este servidor se han realizado múltiples sesiones de prácticas durante este año 2003 siendo satisfactoria la respuesta del sistema y permitiendo realizar cada uno de los ejercicios prácticos que requería el profesor de la asignatura.

Los temores sobre la suficiencia del hardware utilizado han sido superados en gran parte gracias a las bondades del sistema operativo elegido (GNU/Linux) y una optima configuración del mismo, dándonos una productividad más que suficiente para los requerimientos de actividad a los que estaba destinado.

Espero que os haya sido de alguna utilidad a los que esteis interesados en un proyecto similar o querais aprender un poquito más sobre la instalación de servidores en linux.

Para cualquier duda o comentario podeis contactar conmigo enviando un e-mail a:

javi (arroba) ideando.net

-FIN-