Control de Acceso a Internet

Hay muchas formas de hacer un control de acceso. La más normal suele ser cortar la conexión exterior en el cortafuegos. Esta solución supone un problema. El cortafuegos no puede ser manipulado por cualquiera. Necesitamos otro método diferente que sea mas flexible y por medio del cual cualquier profesor pueda conectar una clase a Internet para ver paginas web, de una forma sencilla. Esto es lo que intentaremos hacer. 

Veamos un ejemplo de escuela.

Subredes escolares

Subredes

Grupos IP

Profesores

172.16.0.0/24

Alumnos

172.16.1.0/24

Direccion

172.16.2.0/24

Servidores

172.16.3.0/24

Direcciones de las aulas

Aulas

Grupos IP

Aula-01

172.16.1.17 -> 172.16.1.32

Aula-02

172.16.1.33 -> 172.16.1.48

Aula-03

172.16.1.49 -> 172.16.1.64

Aula-04

172.16.1.65 -> 172.16.1.80

Aula-05

172.16.1.81 -> 172.16.1.96

Aula-06

172.16.1.97 -> 172.16.1.112

Aula-07

172.16.1.113 -> 172.16.1.128

Aula-08

172.16.1.129 -> 172.16.1.144

Software necesario

El control de acceso lo implementaremos sobre squid. Los paquetes que necesitamos instalar son squid, apache, php y (en Squeeze)  sudo. El resto de paquetes ya se han instalado.


    aptitude install squid apache2 libapache2-mod-php5 php5 php5-cli php5-gd sudo

El script de instalación nos crea la jerarquía de directorios de la caché en /var/spool/squid y lo ejecuta. Ya tenemos pues, squid en marcha. Si por la razón que sea, no se han creado los directorios, le indicamos que los cree con squid -z.

Configurando squid

El archivo de configuración es /etc/squid/squid.conf. Si queremos experimentar, aquí tenemos algunos parametros que se pueden cambiar:


# ---------- Cache Parameters ----------
cache_mem 100 MB

maximum_object_size 32768 KB
maximum_object_size_in_memory 8192 KB
ipcache_size 8192
fqdncache_size 8192

No se han realizado pruebas para evaluar el efecto de los anteriores cambios, pero si tenemos memoria RAM suficiente, no hay  problema alguno. Seguimos configurando.


# ---------- Cache Refresh Patterns ----------

icp_port 0

refresh_pattern ^ftp:       1440    20% 10080
refresh_pattern ^gopher:    1440    0%  1440
refresh_pattern .       0   20% 4320
refresh_pattern         \.gif$          10080   100%  43200
refresh_pattern         \.jpg$          10080  100%  43200
refresh_pattern .               960     90%     43200   reload-into-ims

Conviene cambiar los siguientes parámetros (poner las cadenas apropiadas para vuestro caso):


# ---------- Administrative Data ----------
ftp-user
anonymous@NIRE-ESKOLA.NET
cache_mgr sare-admin@NIRE-ESKOLA.NET

Si nuestra instalación tiene SQUID3 como en el caso de Ubuntu 12.04 LTS, los directorios han cambiado de nombre, por lo que realizaremos unos enlaces apuntando a los nuevos.

    ln -s /usr/share/squid3 /usr/share/squid
    ln -s /etc/squid3 /etc/squid
    ln -s /var/log/squid3 /var/log/squid

Vamos a poner los mensajes de error en Euskera. Para ello, vamos a copiar los mensajes personalizados para nuestra aplicación, y configurar squid para que los utilize. Primero copiamos los directorios /var/www/lhiak/squid-basque/var/www/lhiak/squid-spanish al lugar correspondiente. A los preexistentes de castellano les hacemos una copia de seguridad.

    mv -p R /usr/share/squid/errors/Spanish /usr/share/squid/errors/Spanish-orig
    cp -p R /var/www/lhiak/squid-basque /usr/share/squid/errors/Basque
    cp -p R /var/www/lhiak/squid-spanish /usr/share/squid/errors/Spanish

Ahora, elegimos Euskera como idioma para los mensajes de error. La siguiente línea debe quedar como sigue en el fichero /etc/squid/squid.conf.


error_directory /usr/share/squid/errors/Basque

Indicamos el sistema de registro. Lo que se registra, y en qué medida.


# ---------- LOG System ----------

cache_log /var/log/squid/cache.log
access_log /var/log/squid/access.log squid
useragent_log /var/log/squid/useragent.log
referer_log /var/log/squid/referer.log
debug_options ALL,1

En la compilación de la distribución Ubuntu 12.04 LTS, no se admiten los parámetros useragent_log y referer_log.

Le diremos en qué puerto ha de escuchar. Le indicaremos también la dirección del interface, por si tenemos más de uno y no deseamos que acepte conexiones en otro.


# ---------- SQUID Listening Address:Ports ----------
http_port 172.16.0.4:3128

http_port 172.16.1.4:3128
http_port 172.16.2.4:3128
http_port 127.0.0.1:3128

ACLs

Los acl (Access Control Lists) se utilizan para controlar quién puede hacer qué cosa, y quién no. Utilizaremos este sistema para controlar el acceso a Internet. Squid evalúa los acl en el orden en que están definidos.

Vamos a indicarle los puertos que son seguros y otras cosas.


# ---------- Secure Ports and ... ----------

acl SSL_ports port 443      # https
acl SSL_ports port 563      # snews
acl SSL_ports port 873      # rsync

acl Safe_ports port 80      # http

acl Safe_ports port 81      # http mail
acl Safe_ports port 21      # ftp
acl Safe_ports port 443     # https
acl Safe_ports port 70      # gopher
acl Safe_ports port 210     # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280     # http-mgmt
acl Safe_ports port 488     # gss-http
acl Safe_ports port 591     # filemaker
acl Safe_ports port 777     # multiling http
acl Safe_ports port 631     # cups
acl Safe_ports port 873     # rsync
acl Safe_ports port 901     # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
acl manager proto cache_object
acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8

En la compilación de la distribución Ubuntu 12.04 LTS, las tres últimas líneas han de quedar de la siguiente manera:

acl all src all
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8

Ahora damos los permisos pertinentes a las listas de acceso (ACL) definidas.


# ---------- Standard Access Permissions ----------

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost

Ahora damos permiso de acceso al propio proxy, para acceder a las imágenes de las páginas de error y del antivirus.


# ---------- Allow Proxy Addresses ----------
acl ProxyAddresses dst 172.16.0.4
acl ProxyAddresses dst 172.16.1.4
acl ProxyAddresses dst 172.16.2.4

http_access allow ProxyAddresses

Tenemos que indicarle a squid las páginas que no debe cachear. Típicamente serán los cgi-s, las páginas de noticias y la del tiempo. También podemos no cachear MP3, AVi, etc. Esto queda a gusto del administrador. Pondremos lo siguiente en el fichero de configuración de squid:


# ---------- No Caching Addresses ----------

acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
include /etc/squid/iak.noca.conf

La lista de direcciones a no cachear la ponemos en el fichero /etc/squid/iak.noca.conf. Este puede ser su contenido:

# ---------- No Caching Addresses ----------
acl NoCache1 dst 127.0.0.1
acl NoCache2 dstdomain .weather.com
acl NoCache2 dstdomain .berria.info
acl NoCache2 dstdomain .gara.net
acl NoCache2 dstdomain .elpais.es
acl NoCache2 dstdomain .elcorreodigital.com
 
no_cache deny NoCache1
no_cache deny NoCache2

Control de acceso

Todos conocemos los problemas que en los navegadores web (léase MS IE) ocasionan los suplementos que muchas veces se instalan sin saber. Además, a veces nos interesa que los alumnos trabajen con ordenadores, pero que no accedan a Internet. Teniendo esto en cuenta, pondremos seis acl-s en nuestro sistema de control de acceso.
     1- Las subredes de profesores y dirección. Estas redes no serĂ¡n filtradas de ninguna manera.
     2- Las páginas web institucionales, actualizaciones y activaciones de windows, java, etc. Podremos dirigirnos a esos lugares con cualquier navegador en cualquier momento.
     3- Denegaremos el acceso a sitios web que consideremos que son inapropiados o que consuman mucho ancho de banda innecesario a la escuela.
     4- Denegaremos el acceso a los navegadores que consideremos peligrosos o con vulnerabilidades en un momento dado.
     5- Permitiremos el acceso permanente a ciertos rangos de direcciones IP. Por ejemplo, aulas de cursos de Hobetuz, salas de reuniones de empresas, etc.
     6- Permitiremos o denegaremos el acceso a las distintas aulas, de forma controlada. 

He aquí un diagrama:

Tener en cuenta que las listas son evaluadas al recibir cada petición. Si las listas IP las ponemos con dst se deben evaluar por medio de DNS y por lo tanto si las ponemos de esa forma tardara mucho más tiempo para la resolución de acceso. En cambio, si las ponemos con su IP, serán evaluadas más rápidamente. En cualquier caso lo pondremos como ejemplo de esta manera. En cambio la próxima vez lo haremos de forma distinta. Veamos ahora los acl que utilizaremos. Tener en cuenta que en la misma lista hay comentarios y por lo tanto no explicamos aquí todo en profundidad. 

En la configuración por defecto, squid solamente permite conexiones desde localhost. Para permitir el acceso a Internet desde otras redes, hemos de decírselo explícitamente. En el fichero de configuración de squid le diremos que coja la lista de direcciones siempre permitidas de un fichero. Estas redes pueden ser las de profesores, dirección, etc.

# ---------- Not Filtered Source Networks ----------
include /etc/squid/iak.nfnets.conf

El contenido del fichero /etc/squid/iak.nfnets.conf será algo así como:


# ---------- Not Filtered Source Networks ----------
# Irakasleak
acl NfNets src 172.16.0.0/24

# Zuzendaritza
acl NfNets src 172.16.0.0/24

# Gonbidatuak
acl NfNets src 172.16.0.0/24

 
http_access allow NfNets

Ahora vamos con las direcciones siempre permitidas con cualquier navegador. Pueden ser páginas institucionales que nos interesa permitir siempre, o las del Gobierno Vasco, que requieren Internet Explorer, o ... Se lo indicamos de esta manera:


# All-Time Allowed Domains

include /etc/squid/iak.okdoms.conf

El contenido del fichero /etc/squid/iak.okdoms.conf puede ser el siguiente:


# ---------- All-Time Allowed Domains ----------
acl AlWaysGO dst 212.55.8.132
acl AlWaysGO2 dstdomain .hezkuntza.net
# Eskolako helbide batzuk
acl BetiPasa dst 82.194.66.176

acl AlWaysGO dst 10.22.3.8
acl AlWaysGO dst 172.31.249.2
acl AlWaysGO dst 172.31.249.3
acl AlWaysGO dst 172.31.249.1
# www.euskadi.net : Euskadi.Net, hezkuntza, Zenbait hiztegi (morris, 3000, Elhuyar...)
acl AlWaysGO dst 194.30.48.1
acl AlWaysGO dst 212.55.29.1
acl AlWaysGO dst 194.30.48.2
acl AlWaysGO dst 212.55.29.2
# parlamento.euskadi.net : Eusko legebiltzarreko administrazioko hiztegia
acl AlWaysGO dst 212.55.31.252
# www.bizkaia.net : Bizkaierazko hiztegia eta diputazioaren web orri nagusia
acl AlWaysGO dst 80.245.0.26
# www.gipuzkoa.net : Gipuzkoako diputazioaren web orri nagusia
acl AlWaysGO dst 82.116.160.2
# www.araba.net, www.alava.net : Arabako diputazioaren web orri nagusia
acl AlWaysGO dst 194.30.32.126
acl AlWaysGO dst 206.251.184.30
# www.hiztegia.net : Zerrenda orokorra
acl AlWaysGO dst 82.194.66.80
acl AlWaysGO2 dstdomain .euskaltzaindia.net
acl AlWaysGO2 dstdomain .hiru.com
acl AlWaysGO2 dstdomain .hizkuntza.tk
acl AlWaysGO2 dstdomain .ehu.es
acl AlWaysGO2 dstdomain .infor.es
acl AlWaysGO2 dstdomain .euskadi.net
acl AlWaysGO2 dstdomain .gestionet.info
acl AlWaysGO2 dstdomain .kaspersky.com
acl AlWaysGO2 dstdomain .microsoft.com
 
http_access allow AlWaysGO
http_access allow AlWaysGO2

Le diremos también que ahora no permita jamás el acceso a una serie de dominios que tengamos vetados. Sitios de descargas, pornos, etc. Le diremos que cargue el fichero /etc/squid/iak.nodoms.conf.


# ---------- Internet Access Control ----------

# All-Time Banned Addresses
acl debekatu url_regex "/etc/squid/iak.nodoms.conf"
http_access deny debekatu

El contenido del fichero /etc/squid/iak.nodoms.conf puede ser el siguiente:


megaupload.com

rapidshare.com
gigasize.com
bluehost.to
x7.to
uploaded.to
filefactory.com
freakshare.net
megashares.com
meinupload.com
megarotic.com
macizorras.com
badongo.com
depositfiles.com
easy-share.com
filehostme.com
filer.net
netload.com
minijuegos.com

Ahora toca el turno de los navegadores. Indicaremos a squid que los filtre:

# ---------- Browser Definitions and Access Control ----------
include /etc/squid/iak.brow.conf

El contenido del fichero /etc/squid/iak.brow.conf puede ser algo parecido a:

acl OKBrowser browser Firefox
acl OKBrowser browser Opera
acl OKBrowser browser Safari
acl OKBrowser browser Konqueror
acl OKBrowser browser Galeon
acl OKBrowser browser Camino
acl OKBrowser browser Gecko
acl OKBrowser browser Chrome
acl OKBrowser browser Java
 
http_acces deny !OKBrowser

Si no queremos filtrar ningún navegador, dejamos el fichero vacío, pero ha de existir.

Ahora definimos las aulas o rangos de direcciones IP a los que siempre permitimos acceder a Internet. Ponemos lo siquiente en el fichero de configuración de squid:

# ---------- All-Time Allowed Source IP Ranges ----------
include /etc/squid/iak.wipr.conf

El contenido del fichero /etc/squid/iak.wipr.conf puede ser algo como:

# ---------- All-Time Allowed Source IP Ranges ----------
# --- Gela Bakarrak ---
acl whiteiprange-01 src 10.22.1.244-10.22.1.239
http_access allow whiteiprange-01

# --- VIP Gelak ---

acl whiteiprange-02 src 10.22.3.16-10.22.3.31
http_access allow whiteiprange-02

Ahora ponemos el control de aulas.

# ---------- Controlled Classrooms ----------
include /etc/squid/iak.rooms.conf

El fichero /etc/squid/iak.rooms.conf tendrá por ejemplo el siquiente contenido:


# Student Classrooms
# --- ROOM01 ---
acl room-01 src 172.16.1.16-172.16.1.31
http_access deny room-01
# --- ROOM02 ---
acl room-01 src 172.16.1.32-172.16.1.47
http_access deny room-01
# --- ROOM03 ---
acl room-01 src 172.16.1.48-172.16.1.63
http_access deny room-01
# --- New Room ---
acl room-01 src 172.16.1.64-172.16.1.79
http_access deny room-01
# --- Clean Room ---
acl room-01 src 172.16.1.80-172.16.1.95
http_access deny room-01
# --- Blue Room ---
acl room-01 src 172.16.1.96-172.16.1.111
http_access deny room-01
# --- ROOM110 ---
acl room-01 src 172.16.1.112-172.16.1.127
http_access deny room-01
# --- ROOM200 ---
acl room-01 src 172.16.1.17-128.16.1.143
http_access deny room-01

Otros parámetros que necesitamos:


# ---------- Other Parameters ----------

http_reply_access allow all
forwarded_for off
icp_access allow all
half_closed_clients off

Probaremos ahora si hemos cometido algún error. Para ello disponemos de una orden para examinar la configuración del archivo.:
    squid -k parse

En la distribución Ubuntu 12.04 LTS, en cambio:

    squid3 -k parse

Si todo ha ido bien y no nos da errores, le indicamos al proxy que cargue la nueva configuración:


    /etc/init.d/squid reload

En la distribución Ubuntu 12.04 LTS, en cambio:

    service squid3 reload

Antes de probar el proxy vamos a permitir el acceso al mismo desde la red del centro. Esto lo configuramos en el cortafuegos de la siguiente manera:

Source

Destination

Service

Action

Irakasleak

Ikasleak

Zuzendaritza

Zerbitzariak

antivirus perimetral

squid (3128)

Accept

Para probar el proxy, cambia las preferencias del navegador web y dile al ordenador que tiene el proxy en el puerto 3128 de la IP del antivirus perimetral. Lo puedes ver en la siguiente sección: "Configurando los navegadores". Buena suerte!

Probemos ahora su funcionamiento. Pongámosle por ejemplo a un ordenador la dirección IP 172.16.1.18/24 (gela-01 segunda dirección del aula). Ejecutemos la siguiente orden y comprobemos si entra en Internet. Haced la prueba con un navegador que no sea MSIE.


    sed -i s/http_access\ deny\ gela-01/http_access\ allow\ gela-01/ /etc/squid/iak.room.conf
    squid -k reconfigure

Todo va bien? Adelante!

Cuando aparecen problemas

Cuando trabajamos con ACLs, muchas veces aparecen problemas de los cuales el registro no nos da mucas pistas. Para tener información más detallada, ponemos en /etc/squid/squid.conf los siguientes parámetros. Reiniciamos squid y... Suerte!


debug_options ALL,1 33,2

debug_options ALL,1 33,2 28,9

Script de Control de Acceso

No manipularemos directamente el archivo de configuración squid.conf, sino que lo haremos con un script ejecutado por el servidor web. Este script crea un archivo de registro con todas las operaciones realizadas. Quién lo hizo, desde qué ordenador, día y hora, navegador... Crearemos este archivo en el directorio /var/log/iak y por lo tanto el proceso que ejecuta apache deberá tener permiso de escritura en ese directorio. Para hacer esto:


    mkdir /var/log/iak
    chown www-data:root /var/log/iak

El script estará en /var/www/iak/iakmanager.php. Este es el código del script de control de acceso.


<?php

//
// LHPAIAK 5.2.0
//

header ("Location: {$_SERVER['HTTP_REFERER']}");

$PROG = "sudo /bin/sed";
$CONF_FILE = "/etc/squid/iak.rooms.conf";

$COMMAND = "sudo /etc/init.d/squid reload";
$COMMAND3 = "sudo /etc/init.d/squid3 reload";
$LOGFILE = "/var/log/iak/iak.log";


$ADDR = $_SERVER ['REMOTE_ADDR'];
$nowdate = date('Y.m.d-H:i');


if (isset($_POST['room']) && isset($_POST['action'])) {

    $room = $_POST['room'];
    $action = $_POST['action'];
    $host = gethostbyaddr($ADDR);
    $user = getenv('REMOTE_USER');

    exec("sudo /bin/echo  $nowdate - $user - $host - $ADDR - $room - $action >> $LOGFILE");

    if ($action == "close") {
        exec("$PROG -i s/http_access\ allow\ $room/http_access\ deny\ $room/ $CONF_FILE");
    }
    else {
        exec("$PROG -i s/http_access\ deny\ $room/http_access\ allow\ $room/ $CONF_FILE");
    }

    if (file_exists('/etc/init.d/squid'))
       exec("$COMMAND");
    else
       exec("$COMMAND3");
}
else {

    exec("sudo /bin/echo  $nowdate - TO_DEFAULT >> $LOGFILE");

# Gela 1 (no closed automagically)
#    exec("$PROG -i s/http_access\ allow\ room-01/http_access\ deny\ room-01/ $CONF_FILE");

# 2. classroom (automagically closed)
    exec("$PROG -i s/http_access\ allow\ room-02/http_access\ deny\ room-02/ $CONF_FILE");

# 3. classroom (automagically closed)
    exec("$PROG -i s/http_access\ allow\ room-03/http_access\ deny\ room-03/ $CONF_FILE");

# No closed room
#    exec("$PROG -i s/http_access\ allow\ room-04/http_access\ deny\ room-04/ $CONF_FILE");

# No closed room
#    exec("$PROG -i s/http_access\ allow\ room-05/http_access\ deny\ room-05/ $CONF_FILE");

# Closed room
    exec("$PROG -i s/http_access\ allow\ room-06/http_access\ deny\ room-06/ $CONF_FILE");

#
    exec("$PROG -i s/http_access\ allow\ room-07/http_access\ deny\ room-07/ $CONF_FILE");

#
    exec("$PROG -i s/http_access\ allow\ room-08/http_access\ deny\ room-08/ $CONF_FILE");

#
    exec("$PROG -i s/http_access\ allow\ room-09/http_access\ deny\ room-09/ $CONF_FILE");

#
    exec("$PROG -i s/http_access\ allow\ room-10/http_access\ deny\ room-10/ $CONF_FILE");

#
    exec("$PROG -i s/http_access\ allow\ room-11/http_access\ deny\ room-11/ $CONF_FILE");

#
    exec("$PROG -i s/http_access\ allow\ room-12/http_access\ deny\ room-12/ $CONF_FILE");

#
    exec("$PROG -i s/http_access\ allow\ room-13/http_access\ deny\ room-13/ $CONF_FILE");

#
    exec("$PROG -i s/http_access\ allow\ room-14/http_access\ deny\ room-14/ $CONF_FILE");

#
    exec("$PROG -i s/http_access\ allow\ room-15/http_access\ deny\ room-15/ $CONF_FILE");

#
    exec("$PROG -i s/http_access\ allow\ room-16/http_access\ deny\ room-16/ $CONF_FILE");


    if (file_exists('/etc/init.d/squid'))
       exec("$COMMAND");
    else
       exec("$COMMAND3");
}
?>

Buen provecho!

Página Web

Ahora hay que hacer una página web. Pondremos esta página en el directorio iak del servidor web. En Debian, /var/www/iak/. Vamos a crear el directorio.


    
mkdir /var/www/iak

El nombre de la página será iak.php Aquí hay un esqueleto o ejemplo con 8 aulas:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<!--
//
// LHIAK 5.2.0
//
-->
<head>
  <title>nire-eskola.net :: Internet Atzipen Kontrola</title>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<style type="text/css">
label {
display: block;
min-height: 100%; /* NO IE */
height: auto !important; /* IE8 ... */
height: 100%; /* IE6 */
}
</style>
</head>
<body leftmargin="0" topmargin="0" style="background-color: #e0f0fb;">

<?php
$room = 0;

$iakroomsconffile = file("/etc/squid/iak.rooms.conf");
foreach ($iakroomsconffile as $line => $text){
    $pos1 = strpos($text, 'http_access');
    $pos2 = strpos($text, 'room');
    if ($pos1 === 0 and $pos2 > 0){
        $access = split(" ", $text);
        if (trim($access[1]) === "allow"){
            $state[$room++] = "1";
        }
        else{
            $state[$room++] = "0";
        }
    }
    else {
    }
}
?>

<div style="text-align: center;"><img alt="" src="goikoikurra-web.png"><br>
</div>
<div style="text-align: center;"><big style="text-decoration: underline; font-weight: bold;"><big><big>
Internet Atzipen Kontrola</big></big></big><br>
</div>
<br>
<form style="margin-top: 22px; height: 222px;" method="post" action="iakmanager.php" name="aukerak">
  <table style="text-align: left; margin-left: auto; margin-right: auto; width: 533px; height: 198px; background-color: rgb(255, 255, 255);" align="center" border="0">
    <tbody>
      <tr>
        <td style="color: rgb(0, 0, 0); background-color: <?php if (isset($state[0]) && ($state[0] == "1")) { echo 'rgb(102, 255, 102)';} else {echo 'rgb(255, 102, 102)';} ?>; text-align: left;">
        <label for="room-01>&nbsp;&nbsp;<input name="room" value="room-01" id="room-01" type="radio">&nbsp;Gela-01</label>
        </td>
        <td style="color: rgb(0, 0, 0); background-color: <?php if (
isset($state[1]) && ($state[1] == "1")) { echo 'rgb(102, 255, 102)';} else {echo 'rgb(255, 102, 102)';} ?>; text-align: left;">
       
<label for="room-02>&nbsp;&nbsp;<input name="room" value="room-02" id="room-02" type="radio">&nbsp;Gela-02</label>
        </td>
        <td style="color: rgb(0, 0, 0); background-color: <?php if (
isset($state[2]) && ($state[2] == "1")) { echo 'rgb(102, 255, 102)';} else {echo 'rgb(255, 102, 102)';} ?>; text-align: left;">
       
<label for="room-03>&nbsp;&nbsp;<input name="room" value="room-03" id="room-03" type="radio">&nbsp;Gela-03</label>
        </td>
        <td style="color: rgb(0, 0, 0); background-color: <?php if (
isset($state[3]) && ($state[3] == "1")) { echo 'rgb(102, 255, 102)';} else {echo 'rgb(255, 102, 102)';} ?>; text-align: left;">
       
<label for="room-04>&nbsp;&nbsp;<input name="room" value="room-04" id="room-04" type="radio">&nbsp;Gela-04</label>
        </td>
      </tr>
      <tr>
        <td style="color: rgb(0, 0, 0); background-color: <?php if (
isset($state[4]) && ($state[4] == "1")) { echo 'rgb(102, 255, 102)';} else {echo 'rgb(255, 102, 102)';} ?>; text-align: left;">
       
<label for="room-05>&nbsp;&nbsp;<input name="room" value="room-05" id="room-05" type="radio">&nbsp;Gela-05</label>
        </td>
        <td style="color: rgb(0, 0, 0); background-color: <?php if (
isset($state[5]) && ($state[5] == "1")) { echo 'rgb(102, 255, 102)';} else {echo 'rgb(255, 102, 102)';} ?>; text-align: left;">
       
<label for="room-06>&nbsp;&nbsp;<input name="room" value="room-06" id="room-06" type="radio">&nbsp;Gela-06</label>
        </td>
        <td style="color: rgb(0, 0, 0); background-color: <?php if (
isset($state[6]) && ($state[6] == "1")) { echo 'rgb(102, 255, 102)';} else {echo 'rgb(255, 102, 102)';} ?>; text-align: left;">
       
<label for="room-07>&nbsp;&nbsp;<input name="room" value="room-07" id="room-07" type="radio">&nbsp;Gela-07<b/labelr>
        </td>
        <td style="color: rgb(0, 0, 0); background-color: <?php if (
isset($state[7]) && ($state[7] == "1")) { echo 'rgb(102, 255, 102)';} else {echo 'rgb(255, 102, 102)';} ?>; text-align: left;">
       
<label for="room-08>&nbsp;&nbsp;<input name="room" value="room-08" id="room-08" type="radio">&nbsp;Gela-08</label>
        </td>
      </tr>
      <tr>
        <td style="color: rgb(255, 255, 255); background-color: rgb(255, 102, 102);">
&nbsp;
        </td>
        <td colspan="2" style="color: rgb(255, 255, 255); background-color: rgb(255, 102, 102);" align="center">
        <input name="action" value="open" type="radio">Ireki
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <input name="action" value="close" type="radio">Itxi
        </td>
        <td style="color: rgb(255, 255, 255); background-color: rgb(255, 102, 102);">
        </td>
      </tr>
      <tr>
        <td colspan="4" rowspan="1" style="color: rgb(255, 255, 255); background-color: rgb(255, 102, 102); text-align: center;">
        <input value=" Bidali " type="submit"></td>
      </tr>
    </tbody>
  </table>
</form>
<div style="text-align: center;"><img alt="" src="behekoikurra-web.png"><br>
</div>
</body>
</html>

Servidor Web como root

Normalmente, será el servidor web y no el root, quien ejecutará el siguiente script desde la línea de comandos. Pero por otro lado, se necesitan permisos de root para ejecutar los comandos de squid y otros programas. Para solucionar este problema, daremos autorizaciones root al usuario que ejecuta el servidor (www-data en Debian y derivados) para que ejecute estas órdenes. Esto se consigue con el comando sudo. El comando sudo se configura en el fichero /etc/sudoers y ficheros adicionales que se encuentren en el directorio /etc/sudoers.d/. Nosotros pondremos el fichero iak-sudoers en dicho directorio. De este modo nos evitamos tocar el siempre sensible /etc/sudoers. Este es el contenido de este fichero:


# User alias specification
User_Alias IAK = www-data

# Cmnd alias specification
Cmnd_Alias IAKCOMMANDS = /etc/init.d/squid reload, /etc/init.d/squid3 reload, /bin/sed

# User privilege specification
IAK ALL = (root) NOPASSWD: IAKCOMMANDS

Como se puede ver, no va a pedir contraseña. Listo!

Autentificación

Esta página sólo debe ser accesible desde las subredes de profesores, administración y red del centro. Además, sólo deben tener acceso a ella los profesores. Para autentificar a los profesores podemos utilizar tres métodos. El primero, contra un fichero. El segundo, contra el Directorio Activo de MS y el tercero contra un servidor OpenLDAP.

Contra un fichero

Para autentificar los profesores contra un fichero, debemos configurar Apache. En el directorio /etc/apache2/conf.d/ creamos el fichero iak.conf con el siguiente contenido:


ServerAdmin webadmin@nire-eskola.net

<Directory /var/www/iak/>
    Order deny,allow
    Deny from all
    AllowOverride AuthConfig Limit
    Allow from 127.0.0.1 172.16.0 172.16.2 172.16.3
    AuthType Basic
    AuthName "Internet Atzipen Kontrola. Pasahitza behar duzu sartu"
    AuthUserFile "/var/lib/apache2/iak.pass"
    Require valid-user
</Directory>

Ahora tenemos que crear los usuarios y contraseñas en el fichero /var/lib/apache2/iak.pass. Elegiremos 8 profesores y les autorizaremos. Nos pedirá la contraseña, y con la primera tenemos que establecer el parámetro –c para crear el fichero. Ejecutar las siguientes órdenes:


    htpasswd2 -c /var/lib/apache2/iak.pass irakasle1
    htpasswd2 /var/lib/apache2/iak.pass irakasle2
    htpasswd2 /var/lib/apache2/iak.pass irakasle3
    htpasswd2 /var/lib/apache2/iak.pass irakasle4
    htpasswd2 /var/lib/apache2/iak.pass irakasle5
    htpasswd2 /var/lib/apache2/iak.pass irakasle6
    htpasswd2 /var/lib/apache2/iak.pass irakasle7
    htpasswd2 /var/lib/apache2/iak.pass irakasle8

Si queremos eliminar el usuario, le daremos el parámetro –D al comando.

Ahora, para que lo pueda leer el proceso que ejecuta apache, tenemos que cambiar de dueño:


    chown www-data:root /var/lib/apache2/iak.pass

Finalmente, hay que rearrancar apache.


    /etc/init.d/apache2 restart

Contra el Directorio Activo de MS

Lo msimo podemos realizar utilizando Active Directory como base para la autentificación de los profesores. Tenemos que tener en cuenta que en dicho directorio podemos tener no solamente profesores.

Primero hemos de habilitar dos módulos de Apache. He aquí cómo:


    a2enmod ldap
    a2enmod authnz_ldap

He aquí el contenido del fichero /etc/apache2/conf.d/iak:


<Directory "/var/www/iak/">
    Options -Indexes
    AllowOverride AuthConfig Limit
    Order deny,allow
    Deny from all
    Allow from from 127.0.0.1 172.16.0 172.16.2 172.16.3

    AuthName " INTERNET ATZIPEN KONTROLA "
    AuthType Basic
    AuthBasicProvider ldap
    AuthzLDAPAuthoritative off

    AuthLDAPUrl "ldap://SERVER.nire-eskola.net:389/ou=irakasleak,dc=nire-eskola,dc=net?sAMAccountName?sub?(objectClass=*)"

    AuthLDAPBindDN "cn=IAKBind,cn=Users,dc=nire-eskola,dc=net"
    AuthLDAPBindPassword nire-pasahitz-izkutua

    Require valid-user
</Directory>

He aquí una pequeña explicación de los parámetros correspondientes al LDAP de AD:

Parámetro Explicación
AuthBasicProvider Quién provee la autentificación
AuthzLDAPAuthoritative Si el módulo LDAP tiene la última palabra respecto de la autorización
AuthLDAPUrl Lugar desde el que se obtiene la información de los profesores
ldap Protocolo a utilizar
SERVER Nombre DNS del servidor
nire-eskola.net Dominio DNS del servidor
389 Puerto TCP del protocolo LDAP
irakaslek Unidad organizativa "irakasleak"
nire-eskola.net Componentes de dominio del árbol LDAP
sAMAccountName Atributo LDAP que contiene el nombre del usuario en el esquema de AD
sub Profundidad de la búsqueda: Todos los niveles inferiores
objectClass=*  Filtro para el tipo de objeto: Todos
AuthLDAPBindDN Usuario que realiza la búsqueda en el directorio LDAP (Necesario en AD)
cn Nombre común (Common Name)
IAKBind Nombre del usuario
Users Por defecto, todos los usuarios de AD se encuentran en este contenedor
AuthLDAPBindPassword Password del usuario que realiza la búsqueda

Un detalle. Hay algún problema con el LDAP de Linux y AD. Para solventarlo, pondremos la siguiente línea en /etc/ldap/ldap.conf:

REFERRALS off

Ahora sólamente nos queda recargar la configuración de Apache:

    /etc/init.d/apache2 reload

NOTA: No os olvidéis de abrir el puerto 389 en el cortafuegos, para las conexiones desde el antivirus, al servidor que contiene las cuentas de usuario de los profesores.

Contra OpenLDAP

Al igual que el directorio LDAP de Active Directory, podemos usar el de OpenLDAP para la autentificación.

Primero hemos de habilitar los dos módulos de Apache que se requieren también para la autentificación contra AD.


    a2enmod ldap
    a2enmod authnz_ldap

He aquí el contenido del fichero /etc/apache2/conf.d/iak:


<Directory "/var/www/iak/">
    Options -Indexes
    AllowOverride AuthConfig Limit
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1 172.16.0 172.16.2 172.16.3

    AuthName " INTERNET ATZIPEN KONTROLA "
    AuthType Basic
    AuthUserFile /dev/null
    AuthBasicProvider ldap


    AuthLDAPUrl "ldap://SERVER.nire-eskola.net:389/ou=irakasleak,dc=nire-eskola,dc=net

    AuthLDAPBindDN "cn=IAKBind,dc=nire-eskola,dc=net"
    AuthLDAPBindPassword nire-pasahitz-izkutua

    Require valid-user
</Directory>

En el caso de Debian Squeeze, la siguiente línea ha de quedar comno sigue:

    Require ldap-valid-user

He aquí una pequeña explicación de los parámetros correspondientes al LDAP de OpenLDAP:

Parámetro Explicación
AuthBasicProvider Quién provee la autentificación
AuthzLDAPAuthoritative Si el módulo LDAP tiene la última palabra respecto de la autorización
AuthLDAPUrl Lugar desde el que se obtiene la información de los profesores
ldap Protocolo a utilizar
SERVER Nombre DNS del servidor
nire-eskola.net Dominio DNS del servidor
389 Puerto TCP del protocolo LDAP
irakaslek Unidad organizativa "irakasleak"
nire-eskola.net Componentes de dominio del árbol LDAP
AuthLDAPBindDN Usuario que realiza la búsqueda en el directorio LDAP (Necesario en AD)
cn Nombre común (Common Name)
IAKBind Nombre del usuario
AuthLDAPBindPassword Password del usuario que realiza la búsqueda

Ahora sólamente nos queda recargar la configuración de Apache:

    /etc/init.d/apache2 reload

NOTA: No os olvidéis de abrir el puerto 389 en el cortafuegos, para las conexiones desde el antivirus, al servidor que contiene las cuentas de usuario de los profesores.

Fichero de registro

El fichero de registro, como se ha mencionado anteriormente, es /var/log/iak/iak.log. Para que no crezca indefinidamente, vamios a rotarlo como todos los registros. Para ello, creamos un fichero /etc/logrotate.d/iak con el siguiente contenido:


/var/log/iak/iak.log {
    weekly
    missingok
    rotate 12
    compress
    delaycompress
    notifempty
    create 640 www-data www-data
    sharedscripts
}

Configuración automática

Al finalizar las clases de la mañana y de la tarde, pondremos la configuración por defecto en el control de acceso. Esto se pude hacer automáticamente con el cron. Le daremos una tarea al proceso cron. Tendrá que hacer esta tarea todos los días a las 15:30 y a las 23:30. Para realizar esta tarea ejecutará el fichero iakmanager.php con el parámetro default. Este comando cerrará todas las clases al ejecutarse. Para ello crearemos el fichero /etc/cron.d/iak con el siguiente contenido:


30 15,23 * * * www-data php5 /var/www/iak/iakmanager.php default

Seguidamente, reiniciamos el proceso cron.

    /etc/init.d/cron restart

Vamos a probar el funcionamiento. Apunta tu navegador a la siguiente dirección y pruébalo.


http://iak.nire-eskola.net/iak/iak.php

Sorte on!