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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
[quote=Huk]1. Firewall - standardowo odrzucać wszystko, poza portami dla HTTP/HTTPS oraz SSH[/quote]
Na początek tyle ci wystarczy.
wyłączyć logowanie root'a, włączyć tylko protokół mk. 2 itd.[/quote]
To jest w standardzie.To w zasadzie tyle co mi do głowy przychodzi jako taka podstawa zabezpieczeń - o czymś jeszcze powinienem pamiętać?[/quote]
Klucze zamiast hasła? W ogóle po skonfigurowaniu kilku rządzeń (kilka niezależnych opcji logowania przy użyciu kluczy) ja bym całkiem wyłączył logowanie po haśle.Jeszcze się tak zastanawiam, czy jest sens jakoś próbować dodawać czasowy banning IP, w przypadku iluś tam nieudanych prób logowania? Do tego jest chyba trzeba użyć [b]Fail2Ban[/b] lub czegoś podobnego?[/quote]
Sam firewall to lepsze rozwiązanie niż takie zabawki jak fail2ban. Iptables może od razu wycinać i banować intruzów.
Może poświeć jakiś tydzień na różne tego typu eksperymenty z konfiguracją i zabezpieczeniami, gdzieś sobie zapisuj procedury, a potem wszystko zaoraj i postaw od nowa poprawnie, wiedząc mniej więcej co i jak chcesz osiągnąć.Offline
@Huk
Usługi typu SSH radziłbym zbroić tak:
iptables -N SSH iptables -A INPUT -p tcp --dport 11343 -m connlimit --connlimit-upto 20 --connlimit-mask 0 --connlimit-saddr -j SSH iptables -A SSH -m hashlimit --hashlimit 15/min --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name SSH -j ACCEPT iptables -A SSH -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A SSH -j LOG --log-prefix "SSH - zablokowany" iptables -A SSH -j DROP
Gdzie 11343 to port SSH.
Identycznie, ale oczywiście z różnymi limitami connlimita i hashlimita radzę zbroić wszystkie usługi.
PS:
A tu mała pułapka na skanery portów:
https://forum.dug.net.pl/viewtopic.php?pid=269383#p269383
Pozdro
Ostatnio edytowany przez Jacekalex (2017-09-11 09:38:16)
Offline
Dobra panowie, na razie naskrobałem sobie coś takiego jako firewall:
#! /bin/sh # /etc/init.d/firewall # # Some things that run always touch /var/lock/firewall # Carry out specific functions when asked to by the system case "$1" in start) echo "Starting firewall " # Clear everything iptables -F iptables -t nat -F iptables -t mangle -F iptables -X # Change the default policy of all three chains to DROP iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # Accept input from loopback device iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Accept input from already established connections iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Drop input from not defined connections iptables -A INPUT -m state --state INVALID -j DROP iptables -A OUTPUT -m state --state INVALID -j DROP # Accept SSH connections iptables -N SSH iptables -A INPUT -p tcp --dport 11343 -m connlimit --connlimit-upto 20 --connlimit-mask 0 --connlimit-saddr -j SSH iptables -A SSH -m hashlimit --hashlimit 15/min --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name SSH -j ACCEPT iptables -A SSH -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A SSH -j LOG --log-prefix "SSH - zablokowany" iptables -A SSH -j DROP # Accept HTTP and HTTPS connections iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT ;; stop) echo "Stopping firewall" iptables -F iptables -t nat -F iptables -t mangle -F iptables -X iptables -P INPUT ACCEPT ;; *) echo "Usage: /etc/init.d/firewall {start|stop}" exit 1 ;; esac exit 0
I pożeniłem z systemd żeby włączało się na starcie - o ile dobrze myślę to chyba powinno wystarczyć? Dopuszczam tylko ssh po innym porcie + http/https - nic innego na razie nie trzeba...
@Jacekalex:
W sumie to połączyłem swój stary skrypt z tym co zapodałeś do SSH - czytając jakieś poradniki na necie wydaje się że podejście chyba poprawne...
@yossarian:
Planuję zrobić tak jak mówisz - na razie rozczajam i zapisuję sobie co i jak, a potem dam reinstall VPS'a i postawię już 'bo Bożemu' ...
W sumie to pozostaje kwestia bezpieczeństwa samej strony. Generalnie jeżeli chodzi o .NET Core (ale pewnie też o inne ustrojstwa) MS podszedł do tematu tak że napisali mini-server o nazwie Kestrel na którym odpala się aplikacja, ale zalecają przed niego ustawić jakiś 'normalny' serwer (nginx'a, Apach'a, czy w przypadku Windos - IIS) i zrobić reverse proxy.
Czy dobrze myślę że tutaj wypadało by utworzyć sobie usera systemowego [b]typowo pod stronę[/b], pozabierać mu wszelkie uprawnienia poza niezbędnym minimum i na jego koncie odpalać samą stronę (na Kestrel'u) a nginx'a czy Apatcha normalnie na kontach domyślnych na których się poinstalują?
Dodam tyko że ja tutaj nie potrzebuję jakichś 'bankowych' zabezpieczeń... celuję bardziej w jakieś podstawy, żeby nie pozostawiać jakichś oczywistych luk - jak to mówią 'nikt z tego strzelać nie będzie' :P
Offline
Na 80,443 też daj jakieś sensowne wartości connlimit i hashlimit.
Do tego port SSH masz nieprawidłowy, przed chwilką w totolotku wylosowali inny...
Do testowania zbrojeń na porcie SSH radzę puścić SSH równocześnie na dwóch portach, żeby sobie nie odciąć dostępu do serwera przez przypadek.
Dopiero,jak masz pewność, ze wszystko jest optymalne, to ten drugi port usuwasz z sshd_config.
Jeszcze weselej wygląda SSH,kiedy hashlimit umieścisz przed connlimitem, żeby przekierowywał do łańcucha SSH, ale obejmował zakres jakieś +-250 portów od faktycznego.
Wtedy żaden skaner portów ani za pół roku nie znajdzie serwera SSH, bo zawsze będzie dropowany po kilku próbach na portach w okolicy SSH.
Można tam też elegancko wsadzić na sąsiednich portach ipseta, z opcją timeout, sznurka do metody ipset wypad masz tam wyżej.
Ostatnio edytowany przez Jacekalex (2017-09-11 21:55:59)
Offline
@Jacekalex:
Hmm po kilku godzinach czytania różnych poradników chyba wiem mniej niż zanim zacząłem... dopisałem sobie na dole jeszcze coś takiego, analogicznie do tej Twojej reguły do SSH:
iptables -N HTTP iptables -A INPUT -p tcp -m multiport --dports 80,443 -m connlimit --connlimit-upto 20 --connlimit-mask 0 --connlimit-saddr -j HTTP iptables -A HTTP -m hashlimit --hashlimit 1/min --hashlimit-burst 1 --hashlimit-mode srcip --hashlimit-name HTTP -j ACCEPT iptables -A HTTP -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A HTTP -j LOG --log-prefix "HTTP - zablokowany" iptables -A HTTP -j DROP
Wydawało mi się że to powinno teoretycznie ograniczać zwrotki z serwera do jednej na minutę max... tymczasem mogę sobie spokojnie odpytywać stronę i zwraca jakby nigdy nic - no chyba że hashlimit nie działa tak jak mi się wydawało... albo Fiddler napierdziela z jakiegoś cholernego cache...
Tak btw - wszędzie gdzie czytam jakieś odniesienia odnośnie hashlimit na porcie 80 jest zwykle zdanie 'tylko sobie ustaw hashlimit i burst na taki jaki ci trzeba' - co to w praktyce oznacza? Skąd ja mam wiedzieć 'jaki mi trzeba' ? Mam rozumieć że admini stron bankowych codziennie sobie ten limit wyliczają na podstawie ilości połączeń z ostatnich 24 godzin czy coś?
Offline
Kod:
iptables -A HTTP -m hashlimit --hashlimit 1/min --hashlimit-burst 1 --hashlimit-mode srcip --hashlimit-name HTTP -j ACCEPT iptables -A HTTP -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT[/quote]
To nie ma sensu,bo jak limit zadziała w regule 1, to i tak wpuszcza w regule 2.
Do http użyj lepiej SYNPROXY:
https://morfitronik.pl/unikanie-atakow-ddos-z-synproxy/
Wcześniej do usług publicznych stosowałem hashlimit i connlimit tak:
https://forums.gentoo.org/viewtopic-p-7081326.html#7081326Ostatnio edytowany przez Jacekalex (2017-09-13 12:20:33)
W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem para bellum ;) | Pozdrawiam :)
Offline
Time (s) | Query |
---|---|
0.00009 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00096 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.191.200.223' WHERE u.id=1 |
0.00061 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.191.200.223', 1732689365) |
0.00048 | SELECT * FROM punbb_online WHERE logged<1732689065 |
0.00067 | SELECT topic_id FROM punbb_posts WHERE id=314171 |
0.00007 | SELECT id FROM punbb_posts WHERE topic_id=29667 ORDER BY posted |
0.00059 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=29667 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00434 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=29667 ORDER BY p.id LIMIT 25,25 |
0.00099 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=29667 |
Total query time: 0.00889 s |