Vermeidung von SSH Dictionary Attacks mit DenyHosts - Seite 2


Pass auf, dass Du SECURE_LOG und LOCK_FILE den richtigen Werten Deiner Distribution zuweist! Bei Debian sind es diese:
SECURE_LOG = /var/log/auth.log
LOCK_FILE = /var/run/denyhosts.pid

Da DenyHosts als Daemon ausgeführt werden soll, benötigen wir das Daemon Kontroll-Skript /usr/share/denyhosts/daemon-control. Again, we can use the sample script /usr/share/denyhosts/daemon-control-dist um die benötigte Datei zu erstellen:
cp daemon-control-dist daemon-control
Bearbeite /usr/share/denyhosts/daemon-control und pass auf, dass Du die korrkten Werte für DENYHOSTS_BIN, DENYHOSTS_LOCK und DENYHOSTS_CFG einstellst. Bei Debian sind es diese:
DENYHOSTS_BIN = "/usr/bin/denyhosts.py"
DENYHOSTS_LOCK = "/var/run/denyhosts.pid"
DENYHOSTS_CFG = "/usr/share/denyhosts/denyhosts.cfg"

Meine /usr/share/denyhosts/daemon-control Datei sieht wie folgt aus:
#!/usr/bin/env python
# denyhosts Bring up/down the DenyHosts daemon # # chkconfig: 2345 98 02 # description: Activates/Deactivates the # DenyHosts daemon to block ssh attempts # ############################################### ############################################### #### Edit these to suit your configuration #### ############################################### DENYHOSTS_BIN = "/usr/bin/denyhosts.py" DENYHOSTS_LOCK = "/var/run/denyhosts.pid" DENYHOSTS_CFG = "/usr/share/denyhosts/denyhosts.cfg" ############################################### #### Do not edit below #### ############################################### import os, sys, signal, time STATE_NOT_RUNNING = -1 STATE_LOCK_EXISTS = -2 def usage(): print "Usage: %s {start [args...] | stop | restart [args...] | status | debug | condrestart [args...] }" % sys.argv[0] print print "For a list of valid 'args' refer to:" print "$ denyhosts.py --help" print sys.exit(0) def getpid(): try: fp = open(DENYHOSTS_LOCK, "r") pid = int(fp.readline().rstrip()) fp.close() except Exception, e: return STATE_NOT_RUNNING if os.access(os.path.join("/proc", str(pid)), os.F_OK): return pid else: return STATE_LOCK_EXISTS def start(*args): cmd = "%s --daemon " % DENYHOSTS_BIN if args: cmd += ' '.join(args) print "starting DenyHosts: ", cmd os.system(cmd) def stop(): pid = getpid() if pid >= 0: os.kill(pid, signal.SIGTERM) print "sent DenyHosts SIGTERM" else: print "DenyHosts is not running" def debug(): pid = getpid() if pid >= 0: os.kill(pid, signal.SIGUSR1) print "sent DenyHosts SIGUSR1" else: print "DenyHosts is not running" def status(): pid = getpid() if pid == STATE_LOCK_EXISTS: print "%s exists but DenyHosts is not running" % DENYHOSTS_LOCK elif pid == STATE_NOT_RUNNING: print "Denyhosts is not running" else: print "DenyHosts is running with pid = %d" % pid def condrestart(*args): pid = getpid() if pid >= 0: restart(*args) def restart(*args): stop() time.sleep(1) start(*args) if __name__ == '__main__': cases = {'start': start, 'stop': stop, 'debug': debug, 'status': status, 'condrestart': condrestart, 'restart': restart} try: args = sys.argv[2:] except: args = [] try: option = sys.argv[1] if option in ('start', 'restart', 'condrestart'): if '--config' not in args and '-c' not in args: args.append("--config=%s" % DENYHOSTS_CFG) cmd = cases[option] apply(cmd, args) except: usage()
Als Nächstes müssen wir veranlassen, dass diese Datei ausführbar wird:
chown root daemon-control
chmod 700 daemon-control

Danach erstellen wir die System Bootup Links für DenyHosts, damit es automatisch gestartet wird wenn das System hochfährt:
cd /etc/init.d
ln -s /usr/share/denyhosts/daemon-control denyhosts
update-rc.d denyhosts defaults

Letztendlich starten wir DenyHosts:
/etc/init.d/denyhosts start
DenyHosts loggt auf /var/log/denyhosts, falls Du an den Logs interessiert bist. Der SSH Daemon loggt auf /var/log/auth.log auf Debian. Du kannst beide Logs überwachen und versuchen, Dich mit einem ungültigen Benutzer oder mit einem gültigen Benutzer aber ungültigen Passwort, etc. via SSH anzumelden und beobachten was passiert. Nachdem Du den Grenzwert ungültiger Login-Versuche überschritten hast, sollte die IP Adresse, von der aus Du versucht hast Dich zu verbinden, in /etc/hosts.deny wie folgt aufgelistet werden:
# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.
# See the manual pages hosts_access(5), hosts_options(5) # and /usr/doc/netbase/portmapper.txt.gz # # Example: ALL: some.host.name, .some.domain # ALL EXCEPT in.fingerd: other.host.name, .other.domain # # If you're going to protect the portmapper use the name "portmap" for the # daemon name. Remember that you can only use the keyword "ALL" and IP # addresses (NOT host or domain names) for the portmapper. See portmap(8) # and /usr/doc/portmap/portmapper.txt.gz for further information. # # The PARANOID wildcard matches any host whose name does not match its # address. # You may wish to enable this to ensure any programs that don't # validate looked up hostnames still leave understandable logs. In past # versions of Debian this has been the default. # ALL: PARANOID sshd: 192.168.0.203
Das bedeutet, dass sich das System mit der IP Adresse 192.168.0.203 nicht mehr über SSH verbinden kann.
Du kannst festlegen, ob/wenn IP Adressen wieder aus /etc/hosts.deny entfernt werden sollen - sieh Dir die PURGE_DENY Variable in /usr/share/denyhosts/denyhosts.cfg an. Du musst DenyHosts wie folgt mit der --purge Option starten, damit die PURGE_DENY Variable in Kraft treten kann:
/etc/init.d/denyhosts start --purge
Du kannst IP Adressen aber auch manuell entfernen. Sobald diese entfernt sind, können diese IP Adressen versuchen, sich erneut via SSH einzuloggen.
Links

0 Kommentar(e)

Zum Posten von Kommentaren bitte