Product SiteDocumentation Site

4.18. Rendere sicuro l'accesso alla rete

FIXME. Servono più contenuti (specifici per Debian)

4.18.1. Configurare le caratteristiche di rete del kernel

Many features of the kernel can be modified while running by echoing something into the /proc file system or by using sysctl. By entering /sbin/sysctl -A you can see what you can configure and what the options are, and it can be modified running
/sbin/sysctl -w variable=value
(see sysctl(8)). Only in rare cases do you need to edit something here, but you can increase security that way as well. For example:
net/ipv4/icmp_echo_ignore_broadcasts = 1
Questo è un emulatore di Windows perché funziona come Windows in broadcast ping, se questa opzione viene impostata ad 1. In pratica, le richieste ICMP_ECHO spedite all'indirizzo in broadcast vengono ignorate. Altrimenti, non succede nulla.
Se volete evitare che il sistema risponda alle richieste echo ICMP, basta attivare questa opzione di configurazione:
net/ipv4/icmp_echo_ignore_all = 1
Per loggare dei pacchetti destinati ad indirizzi inesistenti (errore dovuto ad instradamenti sbagliati) sulla vostra rete, utilizzate:
/proc/sys/net/ipv4/conf/all/log_martians = 1
For more information on what things can be done with /proc/sys/net/ipv4/* read /usr/src/linux/Documentation/filesystems/proc.txt. All the options are described thoroughly under /usr/src/linux/Documentation/networking/ip-sysctl.txt[31].

4.18.2. Configurare i Syncookies

Questa opzione è un'arma a doppio taglio. Da un lato, protegge il sistema contro il syn packet flooding, dall'altro viola degli standard definiti (le RFC).
net/ipv4/tcp_syncookies = 1
If you want to change this option each time the kernel is working you need to change it in /etc/network/options by setting syncookies=yes. This will take effect when ever /etc/init.d/networking is run (which is typically done at boot time) while the following will have a one-time effect until the reboot:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
Questa opzione è disponibile solamente se il kernel è stato compilato con l'opzione CONFIG_SYNCOOKIES. Tutti i kernel Debian vengono compilati con questa opzione all'interno del kernel, potete verificarlo eseguendo:
$ sysctl -A |grep syncookies
net/ipv4/tcp_syncookies = 1
Per maggiori informazioni sui syncookies TCP leggete http://cr.yp.to/syncookies.html.

4.18.3. Rendere sicura la rete al momento del boot

Quando impostate le opzioni del kernel relative al networking, dovete configurarle in maniera tale che siano caricate ogni volta che il sistema viene riavviato. L'esempio seguente abilita molte delle precedenti opzioni che avete visto, insieme ad altre utili opzioni.
There are actually two ways to configure your network at boot time. You can configure /etc/sysctl.conf (see: sysctl.conf(5)) or introduce a script that is called when the interface is enabled. The first option will be applied to all interfaces, whileas the second option allows you to configure this on a per-interface basis.
Sotto viene mostrato un esempio di configurazione di /etc/sysctl.conf che rende sicure alcune opzioni di rete a livello di kernel. Guardate la parte commentata, /etc/network/options potrebbe ignorare alcuni valori, se in contrasto con quelli in questo file quando viene eseguito /etc/init.d/networking (che viene dopo procps nella sequenza di boot).
#
# /etc/sysctl.conf - Configuration file for setting system variables
# See sysctl.conf (5) for information. Also see the files under
# Documentation/sysctl/, Documentation/filesystems/proc.txt, and
# Documentation/networking/ip-sysctl.txt in the kernel sources 
# (/usr/src/kernel-$version if you have a kernel-package installed)
# for more information of the values that can be defined here.

#
# Be warned that /etc/init.d/procps is executed to set the following
# variables.  However, after that, /etc/init.d/networking sets some
# network options with builtin values.  These values may be overridden
# using /etc/network/options.
#
#kernel.domainname = example.com

# Additional settings - adapted from the script contributed
# by Dariusz Puchala (see below)
# Ignore ICMP broadcasts
net/ipv4/icmp_echo_ignore_broadcasts = 1
#
# Ignore bogus ICMP errors
net/ipv4/icmp_ignore_bogus_error_responses = 1
# 
# Do not accept ICMP redirects (prevent MITM attacks)
net/ipv4/conf/all/accept_redirects = 0
# _or_
# Accept ICMP redirects only for gateways listed in our default
# gateway list (enabled by default)
# net/ipv4/conf/all/secure_redirects = 1
#
# Do not send ICMP redirects (we are not a router)
net/ipv4/conf/all/send_redirects = 0
#
# Do not forward IP packets (we are not a router)
# Note: Make sure that /etc/network/options has 'ip_forward=no'
net/ipv4/conf/all/forwarding = 0
#
# Enable TCP Syn Cookies
# Note: Make sure that /etc/network/options has 'syncookies=yes'
net/ipv4/tcp_syncookies = 1
#
# Log Martian Packets
net/ipv4/conf/all/log_martians = 1
#
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
# Note: Make sure that /etc/network/options has 'spoofprotect=yes'
net/ipv4/conf/all/rp_filter = 1
#
# Do not accept IP source route packets (we are not a router)
net/ipv4/conf/all/accept_source_route = 0
Per usare lo script dovete prima di tutto crearlo, per esempio, in /etc/network/interface-secure (il nome è solo un esempio) e chiamarlo da /etc/network/interfaces come mostrato qui:
auto eth0
iface eth0 inet static
        address xxx.xxx.xxx.xxx
        netmask 255.255.255.xxx
        broadcast xxx.xxx.xxx.xxx
        gateway xxx.xxx.xxx.xxx
        pre-up /etc/network/interface-secure
In questo esempio, prima di abilitare l'interfaccia eth0, lo script verrà chiamato per rendere sicure tutte le interfacce di rete come mostrato sotto.
#!/bin/sh -e
# Script-name: /etc/network/interface-secure
#
# Modifica alcuni comportamenti predefiniti per proteggere il 
# sistema da alcuni attacchi spoofing contro il TCP/IP e da altri 
# tipi di attacchi rivolti a tutte le interfacce.
#
# Contributed by Dariusz Puchalak.
#
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 
                                           # Broadcast echo protection enabled.
echo 0 > /proc/sys/net/ipv4/conf/all/forwarding
                                           # IP forwarding disabled.
echo 1 > /proc/sys/net/ipv4/tcp_syncookies # TCP syn cookies protection enabled.
echo 1 >/proc/sys/net/ipv4/conf/all/log_martians # Log strange packets.
# (this includes spoofed packets, source routed packets, redirect packets)
# but be careful with this on heavy loaded web servers.
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses 
                                           # Bad error message protection enabled.

# IP spoofing protection.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

# Disable ICMP redirect acceptance.
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

# Disable source routed packets.
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

exit 0
È opportuno notare che si possono adottare script specifici per ogni interfaccia. Questi script abilitano le opzioni di rete relative alle diverse interfacce (qualora ne fossero presenti più di una). È sufficiente modificare il comando di pre-up come indicato di seguito:
pre-up /etc/network/interface-secure $IFACE
Questo comando lancia lo script che applicherà i cambiamenti solamente all'interfaccia di rete specificata e non a tutte le interfacce eventualmente disponibili. Notate che alcune opzioni di rete possono essere applicate solo globalmente. Di seguito un modello di script:
#!/bin/sh -e
# Script-name: /etc/network/interface-secure
#
# Modifica alcuni comportamenti predefiniti per proteggere il 
# sistema da alcuni attacchi spoofing contro il TCP/IP e da altri 
# tipi di attacchi rivolti a tutte le interfacce.
#
# Contributed by Dariusz Puchalak.
#

IFACE=$1
if [ -z "$IFACE" ] ; then
   echo "$0: Must give an interface name as argument!"
   echo "Usage: $0 <interface>"
   exit 1
fi

if [ ! -e /proc/sys/net/ipv4/conf/$IFACE/ ]; then
   echo "$0: Interface $IFACE does not exit (cannot find /proc/sys/net/ipv4/conf/)"
   exit 1
fi

echo 0 > /proc/sys/net/ipv4/conf/$IFACE/forwarding  # IP forwarding disabled.
echo 1 >/proc/sys/net/ipv4/conf/$IFACE/log_martians # Log strange packets.
# (questo include spoofed packets, source routed packets, redirect packets)
# ma fate attenzione, può essere pesante per un server web.

# IP spoofing protection.
echo 1 > /proc/sys/net/ipv4/conf/$IFACE/rp_filter

# Disable ICMP redirect acceptance.
echo 0 > /proc/sys/net/ipv4/conf/$IFACE/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/$IFACE/send_redirects

# Disable source routed packets.
echo 0 > /proc/sys/net/ipv4/conf/$IFACE/accept_source_route

exit 0
An alternative solution is to create an init.d script and have it run on bootup (using update-rc.d to create the appropriate rc.d links).

4.18.4. Configurare le caratteristiche di un firewall

Per avere un firewall, sia per proteggere il sistema locale o tutto quello che si trova dietro, dovete compilare nel kernel le funzionalità del firewall. Il kernel standard per Debian 2.2 (Linux 2.2) comprende il packet filter ipchains come firewall, in Debian 3.0 è presente anche il kernel della serie 2.4 che è invece munito dello stateful packet filter, iptables (netfilter) come firewall.
In any case, it is pretty easy to use a kernel different from the one provided by Debian. You can find pre-compiled kernels as packages you can easily install in the Debian system. You can also download the kernel sources using the kernel-source-X and build custom kernel packages using make-kpkg from the kernel-package package.
La configurazione del firewall sarà ampiamente trattata in Sezione 5.14, «Aggiungere funzionalità al firewall».

4.18.5. Disabilitare la questione weak-end host

Systems with more than one interface on different networks can have services configured so that they will bind only to a given IP address. This usually prevents access to services when requested through any other address. However, this does not mean (although it is a common misconception) that the service is bound to a given hardware address (interface card). [32]
It seems, however, not to work with services bound to 127.0.0.1, you might need to write the tests using raw sockets.
This is not an ARP issue and it's not an RFC violation (it's called weak end host in RFC1122, (in the section 3.3.4.2). Remember, IP addresses have nothing to do with physical interfaces.
Nelle versioni 2.2 del kernel ed anche nelle precedenti è possibile porre rimedio con:
# echo 1 > /proc/sys/net/ipv4/conf/all/hidden
# echo 1 > /proc/sys/net/ipv4/conf/eth0/hidden
# echo 1 > /proc/sys/net/ipv4/conf/eth1/hidden
.....
Nei kernel più recenti si può ottenere lo stesso con:
  • Regole per iptable.
  • properly configured routing. [33]
  • kernel patching. [34]
Along this text there will be many occasions in which it is shown how to configure some services (sshd server, apache, printer service...) in order to have them listening on any given address, the reader should take into account that, without the fixes given here, the fix would not prevent accesses from within the same (local) network. [35]
FIXME: i commenti tratti da bugtraq sono metodi specifici per proteggere un data interfaccia in Linux.
FIXME: sottoporre un bug nei confronti di netbase in modo che il risultato della riparazione della tabella di routing sia il comportamento standard per Debian?

4.18.6. Proteggersi dagli attacchi di tipo ARP

Quando non c'è piena fiducia verso le altre postazioni sulla propria LAN (dovrebbe essere sempre così, è l'atteggiamento più sicuro), ci si dovrebbe proteggere dai diversi possibili attacchi di tipo ARP.
As you know the ARP protocol is used to link IP addresses to MAC addresses (see ftp://ftp.isi.edu/in-notes/rfc826.txt for all the details). Every time you send a packet to an IP address an ARP resolution is done (first by looking into the local ARP cache then if the IP isn't present in the cache by broadcasting an ARP query) to find the target's hardware address. All the ARP attacks aim to fool your box into thinking that box B's IP address is associated to the intruder's box's MAC address; Then every packet that you want to send to the IP associated to box B will be send to the intruder's box...
Quegli attacchi (ARP cache poisonning, ARP spoofing - avvelenamento della cache ARP, falsificazioni ARP) permettono all'attaccante di intercettare il traffico anche su reti commutate, di dirottare facilmente delle connessioni, di disconnettere un host qualunque dalla rete... gli attacchi ARP sono potenti e semplici da implementare, essendovi parecchi strumenti utili allo scopo: arpspoof dal pacchetto dsniff o http://arpoison.sourceforge.net/.
Tuttavia, una soluzione c'è sempre:
  • Usare una cache ARP statica, nella quale impostare delle voci "statiche":
      arp -s host_name hdwr_addr 
    
    Impostando voci statiche per ciascun host importante presente nella rete vi assicurerete che nessuno crei/modifichi per detti host la voce (la falsifichi) - le voci statiche non hanno scadenza e non possono essere modificate - cosicché le repliche ARP falsificate verranno ignorate.
  • Detect suspicious ARP traffic. You can use arpwatch, karpski or more general IDS that can also detect suspicious ARP traffic (snort, http://www.prelude-ids.org...).
  • Implementare un filtraggio del traffico IP in grado di convalidare gli indirizzi MAC.


[31] In Debian the kernel-source-version packages copy the sources to /usr/src/kernel-source-version.tar.bz2, just substitute version to whatever kernel version sources you have installed
[32] To reproduce this (example provided by Felix von Leitner on the Bugtraq mailing list):
   host a (eth0 connected to eth0 of host b):
     ifconfig eth0 10.0.0.1
     ifconfig eth1 23.0.0.1
     tcpserver -RHl localhost 23.0.0.1 8000 echo fnord

   host b:
     ifconfig eth0 10.0.0.2
     route add 23.0.0.1 gw 10.0.0.1
     telnet 23.0.0.1 8000
[33] The fact that this behavior can be changed through routing was described by Matthew G. Marsh in the Bugtraq thread:
eth0 = 1.1.1.1/24
eth1 = 2.2.2.2/24

ip rule add from 1.1.1.1/32 dev lo table 1 prio 15000
ip rule add from 2.2.2.2/32 dev lo table 2 prio 16000

ip route add default dev eth0 table 1
ip route add default dev eth1 table 2
[34] There are some patches available for this behavior as described in Bugtraq's thread at http://www.linuxvirtualserver.org/~julian/#hidden and http://www.fefe.de/linux-eth-forwarding.diff.
[35] An attacker might have many problems pulling the access through after configuring the IP-address binding while not being on the same broadcast domain (same network) as the attacked host. If the attack goes through a router it might be quite difficult for the answers to return somewhere.