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
#
Siguiente: Módulo ControlNocat.pm
Subir: Detalles Implementación
Anterior: Calidad de servicio
  Índice General
Jesús Martín
2003-09-16