ssh schutz:
-sicheres passwort wählen(1)
-arbeitsuser/sudo(2/2.1)
-direkter root login verbieten(3)
-port knocking/iptables-firewall(4/4.1)
-updates(5)
-so wenig infos wie möglich(6)



(1)
das passwort sollte sonderzeichen,große- und kleine buchstaben beinhalten sowie zahlen und eine ausreichende länge. bei mir auf dem server habe ich ein 20 zeichen passwort. ändern kann man das passwort mit:

passwd

(2)
man sollte einen arbeitsuser er

stellen weil man sachen wenn möglich nicht als root user starten sollte. wenn der arbeits user gehacked werden würde könne man nicht viel tun... da einem einfach die rechte fehlen. ablegen kann man den neuen user mit dem befehl:

adduser USERNAME

(2.1)
sudoers benutzt man um einem arbeitsuser mehr rechte zu geben und diese gezielt einzuschränken.installieren tut man das unter debian mit dem befehl(als root online sein):

apt-get install sudo

wenn man nun einem arbeitsuser die benötigten rechte geben will z.b ein script starten welches dem root user gehört gibt man dieses in die konsole ein:

visudo

in der datei gibt man ganz unten an was der arbeitsuser darf.

mit:

arbeitsuser1 ALL=(ALL) ALL

gibt man dem user "arbeitsuser1" vollen zugriff. wenn man dem arbeitsuser1 jedoch nur erlauben will ein einziges script zu starten oä. benutzt man volgenen "code":

arbeitsuser1 ALL = (ALL) /root/./script start

es wird dem arbeitsuser1 erlaubt ein script des root users zu starten welches sich in dem root verzeichnis befindet.

(3)
der direkte root login sollte verboten werden. es reicht wenn man sich über einen anderen user die root rechte geben lässt. z.b mit dem befehl:

su

den direkten root login kann man unter debian in der /etc/ssh/sshd_config konfigurieren. dazu gibt man folgendes in die konsole ein:

nano /etc/ssh/sshd_config

dort sieht man eine konfiguration wie "PermitRootLogin yes" was man auf "PermitRootLogin no" ändern sollte. mit F3 speichert man die datei. und mit F2 kehrt man zur konsole zurück.
nun muss man ssh neustarten. man sollte bevor man dieses tut eien arbeitsuser angelegt haben.um ssh neuzustarten gibt man unter debian folgendes in der console ein:

/etc/init.d/sshd restart

jetzt testet man ob der root sich wirklich nicht mehr direkt einlogen kann.
wenn keine verbindung zustande kommt hat man alles richtig gemacht.
jetzt mit dem arbeitsuser testen. wenn wenn dies funktioniert ist wieder alles richtig. und jetzt mit dem befehl:

su

root rechte bekommen.


(4)
port knocking heißt so viel das der port dauerhaft blockiert ist... also portscans listen den port nicht auf... da er ja geschlossen ist. und portknocking benutzt man um den z.b ssh port wieder freizugeben und das gezielt für eine ip die dieses angefordert hat. installieren tut man das unter debian mit:

apt-get install knockd

jetzt muss knockd konfiguriert werden mit:

nano /etc/knockd.conf

meine konfigurations datei ähnelt diesem code:

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

es kann ein signal zum öffnen des ports für eine bestimmte ip gesendet werden und zum schließen des ports für eine ip.

der port wird geöffnet mit:

knock IP 111 222 333

und geschlossen mit:

knock IP 444 555 666

jetzt kann man das ganze testen. dazu gibt man in der console ein:

knockd --debug --verbose

knockd startet nun im test modus.

den windows klienten zum anklopfen kann man downloaden unter:

http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki

damit klopft man nun erstmal am server an. in der konsole kann man dann sehen ob der befehl korrekt funktioniert wenn man anklopft. kontrollieren kann man dies in dem mal eine 2. console öffnet und zum root user wird und dann iptables auflistet mit:

iptables -L

wenn dort ein eintrag erscheint mit der eigenen ip das der port freigeschaltet wurde ist alles richtig gemacht worden. jetzt das gleiche mit dem schließen des ports testen.

knockd daeurhaft anschalten kann man in der konfigurationsdatei wenn man dieses in der konsole eingibt:

nano /etc/default/knockd

und stat einer 0 eine 1 schreibt.

jetzt kann man knockd unter debian starten mit:

/etc/init.d/knockd start

(4.1)
bei einer firewall sollte man grundsätzlich alles blocken und nur was man wirklich braucht erlauben. um eine iptables firewall zu erstellen gibt man folgendes ein:

nano ports.conf

hier gibt man die ports an die man wirklich benötigt. z.b eine beispiel konfiguration:

80
8080
20:21
22
25
67:68
110
143
443
1812
1813
2401
6000:6015
137:139


die ports müssen untereinander angegeben werden. und bei portranges trennt man den portbereich mit einem doppelpunkt.

jetzt die eingene firewall erstellen mit:

nano firewall

und folgendes hinein kopieren:

Code:
#!/bin/bash

test -f $iptables || exit 0

case "$1" in
  start)

    echo "Starte IP-Paketfilter"

    interface="eth1"
    lan="eth0"
    gateway="192.168.1.1"
    network="192.168.1.0/24"
    network2="10.0.0.0/24"
    broadcast="192.168.1.255"
    nameserver="192.168.1.1"

    # iptables-Modul
    modprobe ip_tables

    # Connection-Tracking-Module
    modprobe ip_conntrack

    # Das Modul ip_conntrack_irc ist erst bei Kerneln >= 2.4.19 verfuegbar
    modprobe ip_conntrack_irc
    modprobe ip_conntrack_ftp

    # filter table module
    modprobe iptable_filter

    # mangle table module
    modprobe iptable_mangle

    # nat table module
    modprobe iptable_nat

    # LOG target module
    modprobe ipt_LOG

    # This is used to limit the number of packets per sec/min/hr
    modprobe ipt_limit

    # masquerade target module
    modprobe ipt_MASQUERADE

    # filter using owner as part of the match
    modprobe ipt_owner

    # REJECT target drops the packet and returns an ICMP response.
    # The response is configurable.  By default, connection refused.
    modprobe ipt_REJECT

    # This target allows packets to be marked in the mangle table
    modprobe ipt_mark

    # This target affects the TCP MSS
    modprobe ipt_tcpmss


    # This match checks against the TCP flags
    modprobe ipt_state

    # The ftp nat module is required for non-PASV ftp support
    modprobe ip_nat_ftp

    # Tabelle flushen
    iptables -F
    iptables -t nat -F
    iptables -t mangle -F
    iptables -X
    iptables -t nat -X
    iptables -t mangle -X

    # Default-Policies setzen
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP
    iptables -t nat -P PREROUTING ACCEPT
    iptables -t nat -P POSTROUTING ACCEPT
    iptables -t nat -P OUTPUT ACCEPT
    iptables -t mangle -P PREROUTING ACCEPT
    iptables -t mangle -P OUTPUT ACCEPT

    # Loopback-Netzwerk-Kommunikation und LAN zulassen
    iptables -A INPUT -i lo -s 0/0 -d 0/0 -j ACCEPT
    iptables -A OUTPUT -o lo -s 0/0 -d 0/0 -j ACCEPT
    
    # gateway
    iptables -A POSTROUTING -t nat -o $interface -j MASQUERADE
    iptables -A FORWARD -i $lan -o $interface -m state --state ESTABLISHED -j ACCEPT
    iptables -A FORWARD -i $interface -o $lan -m state --state ESTABLISHED -j ACCEPT
    iptables -A INPUT -i $lan -s $network -j ACCEPT
    iptables -A OUTPUT -o $lan -d $network -j ACCEPT
    iptables -A INPUT -i $lan -s $network2 -j ACCEPT
    iptables -A OUTPUT -o $lan -d $network2 -j ACCEPT
    #iptables -A INPUT -i $interface -s $network -d $network -j ACCEPT
    #iptables -A OUTPUT -o $interface -s $network -d $network -j ACCEPT
    iptables -A INPUT -p tcp ! --syn -s $nameserver -d 0/0 -j ACCEPT
    iptables -A INPUT -p udp -s $nameserver -d 0/0 -j ACCEPT
    iptables -A OUTPUT -p tcp -s $network -d $nameserver --dport 53 -j ACCEPT
    iptables -A OUTPUT -p udp -s $network -d $nameserver --dport 53 -j ACCEPT

    # Korrupte Pakete zurückweisen
    iptables -A INPUT -m state --state INVALID -j DROP
    iptables -A OUTPUT -m state --state INVALID -j DROP

    # falsche gesendete pakete    
    iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP
    iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "Bad Packets:"
    iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
    iptables -A INPUT -i $interface -d 224.0.0.0/8 -j DROP

    # ip spoofing verhindern
    iptables -A INPUT -i $interface -s 127.0.0.0/8 -j DROP

    #syn Flood Schutz
    iptables -N syn-flood
    iptables -A INPUT -p tcp --syn -j syn-flood
    iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j DROP
    iptables -A syn-flood -j LOG --log-prefix "SYN FLOOD " --log-level info
    iptables -A syn-flood -j DROP

    #verstohlener portscanner
    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

    #TCP-SYN-Pakete ohne Status NEW droppen
    iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

    #Portscanner ausschalten
    iptables -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 1/h -j ACCEPT 
    iptables -A INPUT -p tcp --tcp-flags ALL ALL -m limit --limit 1/h -j ACCEPT

    # ping
    iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
    iptables -A INPUT -p icmp -j DROP
    iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A OUTPUT -p icmp -j DROP

    # Setzt die MMS (Maximum Segment Size) auf weniger 40Bytes für SYN,RST SYN Packete
    iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

    if [ -f ports.conf ]; then
    for port in `cat ports.conf`
    do
    if [ "$port" != "" ]
    then
    iptables -A INPUT -p tcp --sport $port -m state --state NEW -j ACCEPT
    iptables -A INPUT -p udp --sport $port -m state --state NEW -j ACCEPT
    iptables -A OUTPUT -p tcp --dport $port -m state --state NEW -j ACCEPT
    iptables -A OUTPUT -p udp --dport $port -m state --state NEW -j ACCEPT
    fi
    done
    fi

    if [ -f blacklist.conf ]; then
    for badip in `cat blacklist.conf`
    do
    if [ "$badip" != "" ]
    then
    iptables -A INPUT -d $badip -s $badip -j DROP
    iptables -A OUTPUT -d $badip -s $badip -j DROP
    fi
    done
    fi
   
    #maximal 4 verbindungen erlauben
    iptables -A INPUT -i $interface -p ALL -j LOG --log-prefix "Access Limit" --log-level 6 -m limit --limit 4/m
    iptables -A INPUT -i $interface -p ALL -m limit --limit 4/m -j DROP

    # max. 8 neue Verbindungen in 5 Sekunden pro Quelladresse erlauben
    iptables -A INPUT -p ALL -i $interface -m state --state NEW -m recent --set
    iptables -A INPUT -p ALL -i $interface -m state --state NEW -m recent --update --seconds 5 --hitcount 8 -j DROP
    
    # broadcast blocken
    iptables -A INPUT -i $interface -d 255.255.255.255 -j DROP
    iptables -A INPUT -i $lan -d 255.255.255.255 -j DROP
    iptables -A INPUT -s 255.255.255.255 -j DROP

    # Connection-Tracking aktivieren
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
    # 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

    # 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

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

    # TCP-FIN-Timeout zum Schutz vor DoS-Attacken setzen
    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
    echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

    # 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

    # BOOTP-Relaying ausschalten
    echo 0 > /proc/sys/net/ipv4/conf/all/bootp_relay
    ;;

  stop)

    echo "Stoppe IP-Paketfilter"

    # Tabelle flushen
    iptables -F
    iptables -t nat -F
    iptables -t mangle -F
    iptables -X
    iptables -t nat -X
    iptables -t mangle -X

    # Default-Policies setzen
    iptables -P INPUT ACCEPT
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -t nat -P PREROUTING ACCEPT
    iptables -t nat -P POSTROUTING ACCEPT
    iptables -t nat -P OUTPUT ACCEPT
    iptables -t mangle -P PREROUTING ACCEPT
    iptables -t mangle -P OUTPUT ACCEPT

    ;;

  status)
    echo "Tabelle filter"
    iptables -L -vn

    echo "Tabelle nat"
    iptables -t nat -L -vn

    echo "Tabelle mangle"
    iptables -t mangle -L -vn

    ;;

   testing)

      echo "Testing..."
      $0 start
      sleep 180
      $0 stop

      ;;

  *)

    echo "Fehlerhafter Aufruf"
    echo "Syntax: ./firewall {start|stop|testing|status}"

    exit 1

    ;;



esac
jetzt dem script die benötigten rechte geben mit:

chmod 1777 firewall

jetzt screen installieren unter debian mit:

apt-get install screen

jetzt die firewall testen in dem man screen startet mit:

screen

dort bestätigt man mit enter ung gibt ein:

./firewall testing

weiterlaufen kann screen im hintergrund mit:

strg+a d

für 60 sekunden wird die firewall gestartet. danach wird sie wieder beendet.

jetzt sollte man nochmal knockd testen ob es nocht funktioniert... was es sollte.

wenn alles funktioniert kann man screen beenden mit:

screen -r
strg+a K

und die firewall starten mit:

./firewall start

(5)
das system kann man unter debian linux sehr einfach updaten. als root user:

apt-get update
apt-get upgrade


(6)
infos die einem eventuell helfen etwas zu hacken sollten vermieden werden. z.b wenn man ein verzeichnis falsch angibt erscheint einem meistens eine fehlermeldung error 400 oder error 402 oä... errors.. je nach dem was man falsch eingebene hat oder falsche geconft wurde...
darunter steht aber meistens leider das isntallierte betriebssystem und die installierten module... bzw der installierte webserver(apache...)

um solche informationen zurück zu halten gibt man in der konsole forgendes ein:

nano /etc/apache2/apache2.conf

dort ist die konfiguration des webservers. jetzt nach der zeile suchen:

ServerTokens All

und in

ServerTokens Prod

ändern.
außerdem
nach der zeile suchen:

ServerSignature on

und diese zeile mit:

ServerSignature Off

ersezten.

jetzt noch dne apache server neustarten mit:

/etc/init.d/apache2 restart