5. Seguridad del servidor.

Anuncio
5. Seguridad del servidor.
Hoy en día se puede decir que Internet es de público acceso. Cualquiera con un
ordenador y unos mínimos conocimientos puede conectarse a la Red de Redes y tener acceso a
un ordenador remoto ubicado en la otra punta del planeta y que, quizás contenga información
privilegiada y no destinada al público en general.
En un mundo cada vez más informatizado, en un entorno hostil, como puede ser
Internet, y cada vez más comercial, en una red cada vez más accesible al público en general, la
seguridad informática es de vital importancia.
Debido a estas razones nuestro servidor deberá tener elementos de seguridad, para ello
se desarrolla un mecanismo se seguridad mucho más eficiente y seguro del que ya existía en el
laboratorio remoto. Este mecanismo está basado en las bases de datos MySQL que se crean
para el ya explicado desarrollo e-learning instalado, Moodle. Consiste de forma general en
obtener información de esas bases de datos y ver si el usuario que quiere acceder al laboratorio
está autentificado y está accediendo desde el entorno moodle.
Aunque antes de hacer esto necesitamos que los usuarios suban archivos .out que ya
hayan compilado con el Code Composer, esto se hace creando una página PHP de subida.
También hay que tener cuidado con la seguridad en esta página.
5.1.
Página Web en PHP para subir archivos.
Como se ha comentado anteriormente el laboratorio remoto creado en LabVIEW
necesita tener en el servidor el archivo .out creado en Code Composer Studio para poder
cargarlo en el DSP. Para ello se tuvo que realizar una aplicación en PHP que sube esos archivos
al servidor.
Mediante un formulario podemos elegir de nuestro PC un archivo y subirlo al servidor
pero no podemos elegir el lugar donde se guarda.
Hay que tener cuidado porque el programa en LabVIEW busca esos archivos con una
determinada ruta, siendo ésta siempre fija independientemente del usuario que esté accediendo.
Esta ruta es C:\LabCSED\Archivos alumnos. Por tanto en nuestra aplicación tenemos que
guardar esos archivos en esa ruta. Para ello luego de subir el archivo lo movemos con
move_uploaded_file.
El lenguaje PHP creado está contenido en el siguiente cuadro.
- 32 -
<HTML>
<HEAD>
<TITLE> Laboratorio de complementos de sistemas electrónicos
</TITLE>
</HEAD>
<BODY bgcolor="#b8b8b8">
<CENTER>
<h1>LabCSED</h1>
<h2>Subir el fichero .out creado en CCS </h2> Primeramente debes subir al servidor el
archivo creado en CCS para cargarlo en el DSP.
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" name="submit" value="Subir archivo"
onclick="comprueba_extension(this.form, this.form.file.value)"/>
</form>
<HR> Para comenzar a utilizar el laboratorio remoto haz clic en este enlace.
<br>
<A HREF="http://edsplab.us.es:2000/labcsed.htm">Laboratorio Remoto</A>
</CENTER>
</HTML>
</BODY>
<?
$destino = 'C:\LabCSED\Archivos alumnos' ;
move_uploaded_file ( $_FILES [ 'file' ][ 'tmp_name' ], $destino . '/' . $_FILES [ 'file' ][
'name' ]);
?>
Queda comentar que la página que contiene el laboratorio remoto se ha creado con la
aplicación que tiene LabVIEW para crearlo.
Esta aplicación PHP realiza lo que se quería de una forma simple pero no nos hemos
preocupado de la seguridad del servidor. Cualquier persona con conexión a Internet puede
acceder a dicha página y puede subir cualquier archivo, con cualquier extensión. Hasta
ejecutables que pudieran contener virus.
Para ello se ha tenido que crear un sistema de contraseña y se ha realizado una
comprobación de extensión cada vez que se sube un archivo. Todo esto está comentado en el
siguiente apartado.
5.1.1.
Seguridad al subir archivos *.out.
Lo más importante, antes de poner en funcionamiento el laboratorio al completo, era
mejorarlo en seguridad, ya que teníamos un agujero de seguridad en el servidor.
Como medida inicial para empezarlo a arrancar se pensó utilizar una contraseña
genérica para todos los usuarios, ya que esta forma era la más fácil y rápida. Se hizo así porque
el curso había comenzado y necesitábamos ponerlo en funcionamiento lo más pronto posible,
para que los alumnos comenzaran a utilizarlo.
- 33 -
<?php
if (($PHP_AUTH_USER!="******") || ($PHP_AUTH_PW!="******")) {
header('WWW-Authenticate: Basic realm="Acceso restringido"');
header('HTTP/1.0 401 Unauthorized');
echo 'Usuario no autorizado.';
exit;
}
?>
En nuestro caso la contraseña que se utilizó fue la misma que se usa en el laboratorio
remoto, para no complicar al alumno con diversas contraseñas.
Figura 13. Ventana para conexión a edsplab.us.es
5.2.
Composición de un entorno homogéneo.
Ya hemos mejorado y asegurado la página PHP en la que tenemos que subir el archivo,
la parte del laboratorio remoto tiene su propia seguridad mediante la misma contraseña
genérica, así que solamente necesitamos crear un entorno adecuado y añadir un par de
opciones a la página que contiene el laboratorio remoto.
Podemos observar que la aplicación de LabVIEW se encuentra dentro de un cuadro, en
principio, se ha intentado reproducir el mismo color en todas las páginas relacionadas.
A continuación vemos una vista general de la página cargada en un navegador.
- 34 -
Figura 14. Página que contiene el laboratorio remoto
De esta parte hay que comentar que el sistema utilizado por LabVIEW para control
remoto es monousuario, por tanto cuando un alumno está utilizando el servicio, los demás no
podrán tener el control del laboratorio, solamente observar lo que está haciendo el usuario con el
control del sistema.
- 35 -
Si alguien pide el control cuando otro alumno lo está usando, al alumno con el control se
le ceden 5 minutos para que termine su tarea y se ceda el control al usuario que está en cola.
Veremos el código completo necesario para generar dicha página.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Draft//EN">
<HTML>
<HEAD>
<TITLE> LabCSED
</TITLE>
</HEAD>
<BODY bgcolor="#b8b8b8">
<center>
<H1>LabCSED</H1>
<h2>Laboratorio de Complementos de Sistemas Electronicos Digitales </h2>
</center> Este es el laboratorio remoto creado para las prácticas de CSED, si el
servidor esta ocupado tienes que esperar tu turno, se cederá el servidor en orden de
espera. Si algo no lo comprendes utiliza el menú de ayuda.
<hr>
<br> Si quieres volver a cargar un archivo .out para el DSP pulsa en el siguente
enlace.
<center>
<A HREF="http://edsplab.us.es/labview/subirarchivo.php">Subir archivo</A>
</center>
<P>
<TABLE BORDER = 1 BORDERCOLOR = #000000>
<TR>
<TD>
<SCRIPT language="JavaScript"><!-var lng;
if (navigator.userLanguage) { lng = navigator.userLanguage; };
if (navigator.language) { lng = navigator.language.toLowerCase(); };
var obj = '<OBJECT ID="LabVIEWControl" CLASSID="CLSID:A40B0AD4-B50E-4E588A1D-8544233807AC" WIDTH=1018 HEIGHT=708
CODEBASE="ftp://ftp.ni.com/support/labview/runtime/windows/7.1';
if (lng.indexOf("fr") != -1) { obj = obj + '/French'; }
else if (lng.indexOf("de") != -1) { obj = obj + '/German'; }
else if (lng.indexOf("ja") != -1) { obj = obj + '/Japanese'; }
obj = obj + '/LVRunTimeEng.exe">';
document.write(obj);
// --></SCRIPT>
<PARAM name="LVFPPVINAME" value="LabCSED.vi">
<PARAM name="REQCTRL" value=true>
<EMBED SRC=".LV_FrontPanelProtocol.rpvi71" LVFPPVINAME="LabCSED.vi"
REQCTRL=true TYPE="application/x-labviewrpvi71" WIDTH=1018 HEIGHT=708
PLUGINSPAGE="http://digital.ni.com/express.nsf/express?openagent&code=ex3e33&">
</EMBED>
</OBJECT></TD>
</TR>
</TABLE>
<P> Antes de cerrar el navegador debes poner el sistema en OFF y LOGOUT.
<hr> Si no eres capaz de visualizar el laboratorio es necesario descargar una
aplicacion para LabVIEW. Puedes descargarlo en el siguiente enlace.
<center>
<A HREF="LabVIEW Run Time Engine.exe">LabVIEW Run Time Engine</A>
</center>
<hr>
<br> Si el servidor no responde o tienes alguna duda puedes ponerte en contacto
con el administrador del sistema en la siguiente dirección de correo.
<br>
<center>
<IMG SRC="correo.bmp">
</center>
</BODY>
</HTML>
- 36
-
5.3.
Seguridad basada en las bases de datos de Moodle.
El entorno de aprendizaje Moodle basa su funcionamiento en una base de datos
integrado en MySQL, en ella es donde almacena toda la información necesaria para gestionar el
entorno de aprendizaje. Algunas de las tablas que se crean tienen la función de almacenar datos
de los usuarios. Estos datos pueden ser leídos para comprobar si algún usuario tiene acceso a
este entorno para poder darle acceso al laboratorio, además se puede obtener información
adicional para personalizar la página.
5.3.1.
Datos de los alumnos en la base de datos y timestamp.
Después de hacer varias pruebas y mirar todas las tablas de la base de datos, se ha
conseguido identificar las tablas necesarias y útiles para nuestro cometido, la autentificación
utilizando esta base de datos.
Inicialmente las tablas que se usarán son:
x
mdl_user
x
mdl_groups_members
x
mdl_log
El primero de ellos (mdl_user) contiene todo lo relacionado con el usuario
independientemente del tipo de usuario, alumno, profesor o administrador.
Vemos que esta tabla se puede utilizar para varias cosas. Una de ellas es obtener
información para personalizar la página del laboratorio remoto, eso se consigue sacando, por
ejemplo, el nombre y el apellido. También es necesario saber que usuario está accediendo al
portal y se consigue mirando su IP y sus tiempos de acceso, esos tiempos está en base al
tiempo epoch, este tema se comentará al final del apartado.
Después de saber que usuario está intentando acceder obtendremos sus datos de
autentificación en Moodle con Id, Auth y Confirmed.
Esta tabla es la única necesaria para ver si el usuario que accede está capacitado para
entrar en el entorno de aprendizaje creado para la asignatura mediante Moodle, pero en general
no queremos que todos los usuarios quieran entrar, ya que en este entorno pueden y suelen
coexistir varias asignaturas y cursos, por tanto tenemos que dar una solución adaptada a nuestro
sistema.
La solución más fácil y sencilla que se ha encontrado fue utilizar la otra que tabla que se
comenta al principio del apartado, mdl_groups_user, ésta contiene los datos de los usuarios
que están dentro de un grupo.
- 37 -
Con esta tabla podremos comprobar que el usuario que quiera acceder pertenece al
grupo creado para tal efecto, si no pertenece al grupo no se le dará acceso.
Con estas dos tablas es suficiente para dar acceso a los usuarios que queramos con
suficiente seguridad y estabilidad, pero se puede usar otra tabla para obtener más seguridad. Se
trata de la tabla mdl_log, contiene un log donde se almacenan las acciones que realizan todos
los usuarios.
Vemos que con esta tabla se pueden hacer diversas cosas ya que se va a actualizando
en tiempo real, por tanto podemos comprobar todo lo que hacemos bajo el entorno Moodle.
Es suficiente trabajar con estas tres tablas, de hecho con menos también se podría
realizar una conexión segura, pero con la redundancia obtenemos un extra de seguridad a
ataques externos y usos malintencionados.
Las bases de datos MySQL se basan en el tiempo epoch, ese instante de tiempo
corresponde a medianoche del 1 de enero de 1970 (GMT, Greenwich Mean Time). El timestamp
es un formato de representación de fecha/hora muy frecuente no solo en sistemas Unix, sino
también en lenguajes como C y PHP, en SQL es un tipo de datos. Es decir se trata de un
número entero que indica el tiempo en segundos que ha transcurrido desde el tiempo epoch al
instante de tiempo que queramos representar. Todos los campos de tiempo en la base de datos
que estamos utilizando usan esta metodología.
5.3.1.1.
Obtener datos con variables PHP.
Ya sabemos obtener datos de la base de datos que ofrece Moodle, pero tenemos que
compararlo con los datos que somos capaces de obtener del usuario que quiere acceder.
Seremos capaces de hacer obtener estos datos a través de variables globales que ofrece PHP,
aquí mostramos un conjunto de estas variables, posiblemente en nuestro caso serán las más
útiles.
x
$HTTP_REFERER: Dirección URL de la que procede el usuario.
x
$HTTP_ACCEPT_LANGUAJE: Lenguaje del navegador.
x
$HTTP_USER_AGENT: Navegador utilizado por el usuario.
x
$REMOTE_ADDR: IP asignada al usuario.
x
$OS: Sistema operativo utilizado por el usuario.
x
$REQUEST_METED: Método de petición por el cual se accede a la página.
x
$SERVER_NAME: Nombre del servidor donde se ejecuta el script.
x
$SERVER_SOFTWARE: Bajo que servidor se ejecuta el script
- 38 -
Este es una pequeña parte de las variables que maneja PHP, podemos ver todas las
variables disponibles en la función phpinfo().
5.3.2.
Idea de autentificación.
La necesidad de hacer una autentificación en el laboratorio remoto es debido a que la
seguridad que ahora está implementada es básica y fácilmente parcheable, esta basada en una
contraseña genérica para todos los usuarios.
Como en el mismo sistema se ha implementado un entorno de aprendizaje e-learning
basado en la tecnología Moodle, podemos hacer uso de las bases de datos que se generan en el
momento en el que los alumnos se registren en este entorno de aprendizaje.
Para hacer esto se ha tenido que acceder a dichas bases de datos sin modificarlas para
no generar errores en Moodle. Para ello se ha utilizado la integración existente entre PHP y
MySQL.
Figura 15. Idea general para autentificación mediante base de datos Moodle
Las tablas que usaremos dentro de la base de datos Moodle van a ser las que se ha
explicado en apartados anteriores, ahí encontramos los datos necesarios para saber si el usuario
que se quiere autentificar está accediendo desde el entorno de aprendizaje.
- 39 -
De una forma simple se intentará explicar el mecanismo que se ha pensado para hacer
la autentificación con las tablas involucradas.
Inicialmente obtenemos la IP del usuario con la variable PHP $REMOTE_ADDR, con
esta variable hacemos una búsqueda en la tabla mdl_user, filtrando por lastip, así podemos ver
todos los usuarios que han accedido con ese ordenador. Si solamente aparece un registro (se
obtiene con mysql_num_rows) podremos suponer que es el usuario que quiere acceder. Si
aparece más de un registro tenemos que observar el último que ha utilizado el entorno se
aprendizaje, eso se ve mirando lastaccess que indica el tiempo timestamp en el cual ese
usuario ha ejecutado la última acción. El usuario que hace la última acción se presupone que es
el que quiere acceder al laboratorio.
Si la página en la que se hace estas acciones es la primera del laboratorio, el enlace
colocado en el entorno Moodle ira directamente a esta página, por tanto podremos utilizar la
variable PHP $HTTP_REFERER para ver desde qué página se procede, si no es de la del
entorno Moodle no se le da acceso. También podemos comprobar que el valor lastaccess es
igual al tiempo actual (o similar) ya que el hecho de entrar en el recurso del laboratorio actualiza
este valor en el registro del usuario que hace la acción.
Para más seguridad se comentó en apartados anteriores que se podían utilizar los
grupos, creando un grupo específico con las personas que tengan la posibilidad de entrar en el
laboratorio. Así mirando el número de identificación en mdl_user y comparándolo en userid de la
tabla mdl_groups podemos ver si pertenece al grupo elegido.
Por último podemos utilizar la última tabla que se comentó, ésta contiene un log de todas
las acciones que se hacen bajo el entorno Moodle, mdl_log. Esta tabla tiene algunos registros
bastante útiles, como por ejemplo el momento de ejecutar la acción, la ID del usuario, su IP, la
acción que realiza y desde que página la está haciendo.
- 40 -
Descargar