Netzwerksicherheit

Der Bereich der Sicherheit spielt vor Allem in Netzwerken eine große Rolle.
Gentoo hat eine gute Dokumentation, die ich (noch) nicht übersetzt gefunden habe. Daher stelle ich diese hier in Deutsch zur Verfügung. Das Orginal ist unter https://wiki.gentoo.org/wiki/Security_Handbook/Network_security  zu finden. 

Das proc-Dateisystem

Viele Kernel-Parameter können über das Dateisystem / proc oder mithilfe von sysctl geändert werden.
Um Kernel-Parameter und Variablen dynamisch dynamisch ändern zu können, muss CONFIG_SYSCTL im Kernel aktiviert sein.Dies ist standardmäßig in einem Standard 4.0+ Kernel aktiviert.
IP-Weiterleitung deaktivieren:

root #/bin/echo "0" > /proc/sys/net/ipv4/ip_forward

Stellen Sie sicher, dass die IP-Weiterleitung deaktiviert ist. Wir wollen das nur für einen Multi-Homed-Host. Es wird empfohlen, dieses Flag vor allen anderen Flags zu setzen oder zu deaktivieren, da es auch andere Flags aktiviert / deaktiviert.

Drop-Ping-Pakete:

root #/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all

Dies wird dazu führen, dass der Kernel einfach alle Ping-Nachrichten ignoriert (auch als ICMP-Typ 0-Nachrichten bekannt). Der Grund dafür ist, dass ein IP-Paket, das eine ICMP-Nachricht enthält, eine Payload mit anderen Informationen enthalten kann, als Sie denken. Administratoren verwenden Ping als Diagnose-Tool und beschweren sich oft, wenn es deaktiviert ist, aber es gibt keinen Grund für einen Außenseiter, Ping zu können. Da es jedoch für Insider manchmal von Vorteil sein kann, Ping-Nachrichten zu senden, können Sie ICMP-Nachrichten vom Typ 0 in der Firewall deaktivieren (damit lokale Administratoren dieses Tool weiterhin verwenden können).

Sendepings ignorieren:

root #/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

Dies deaktiviert die Reaktion auf ICMP-Broadcasts und verhindert Smurf-Angriffe. Der Smurf-Angriff sendet eine ICMP-Nachricht vom Typ 0 (Ping) an die Broadcast-Adresse eines Netzwerks. Normalerweise verwendet der Angreifer eine gefälschte Quelladresse. Alle Computer im Netzwerk werden auf die Ping-Nachricht antworten und dadurch den Host unter der gefälschten Quelladresse überfluten.

Deaktivieren Sie geroutete Pakete:

root #/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route

Akzeptieren Sie keine von der Quelle gerouteten Pakete. Angreifer können mithilfe von Quellrouting Verkehr generieren, der so aussieht, als käme er aus dem Netzwerk, aber er wird tatsächlich entlang des Pfads zurückgeleitet, von dem er stammt. Angreifer können also Ihr Netzwerk gefährden. Das Quellenrouting wird selten für legitime Zwecke verwendet, daher ist es sicher, es zu deaktivieren.

Deaktivieren der Weiterleitungsakzeptanz:

root #/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects

Akzeptieren Sie keine ICMP-Redirect-Pakete. ICMP-Redirects können verwendet werden, um Ihre Routingtabellen möglicherweise zu einem schädlichen Ende zu ändern.

Aktivieren Sie den Schutz vor schlechten / gefälschten Fehlernachrichtenantworten:

root # / bin / echo "1"> / proc / sys / netz / ipv4 / icmp_ignore_bogus_error_responses

Aktivieren Sie die umgekehrte Pfadfilterung:

root #for i in /proc/sys/net/ipv4/conf/*; do

/bin/echo "1" > $i/rp_filter

done

Aktivieren Sie die umgekehrte Pfadfilterung. Dies stellt sicher, dass Pakete legitime Quelladressen verwenden, indem eingehende Pakete automatisch zurückgewiesen werden, wenn der Routing-Tabelleneintrag für ihre Quelladresse nicht mit der Netzwerkschnittstelle übereinstimmt, an der sie ankommen. Dies hat Sicherheitsvorteile, da es IP-Spoofing verhindert. Sie müssen es für jedes net / ipv4 / conf / * aktivieren, andernfalls ist die Quellenvalidierung nicht voll funktionsfähig.

 
Warnung
Das Aktivieren der umgekehrten Pfadfilterung kann jedoch ein Problem darstellen, wenn Sie asymmetrisches Routing verwenden (Pakete von Ihnen zu einem Host nehmen einen anderen Pfad als Pakete von diesem Host zu Ihnen) oder wenn Sie einen Host ohne Routing betreiben, der mehrere IP-Adressen und Schnittstellen hat.

Gespoofte Pakete protokollieren, geroutete Pakete routen und Pakete umleiten:

root # / bin / echo "1"> / proc / system / net / ipv4 / conf / all / log_martians

Alle diese Einstellungen werden zurückgesetzt, wenn das Gerät neu gestartet wird. Ich schlage vor, dass Sie sie zu /etc/sysctl.conf hinzufügen, was automatisch vom Init-Skript /etc/init.d/bootmisc stammt.

Die Syntax für /etc/sysctl.conf ist ziemlich einfach. Entfernen Sie / proc / sys / von den zuvor genannten Pfaden und ersetzen Sie / durch:
FILE /etc/sysctl.conf

net.ipv4.ip_forward = 0

Es ist auch möglich, den Befehl echo zu verwenden, um die obige Anpassung an ip_forward manuell vorzunehmen:

root # / bin / echo "0"> / proc / sys / net / ipv4 / ip_forward
Port Check:

michi@sysvorOrt ~ $ nmap -sV -p 80 192.168.2.1
Starting Nmap 7.95 ( https://nmap.org ) at 2024-09-21 11:20 CEST
Nmap scan report for speedport.ip (192.168.2.1)
Host is up (0.00051s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 5.18 seconds

Sehen wir uns ein vollständiges Beispiel an. In diesem Fall lautet meine Firewall-/Gateway-Richtlinie:

Verbindungen zur Firewall sind nur über SSH (Port 22) zulässig.
Das lokale Netzwerk sollte Zugriff auf HTTP, HTTPS und SSH haben (DNS sollte ebenfalls zulässig sein).
ICMP-Verkehr kann Nutzdaten enthalten und sollte nicht zugelassen werden. Natürlich müssen wir einen gewissen ICMP-Verkehr zulassen.
Port-Scans sollten erkannt und protokolliert werden.
SYN-Angriffe sollten vermieden werden.
Der gesamte andere Verkehr sollte verworfen und protokolliert werden.


/etc/init.d/firewall


#!/sbin/openrc-run
IPTABLES=/sbin/iptables
IPTABLESSAVE=/sbin/iptables-save
IPTABLESRESTORE=/sbin/iptables-restore
FIREWALL=/etc/firewall.rules
DNS1=212.242.40.3
DNS2=212.242.40.51
#inside
IIP=10.0.0.2
IINTERFACE=eth0
LOCAL_NETWORK=10.0.0.0/24
#outside
OIP=217.157.156.144
OINTERFACE=eth1

opts="${opts} showstatus panic save restore showoptions rules"

depend() {
  need net
}

rules() {
  stop
  ebegin "Setting internal rules"

  einfo "Setting default rule to drop"
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP

  #default rule
  einfo "Creating states chain"
  $IPTABLES -N allowed-connection
  $IPTABLES -F allowed-connection
  $IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT
  $IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix \
      "Bad packet from ${IINTERFACE}:"
  $IPTABLES -A allowed-connection -j DROP

  #ICMP traffic
  einfo "Creating icmp chain"
  $IPTABLES -N icmp_allowed
  $IPTABLES -F icmp_allowed
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
      time-exceeded -j ACCEPT
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
      destination-unreachable -j ACCEPT
  $IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
  $IPTABLES -A icmp_allowed -p icmp -j DROP

  #Incoming traffic
  einfo "Creating incoming ssh traffic chain"
  $IPTABLES -N allow-ssh-traffic-in
  $IPTABLES -F allow-ssh-traffic-in
  #Flood protection
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL RST --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL FIN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL SYN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT

  #outgoing traffic
  einfo "Creating outgoing ssh traffic chain"
  $IPTABLES -N allow-ssh-traffic-out
  $IPTABLES -F allow-ssh-traffic-out
  $IPTABLES -A allow-ssh-traffic-out -p tcp --dport ssh -j ACCEPT

  einfo "Creating outgoing dns traffic chain"
  $IPTABLES -N allow-dns-traffic-out
  $IPTABLES -F allow-dns-traffic-out
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain \
      -j ACCEPT
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain \
     -j ACCEPT

  einfo "Creating outgoing http/https traffic chain"
  $IPTABLES -N allow-www-traffic-out
  $IPTABLES -F allow-www-traffic-out
  $IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT
  $IPTABLES -A allow-www-traffic-out -p tcp --dport https -j ACCEPT

  #Catch portscanners
  einfo "Creating portscan detection chain"
  $IPTABLES -N check-flags
  $IPTABLES -F check-flags
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit \
      --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit \
      5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \
      -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit \
      --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit \
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit \
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

  # Apply and add invalid states to the chains
  einfo "Applying chains to INPUT"
  $IPTABLES -A INPUT -m state --state INVALID -j DROP
  $IPTABLES -A INPUT -p icmp -j icmp_allowed
  $IPTABLES -A INPUT -j check-flags
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A INPUT -j allow-ssh-traffic-in
  $IPTABLES -A INPUT -j allowed-connection

  einfo "Applying chains to FORWARD"
  $IPTABLES -A FORWARD -m state --state INVALID -j DROP
  $IPTABLES -A FORWARD -p icmp -j icmp_allowed
  $IPTABLES -A FORWARD -j check-flags
  $IPTABLES -A FORWARD -o lo -j ACCEPT
  $IPTABLES -A FORWARD -j allow-ssh-traffic-in
  $IPTABLES -A FORWARD -j allow-www-traffic-out
  $IPTABLES -A FORWARD -j allowed-connection

  einfo "Applying chains to OUTPUT"
  $IPTABLES -A OUTPUT -m state --state INVALID -j DROP
  $IPTABLES -A OUTPUT -p icmp -j icmp_allowed
  $IPTABLES -A OUTPUT -j check-flags
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  $IPTABLES -A OUTPUT -j allow-ssh-traffic-out
  $IPTABLES -A OUTPUT -j allow-dns-traffic-out
  $IPTABLES -A OUTPUT -j allow-www-traffic-out
  $IPTABLES -A OUTPUT -j allowed-connection

  #Allow client to route through via NAT (Network Address Translation)
  $IPTABLES -t nat -A POSTROUTING -o $OINTERFACE -j MASQUERADE
  eend $?
}

start() {
  ebegin "Starting firewall"
  if [ -e "${FIREWALL}" ]; then
    restore
  else
    einfo "${FIREWALL} does not exists. Using default rules."
    rules
  fi
  eend $?
}

stop() {
  ebegin "Stopping firewall"
  $IPTABLES -F
  $IPTABLES -t nat -F
  $IPTABLES -X
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P INPUT   ACCEPT
  $IPTABLES -P OUTPUT  ACCEPT
  eend $?
}

showstatus() {
  ebegin "Status"
  $IPTABLES -L -n -v --line-numbers
  einfo "NAT status"
  $IPTABLES -L -n -v --line-numbers -t nat
  eend $?
}

panic() {
  ebegin "Setting panic rules"
  $IPTABLES -F
  $IPTABLES -X
  $IPTABLES -t nat -F
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  eend $?
}

save() {
  ebegin "Saving Firewall rules"
  $IPTABLESSAVE > $FIREWALL
  eend $?
}

restore() {
  ebegin "Restoring Firewall rules"
  $IPTABLESRESTORE < $FIREWALL
  eend $?
}

restart() {
  svc_stop; svc_start
}

showoptions() {
  echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus}"
  echo "start)      will restore setting if exists else force rules"
  echo "stop)       delete all rules and set all to accept"
  echo "rules)      force settings of new rules"
  echo "save)       will store settings in ${FIREWALL}"
  echo "restore)    will restore settings from ${FIREWALL}"
  echo "showstatus) Shows the status"
}