Un firewall per ogni processo

Negli ultimi kernel Unbit (settembre 2009) e' stata introdotta una nuova regola di matching ad iptables.

Questa implementazione permette di verificare nei pacchetti in uscita un particolare flag impostato dal processo che ha creato il socket.

Sono disponibili 63 valori per il flag (che in realta' e' una bitmask). Ogni valore corrisponde a una particolare autorizzazione del firewall.

Se il socket ha il bit della mask richiesto settato, l'autorizzazione e' concessa:

iptables -A OUTPUT -p tcp --dport 995 -m unbit --unbit-group 3 -j ACCEPT

La seguente regola si legge come:

autorizza il traffico in uscita sulla porta 995 per tutti i socket con il bit 3 dell'apposita mask settato

Attualmente sono stati definiti una decina di gruppi, gli altri saranno aggiunti in base alle richieste degli utenti e inseriti nell'elenco presente alla pagina UnbitInetGroup

Il codice del modulo kernel e' molto semplice:

/*
Unbit netfilter module for uidsec
 */
#include <linux/module.h>
#include <linux/skbuff.h>
#include <net/sock.h>
#include <linux/netfilter/x_tables.h>
#include <linux/unbit.h>

struct ipt_unbit_info {
        unsigned char unbit_inet_group;
};

static bool
unbit_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par)
{
        const struct ipt_unbit_info *info = par->matchinfo;
        struct uidsec_tcp_ipv4_socket *uidsec_tcp_socket ;

        if (skb->sk == NULL || skb->sk->sk_socket == NULL || skb->sk->sk_security == NULL)
                return false;

        if (info->unbit_inet_group >=1 && info->unbit_inet_group <= 63) {


                uidsec_tcp_socket = skb->sk->sk_security ;

                if (uidsec_tcp_socket->socket_firewall_mask & (unsigned long long) 1 << info->unbit_inet_group) {
                        /* valid rule !!! */
                        return true;
                }
        }

        return false;
}

static bool unbit_mt_check_v0(const struct xt_mtchk_param *par)
{
        const struct ipt_unbit_info *info = par->matchinfo;

        if (info->unbit_inet_group <= 0 || info->unbit_inet_group >= 64) {
                printk(KERN_WARNING KBUILD_MODNAME
                       ": Unbit INET group must be set between 1 and 63\n");
                return false;
        }

        return true;
}

static struct xt_match unbit_mt_reg[] __read_mostly = {
        {
                .name       = "unbit",
                .revision   = 0,
                .family     = NFPROTO_IPV4,
                .match      = unbit_mt_v0,
                .matchsize  = sizeof(struct ipt_unbit_info),
                .checkentry = unbit_mt_check_v0,
                .hooks      = (1 << NF_INET_LOCAL_OUT) |
                              (1 << NF_INET_POST_ROUTING),
                .me         = THIS_MODULE,
        },
};

static int __init unbit_mt_init(void)
{
        return xt_register_matches(unbit_mt_reg, ARRAY_SIZE(unbit_mt_reg));
}

static void __exit unbit_mt_exit(void)
{
        xt_unregister_matches(unbit_mt_reg, ARRAY_SIZE(unbit_mt_reg));
}

module_init(unbit_mt_init);
module_exit(unbit_mt_exit);
MODULE_AUTHOR("Roberto De Ioris <roberto@unbit.it>");
MODULE_DESCRIPTION("Xtables: socket uidsec/unbit matching");
MODULE_LICENSE("GPL");

La parte sicuramente piu' rilevante e' la seguente:

if (uidsec_tcp_socket->socket_firewall_mask & (unsigned long long) 1 << info->unbit_inet_group) {
        /* valid rule !!! */
        return true;
}

dove uidsec_tcp_socket e' la struttura dati associata al socket tramite il puntatore sk_security e info->unbit_inet_group e' il valore impostato tramite il comando iptables.

Come ottengo il privilegio per un determinato gruppo del firewall Unbit ?

Bisogna contattare lo staff Unbit fornendo una dettagliata spiegazione del motivo per cui si intende accedere al server esterno e che utilizzo se ne fara'. Lo staff valutera' anche le implicazioni sulla banda e stilera' un preventivo. Ad esempio l'accesso a un server mysql esterno potrebbe potenzialmente generare molta banda, quindi oltre all'assegnazione del privilegio sara' anche necessario assegnare un quantitativo minimo di banda garantita.

PerProcessFirewall (l'ultima modifica รจ del 2009-09-11 07:59:04, fatta da RobertoDeIoris)