Hobby-firewall
[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)