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