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 -