Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2007-05-27 16:08:20

  suncez - Użytkownik

suncez
Użytkownik
Skąd: Koszalin
Zarejestrowany: 2006-04-08

USERDEF_FAILED_ENTRY_REGEX dla proftpd

Od dłuższego czasu szukam rozwiązania, czytam podręczniki, faq, googluję, ale nie daję rady. Być może robię zasadniczy błąd lub czegoś nie robię.

Chcę dodać do denyhosts.conf USERDEF_FAILED_ENTRY_REGEX  dla proftpd
Wpisuję różne "wyrażenia regularne" o których nie mam pojęcia i nic z tego. Denyhosts nie reaguje na logi spływające do /var/log/auth.log

Jeśli w konfiguracji proftpd.conf wymuszę postać logu tak aby był podobny do tego z ssh, to jest reakcja, do hosts.deny trafiają adresy ip. Tylko jeden szkopuł - trafiają wszystkie adresy, z poprawnych i błędnych autoryzacji - nie potrafię tak zróżnicować logu, aby był zrozumiały dla denyhosts.

Wiem, że można blokować próby łamania hasła także w inny sposób, ale zanim się zupełnie poddam i spróbuję czegoś innego chciałbym zapytać tutaj.

Fragment logu z proftpd

Kod:

May 27 14:41:16 aisa.world proftpd[6120] localhost (193.203.45.89[193.203.45.89]): no such user 'susiak'
May 27 14:41:16 aisa.world proftpd[6120] localhost (193.203.45.89[193.203.45.89]): USER susiak: no such user found from 193.203.45.89 [193.203.45.89] to 193.203.45.89:21
May 27 14:41:16 aisa.world proftpd[6120] localhost (193.203.45.89[193.203.45.89]): mod_delay/0.5: delaying for 51 usecs
May 27 14:41:16 aisa.world proftpd[6120] localhost (193.203.45.89[193.203.45.89]): FTP session closed.

Regexy zaszyte w denyhosts

Kod:

SSHD_FORMAT_REGEX = re.compile(r""".* (sshd.*:|[sshd]) (?P<message>.*)""")
#SSHD_FORMAT_REGEX = re.compile(r""".* sshd.*: (?P<message>.*)""")

FAILED_ENTRY_REGEX = re.compile(r"""Failed (?P<method>.*) for (?P<invalid>invalid user |illegal user )?(?P<user>.*?) .*from (::ffff:)?(?P<host>d{1,3}.d{1,3}.d{1,3}.d{1,3})""")

FAILED_ENTRY_REGEX2 = re.compile(r"""(?P<invalid>(Illegal|Invalid)) user (?P<user>.*?) .*from (::ffff:)?(?P<host>d{1,3}.d{1,3}.d{1,3}.d{1,3})""")

FAILED_ENTRY_REGEX3 = re.compile(r"""Authentication failure for (?P<user>.*) .*from (::ffff:)?(?P<host>d{1,3}.d{1,3}.d{1,3}.d{1,3})""")

FAILED_ENTRY_REGEX4 = re.compile(r"""Authentication failure for (?P<user>.*) .*from (?P<host>.*)""")

FAILED_ENTRY_REGEX5 = re.compile(r"""User (?P<user>.*) .*from (?P<host>.*) not allowed because none of user's groups are listed in AllowGroups""")

FAILED_ENTRY_REGEX6 = re.compile(r"""Did not receive identification string .*from (::ffff:)?(?P<host>d{1,3}.d{1,3}.d{1,3}.d{1,3})""")

FAILED_ENTRY_REGEX7 = re.compile(r"""User (?P<user>.*) not allowed because not listed in AllowUsers""")

Próbuję różne wpisy USERDEF_FAILED_ENTRY_REGEX z i bez re.compile(r"""  """) np.

Kod:

USERDEF_FAILED_ENTRY_REGEX=re.compile(r""".*proftpd.*no such user found from (?P<host>.*) .*:21""")

Potem restartuję denyhosts i testuję. Jeśli "dobrze" trafię to nawet nie musze produkować nowych logów do auth.log - po kilku sekundach pojawia się wpis w hosts.deny.

Może ktoś ma doświadczenie i wie jak poprawnie dodać taki regex i jak ma on wyglądać? Mnie przy tym upale zaczyna brakować pary.
:)

Dopisane
Działa poprawnie, w końcu.
Po pierwsze według moich obserwacji denyhosts nie obsługuje logów z proftpd, nic nie pomogą żadne regexy jeśli logi z proftpd nie będą przypominały logów z ssh - chodzi o początek logu.
Można, za pomocą dyrektywy LogFormat auth, upodobnić początek logu dodatkowego wymuszonego dyrektywą ExtendedLog /var/log/auth.log AUTH auth do logu z ssh. Dopiero w dalszej części logu można eksperymentować z jego formą a potem dopasować do całości wyrażenie regularne, które potem wstawimy jako USERDEF_FAILED_ENTRY_REGEX do denyhosts.conf
Po czym można odróżnić log z poprawnej autoryzacji od tego z próby złamania hasła? Może po odpowiedzi serwera 530. Taka więc pozycja musi znaleźć się w wyrażeniu użytym jako regex. Jeśli będzie trzeba można dodać kolejne regex dla każdej innej odpowiedzi serwera.

Ja mając już dość kombinowania upodobniłem log z proftpd do logu z ssh, następnie wziąłem pierwszy regex z pliku /usr/share/denyhosts/DenyHosts/regex.py i użyłem go jako USERDEF_FAILED_ENTRY_REGEX lekko modyfikując go - chodzi o dodanie odpowiedzi serwera. Wyszło tak

Kod:

USERDEF_FAILED_ENTRY_REGEX=Failed (?P<method>.*) for (?P<invalid>invalid user |illegal user )?(?P<user>.*?) .*from 530 (::ffff:)?(?P<host>d{1,3}.d{1,3}.d{1,3}.d{1,3})

dla

Kod:

]LogFormat auth "Debian sshd[%P]: Failed keyboard-interactive/pam for invalid user %U from %s %a port %p"

Jeśli w logu znajdzie się odpowiedź 230, czy 331 itd denyhosts nie zareaguje, ale jak trafi na 530 zacznie liczyć próby. Może jeszcze posiedzę, aby wygładzić wygląd logu. Bardzo przydatna rzecz to program Kodos, którym możemy testować wyrażenia regularne na logu. Bez niego to można równie łatwo trafić coś więcej niż 3-ke w totka. Uff, ulżyło mi :D


http://suncez.webpark.pl/80x15.png

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)