Ten blog nie jest już rozwijany. Wraz ze wszystkimi artykułami zostały przeniesiony pod adres wmroczkowski.pl

Czy chcesz przejść pod nowy adres?

czwartek, 3 lipca 2008

DenyHosts, czyli jeszcze bezpieczniejsze SSH

Witam po długiej przerwie. Kto by pomyślał, że to będzie taki pracowity okres… Przejdźmy do rzeczy: ostatnimi czasy poświęcam więcej czasu systemowi o wiele znaczącej nazwie jaką jest Linux. Moje ostatnie plany „zmusiły” mnie do postawienia serwera na Debianie i jak się okazało sprawiło mi to wiele frajdy. Wszystko wspaniale działa – mysql, PHP, samba i rzecz, która była mi niezbędna do pracy – SSH. Po pewnym czasie zauważyłem, że na moim serwerze generuje się dziwny ruch – możemy to zobaczyć wpisując jako root następującą komendę:
cat /var/log/auth.log |grep invalid

Wynik będzie prawdopodobnie podobny do tego poniżej tylko, że znacznie duższy.

Jul 3 20:59:49 debian-serwer sshd[9627]: Failed password for invalid user alex from 193.218.155.219 port 36407 ssh2
Jul 3 20:59:52 debian-serwer sshd[9629]: Failed password for invalid user brett from 193.218.155.219 port 36504 ssh2
Jul 3 20:59:54 debian-serwer sshd[9631]: Failed password for invalid user mike from 193.218.155.219 port 37059 ssh2
Jul 3 20:59:57 debian-serwer sshd[9633]: Failed password for invalid user alan from 193.218.155.219 port 37120 ssh2
Jul 3 20:59:59 debian-serwer sshd[9635]: Failed password for invalid user data from 193.218.155.219 port 37707 ssh2
Jul 3 21:00:04 debian-serwer sshd[9639]: Failed password for invalid user http from 193.218.155.219 port 37879 ssh2
Jul 3 21:00:06 debian-serwer sshd[9641]: Failed password for invalid user httpd from 193.218.155.219 port 39878 ssh2
Jul 3 21:00:16 debian-serwer sshd[9649]: Failed password for invalid user info from 193.218.155.219 port 43904 ssh2
Jul 3 21:00:18 debian-serwer sshd[9651]: Failed password for invalid user shop from 193.218.155.219 port 44402 ssh2
Jul 3 21:00:21 debian-serwer sshd[9653]: Failed password for invalid user sales from 193.218.155.219 port 45696 ssh2
Jul 3 21:00:23 debian-serwer sshd[9655]: Failed password for invalid user web from 193.218.155.219 port 46620 ssh2
Jul 3 21:00:26 debian-serwer sshd[9657]: Failed password for invalid user www from 193.218.155.219 port 47784 ssh2
Jul 3 21:00:28 debian-serwer sshd[9659]: Failed password for invalid user wwwrun from 193.218.155.219 port 48591 ssh2
Jul 3 21:00:31 debian-serwer sshd[9661]: Failed password for invalid user adam from 193.218.155.219 port 49459 ssh2
Jul 3 21:00:33 debian-serwer sshd[9663]: Failed password for invalid user stephen from 193.218.155.219 port 50373 ssh2
Jul 3 21:00:35 debian-serwer sshd[9665]: Failed password for invalid user richard from 193.218.155.219 port 51208 ssh2
Jul 3 21:00:38 debian-serwer sshd[9667]: Failed password for invalid user george from 193.218.155.219 port 51476 ssh2
Jul 3 21:00:40 debian-serwer sshd[9669]: Failed password for invalid user michael from 193.218.155.219 port 52192 ssh2
Jul 3 21:00:43 debian-serwer sshd[9671]: Failed password for invalid user john from 193.218.155.219 port 52903 ssh2
Jul 3 21:00:46 debian-serwer sshd[9673]: Failed password for invalid user david from 193.218.155.219 port 53839 ssh2
Jul 3 21:00:48 debian-serwer sshd[9675]: Failed password for invalid user paul from 193.218.155.219 port 54252 ssh2
Jul 3 21:00:53 debian-serwer sshd[9679]: Failed password for invalid user angel from 193.218.155.219 port 55321 ssh2
Jul 3 21:00:58 debian-serwer sshd[9683]: Failed password for invalid user pgsql from 193.218.155.219 port 56702 ssh2
Jul 3 21:01:01 debian-serwer sshd[9685]: Failed password for invalid user pgsql from 193.218.155.219 port 57653 ssh2
Jul 3 21:01:06 debian-serwer sshd[9689]: Failed password for invalid user adm from 193.218.155.219 port 58824 ssh2
Jul 3 21:01:09 debian-serwer sshd[9691]: Failed password for invalid user ident from 193.218.155.219 port 59109 ssh2
Jul 3 21:01:11 debian-serwer sshd[9693]: Failed password for invalid user resin from 193.218.155.219 port 60094 ssh2

Interesujące, prawda? Są to boty, które przeszukują sieć w poszukiwaniu dziur w zabezpieczeniach. Jeżeli im się uda – mamy kolejne zoombie w necie. Proszę zauważyć, że w tym przypadku wszystkie próby pochodzą z jednego adresu. Można to zrobić ręcznie i po prostu zablokować takie ip na firewallu ale to działa tylko na chwilę, takich adresów jest naprawdę wiele, przynajmniej kilka dziennie, więc to by była syzyfowa praca. Tutaj z pomocą przychodzi nam program o nazwie DenyHosts pobierz.
To jest bardzo prosty program ale jego funkcjonalność wydaję się nieoceniona – blokuje wszystkie takie ataki wg ustawionych kryteriów, powiadamia nas o tym na maila oraz wysyła adres agresora na swój serwer i tam uaktualnia ogólną bazę danych zbanowanych adresów, które każdy klient blokuje również u siebie. Obecnie z DenyHosts korzysta 6800 klientów, więc została utworzona już całkiem pokaźna baza. Przy uaktualnianiu cogodzinnym do naszej listy banów dodaje się kilkadziesiąt nowych adresów. Po poprawnej konfiguracji takie ataki stają się naprawdę sporadyczne.
A teraz do rzeczy – jak to się robi?
1. A więc zaczynamy standardowo, czyli od instalacji programu:
sudo apt-get install denyhosts
2. Program jest już defaultowo skonfigurowany i uruchamia się już po instalacji ale my chcemy trochę usprawnić jego pracę. Edytujemy plik konfiguracyjny:
sudo nano /etc/denyhosts.conf
3. Zabieramy się do edycji. Pierwsze sekcje pomijamy bo nas za bardzo nie interesują, dotyczą rozmieszczenia plików z logami itp. Kolejna sekcja wygląda następująco:

########################################################################
#
# PURGE_DENY: removed HOSTS_DENY entries that are older than this time
# when DenyHosts is invoked with the --purge flag
#
# format is: i[dhwmy]
# Where 'i' is an integer (eg. 7)
# 'm' = minutes
# 'h' = hours
# 'd' = days
# 'w' = weeks
# 'y' = years
#
# never purge:
PURGE_DENY =
#
# purge entries older than 1 week
#PURGE_DENY = 1w
#
# purge entries older than 5 days
#PURGE_DENY = 5d
#######################################################################

Tutaj ustawiamy po jakim czasie adres ma być usuwany z naszej listy zbanowanych adresów. Defaultowo j PURGE_DENY jest bez parametrów co oznacza, że adresy nie będą w ogóle usuwany - tak zostawiamy.


#######################################################################
#
# BLOCK_SERVICE: the service name that should be blocked in HOSTS_DENY
#
# man 5 hosts_access for details
#
# eg. sshd: 127.0.0.1 # will block sshd logins from 127.0.0.1
#
# To block all services for the offending host:
#BLOCK_SERVICE = ALL
# To block only sshd:
BLOCK_SERVICE = sshd
# To only record the offending host and nothing else (if using
# an auxilary file to list the hosts). Refer to:
# http://denyhosts.sourceforge.net/faq.html#aux
#BLOCK_SERVICE =
#
#######################################################################

Tutaj ustawiamy dla których usług ma być blokowany dany adres. Standardowo jest ustawione blokowanie na wszsytkie usługi - tutaj również tak zostawiamy.


#######################################################################
#
# DENY_THRESHOLD_INVALID: block each host after the number of failed login
# attempts has exceeded this value. This value applies to invalid
# user login attempts (eg. non-existent user accounts)
#
DENY_THRESHOLD_INVALID = 5
#
#######################################################################

W tym miejscu ustawiamy po ilu nieudanych próbach adres będzie blokowany dla kont których nie ma w /etc/passwd . Przeważnie dotyczy to ataków słowników. Sądze, że my znamy własny login, więc można to spokojnie zmniejszyć do 2 prób.


#######################################################################
#
# DENY_THRESHOLD_VALID: block each host after the number of failed
# login attempts has exceeded this value. This value applies to valid
# user login attempts (eg. user accounts that exist in /etc/passwd) except
# for the "root" user
#
DENY_THRESHOLD_VALID = 10
#
#######################################################################

Ta reguła dotyczy prób logowania na istniejące konta. Radzę zachować tutaj ostrożność - my też możemy się pomylić lub zapomnieć hasła. 7-8 prób będzie to optymalną wartością.


#######################################################################
#
# DENY_THRESHOLD_ROOT: block each host after the number of failed
# login attempts has exceeded this value. This value applies to
# "root" user login attempts only.
#
DENY_THRESHOLD_ROOT = 1
#
#######################################################################

Powyższa opcja od razu blokuje próbę logowania jako root.


#######################################################################
#
# DENY_THRESHOLD_RESTRICTED: block each host after the number of failed
# login attempts has exceeded this value. This value applies to
# usernames that appear in the WORK_DIR/restricted-usernames file only.
#
DENY_THRESHOLD_RESTRICTED = 1
#
#######################################################################

Ta opcja blokuje wszystkie próby użycia loginu, który jest wymieniony w pliku restricted-usernames.


#######################################################################
#
# SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS
#
# SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES|NO
# If set to YES, if a suspicious login attempt results from an allowed-host
# then it is considered suspicious. If this is NO, then suspicious logins
# from allowed-hosts will not be reported. All suspicious logins from
# ip addresses that are not in allowed-hosts will always be reported.
#
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
######################################################################

Tutaj powinniśmy mieć YES. Program monitoruje wtedy raporty DenyHosts w celu odnalazienia podejrzanych logowań lub odnajduje wpisy, które nie są przydatne.


######################################################################
#
# HOSTNAME_LOOKUP
#
# HOSTNAME_LOOKUP=YES|NO
# If set to YES, for each IP address that is reported by Denyhosts,
# the corresponding hostname will be looked up and reported as well
# (if available).
#
HOSTNAME_LOOKUP=YES
#
######################################################################

Jeżeli YES to atakujący host będzie informowany o blokowaniu (o ile to jest możliwe). Jeżeli zależy nam na prędkości proponuje to wyłączyć.


######################################################################
#
# LOCK_FILE
#
# LOCK_FILE=/path/denyhosts
# If this file exists when DenyHosts is run, then DenyHosts will exit
# immediately. Otherwise, this file will be created upon invocation
# and deleted upon exit. This ensures that only one instance is
# running at a time.
#
# Redhat/Fedora:
#LOCK_FILE = /var/lock/subsys/denyhosts
#
# Debian
LOCK_FILE = /var/run/denyhosts.pid
#
# Misc
#LOCK_FILE = /tmp/denyhosts.lock
#
######################################################################

Zabezpieczenie przed urchomieniem dwa razy programu. Usuwamy komentarz przy naszej dystrybucji.


#######################################################################
#
# ADMIN_EMAIL: if you would like to receive emails regarding newly
# restricted hosts and suspicious logins, set this address to
# match your email address. If you do not want to receive these reports
# leave this field blank (or run with the --noemail option)
#
# Multiple email addresses can be delimited by a comma, eg:
# ADMIN_EMAIL = foo@bar.com, bar@foo.com, etc@foobar.com
#
ADMIN_EMAIL = xxx@xxx.pl
#
#######################################################################

#######################################################################
#
# SMTP_HOST and SMTP_PORT: if DenyHosts is configured to email
# reports (see ADMIN_EMAIL) then these settings specify the
# email server address (SMTP_HOST) and the server port (SMTP_PORT)
#
#
SMTP_HOST = localhost
SMTP_PORT = 25
#
#######################################################################

#######################################################################
#
# SMTP_USERNAME and SMTP_PASSWORD: set these parameters if your
# smtp email server requires authentication
#
#SMTP_USERNAME=foo
#SMTP_PASSWORD=bar
#
#####################################################################

W tym miejscu możemy sobie ustawić powiadomienia na adres e-mail. Wszystkie ruchy w logach będą raportowane. Polecam jeżeli ktoś ma skonfigurowany serwer poczty, polecam Postfix. Może w kolejnym poście opiszę konfigurację takiego serwera.


#######################################################################
#
# SMTP_FROM: you can specify the "From:" address in messages sent
# from DenyHosts when it reports thwarted abuse attempts
#
SMTP_FROM = DenyHosts
#
#######################################################################

#######################################################################
#
# SMTP_SUBJECT: you can specify the "Subject:" of messages sent
# by DenyHosts when it reports thwarted abuse attempts
SMTP_SUBJECT = DenyHosts Report
#
######################################################################

######################################################################
#
# SMTP_DATE_FORMAT: specifies the format used for the "Date:" header
# when sending email messages.
#
# for possible values for this parameter refer to: man strftime
#
# the default:
#
#SMTP_DATE_FORMAT = %a, %d %b %Y %H:%M:%S %z
#
######################################################################

Tutaj kolejne ustawienia poczty - ustawiamy nadawacę, temat i format daty.

Kolejne sekcje zostawiamy defaultowo aż do:

#######################################################################
#
# SYNC_SERVER: The central server that communicates with DenyHost
# daemons. Currently, denyhosts.net is the only available server
# however, in the future, it may be possible for organizations to
# install their own server for internal network synchronization
#
# To disable synchronization (the default), do nothing.
#
# To enable synchronization, you must uncomment the following line:
#SYNC_SERVER = http://xmlrpc.denyhosts.net:9911
#
#######################################################################

Tutaj wybieramy czy DenyHosts ma się łączyć z serwerem w celu aktualizacji bazy adresów. Defaultowo wyłączone - proponuję włączyć poprzez usunięcie hasha przy SYNC_SERVER.


#######################################################################
#
# SYNC_INTERVAL: the interval of time to perform synchronizations if
# SYNC_SERVER has been uncommented. The default is 1 hour.
#
#SYNC_INTERVAL = 1h
#
#######################################################################

Wybieramy jak często ma być robiona aktualizacja. Ja mam 1h ale jeżeli nie lubimy jak nasz serwer często się aktualizuje możemy tu ustawić np. 12h.


#######################################################################
#
# SYNC_UPLOAD: allow your DenyHosts daemon to transmit hosts that have
# been denied? This option only applies if SYNC_SERVER has
# been uncommented.
# The default is SYNC_UPLOAD = yes
#
#SYNC_UPLOAD = no
SYNC_UPLOAD = yes
#
#######################################################################

Tutaj wybieramy czy chcemy robić upload naszej bazy zablopkowanych adresów. Proponuje YES.


#######################################################################
#
# SYNC_DOWNLOAD: allow your DenyHosts daemon to receive hosts that have
# been denied by others? This option only applies if SYNC_SERVER has
# been uncommented.
# The default is SYNC_DOWNLOAD = yes
#
#SYNC_DOWNLOAD = no
#SYNC_DOWNLOAD = yes
#
#
#
#######################################################################

Czy chcemy ściągać bazy adresów innych użytkowników? Oczywiście, że tak.


#######################################################################
#
# SYNC_DOWNLOAD_THRESHOLD: If SYNC_DOWNLOAD is enabled this parameter
# filters the returned hosts to those that have been blocked this many
# times by others. That is, if set to 1, then if a single DenyHosts
# server has denied an ip address then you will receive the denied host.
#
# See also SYNC_DOWNLOAD_RESILIENCY
#
#SYNC_DOWNLOAD_THRESHOLD = 10
#
# The default is SYNC_DOWNLOAD_THRESHOLD = 3
#
#SYNC_DOWNLOAD_THRESHOLD = 3
#
#######################################################################

Tutaj mała opcja filtrowania. Jeżeli ustawimy na 1 to wtedy wszystkie adresy zablokowane przez przynajmniej jeden serwer zostaną również zablokowane u nas. Proponuje zostawić jak jest.

4. Zapisujemy plik i wpisujemy:
sudo /etc/init.d/denyhosts restart
i możemy spać spokojnie ;) Od tej pory każdy kto będzie próbował się zalogować w podejrzany sposób będzie blokowany a jego ip będzie umieszczane w /etc/hosts.deny . Wszystkie logi programu, łącznie z zablokowanymi adresami znajdują się w /var/log/denyhosts.
Dziękuje i pozdrawiam!

2 komentarze:

Anonimowy pisze...

#######################################################################
#
# BLOCK_SERVICE: the service name that should be blocked in HOSTS_DENY
#
# man 5 hosts_access for details
#
# eg. sshd: 127.0.0.1 # will block sshd logins from 127.0.0.1
#
# To block all services for the offending host:
#BLOCK_SERVICE = ALL
# To block only sshd:
BLOCK_SERVICE = sshd
# To only record the offending host and nothing else (if using
# an auxilary file to list the hosts). Refer to:
# http://denyhosts.sourceforge.net/faq.html#aux
#BLOCK_SERVICE =
#
#######################################################################

Tutaj ustawiamy dla których usług ma być blokowany dany adres. Standardowo jest ustawione blokowanie na wszsytkie usługi - tutaj również tak zostawiamy

Unknown pisze...

O sekcji z rozmieszczeniem logów warto wspomnieć ponieważ nie w każdej dystrybucji błędne logowanie zapisywane jest do /var/log/auth.log. Slackware wrzuca błędne logowania do /var/log/messages.