next up previous contents
Siguiente: Módulo ControlNocat.pm Subir: Detalles Implementación Anterior: Calidad de servicio   Índice General


Políticas de acceso

Las nuevas directivas definidas en el archivo de configuración son las siguientes:
# Definicion de puertos permitidos para cada politica
#
#   Las marcas 1,2 y 3 para pertenecer a Owner,Member o Public
#   La marca 4 no te permite la entrada.
#   El resto a definir libremente.

MarkPolicy1 5
Policy1 80 443

MarkPolicy2 6
Policy2 22 21 80 443

MarkPolicy3 2
#Policy3 

MarkPolicy4 2
#Policy4

MarkPolicy5 2
#Policy5 

MarkPolicy6 2
#Policy6
Con esta definición vemos que hay dos políticas nuevas con las marcas 5 y 6 que permiten el acceso a los puertos definidos en Policy1 y Policy2. Para poder usar estas directivas se ha cambiado en la clase firewall las directivas que se exportan:
my @Perform_Export = qw(
    InternalDevice ExternalDevice LocalNetwork AuthServiceAddr DNSAddr
    GatewayAddr GatewayPort IncludePorts ExcludePorts AllowedWebHosts
    MembersOnly RouteOnly IgnoreMAC
    Policy1 Policy2 Policy3 Policy4 Policy5 Policy6
    MarkPolicy1 MarkPolicy2 MarkPolicy3 MarkPolicy4 MarkPolicy5 MarkPolicy6
    MaxBandWidthDown MaxBandWidthUp MinBandWidthDown MinBandWidthUp
);
Al iniciar el firewall se ha cambiado el script initialize.fw para que tenga en cuenta las nuevas marcas definidas, y se creen reglas que sólo permitan el acceso a los puertos definidos:

#!/bin/sh
##
#
# initialize.fw: setup the default firewall rules
#
.......
# Flush all user-defined chains
#
.......

if [ "$MembersOnly" ]; then
  classes="1 2"
else
  classes="1 2 3 5 6"
fi

# Handle tagged traffic.
#
for iface in $InternalDevice; do
    for net in $LocalNetwork; do
      for fwmark in $classes; do
        # Only forward tagged traffic per class
         $fwd -i $iface -s $net -m mark -mark $fwmark -j ACCEPT
#        $fwd -o $iface -d $net -m mark -mark $fwmark -j ACCEPT

        # Masquerade permitted connections.
        $nat -o $ExternalDevice -s $net -m mark -mark $fwmark -j MASQUERADE
      done

      # Allow web traffic to the specified hosts, and don't capture
      # connections intended for them.
      #
      if [ "$AuthServiceAddr" -o "$AllowedWebHosts" ]; then
        for host in $AuthServiceAddr $AllowedWebHosts; do
          for port in 80 443; do
            $nat      -s $net -d $host -p tcp -dport $port -j MASQUERADE
            $redirect -s $net -d $host -p tcp -dport $port -j RETURN
            $fwd -s $net -d $host -p tcp -dport $port -j ACCEPT
            $fwd -d $net -s $host -p tcp -sport $port -j ACCEPT
          done
        done
      fi

      # Accept forward and back traffic to/from DNSAddr
      if [ "$DNSAddr" ]; then
        for dns in $DNSAddr; do
          $fwd -o $iface -d $net -s $dns -j ACCEPT

          for prot in tcp udp; do
            $fwd -i $iface -s $net -d $dns -p $prot -dport 53 -j ACCEPT
            $nat -p $prot -s $net -d $dns -dport 53 -j MASQUERADE

            # Force unauthenticated DNS traffic through this server.
            # Of course, only the first rule of this type will match.
            # But it's easier to leave them all in ATM.
            #
            # Commented out for now, it's got a syntax issue I can't
            # quite fathom: "iptables: Invalid argument"
            #   -Rob
            #
            #$nat -i $InternalDevice -m mark -mark 4 -p $prot \
            # -dport 53 -j DNAT -to $dns:53
          done
        done
      fi
    done

    # Set packets from internal devices to fw mark 4, or 'denied', by default.
    $mangle -i $iface -j MARK -set-mark 4
done
......


#
#  Definimos las politicas correspondientes que esten definidas
#
if [ "$Policy1" ]; then
  for iface in $InternalDevice; do
    for port in $Policy1; do
      $ports -p tcp -i $iface -dport $port -m mark -mark $MarkPolicy1
          -j ACCEPT
      $ports -p udp -i $iface -dport $port -m mark -mark $MarkPolicy1
          -j ACCEPT
    done

    # Siempre se permite el acceso al gateway o no se podra hacer logout
    $ports -p tcp -i $iface -dport $GatewayPort -j ACCEPT
    $ports -p udp -i $iface -dport $GatewayPort -j ACCEPT

    # Se deshabilitan el resto de puertos
    $ports -p tcp -i $iface -m mark -mark $MarkPolicy1 -j DROP
    $ports -p udp -i $iface -m mark -mark $MarkPolicy1 -j DROP
  done
fi
if [ "$Policy2" ]; then
  for iface in $InternalDevice; do
    for port in $Policy2; do
      $ports -p tcp -i $iface -dport $port -m mark -mark $MarkPolicy2
          -j ACCEPT
      $ports -p udp -i $iface -dport $port -m mark -mark $MarkPolicy2
          -j ACCEPT
    done

    # Siempre se permite el acceso al gateway o no se podra hacer logout
    $ports -p tcp -i $iface -dport $GatewayPort -j ACCEPT
    $ports -p udp -i $iface -dport $GatewayPort -j ACCEPT

    # Se deshabilitan el resto de puertos
    $ports -p tcp -i $iface -m mark -mark $MarkPolicy2 -j DROP
    $ports -p udp -i $iface -m mark -mark $MarkPolicy2 -j DROP
  done
fi
if [ "$Policy3" ]; then
  for iface in $InternalDevice; do
    for port in $Policy3; do
      $ports -p tcp -i $iface -dport $port -m mark -mark $MarkPolicy3
          -j ACCEPT
      $ports -p udp -i $iface -dport $port -m mark -mark $MarkPolicy3
          -j ACCEPT
    done

    # Siempre se permite el acceso al gateway o no se podra hacer logout
    $ports -p tcp -i $iface -dport $GatewayPort -j ACCEPT
    $ports -p udp -i $iface -dport $GatewayPort -j ACCEPT

    # Se deshabilitan el resto de puertos
    $ports -p tcp -i $iface -m mark -mark $MarkPolicy3 -j DROP
    $ports -p udp -i $iface -m mark -mark $MarkPolicy3 -j DROP
  done
fi
if [ "$Policy4" ]; then
  for iface in $InternalDevice; do
    for port in $Policy4; do
      $ports -p tcp -i $iface -dport $port -m mark -mark $MarkPolicy4
          -j ACCEPT
      $ports -p udp -i $iface -dport $port -m mark -mark $MarkPolicy4
          -j ACCEPT
    done

    # Siempre se permite el acceso al gateway o no se podra hacer logout
    $ports -p tcp -i $iface -dport $GatewayPort -j ACCEPT
    $ports -p udp -i $iface -dport $GatewayPort -j ACCEPT

    # Se deshabilitan el resto de puertos
    $ports -p tcp -i $iface -m mark -mark $MarkPolicy4 -j DROP
    $ports -p udp -i $iface -m mark -mark $MarkPolicy4 -j DROP
  done
fi
if [ "$Policy5" ]; then
  for iface in $InternalDevice; do
    for port in $Policy5; do
      $ports -p tcp -i $iface -dport $port -m mark -mark $MarkPolicy5
          -j ACCEPT
      $ports -p udp -i $iface -dport $port -m mark -mark $MarkPolicy5
          -j ACCEPT
    done

    # Siempre se permite el acceso al gateway o no se podra hacer logout
    $ports -p tcp -i $iface -dport $GatewayPort -j ACCEPT
    $ports -p udp -i $iface -dport $GatewayPort -j ACCEPT

    # Se deshabilitan el resto de puertos
    $ports -p tcp -i $iface -m mark -mark $MarkPolicy5 -j DROP
    $ports -p udp -i $iface -m mark -mark $MarkPolicy5 -j DROP
  done
fi
if [ "$Policy6" ]; then
  for iface in $InternalDevice; do
    for port in $Policy6; do
      $ports -p tcp -i $iface -dport $port -m mark -mark $MarkPolicy6
          -j ACCEPT
      $ports -p udp -i $iface -dport $port -m mark -mark $MarkPolicy6
          -j ACCEPT
    done

    # Siempre se permite el acceso al gateway o no se podra hacer logout
    $ports -p tcp -i $iface -dport $GatewayPort -j ACCEPT
    $ports -p udp -i $iface -dport $GatewayPort -j ACCEPT

    # Se deshabilitan el resto de puertos
    $ports -p tcp -i $iface -m mark -mark $MarkPolicy6 -j DROP
    $ports -p udp -i $iface -m mark -mark $MarkPolicy6 -j DROP
  done
fi
.......
# Llamamos a inicioQoS para que inicie las clases raiz y por defecto
#[ -x inicioQoS ] && inicioQoS
inicioQoS
.....
#
# Fin
#
Con esto se han creado una serie de reglas en el cortafuegos para impedir el acceso a unos puertos predeterminados a paquetes que estén marcados con una marca. ¿Cómo le decimos al firewall qué marca poner a los paquetes de un cliente determinado? Recordemos el funcionamiento de NoCatAuth: la pasarela marca con 0x1, 0x2 y 0x3 a los paquetes de las clases Owner, Member y Public. En el método classify de la clase Gateway es donde clasifica a los usuarios. Si es uno de los usuarios contenidos en la directiva Owners de nocat.conf entonces pertenece a la clase OWNER. Si pertenece a un grupo de los que están en la directiva TrustedGroups entonces pertenecerá a la clase MEMBER (si en la directiva aparece la palabra Any cualquier miembro de un grupo estará en la clase MEMBER). El resto van a la clase PUBLIC. La pasarela recibe el grupo del servidor en el mensaje encriptado dentro del campo member. En ese campo el servidor ha enviado el campo network de la tabla network de la base de datos nocat. Nosotros vamos a aprovechar este campo para enviar la marca con la que queremos que se marquen los paquetes de un usuario. En la pasarela pondremos dentro de TrutedGroups la palabra Any. De esta manera cualquier usuario sería marcado con MEMBER. Pues bien, hemos cambiado classify para que en lugar de marcar estos paquetes con MEMBER llame al método política que asigna la marca correspondiente. A continuación se muestran los cambios en classify:

sub classify {
    my ( $self, $peer ) = @_;
    my $user = $peer->user;
    my $class;

    if ($user and grep( $user eq $_, $self->owners ))
    {
      $class = OWNER;
    }
    else
    {
        $self->log(9, "User (@{[ $peer->groups ]}) v. trusted (@{[ $self->groups ]})" );
        my %prospect = map { $_ => 1 } $self->groups;
        if ( grep $_, @prospect{ $peer->groups } )
        {

            #$class = MEMBER;
            #En clase guardamos la politica a aplicar al usuario
            $class = "@{[$peer->politica]}";
        }

        else
        {
            $class = PUBLIC;
        }
    }
    return $peer->class( $class );
}

El método politica incluido en la clase Peer es:
sub politica {
  my ($self, $groups) = @_;
  my $list = $self->{Groups} ||= [];
  my $politica = "@$list";
  $politica =~ s/Any//;
  chop($politica);
  return "$politica";
}
En el método permit de la clase gateway se llama al método classify y se guarda en el parámetro class la marca que se debe aplicar a ese usuario. Ya tenemos en el método permit de la clase gateway la marca con la que debemos marcar los paquetes. Lo único que hay que hacer es pasar esa marca al método permit de la clase firewall, y este se encarga de pasarsela al script access.fw. En el script access.fw se han realizado una serie de modificaciones para que los paquetes se marquen con esa marca:

#!/bin/sh

##
# VERY simple access control script for leeenux
##

# Note: your PATH is inherited from the gateway process
#

action=$1
mac=$2
ip=$3
class=$4

if [ -z "$action" -o -z "$mac" -o -z "$ip" -o -z "$class" ]; then
    echo Usage: $0 [permit\|deny] [MAC] [IP] [Class]
    echo Example: $0 permit 00:02:2d:aa:bb:cc 10.0.0.105 member
    exit 1
fi

if [ "$action" = "permit" ]; then
    cmd=-A
elif [ "$action" = "deny" ]; then
    cmd=-D
else
    echo "FATAL: Bad action: $action!"
    exit 1
fi

if [ "$class" = "Owner" ]; then
    mark=1
elif [ "$class" = "Member" ]; then
    mark=2
elif [ "$class" = "Public" ]; then
    mark=3

#
# Marcamos los paquetes con la marca correspondiente
#
elif [ "$class" = "$MarkPolicy1" ]; then
    mark=$MarkPolicy1
elif [ "$class" = "$MarkPolicy2" ]; then
    mark=$MarkPolicy2
elif [ "$class" = "$MarkPolicy3" ]; then
    mark=$MarkPolicy3
elif [ "$class" = "$MarkPolicy4" ]; then
    mark=$MarkPolicy4
elif [ "$class" = "$MarkPolicy5" ]; then
    mark=$MarkPolicy5
elif [ "$class" = "$MarkPolicy6" ]; then
    mark=$MarkPolicy6

else
    echo "FATAL: Bad class: $class!"
    exit 1
fi

if [ "$IgnoreMAC" ]; then
    match_mac=""
else
    match_mac="-m mac -mac-source $mac"
fi

# Mark outbound traffic from this node.
iptables -t mangle $cmd NoCat $match_mac -s $ip -j MARK -set-mark $mark

# Mark inbound traffic to this node.
iptables -t filter $cmd NoCat_Inbound -d $ip -j ACCEPT

#
# Fin
#


next up previous contents
Siguiente: Módulo ControlNocat.pm Subir: Detalles Implementación Anterior: Calidad de servicio   Índice General
Jesús Martín 2003-09-16
e-REdING. Biblioteca de la Escuela Superior de Ingenieros de Sevilla.


SISTEMA DE CONTROL, TARIFICACIÓN Y ADMINISTRACIÓN DEL ACCESO A INTERNET DESDE REDES HETEROGÉNEAS

: Martín Ruiz, Jesús
: Ingeniería Telecomunicación
Contenido del proyecto: