Server-Foren > Server - HowTo's

SSH schützen

(1/4) > >>

echoslider:
Einlogen über den Root Account über SSH(z.b mit Putty)


Root Passwort:
Das Root Passwort sollte man so ändern das es mehrere Zahlen,Buchstaben und Sonderzeichen enthällt. Bei den Buchstaben sollte auch noch die Groß- und Kleinschreibung beachtet werden. Ich habe z.b ein 20 Zeichen Passwort mit all den oben genannten Zeichen.
Dass Passwort kann man mit dem folgenden Befehl ändern>

passwd


Arbeitsuser erstellen:
Unter Linux sollte man wenn möglich keine Sachen als Root User starten. Deswegen legt man einen "Arbeitsuser" an.
Der Befehl dazu lautet>

adduser USERNAME


Root Login verbieten:
Den direkten Root Login über z.b  Putty sollte man verbieten. Wenn man eingelogt ist kann man ja zum Root wechseln. Aber der direkte Login sollte verhindert werden. Die Konfigurations-Datei befindet sich in /etc/ssh/sshd_config. Bearbeiten kann man sie mit>

nano /etc/ssh/sshd_config

In der Konfigurationsdatei steht

PermitRootLogin yes

was man auf

PermitRootLogin no

ändern sollte.

SSH neustarten:
Unter Debian>
/etc/init.d/sshd restart

Die Konsole(Putty nicht schließen) da falls man einen Fehler gemacht hat die Verbindung trotzdem Bestehen bleibt.
Neues Putty Fenster öffnen und den direkten Root Login testen. Wenn keine Verbindung zustande kommt ist alles richtig.
Jetzt Noch mit dem "Arbeitsuser" testen. Wenn eine Verbindung akzeptiert wird ist alles richtig.
Jetzt zum Root User werden mit>

su

Port-Knocking:
Man sollte den SSH Port grundsätzlich blocken und durch bestimmte Anklopfsignale an bestimmten Ports nur einer bestimmten IP zugriff auf den SSH Port geben. Portscanner listen den SSH Port einfach nicht auf und auch Bruteforce Angriffe auf diesen Port werden verhindert... da er ja immer geschlossen ist und nur für eine autorisierte Person die speziel am Server angeklopft hat geöffnet wird.Unter Debian kann man knockd installieren mit>

apt-get install knockd

Die Konfigurationsdatei befindet sich bei Debian unter /etc/knockd.conf die mit>

nano /etc/knockd.conf

geöffnet werden kann. Hier mal eine Beispiel Konfiguration.


--- Code: ---[options]
logfile = /var/log/knockd.log

[openSSH]
sequence    = 111,222,333
seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --sport 22 --dport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT && /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 --sport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
tcpflags    = syn

[closeSSH]
sequence    = 444,555,666
seq_timeout = 5
command     = /sbin/iptables -D INPUT -s %IP% -p tcp --sport 22 --dport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT && /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 --sport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
tcpflags    = syn

--- Ende Code ---

Hier wird SSH erlaubt für eine Bestimmte IP bei dem Anklopfen auf den Ports 111,222,333 und der Zugriff wieder gelöscht beim Anklopfen auf den Ports 444,555,666.

Knockd aktiviren kann man mit>

nano /etc/default/knockd

Der Klient um Anzuklopfen kann man download unter> http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki


Testen>

knockd --debug --verbose

Jetzt den Klienten starten mit der Port Sequenz. In der Putty Konsole müsste dann etwas stehen ob es erfolgreich war oder nicht. Wenn alles erfolgreich war knockd dauerhaft starten mit>

/etc/init.d/knockd start


Beispiel Firewall mit Iptables.


--- Code: ---#!/bin/sh
 
 
# iptables suchen
iptables=`which iptables`
 
# wenn iptables nicht installiert abbrechen
test -f $iptables || exit 0
 
case "$1" in
   start)
      echo "Starte Firewall..."
      # alle Regeln löschen
      $iptables -t nat -F
      $iptables -t nat -X
      $iptables -t filter -F
      $iptables -t filter -X
      $iptables -t mangle -F
      $iptables -t mangle -X
      $iptables -X
      $iptables -Z


      # ICMP Dead Error Messages protection.
      echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

      # Max. 500/Sekunde (5/Jiffie) senden
      echo 5 > /proc/sys/net/ipv4/icmp_ratelimit

      # Speicherallozierung und -timing für IP-De/-Fragmentierung
      echo 262144 > /proc/sys/net/ipv4/ipfrag_high_thresh
      echo 196608 > /proc/sys/net/ipv4/ipfrag_low_thresh
      echo 30 > /proc/sys/net/ipv4/ipfrag_time

      # TCP-FIN-Timeout zum Schutz vor DoS-Attacken setzen
      echo 10 > /proc/sys/net/ipv4/tcp_fin_timeout
      echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
      echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
      echo 0 > /proc/sys/net/ipv4/tcp_sack

      # Maximal 3 Antworten auf ein TCP-SYN
      echo 3 > /proc/sys/net/ipv4/tcp_retries1

      # TCP-Pakete maximal 15x wiederholen
      echo 15 > /proc/sys/net/ipv4/tcp_retries2

      # Required to enable IPv4 forwarding.
      echo "1" > /proc/sys/net/ipv4/ip_forward

      # This enables dynamic address hacking.
      echo "1" > /proc/sys/net/ipv4/ip_dynaddr

      # This enables SYN flood protection.
      echo "1" > /proc/sys/net/ipv4/tcp_syncookies

      # Ping flood protection
      echo 1 > /proc/sys/net/ipv4/icmp_ratelimit

      # This enables source validation by reversed path according to RFC1812.
      echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter

      # This option allows a subnet to be firewalled with a single IP address.
      echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp

      # This kernel parameter instructs the kernel to ignore all ICMP
      echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

      # This option can be used to accept or refuse source routed
      echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route

      # This option can disable ICMP redirects.  ICMP redirects
      echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects

      # This option accepts only from gateways in the default gateways list.
      echo "1" > /proc/sys/net/ipv4/conf/all/secure_redirects

      # This option logs packets from impossible addresses.
      echo "1" > /proc/sys/net/ipv4/conf/all/log_martians


      # neue Regeln erzeugen
      $iptables -N garbage
      $iptables -I garbage -p TCP -j LOG --log-prefix="DROP TCP-Packet: " --log-level err
      $iptables -I garbage -p UDP -j LOG --log-prefix="DROP UDP-Packet: " --log-level err
      $iptables -I garbage -p ICMP -j LOG --log-prefix="DROP ICMP-Packet: " --log-level err
 
      # Default Policy
      $iptables -P INPUT DROP
      $iptables -P OUTPUT ACCEPT
      $iptables -P FORWARD DROP

      # über Loopback alles erlauben
      $iptables -I INPUT -i lo -j ACCEPT
      $iptables -I OUTPUT -o lo -j ACCEPT

      if [ -f ports.conf ]; then
      for port in `cat ports.conf`
      do
      $iptables -I INPUT -i eth0 -p TCP --sport $port --dport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport $port -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p UDP --sport $port --dport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p UDP --sport 1024:65535 --dport $port -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      done
      fi



      #####################################################
      # Erweiterte Sicherheitsfunktionen
      # SynFlood
      $iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
      # PortScan
      $iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
      # Ping-of-Death
      $iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT




      #####################################################
      # bestehende Verbindungen akzeptieren
      $iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
      #####################################################
      # Garbage übergeben wenn nicht erlaubt
      $iptables -A INPUT -m state --state NEW,INVALID -j garbage
 
      #####################################################
      # alles verbieten was bisher erlaubt war
      $iptables -A INPUT -j garbage
      $iptables -A OUTPUT -j garbage
      $iptables -A FORWARD -j garbage
      ;;
   minimal)
        echo "Starte Firewall(minimal)..."
 
     # alle Regeln löschen
      $iptables -t nat -F
      $iptables -t nat -X
      $iptables -t filter -F
      $iptables -t filter -X
      $iptables -t mangle -F
      $iptables -t mangle -X
      $iptables -X
      $iptables -Z


      # ICMP Dead Error Messages protection.
      echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

      # Max. 500/Sekunde (5/Jiffie) senden
      echo 5 > /proc/sys/net/ipv4/icmp_ratelimit

      # Speicherallozierung und -timing für IP-De/-Fragmentierung
      echo 262144 > /proc/sys/net/ipv4/ipfrag_high_thresh
      echo 196608 > /proc/sys/net/ipv4/ipfrag_low_thresh
      echo 30 > /proc/sys/net/ipv4/ipfrag_time

      # TCP-FIN-Timeout zum Schutz vor DoS-Attacken setzen
      echo 10 > /proc/sys/net/ipv4/tcp_fin_timeout
      echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
      echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
      echo 0 > /proc/sys/net/ipv4/tcp_sack

      # Maximal 3 Antworten auf ein TCP-SYN
      echo 3 > /proc/sys/net/ipv4/tcp_retries1

      # TCP-Pakete maximal 15x wiederholen
      echo 15 > /proc/sys/net/ipv4/tcp_retries2

      # Required to enable IPv4 forwarding.
      echo "1" > /proc/sys/net/ipv4/ip_forward

      # This enables dynamic address hacking.
      echo "1" > /proc/sys/net/ipv4/ip_dynaddr

      # This enables SYN flood protection.
      echo "1" > /proc/sys/net/ipv4/tcp_syncookies

      # Ping flood protection
      echo 1 > /proc/sys/net/ipv4/icmp_ratelimit

      # This enables source validation by reversed path according to RFC1812.
      echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter

      # This option allows a subnet to be firewalled with a single IP address.
      echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp

      # This kernel parameter instructs the kernel to ignore all ICMP
      echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

      # This option can be used to accept or refuse source routed
      echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route

      # This option can disable ICMP redirects.  ICMP redirects
      echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects

      # This option accepts only from gateways in the default gateways list.
      echo "1" > /proc/sys/net/ipv4/conf/all/secure_redirects

      # This option logs packets from impossible addresses.
      echo "1" > /proc/sys/net/ipv4/conf/all/log_martians



      # neue Regeln erzeugen
      $iptables -N garbage
      $iptables -I garbage -p TCP -j LOG --log-prefix="DROP TCP-Packet: " --log-level err
      $iptables -I garbage -p UDP -j LOG --log-prefix="DROP UDP-Packet: " --log-level err
      $iptables -I garbage -p ICMP -j LOG --log-prefix="DROP ICMP-Packet: " --log-level err
 
      # Default Policy
      $iptables -P INPUT DROP
      $iptables -P OUTPUT ACCEPT
      $iptables -P FORWARD DROP

      # über Loopback alles erlauben
      $iptables -I INPUT -i lo -j ACCEPT
      $iptables -I OUTPUT -o lo -j ACCEPT


      $iptables -I INPUT -i eth0 -p TCP --sport 22 --dport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p TCP --sport 1024:65535 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p UDP --sport 22 --dport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      $iptables -I INPUT -i eth0 -p UDP --sport 1024:65535 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT




      #####################################################
      # Erweiterte Sicherheitsfunktionen
      # SynFlood
      $iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
      # PortScan
      $iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
      # Ping-of-Death
      $iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT



      #####################################################
      # bestehende Verbindungen akzeptieren
      $iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      $iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
      #####################################################
      # Garbage übergeben wenn nicht erlaubt
      $iptables -A INPUT -m state --state NEW,INVALID -j garbage
 
      #####################################################
      # alles verbieten was bisher erlaubt war
      $iptables -A INPUT -j garbage
      $iptables -A OUTPUT -j garbage
      $iptables -A FORWARD -j garbage

      ;;
   testing)
      echo "Testing..."
      $0 start
      sleep 180
      $0 stop
      ;;
   stop)
      echo "Stoppe Firewall..."
      $iptables -t nat -F
      $iptables -t filter -F
      $iptables -X
      $iptables -P INPUT ACCEPT
      $iptables -P OUTPUT ACCEPT
      $iptables -P FORWARD ACCEPT
      ;;
   restart|reload|force-reload)
   $0 stop
   $0 start
      ;;
   *)
      echo "Usage: ./firewall (start|stop|minimal|testing|restart|reload|force-reload)"
      exit 1
      ;;
esac
exit 0

--- Ende Code ---

Hier wird alles geblockt. Nur die Ports in der ports.conf werden zugelassen.

White2001:
Zusätzlich kann man tools wie pam_abl einsetzen die automatisch bei bestimmer anzahl von fehlversuchen den user/ die ip sperren.

meik82:
das wolte ich auch gerade empfehlen
das ist echt prima so beschriben so das ich dar garnix weiter zu schreiben bräuchte
auser:
es were sinfoll den rootlogin fon anfang an zu blocken
und als user köte zb die kontonummer oder auch wie das pasword eine zufällige sequenz dienen

es gibt einfach fiel zu fiele portscanner die sich auf hunderten servern mit brute force einloggen (versuchen)
und wohl per zufal auch bei einigen auch schaffen
 
MfG Meik

ps. mit dem befehl  [ cat /var/log/auth.log | grep "Failed password" | less ] lassen sich die gescheiterten loginversuche anzeigen (OHNE [ ])

White2001:
Was auch recht schnell geht, is ne maximale anzahl von Neuen Verbindungen in 60s per Firewall.
Da ich ssh sowieso ne zeile in der RULES von shorewall hat is das recht schnell gemacht,
und diese Massenscanner  sind nach 5-6 versuchen ausgesperrt.

Und man selbst, muss man halt mal 5-6 minuten warten, oder den notfall port nehmen...
wo ne 2. ssh Instanz drauf läuft.

markusb:
Besteht auch weiterhin die Möglichkeit, dass sich der User nur mit einem Key-File ein loggt?
Das wäre dann ja der perfekte Schutz ;)

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln