Jakie są najlepsze praktyki dotyczące zabezpieczania sekcji administracyjnej witryny internetowej? [Zamknięte]

92

Chciałbym wiedzieć, co ludzie uważają za najlepsze praktyki w zakresie zabezpieczania sekcji administracyjnej witryn internetowych, w szczególności z punktu widzenia uwierzytelniania / dostępu.

Oczywiście są rzeczy oczywiste, takie jak używanie SSL i rejestrowanie całego dostępu, ale zastanawiam się, gdzie powyżej tych podstawowych kroków ludzie uważają, że pasek jest ustawiony.

Na przykład:

  • Czy polegasz tylko na tym samym mechanizmie uwierzytelniania, którego używasz w przypadku zwykłych użytkowników? Jeśli nie, to co?
  • Czy działasz w sekcji Administracja w tej samej „domenie aplikacji”?
  • Jakie kroki należy podjąć, aby uniemożliwić odkrycie sekcji administratora? (czy też odrzucasz całą sprawę „niejasności”)

Jak dotąd sugestie respondentów obejmują:

  • Wprowadź sztuczną pauzę po stronie serwera do każdego sprawdzania hasła administratora, aby zapobiec atakom siłowym [grafika dewelopera]
  • Używaj oddzielnych stron logowania dla użytkowników i administratora przy użyciu tej samej tabeli DB (aby zatrzymać XSRF i kradzież sesji, zapewniając dostęp do obszarów administracyjnych) [Thief Master]
  • Rozważ także dodanie natywnego uwierzytelniania serwera internetowego do obszaru administracyjnego (np. Przez .htaccess) [Thief Master]
  • Rozważ zablokowanie adresu IP użytkowników po kilku nieudanych próbach zalogowania się przez administratora [Thief Master]
  • Dodaj captcha po nieudanych próbach logowania przez administratora [Thief Master]
  • Zapewnij równie silne mechanizmy (przy użyciu powyższych technik) zarówno użytkownikom, jak i administratorom (np. Nie traktuj administratorów w specjalny sposób) [Lo'oris]
  • Rozważ uwierzytelnianie drugiego poziomu (np. Certyfikaty klienta, karty inteligentne, miejsce na karty itp.) [JoeGeeky]
  • Zezwalaj na dostęp tylko z zaufanych adresów IP / domen, dodaj sprawdzanie do podstawowego potoku HTTP (przez np. HttpModules), jeśli to możliwe. [JoeGeeky]
  • [ASP.NET] Zablokuj IPrincipal i Principal (uczyń je niezmiennymi i niewliczalnymi ) [JoeGeeky]
  • Federate Rights Elevation - np. Wyślij e-maila do innych administratorów, gdy uprawnienia któregokolwiek administratora zostaną zaktualizowane. [JoeGeeky]
  • Rozważ szczegółowe prawa dla administratorów - np. Zamiast praw opartych na rolach, zdefiniuj prawa do poszczególnych działań na administratora [JoeGeeky]
  • Ogranicz tworzenie administratorów - np. Administratorzy nie mogą zmieniać ani tworzyć innych kont administracyjnych. Użyj do tego zablokowanego klienta „superadmin”. [JoeGeeky]
  • Rozważ certyfikaty SSL po stronie klienta lub piloty typu RSA (tokeny elektroniczne) [Daniel Papasian]
  • Jeśli używasz plików cookie do uwierzytelniania, użyj oddzielnych plików cookie dla stron administratora i zwykłych, np. Umieszczając sekcję administratora w innej domenie. [Daniel Papasian]
  • Jeśli jest to praktyczne, rozważ pozostawienie witryny administratora w prywatnej podsieci, poza publicznym Internetem. [John Hartsock]
  • Ponowne wystawianie biletów autoryzacji / sesji podczas przechodzenia między kontekstami administratora / normalnego użytkowania witryny [Richard JP Le Guen]
UpTheCreek
źródło
2
Tylko myśl, ale. Prawdopodobnie najlepszym sposobem zabezpieczenia sekcji administratora jest nie umieszczanie jej w publicznym Internecie. Możesz zdecydować się na pozostawienie witryny administratora tylko w prywatnej podsieci.
John Hartsock
1
Który z podanych przez Ciebie pomysłów nie byłby dobrym pomysłem, aby zastosować go do wszystkich użytkowników, nie tylko do administratorów?
Vivian River
Możesz sprawdzić WebLoginProject na webloginproject.com . Jest to system logowania oparty na współpracy, który został zaprojektowany z myślą o zabezpieczeniu przed lukami XSS, SQL Injection, Session Fixation i CSRF. Ma kod źródłowy w ASP i PHP, jest wielojęzyczny i wygląda fajnie. Wielu programistów pracuje nad tym, aby naprawić dziury, więc prawdopodobnie jest to tak blisko bezpieczeństwa, jak to tylko możliwe.
Stagi
-1 za
dołączenie
@Lohoris - Naprawdę nie rozumiem, dlaczego odrzuciłeś to pytanie. Czy głosujesz w dół, ponieważ podsumowałem czyjąś sugestię, z którą się nie zgadzasz? Być może odrzucenie odpowiedniej odpowiedzi byłoby bardziej konstruktywne. : / Czy możesz dokładnie wyjaśnić, z czym masz problem?
UpTheCreek

Odpowiedzi:

19

To wszystko są dobre odpowiedzi ... Generalnie lubię dodać kilka dodatkowych warstw do moich sekcji administracyjnych. Chociaż użyłem kilku odmian tematu, zazwyczaj obejmują one jedną z następujących:

  • Uwierzytelnianie drugiego poziomu : może to obejmować certyfikaty klienta (np. Certyfikaty x509), karty inteligentne, obszar kart itp.
  • Ograniczenia domeny / adresu IP : w tym przypadku tylko klienci pochodzący z zaufanych / weryfikowalnych domen; takie jak podsieci wewnętrzne; są wpuszczane do strefy administratora. Zdalni administratorzy często przechodzą przez zaufane punkty wejścia VPN, więc ich sesja byłaby weryfikowalna i często jest również chroniona kluczami RSA. Jeśli korzystasz z ASP.NET, możesz łatwo przeprowadzić te sprawdzenia w potoku HTTP za pośrednictwem modułów HTTP, co zapobiegnie otrzymywaniu przez aplikację żadnych żądań, jeśli testy bezpieczeństwa nie zostaną spełnione.
  • Zablokowana autoryzacja IPrincipal i Principal-based : Tworzenie niestandardowych zasad jest powszechną praktyką, chociaż częstym błędem jest uczynienie ich modyfikowalnymi i / lub wyliczalnymi prawami. Chociaż nie jest to tylko kwestia administratora, jest ważniejsza, ponieważ tutaj użytkownicy mogą mieć podwyższone prawa. Upewnij się, że są niezmienne i niewliczalne. Ponadto upewnij się, że wszystkie oceny do Autoryzacji są dokonywane na podstawie Zleceniodawcy.
  • Podniesienie uprawnień federacyjnych : Gdy dowolne konto otrzyma określoną liczbę uprawnień, wszyscy administratorzy i szef bezpieczeństwa zostaną natychmiast powiadomieni pocztą elektroniczną. Daje to pewność, że jeśli atakujący podniesie prawa, wiemy od razu. Prawa te zazwyczaj dotyczą praw uprzywilejowanych, prawa do wglądu do informacji chronionych prywatnością i / lub informacji finansowych (np. Kart kredytowych).
  • Przyznawaj prawa oszczędnie, nawet administratorom : Wreszcie, w niektórych sklepach może to być nieco bardziej zaawansowane. Prawa autoryzacyjne powinny być możliwie dyskretne i powinny otaczać rzeczywiste zachowania funkcjonalne. Typowe podejście do bezpieczeństwa opartego na rolach (RBS) ma zwykle mentalność grupową . Z punktu widzenia bezpieczeństwa nie jest to najlepszy wzorzec. Zamiast `` Grup '', takich jak ` ` Menedżer użytkowników '', spróbuj bardziej je podzielić ( np. Utwórz użytkownika, Autoryzuj użytkownika, Podnieś / Odwołaj prawa dostępu itp ...). Może to wiązać się z nieco większym narzutem administracyjnym, ale zapewnia elastyczność przydzielania tylko praw, które są faktycznie potrzebne większej grupie administratorów. Jeśli dostęp jest zagrożony, przynajmniej mogą nie uzyskać wszystkich praw. Chciałbym zawrzeć to w uprawnieniach Code Access Security (CAS) obsługiwanych przez .NET i Java, ale to wykracza poza zakres tej odpowiedzi. Jeszcze jedno ... w jednej aplikacji administratorzy nie mogą zmieniać innych kont administracyjnych ani nadawać użytkownikom uprawnień administratora. Można to zrobić tylko za pośrednictwem zablokowanego klienta, do którego ma dostęp tylko kilka osób.
JoeGeeky
źródło
19

Jeśli strona wymaga logowania zarówno do zwykłych czynności, jak i administratorów, np. Forum, użyłbym oddzielnych loginów, które korzystają z tej samej bazy danych użytkowników. Gwarantuje to, że XSRF i kradzież sesji nie pozwolą osobie atakującej na dostęp do obszarów administracyjnych.

Dodatkowo, jeśli sekcja administratora znajduje się w osobnym podkatalogu, zabezpieczenie tego za pomocą uwierzytelniania serwera WWW (na przykład .htaccess w Apache) może być dobrym pomysłem - wtedy ktoś potrzebuje zarówno tego hasła, jak i hasła użytkownika.

Przesłonięcie ścieżki administratora prawie nie daje żadnego zysku - jeśli ktoś zna prawidłowe dane logowania, najprawdopodobniej może również znaleźć ścieżkę do narzędzia administracyjnego, ponieważ albo wyłudził je, albo wprowadził do keylogera, albo uzyskał je za pomocą inżynierii społecznej (co prawdopodobnie ścieżka też).

Przydatna może być również ochrona typu brute force, taka jak blokowanie adresu IP użytkownika po 3 nieudanych logowaniach lub wymaganie CAPTCHA po nieudanym logowaniu (nie przy pierwszym logowaniu, ponieważ jest to bardzo irytujące dla legalnych użytkowników).

ThiefMaster
źródło
9
  • Odrzucam niejasność
  • Używanie dwóch systemów uwierzytelniania zamiast jednego to przesada
  • Dla użytkowników należy również zrobić sztuczne przerwy między próbami
  • Blokowanie adresów IP nieudanych prób powinno być również wykonywane dla użytkowników
  • Silne hasła powinny być również używane przez użytkowników
  • Jeśli uważasz, że captcha są w porządku, zgadnij co, możesz ich użyć również dla użytkowników

Tak, po napisaniu tego zdaję sobie sprawę, że tę odpowiedź można podsumować jako „nic specjalnego dla logowania administratora, są to wszystkie funkcje bezpieczeństwa, które powinny być używane przy każdym logowaniu”.

o0 '.
źródło
6
Dziękuję za odpowiedź. Osobiście zwykle się nie zgadzam, na przykład: Czy użytkownik byłby zadowolony z haseł takich jak „ksd83”, | 4d # rrpp0% 27 & lq (go43 $ sd {3> '? I czy resetowanie bloków IP, które wyzwolili ważni użytkownicy, nie jest zapomnienie generuje niepotrzebne prace administracyjne / obsługi klienta? Osobiście uważam, że różne poziomy ryzyka uzasadniają różne podejścia
UpTheCreek
1
Hasło administratora powinno być złożone, ale niezbyt skomplikowane, w przeciwnym razie nawet administrator go nie zapamięta i gdzieś je zapisze (zmuszałbyś go do złamania każdej zasady bezpieczeństwa). Tymczasowe blokowanie adresów IP z nieudaną próbą jest dość standardowe, robi to vbulletin, phpbb robi to IIRC, użytkownicy są do tego przyzwyczajeni.
o0 '.
Naprawdę nie chcę zaglądać do phpbb lub vbulletin w poszukiwaniu najlepszych praktyk bezpieczeństwa;)
UpTheCreek
@UpTheCreek oczywiście, zgadzam się! Właśnie kwestionowałem to „Nie resetuje bloków IP, które wyzwolili ważni użytkownicy, zapominając o generowaniu niepotrzebnej pracy administracyjnej / obsługi klienta” <- nie sądzę, żeby to był problem, ponieważ użytkownicy są już wykorzystywani do takiej funkcji.
o0 '.
3

Jeśli używasz tylko jednego loginu dla użytkowników, którzy mają zarówno uprawnienia zwykłego użytkownika, jak i uprawnienia administratora, ponownie wygeneruj ich identyfikator sesji (czy to w pliku cookie, czy w parametrze GET, czy w jakimkolwiek innym ...), gdy nastąpi zmiana poziomu przywilej ... przynajmniej.

Więc jeśli się zaloguję, zrobię kilka normalnych rzeczy użytkownika, a następnie odwiedzę stronę administratora, ponownie wygeneruję mój identyfikator sesji. Jeśli następnie przejdę ze strony administratora do zwykłej strony użytkownika, ponownie wygeneruj mój identyfikator.

Richard JP Le Guen
źródło
Czy mógłbyś wyjaśnić, co to daje?
Denis Pshenov
Wierzę, że to nie pomoże tak bardzo, jak myślisz. Ponieważ jeśli atakujący jest w stanie uzyskać identyfikator Twojej bieżącej sesji na zwykłej stronie użytkownika, może go użyć, aby uzyskać dostęp do strony administratora i wygenerować nowy identyfikator sesji. Popraw mnie, jeśli się mylę.
Denis Pshenov
1
Ale osoba atakująca nie może uzyskać dostępu do strony administratora bez hasła. Poziom uprawnień zmienia się dopiero po uwierzytelnieniu. Niepowodzenie ponownego wygenerowania identyfikatora sesji oznacza, że ​​mogą ponownie użyć sesji utworzonej w niebezpieczny sposób, aby obejść uwierzytelnianie.
Richard JP Le Guen
Teraz to rozumiem. Myślałem, że opisałeś scenariusz, w którym użytkownik nie musi ponownie logować się, gdy przełącza się między normalnym / administracyjnym kontekstem.
Denis Pshenov
1

Miej dobre hasło administratora.

Nie "123456"tylko sekwencja liter, cyfr i znaków specjalnych wystarczająco długa, powiedzmy 15-20 znaków. Lubię "ksd83,'|4d#rrpp0%27&lq(go43$sd{3>".

Dodaj pauzę przy każdym sprawdzaniu hasła, aby zapobiec atakom siłowym.


źródło
czy mógłbyś trochę wyjaśnić, czym byłaby „pauza”? Czy masz na myśli zrobienie czegoś takiego jak Thread.Sleep (5000), aby zabić trochę czasu?
ziemski
6
to jest głupie: hasło zbyt skomplikowane, aby je zapamiętać, zostanie gdzieś zapisane (lub zapisane), co pogorszy sprawę, niż gdybyś pozwolił na NAPRAWDĘ dobre hasło (tj. hasło, które zostanie wpisane, ponieważ je pamiętasz zamiast kopiować wklejone ).
o0 '.
4
Och, żałuję, że nie mogę przegłosować tego gówna do epoki kamienia łupanego, to jest takie głupie, takie złe ... Nienawidzę ludzi szerzących dezinformację, taką jak ta.
o0 '.
1
@ Lo'oris: Z czym dokładnie się nie zgadzasz?
2
Napisałem to w… jak… komentarz tuż powyżej?
o0 '.
1

Oto kilka innych kwestii do rozważenia:

  1. Jedną z opcji do rozważenia, zwłaszcza jeśli zarządzasz komputerami administratorów lub są oni technicznie kompetentni, jest użycie czegoś opartego na certyfikatach SSL do uwierzytelniania klienta. Piloty RSA i inne mogą być również używane w celu zwiększenia bezpieczeństwa.
  2. Jeśli w ogóle używasz plików cookie - być może do tokenu uwierzytelniania / sesji - prawdopodobnie chcesz mieć pewność, że pliki cookie są wysyłane tylko do stron administratora. Pomaga to złagodzić ryzyko, jakie stanowi kradzież plików cookie w Twojej witrynie poprzez przejęcie warstwy 1/2 lub XSS. Można to łatwo zrobić, ustawiając część administracyjną na innej nazwie hosta lub domenie, a także ustawiając bezpieczną flagę za pomocą pliku cookie.
  3. Ograniczanie za pomocą adresu IP może być również sprytne, a jeśli masz użytkowników w całym Internecie, nadal możesz to zrobić, jeśli istnieje zaufana sieć VPN, do której mogą dołączyć.
Daniel Papasian
źródło
1

Używamy Windows Authenticationdo dostępu administratora. Jest to najbardziej praktyczny sposób ochrony obszarów administracyjnych przy jednoczesnym oddzieleniu uwierzytelniania od tego, co dotyczy zwykłych użytkowników końcowych. Administrator systemu zarządza poświadczeniami dostępu użytkownika Admin i egzekwuje zasady dotyczące haseł na koncie użytkownika domeny.

to. __curious_geek
źródło
-1

Ścisłym sposobem jest posiadanie dwóch całkowicie różnych „farm”, w tym baz danych, serwerów i wszystkich innych, i przenoszenie danych z jednej farmy do drugiej. Większość nowoczesnych, wielkoskalowych systemów wykorzystuje to podejście (Vignette, SharePoint itp.). Zwykle jest to określane jako mające różne etapy „etap edycji” -> „etap podglądu” -> „etap dostarczania”. Ta metoda pozwala traktować zawartość / konfigurację w taki sam sposób jak kod (dev-> qa-> prod).

Jeśli jesteś mniej paranoikiem, możesz mieć jedną bazę danych, ale tylko sekcja administratora jest dostępna na serwerach „edytujących”. Mam na myśli tylko te skrypty / pliki edycyjne umieszczone na serwerze edycyjnym.

Oczywiście etap edycji powinien być dostępny tylko w lokalnym intranecie i / lub przy użyciu VPN.

Może się to wydawać przesadą i może nie być najłatwiejszym rozwiązaniem we wszystkich przypadkach użycia, ale jest to zdecydowanie najbardziej solidny sposób robienia rzeczy.

Zauważ, że takie rzeczy jak „mieć silne hasła administratora” są fajne, ale nadal pozostawiają administratora otwartego na wszelkiego rodzaju sprytne ataki.

Nir Levy
źródło
Myślę, że byłoby to przydatne / praktyczne tylko w sytuacjach czysto CMS / publikacyjnych, w których przesyłasz treść, a nie przetwarzasz dane.
UpTheCreek
Może, ale znałem (i widziałem) sytuacje, w których robi się to również w celu przetwarzania i wprowadzania danych przez użytkownika. W przypadku pojedynczej farmy z oddzielnym serwerem edycyjnym jest to oczywiste. W przypadku wielu farm dane wejściowe z witryny trafiają do kolejki (w bazie danych lub w inny sposób), a przy użyciu zewnętrznej procedury są przetwarzane i kopiowane do serwera / bazy danych „edycji”. Zapewnia to większą kontrolę nad tym, co dostaje się do systemu. Jest to jednak skomplikowane do wdrożenia.
Nir Levy
-2

W dużej mierze zależy to od rodzaju danych, które chcesz chronić (wymogi prawne itp.).

  • Wiele sugestii dotyczy uwierzytelniania. Myślę, że powinieneś rozważyć użycie uwierzytelniania OpenId / Facebook jako logowania. (Najprawdopodobniej wydadzą więcej zasobów na bezpieczeństwo uwierzytelniania niż Ty)

  • Zapisuj zmiany, a także aktualizuj wartości w bazie danych. W ten sposób możesz cofnąć zmiany od użytkownika X lub między datą X i Y.

Carl Bergquist
źródło
1
Uwierzytelnianie Facebooka w sekcji administracyjnej witryny internetowej ... naprawdę uważasz, że to dobry pomysł? Dla zwykłych użytkowników, tak ... ale dla sekcji administracyjnej ? Wydaje mi się to trochę niebezpieczne ...
Richard JP Le Guen
Nie jestem pewny. ale myślę, że ta witryna obsługuje tylko uwierzytelnianie Openid. I nie sądzę, aby była jakaś duża (w teorii) różnica między uwierzytelnianiem na Facebooku a openid. Ale nie czytałem żadnych umów licencyjnych ani takich.
Carl Bergquist
1
Bardzo zły pomysł na openid do uwierzytelniania administratora, również wycofanie w większości przypadków jest niemożliwe, a zły facet jest gotowy w twoim systemie ... jakie wycofanie?
Aristos
Nie wahaj się wyjaśnić, dlaczego uważasz, że jest to złe. Cóż, jeśli zalogowanie się jako administrator daje pełny dostęp do bazy danych i kopii zapasowej, z pewnością trudno jest przywrócić, ale w takim przypadku wszyscy są gotowi stracić. Moje sugestie dotyczyły strony cmsisch.
Carl Bergquist
-3

Nie zauważyłem, żeby ktoś wspomniał o przechowywaniu / sprawdzaniu hasła administratora. Proszę, proszę, proszę nie przechowywać PW w postaci zwykłego tekstu, a najlepiej nawet nie coś, co można odwrócić - użycie coś jak osolonej hash MD5 tak, że przynajmniej jeśli ktoś stanie odzyskać zapamiętaną „hasło” oni nie mają cokolwiek okropnie pożytecznego, chyba że mają też twój plan solny.

Wayne Werner
źródło
1
-1 dla md5. Nie chcesz szybkiego mieszania haseł, nawet poza innymi problemami z md5ing. bcrypt byłby lepszym rozwiązaniem.
Kzqai
-4

Dodaj pole hasła i pytanie bezpieczeństwa, które Administrator będzie znał, np. Jakie było imię Twojej pierwszej dziewczyny, lub losuj pytania za każdym razem, gdy przeglądasz panel administracyjny.

Być może zawsze mógłbyś umieścić sekcję administracyjną w dużym katalogu, np

http://domain.com/sub/sub/sub/sub/sub/index.php

Ale to nie jest dobre, hah.

Być może mógłbyś dołączyć ciąg zapytania do strony głównej, na przykład:

http://domain.com/index.php?display=true

Kiedy to nastąpi, pojawi się pole nazwy użytkownika i hasła.

MacMac
źródło