Czy ponowne uruchomienie serwera otwartego w Internecie jest bezpieczne?

29

konkretnie

Mam zestaw reguł iptables zdefiniowany na serwerze z systemem CentOS. Czy mam gwarancję / mogę zagwarantować / w jaki sposób mogę zagwarantować, że kiedy sieć jest w trybie online (podczas uruchamiania komputera lub po ponownym uruchomieniu usługi sieciowej), zestaw reguł iptables jest już zastosowany (a jeśli iptables nie uruchomił się lub nie zastosował zestawu reguł interfejs sieciowy nie pojawi się)?

(Wiem, że jest to pytanie noob, ale nigdy nie uruchomiłem serwera w nic poza zaufanymi sieciami za maskaradującym NAT NAT i zaporą ogniową, więc ... oczekuj pytań od noob.)

Parthian Shot
źródło
15
Naprawdę wcale nie jest to pytanie noob. W ten sposób hakerzy dostali się do sieci PlayStation w 2011 roku, powodując 24 dni przestoju i 15 mln USD w rozliczeniach. Kiedy ich zapory uruchomiły się ponownie (tak jak co miesiąc), zapora otworzyła się na kilka chwil - najwyraźniej wystarczająco długo.
Chris S
@ChrisS Najdziwniejszą rzeczą w tym jest dla mnie to, że jestem pewien, że sysadmins odpowiedzialni za tę sieć prawie na pewno byliby na tyle sprytni, by się powstrzymać, gdyby ktoś zaproponował wyłączenie zapory ogniowej, ale nie mrugnął okiem co miesiąc , wyłączając go ... a następnie włączając ponownie. Nie jestem jednak pewien, która z tych kombinacji to wyjaśni.
Parthian Shot
Inną opcją jest wyłączenie portu na przełączniku sieciowym, dopóki serwer nie zostanie w pełni uruchomiony - jeśli jesteś na miejscu i masz dostęp do przełącznika. Nie jest to idealne, ale na pewno zadziałałoby, chyba że serwer był zależny od sieci, takiej jak NFS.
jftuga
@jftuga Cóż, jasne. Ale wtedy serwer nie byłby podłączony do Internetu, więc rozwiązanie technicznie nie wchodzi w zakres tego pytania. Jeśli jestem na miejscu, mogę po prostu odłączyć kabel Ethernet podczas ponownego uruchamiania. Zresztą podstawowym problemem pozostanie rozwiązanie blokujące porty; że lokalny firewall nie zatrzyma innego komputera atakującego przez sieć. Jeśli router zostanie zhakowany lub ulegnie awarii lub ktoś inny w lokalnej sieci zostanie przejęty, gra jest nadal skończona.
Parthian Shot
@jftuga W rzeczywistości problem jest jeszcze gorszy. Zakładając, że ktoś już uruchomił oprogramowanie na komputerze lokalnym, ale moja zapora sieciowa filtruje wyjście, powiedzmy, że wychodzące pakiety są dozwolone tylko wtedy, gdy są ustanowione lub powiązane, a nowe połączenia przychodzące są dozwolone tylko na porcie 80 Zwykle zapobiegałoby to odwróceniu powłoki z nieuprzywilejowanego konta. Ale jeśli połączenie zostanie zainicjowane podczas rozruchu, zostanie podtrzymane poprzez inicjalizację zapory ogniowej. Przypuszczam, że oznacza to również, że reguły zapory powinny się zmienić, ale jest to łatwy błąd do popełnienia.
Parthian Shot

Odpowiedzi:

18

Po wyjęciu z pudełka masz gwarancję, że iptables uruchomi się przed uruchomieniem interfejsu przez kolejność skryptów startowych. Spójrz na wiersz „chkconfig” w każdym skrypcie startowym, a zobaczysz poziomy działania, w których jest „włączony”, gdy jest aktywny, kolejność rozpoczęcia i kolejność zatrzymania.

Nie ma gwarancji, że interfejs nie zostanie wywołany, jeśli zestaw reguł iptables nie zostanie poprawnie zastosowany (lub w ogóle).

Przykład: w
chkconfig: 2345 08 92
tym wierszu podano, że dana usługa będzie aktywna na poziomach 2, 3, 4 i 5 oraz rozpocznie się o 8, a zatrzyma o 92. Wszystko, co ma większą wartość „start”, uruchomi się dopiero po zakończeniu tego skryptu, ale pomyłka w tym skrypcie jest uważana za zakończenie i nie uniemożliwi uruchamiania skryptów niższego rzędu.

Uwaga: ta odpowiedź dotyczy CentOS 6 i wcześniejszych, niekoniecznie CentOS 7. Nie osobiście zbadałem 7 wystarczająco, aby odpowiedzieć na to pytanie dla 7.

Jan
źródło
1
+1 I ... nie patrzeć w usta koniom prezentowym, ponieważ odpowiedź jest całkiem pomocna, ale ... Czy zdarzyłbyś się na znormalizowanym sposobie nadawania usługom nakazu uzależnienia, aby w razie niepowodzenia na początku łańcucha kolejne nie zaczynają się? Och, a także jeśli komuś uda się rozbić zaporę ogniową (jakoś), że interfejs sieciowy „zejdzie ze statkiem”? Idealnie chciałbym, aby wszystko zawiodło bezpiecznie, nawet na obrazie, że ktoś ma 0 dni na DoS firewall ...
Parthian Shot
5
W skryptach startowych SysV (tj. CentOS 6 i wcześniejszych) nie ma na to dobrego sposobu. CentOS 7 robi zależności tak, jak chcesz - jeśli B zależy od A, a A zawiedzie, B nie uruchamia się. Dla 7, aby zobaczyć użycie zależności systemctl list-dependencies --all(właśnie patrzyłem na stronę podręcznika dla tego 30 sekund temu).
John
Chociaż ta wiadomość jest nieco rozczarowująca (w tej chwili mam 6 lat), przynajmniej teraz wiem, że modyfikacja skryptów inicjujących jest akceptowalnie okropnym włamaniem.
Parthian Shot
5
Zachowaj szczególną ostrożność przy modyfikowaniu skryptów inicjujących - może to spowodować fałszywe alarmy w dowolnym oprogramowaniu do wykrywania włamań, które posiadasz, a modyfikacje zostaną zastąpione, jeśli initscriptspakiet zostanie kiedykolwiek zaktualizowany (np. Wydanie erraty). Naprawdę nie polecam tego robić.
John
Nie skonfigurowałem jeszcze IDS, więc fałszywe alarmy nie są w tej chwili problemem (serwer nie jest jeszcze aktywny i wiem, że nie jestem jeszcze gotowy do wdrożenia; to pytanie jest częścią mojego przygotowania. Ale zamierzam wprowadzić HIDS). Będę tak ostrożny, jak to tylko możliwe, a jeśli istnieje sposób, który nie wymaga ręcznej modyfikacji podstawowych części konfiguracji init, zdecydowanie to robię.
Parthian Shot
1

Możesz także użyć opcji ifup-post w centach:

/ etc / sysconfig / network-scripts / ifup-post

Wywoływany, gdy pojawi się dowolne urządzenie sieciowe Z WYJĄTKIEM urządzenia SLIP. Wywołuje / etc / sysconfig / network-scripts / ifup-routs, aby wyświetlić trasy statyczne zależne od tego urządzenia. Wywołuje / etc / sysconfig / network-scripts / ifup-aliases, aby wyświetlić aliasy dla tego urządzenia. Ustawia nazwę hosta, jeśli nie jest jeszcze ustawiona i można znaleźć nazwę hosta dla adresu IP tego urządzenia. Wysyła SIGIO do wszystkich programów, które zażądały powiadomienia o zdarzeniach sieciowych.

Można go rozszerzyć, aby naprawić konfigurację usługi nazw, wywołać dowolne skrypty itp., W razie potrzeby.

Ten skrypt działa i po powyższym (ifup-route i ifup-aliasses) szuka ifup-local

if [ -x /sbin/ifup-local ]; then
   /sbin/ifup-local ${DEVICE}
fi

Możesz więc utworzyć ten plik i upewnić się, że ponownie wywołuje iptables, na przykład za pomocą iptables-restore:

iptables-restore < /etc/sysconfig/iptables
Moti
źródło
1

Mały dodatek: aby zapewnić, że potrzebne reguły będą dostępne przy następnym uruchomieniu serwera, zapisz go

sudo sh -c "iptables-save > /etc/iptables.rules"
manu
źródło