Hobby-firewall

From Hobbynet Admin Wiki
Jump to navigation Jump to search

[aanzet om de nieuwe firewall implementatie te beschrijven]

Omdat er steeds terugkerende delen in de firewalls werden gezet, is gekeken of deze delen uit het standaard 'rules' en 'rules6' bestand gelicht konden worden, en in aparte bestanden ondergebracht.

Daarnaast bleek dat met name in de IPv6 firewall het gebruik van domeinnamen (in plaats van directe IP-adressen) soms tot heftige vertraging leidde (IPv6 reverse DNS is lang niet altijd ingeregeld, en die wordt aangesproken als je ip6tables zelf de vertaling uit laat voeren).

De vertaling van domein namen naar IP-adressen is nu in een apart script opgenomen. Dit script wordt eerst uitgevoerd, daarna pas wordt iptables gestopt en gestart.

WORK IN PROGRESS!


waar staan de files en waar dienen ze voor

lokale files

  • /etc/init.d/hobby-firewall (het init script)
  • /etc/hobby-firewall/rules (de lokale IPv4 rules file)
  • /etc/hobby-firewall/rules6 (de lokale IPv6 rules file)
  • /etc/hobby-firewall/hobby-firewall.local (stuur script voor omzetten van hostnamen van websites en ftp adressen)

symlinks centraal beheerde files voor die server specifiek

Deze staan in /usr/local/hobbynet/firewall/

  • /etc/hobby-firewall/allow_http (symlink naar de file met de websites waarnaar de server mag connecten)
  • /etc/hobby-firewall/allow_ftp (symlink naar de file met de ftpservers waarnaar de server mag connecten)
  • /etc/hobby-firewall/allow_http.ip4 (symlink naar de file met IPv4 adressen van websites waarnaar de server mag connecten)
  • /etc/hobby-firewall/allow_ftp.ip4 (symlink naar de file met IPv4 adressen van ftpservers waarnaar de server mag connecten)
  • /etc/hobby-firewall/allow_http.ip6 (symlink naar de file met IPv6 adressen van websites waarnaar de server mag connecten)
  • /etc/hobby-firewall/allow_ftp.ip6 (symlink naar de file met IPv6 adressen van ftpservers waarnaar de server mag connecten)

Scripts gebruikt door firewall

  • /usr/local/hobbynet/bin/getip-http (dit script zet allow_http files om naar lijst met IP-adressen)
  • /usr/local/hobbynet/bin/getip-ftp (dit script zet allow_ftp files om naar lijst met IP-adressen)
  • /usr/local/hobbynet/bin/get_ip4 (dit script kopieert de centraal beheerde ipv4 files met extentie .ip4 naar lokale server)
  • /usr/local/hobbynet/bin/get_ip6 (dit script kopieert de centraal beheerde ipv6 files met extentie .ip6 naar lokale server)

centraal beheerde files

Files die die naar lokale server worden gekopieer worden in de directory geplaatst /etc/hobby-firewall/work dit is overwaring te voorkommen.

  • /usr/local/hobbynet/firewall/general/hobby-firewall ( Het originele init script van de firewall staat hier en niet in bin, want hier kunnen alle servers er bij)
  • /usr/local/hobbynet/firewall/general/knownoffenders.ip4 (lijst bekende onverlaten die wij blokken IPv4)
  • /usr/local/hobbynet/firewall/general/knownoffenders.ip6 (lijst bekende onverlaten die wij blokken IPv6)
  • /usr/local/hobbynet/firewall/general/in_up.ip4 (het bovenste deel van de centraal beheerder incoming firewall rules)
  • /usr/local/hobbynet/firewall/general/in_down.ip4 (het onderste deel van de centraal beheerder incoming firewall rules)
  • /usr/local/hobbynet/firewall/general/out_up.ip4 (het bovenste deel van de centraal beheerder outgoing firewall rules)
  • /usr/local/hobbynet/firewall/general/out_down.ip4 (het onderste deel van de centraal beheerder outgoing firewall rules)

scripts updaten op servers met een eigenen bin

het script /usr/local/hobbynet/bin/update-fw-scripts zorgt er voor dat scripts die nodig zijn voor de firewall worden gekopieerd naar server met een eigen bin. de input file hier voor staat hier : /usr/local/hobbynet/lib/eigenbin

files

/etc/init.d/hobby-firewall

Dit script zorgt er voor dat de firewall wordt gestart en de rules files worden ingelezen en verwerkt.

/etc/hobby-firewall/rules

In de rules file staan naast de lokaal gelden firewall rules ook de includes van de centraal beheerde bestanden.
Het standaard rules file voor een webserver ziet er zo uit :

#! /bin/bash
#

#####
#
# IPv4 rule file voor hobbynet-firewall
#
#####

PUBIF="eth0"
LOCIF="eth1"

# Inbound established and related traffic is ok:
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# include default incoming rules UP
. $WORK/in_up.ip4

# HTTP/HTTPS are always allowed:
$IPTABLES -A INPUT -p tcp --dport  80  -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 443  -m state --state NEW -j ACCEPT

# include default incoming rules DOWN
. /etc/hobby-firewall/in_down.ip4


## OUTPUT ##

# Outbound established and related traffic is ok:
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# include default outgoing rules UP
. $WORK/out_up.ip4

# include http_allow.ip4
. $WORK/http_allow.ip4

# include ftp_allow.ip4
. $WORK/ftp_allow.ip4

# include default outgoing rules DOWN
. $WORK/out_down.ip4

/etc/hobby-firewall/rules6

Volgt nog zodra deze ook gestandaardiseerd is

/etc/hobby-firewall/hobby-firewall.local

Wanneer deze file op server bestaat zorgt deze er voor dat de allow_* files worden omgezet naar IP-adressen, die vervolgens worden toegestaan in de uitgaande firewall.

#!/bin/bash
# Vertaal domeinnamen naar IP adressen t.b.v. hobby-firewall

# In de onderliggende scripts wordt $MAPNAME vertaald
# naar /usr/local/hobbynet/firewall/$MAPNAME.
# In die map staan de originele 'allow'-bestanden
# die vertaald gaan worden naar een lijst met IP adressen.

MAPNAME=cacert

/usr/local/hobbynet/bin/getip-http $MAPNAME
/usr/local/hobbynet/bin/getip-ftp  $MAPNAME

$MAPNAME geeft aan in welke subdirectory de allow files staan onder /usr/local/hobbynet/firewall

/usr/local/hobbynet/bin/getip-http

Dit script maakt van de bestanden allow_http, allow_http.ip4 en allow_http.ip6 een lijst met daarin de IP-adressen van toegestane webservers.

#!/bin/sh
#
#  Dit script zorgt voor de vertaling van domein namen naar IP-adressen 
#  (zowel IPv4 als IPv6) voordat de firewall wordt gestart of herstart
#
#
UL_FW="/usr/local/hobbynet/firewall"
HOSTS="$UL_FW/$1/allow_http"
HOSTSIP4="$UL_FW/$1/allow_http.ip4"
HOSTSIP6="$UL_FW/$1/allow_http.ip6"

ETC_FW="/etc/hobby-firewall"
HOSTSV4RAW="$ETC_FW/allow_http.v4raw"
HOSTSV6RAW="$ETC_FW/allow_http.v6raw"
HOSTSV4="$ETC_FW/allow_http.v4"
HOSTSV6="$ETC_FW/allow_http.v6"

# check if $HOSTS exists
if [ ! -e $HOSTS ] ; then
   echo "$HOSTS ontbreekt: geen nieuwe IP bestanden gemaakt!!"
   exit 1
fi

if [ -e $HOSTSV4 ] ; then
 rm $HOSTSV4 
fi
if [ -e $HOSTSV4RAW ] ; then
 rm $HOSTSV4RAW 
fi
if [ -e $HOSTSV6 ] ; then
 rm $HOSTSV6
fi
if [ -e $HOSTSV6RAW ] ; then
 rm $HOSTSV6RAW
fi

echo "Generating http IPv4 address file and IPv6 address file from $HOSTS"

for i in `cat $HOSTS`
do
 server_ip=`host $i |grep address | grep -v IPv6|awk '{printf "%s\n",$4}'`
 echo $server_ip >> $HOSTSV4RAW
 server_ip=`host $i |grep address | grep IPv6   |awk '{printf "%s\n",$5}'`
 echo $server_ip >> $HOSTSV6RAW

 # Geef niet te resolven namen op de console weer
 # developers.facebook.com wordt wel gevonden maar geeft ook 'not found' dus exclude die van de weergave
 host $i| grep "not found:"| grep -v developers.facebook.com
done

# IP-adressen lijst toevoegen aan de raw file
cat $HOSTSIP4 >> $HOSTSV4RAW
cat $HOSTSIP6 >> $HOSTSV6RAW

# raw files strippen van lege regels en alle IP-adressen op eigen regel zetten
cat $HOSTSV4RAW | tr ' ' '\n'| sed '/^$/d'  > $HOSTSV4
cat $HOSTSV6RAW | tr ' ' '\n'| sed '/^$/d'  > $HOSTSV6

#raw files opruimen
rm $HOSTSV4RAW $HOSTSV6RAW

/usr/local/hobbynet/bin/getip-ftp

Dit script maakt van de allow_ftp allow_ftp.ip4 allow_ftp.ip6 een lijst van toegestane

#!/bin/sh
#
#  Dit script zorgt voor de vertaling van domein namen naar IP-adressen 
#  (zowel IPv4 als IPv6) voordat de firewall wordt gestart of herstart
#
#
UL_FW="/usr/local/hobbynet/firewall"
HOSTS="$UL_FW/$1/allow_ftp"
HOSTSIP4="$UL_FW/$1/allow_ftp.ip4"
HOSTSIP6="$UL_FW/$1/allow_ftp.ip6"

ETC_FW="/etc/hobby-firewall"
HOSTSV4RAW="$ETC_FW/allow_ftp.v4raw"
HOSTSV6RAW="$ETC_FW/allow_ftp.v6raw"
HOSTSV4="$ETC_FW/allow_ftp.v4"
HOSTSV6="$ETC_FW/allow_ftp.v6"

# check if $HOSTS exists
if [ ! -e $HOSTS ] ; then
   echo "$HOSTS ontbreekt: geen nieuwe IP-bestanden gemaakt!!"
   exit 1
fi

if [ -e $HOSTSV4 ] ; then
 rm $HOSTSV4 
fi
if [ -e $HOSTSV4RAW ] ; then
 rm $HOSTSV4RAW 
fi
if [ -e $HOSTSV6 ] ; then
 rm $HOSTSV6
fi
if [ -e $HOSTSV6RAW ] ; then
 rm $HOSTSV6RAW
fi

echo "Generating FTP IPv4 address file and IPv6 address file from $HOSTS"

for i in `cat $HOSTS`
do
 server_ip=`host $i |grep address | grep -v IPv6|awk '{printf "%s\n",$4}'`
 echo $server_ip >> $HOSTSV4RAW
 server_ip=`host $i |grep address | grep IPv6   |awk '{printf "%s\n",$5}'`
 echo $server_ip >> $HOSTSV6RAW

 # Geef niet te resolven namen op de console weer
 # developers.facebook.com wordt wel gevonden maar geeft ook 'not found' dus exclude die van de weergave
 host $i| grep "not found:"| grep -v developers.facebook.com

done

# IP-adressen lijst toevoegen aan de raw file
cat $HOSTSIP4 >> $HOSTSV4RAW
cat $HOSTSIP6 >> $HOSTSV6RAW

# raw files strippen van lege regels en alle IP-adressen op eigen regel zetten
cat $HOSTSV4RAW | tr ' ' '\n'| sed '/^$/d'  > $HOSTSV4
cat $HOSTSV6RAW | tr ' ' '\n'| sed '/^$/d'  > $HOSTSV6

#raw files opruimen
rm $HOSTSV4RAW $HOSTSV6RAW

installatie nieuwe firewall

Zorg er voor dat volgende mount points er zijn :

  • /usr/local/hobbynet/firewall/general
  • /usr/local/hobbynet/bin

Indien gebruik wordt gemaakt wordt van 'allow_http' en 'allow_ftp' dan moet commentaar uit de rules file worden verwijderd en moet ook het volgende mount point er zijn :

  • /usr/local/hobbynet/firewall/naamserver(groep)

indien er een lokale /usr/local/hobbynet/bin directory is dan moeten daar de volgende files naar toe gekopieerd worden:

  • getip_http
  • getip_ftp
  • get_ip4
  • get_ip6
cp /usr/local/hobbynet/firewall/general/hobby-firewall /etc/init.d/hobby-firewall
mkdir /etc/hobby-firewall
cp /usr/local/hobbynet/firewall/general/rules  /etc/hobby-firewall
cp /usr/local/hobbynet/firewall/general/rules6 /etc/hobby-firewall
chmod 600 /etc/hobby-firewall/*

Pas hierna de rule files nog aan zodat ze geschikt zijn deze server.

synchronisatie naar server zonder mounts

4 x op een dag wordt door scripting naar diverse servers die geen mounts hebben de work directory van de firewall gesynchroniseerd en de firewall herstart. Zodat deze ook up2date blijven en bekend zijn met known offenders. Servers in dit script:

  • ns3
  • store1 (zowel store1 als store2, omdat de inactieve server geen mounts heeft)
  • store2 (zowel store1 als store2, omdat de inactieve server geen mounts heeft)