SSH server hardening / Bruteforce / Logging / Mail notifications

@theSplit, mit Portknocking meinte ich dass was rexcolo zeigt.
Damit kannst du Ports verstecken, erst nachdem eine bestimmte Serie an Ports "abgeklopft" wird, wird der eigentliche Port geöffnet.
 
  • Thread Starter Thread Starter
  • #22
Guten Morgen,

wenn ich das Konzept "Portknocking" richtig auffasse, wird der "eigentliche" Dienstport erst freigeschaltet bzw. aktiv gesetzt, wenn auf anderen Traffic/eine Anfrage gekommen ist, quasi als Legitimation vor dem Freischalten des eigentlichen Dienstes? *kopfkratz*
 
Ja, wie eine art Pin-Code über Ports.
aber das macht die Config halt echt wieder kompliziert und fehleranfällig.

Du machst z.B. bei dir ein script das per telnet port 5, 99,12, 13 im Abstand von jeweils einer Sekunde verbindet und trennt.
Danach ist dann Port 22 plötzlich für 30s online....
 
Ist die Frage ob das ein guter Tradeoff ist, wenn man jetzt nicht routinemäßig Server konfiguriert und ob es nicht wenn schon dann reicht einfach SSH auf einem höheren Port lauschen zu lassen..
 
Ich hatte vor einigen Jahren folgendes kleines Skriptpaket am Laufen:

firewall.conf
[src=perl]
#! /usr/bin/perl
$enableFirewall = 1;
[/src]
rcfirewall
[src=bash]
#! /bin/sh

FIREWALL="/usr/sbin/iptables"

LOGFILE="/etc/firewall/updateFirewall.log"
DATAFILE="/etc/firewall/updateFirewall.data"
CONFFILE="/etc/firewall/firewall.conf"

UPDATESCRIPT="/etc/firewall/updatefirewall"

##################################################################################
##################################################################################
# KONFIGURATION:
##################################################################################
# Je nach Bedarf, die entsprechenden Zeilen (aus) kommentieren bzw. eigene hinzufügen
#
# GGF Pfade zu FIREWALL, LOGFILE, DATAFILE, CONFFILE und UPDATESCRIPT anpassen
# Ich rate aber, die Files einfach unter /etc/firewall abzulegen
# Files ausführbar machen nicht vergessen
##################################################################################
##################################################################################

case "$1" in
start)
echo "Enable Firewall"

###########################################################
# global DROP rule
###########################################################
$FIREWALL -P INPUT DROP

###########################################################
# Allow all on Loopback Device
###########################################################
$FIREWALL -A INPUT -i lo -j ACCEPT

###########################################################
# Allow icmp
###########################################################
$FIREWALL -A INPUT -i eth0 -p icmp -j ACCEPT

###########################################################
# Download-Server
###########################################################
#$FIREWALL -A INPUT -i eth0 -s 127.0.0.1 -j ACCEPT

###########################################################
# SSH - Accept from I-net
###########################################################
$FIREWALL -A INPUT -i eth0 -p tcp -s 127.0.0.1 --dport ssh -j ACCEPT #BACKUP IP-> hat immer Zugriff


###########################################################
# Domain - Server
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport domain -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport domain -j ACCEPT

###########################################################
#PING
###########################################################


###########################################################
# Mail - Server (POP - SMTP - IMAP)
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport smtp -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport pop3 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport pop2 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport imap -j ACCEPT

###########################################################
# Web - Server
###########################################################
$FIREWALL -A INPUT -i eth0 -p tcp --dport http -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport https -j ACCEPT

###########################################################
# IRC
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 6667 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 6667 -j ACCEPT

##########################################################
# FTP
###########################################################
$FIREWALL -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
$FIREWALL -A INPUT -i eth0 -p udp --dport 21 -j ACCEPT

###########################################################
# Teamspeak
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 8767 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 8767 -j ACCEPT

# $FIREWALL -A INPUT -i eth0 -p tcp --dport 14534 -j ACCEPT

# $FIREWALL -A INPUT -i eth0 -p tcp --dport 51234 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 51234 -j ACCEPT

###########################################################
# GAMESERVER
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 27960 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 27960 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 27733 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 27733 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 27964 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 27964 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 27970 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 27970 -j ACCEPT

###########################################################
# WEBMIN
###########################################################

# $FIREWALL -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 10000 -j ACCEPT

###########################################################
# Antwortpakete generell erlauben
###########################################################
$FIREWALL -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

###########################################################
# Logging
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 23:65535 -j LOG
# $FIREWALL -A INPUT -i eth0 -p udp --dport 23:65535 -j LOG


###########################################################
# Start updateFirewall all 5 minutes
###########################################################
echo "#! /usr/bin/perl" > $CONFFILE;
echo "\$enableFirewall = 1;" >> $CONFFILE;
# echo "1" >> $CONFFILE;

$UPDATESCRIPT;
;;
stop)
echo "Disable Firewall"

# If File exists
[ -f $DATAFILE ] && rm $DATAFILE
echo "#! /usr/bin/perl" > $CONFFILE;
echo "\$enableFirewall = 0;" >> $CONFFILE;
# echo "1" >> $CONFFILE;

$FIREWALL -F INPUT
$FIREWALL -F OUTPUT
$FIREWALL -F FORWARD
$FIREWALL -P INPUT ACCEPT

;;
status)
$FIREWALL -L -n
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage ( start | stop | status | restart )"
;;
esac

[/src]
updatefirewall
[src=perl]
#! /usr/bin/perl
require '/etc/firewall/firewall.conf';

$iptables_bin = "/usr/sbin/iptables";
$dataFile = "/etc/firewall/updateFirewall.data";
$logFile = "/etc/firewall/updateFirewall.log";


#
#Hier können DynDNS Adressen eingefügt werden, denen
#Zugang zum ssh gewährt wird
#Diese Datei per Cron ausführen (z.b. alle 5 Minuten)
#
#Beim Ausführen werden die in @URL gelisteten DynDNS Addis in iptable aufgenommen
#
#
##################################################################################
# KONFIGURATION:
##################################################################################
# DYNDNSADDI1 bis 4 mit validen DynDNS Adressen ersetzen
# AllowedUser1 bis 4 mit griffigen Usernamen ersetzen
# GGF Pfade zu FIREWALL, LOGFILE, DATAFILE, CONFFILE und UPDATESCRIPT anpassen
# Ich rate aber, die Files einfach unter /etc/firewall abzulegen
# Files ausführbar machen nicht vergessen
##################################################################################





@URL = ( "/bin/ping -c 1 -w 1 DYNDNSADDI1 |" ,
"/bin/ping -c 1 -w 1 DYNDNSADDI2 |",
"/bin/ping -c 1 -w 1 DYNDNSADDI3 |",
"/bin/ping -c 1 -w 1 DYNDNSADDI4 |" );

@ENV = ( "AllowedUser1", "AllowedUser2" ,"AllowedUser3", "AllowedUser4");



# -----------------------------------------------------------------
# Ab hier nichts mehr aendern
# -----------------------------------------------------------------


sub RemoveRule
{
# open(OUTFILE, ">>$logFile") or die print "error with logfile\n";

# printf OUTFILE "Remove Rule for User: $user[$i] with IP: $data[$i]\n";

open(INFILE, "$iptables_bin -D INPUT -i eth0 -s $data[$i]/32 -p tcp --dport ssh -j ACCEPT |") or die printf OUTFILE "error with iptables\n";
close(INFILE);

# close(OUTFILE);

}

sub AddRule
{
# open(OUTFILE, ">>$logFile") or die print "error with logfile\n";

# printf OUTFILE "Add Rule for User: $user[$i] with IP: $data[$i]\n";

open(INFILE, "$iptables_bin -A INPUT -i eth0 -s $data[$i]/32 -p tcp --dport ssh -j ACCEPT |") or die printf OUTFILE "error with iptables\n";
close(INFILE);

# close(OUTFILE);
}

sub updateDataFile
{
open(OUTFILE, ">$dataFile") or die "Cant createFile\n";

for ($a=0; $a<$counter; $a++)
{
printf OUTFILE "$user[$a] : $data[$a]\n";
}
close(OUTFILE);

}


sub CheckFirewall
{
$changes = 0;
for ($i=0; $i<$counter; $i++)
{
if ($data[$i] ne $ip[$i])
{
$changes = 1;
RemoveRule;
$data[$i] = $ip[$i];
AddRule;
}
}

if ($changes == 1)
{
updateDataFile;
}
}


sub ReadLog
{
open(INFILE, "<$dataFile") or die "File not Found!\n";
@FILE = <INFILE>;
close(INFILE);

$counter = 0;

foreach $line (@FILE)
{
chomp($line);
@DATA = split( / : /, $line);

$user[$counter] = $DATA[0];
$data[$counter] = $DATA[1];

$counter++;
}

CheckFirewall;
}


if (!(-e $dataFile))
{
open(OUTFILE, ">$dataFile") or die "Cant create File\n";
foreach $line (@ENV)
{
printf OUTFILE "$line : 0.0.0.0\n";
}
close(OUTFILE);
}

$index = -1;

foreach $url (@URL)
{
open(INFILE, $url) or die "File not Found!\n";
$line = <INFILE>;
close(INFILE);

if ($line =~ /.* \([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\) .*/)
{
$index++;

@fields = split( / \(/ , $line);
@IP = split( /\) / , $fields[1]);

$ip[$index] = $IP[0];
}
else
{
print "No IP found";
}
}

if ($enableFirewall > 0)
{
if ($index > 0)
{
ReadLog;
}
}
else
{
}




[/src]
updateFirewall.data --> leere Datei (vorerst)

updatefirewall wurde als Cronjob alle 5 Minuten abgefeuert
 
Zurück
Oben