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"
}