Czy uwierzytelnianie przez HTTPS spowolni moją aplikację?

11

Buduję aplikację internetową i usługę RESTful.

Czytałem różne artykuły na temat najlepszego sposobu uwierzytelnienia żądań w serwisie internetowym.

Wydaje mi się, że najlepszą opcją jest podstawowe uwierzytelnianie HTTP. Niemal każdy artykuł, który przeczytałem, mówi, że uwierzytelnianie powinno być szyfrowane za pomocą protokołu SSL lub równoważnego.

Nie jestem do końca pewien, co się z tym wiąże. Czy to oznacza, że ​​cała moja usługa internetowa będzie musiała znajdować się na bezpiecznym serwerze? Czy to spowolni?

Gaz_Edge
źródło
Myśl, buforowalność danych ładowanych przez https. Nie jestem w 100% pewien, czy / jak to wpłynie.
nie jestem pewien, czy podążam. Czy mówisz, że buforowanie nie jest możliwe?
Gaz_Edge
Istnieją interakcje między ssl / https a serwerem WWW, które mogą być niezamierzone w REST - cxf.547215.n5.nabble.com/… - Nie zagłębiłem się zbytnio w REST w bezpiecznym środowisku, więc nie było to problem dla mnie. To więcej z myśli i wskazówek z moich dni jako administratora apache.
Dzięki. Mówisz, że nie korzystałeś z REST w bezpiecznym środowisku. Czy to oznacza, że ​​nie używasz uwierzytelniania? Czy robisz to w inny sposób niż http basic.
Gaz_Edge
Nie ma uwierzytelnienia, podstawowego ani opartego na IP ... i jest wyłącznie w intranecie (nic, co nie jest widoczne z zewnątrz).

Odpowiedzi:

11

Przede wszystkim spróbuj zrozumieć, jak działa uwierzytelnianie SSL (HTTPS) i HTTP.

Zwykłe metody uwierzytelniania HTTP (Digest, Basic i wszelkie formularze + schemat uwierzytelniania oparty na plikach cookie, które można wdrożyć na HTTP) same w sobie są niepewne, ponieważ wysyłają informacje uwierzytelniające mniej więcej w postaci czystego tekstu. Niezależnie od tego, czy dane znajdują się w polach POST, czy w nagłówkach i czy zastosowano kodowanie base64, nie ma w tym względzie żadnego znaczenia, hasło jest wyraźnie widoczne dla każdego, kto ma dostęp do ruchu sieciowego. Oznacza to, że uwierzytelnianie HTTP w niezaufanym kanale jest bezwartościowe: atakujący musi odczytać hasło tylko po to, by wąchać sieć.

SSL implementuje bezpieczny kanał komunikacyjny poprzez z natury niepewny kanał. Działa to mniej więcej tak:

  1. Serwer wysyła podpisany certyfikat
  2. Klient sprawdza poprawność certyfikatu na podstawie listy dobrze znanych kluczy podpisujących; podpisy certyfikatów można łączyć w łańcuchy, tak aby każdy węzeł powiedział „jeśli podpis, który mnie podpisuje, jest dobry, to ja też”, ale ostatecznie łańcuch musi zostać rozwiązany do jednej z garstki zaufanych organów wstępnie skonfigurowanych na kliencie.
  3. Klient używa publicznego klucza szyfrowania serwera, aby wysłać wspólny klucz tajny
  4. Serwer odszyfrowuje udostępniony klucz tajny za pomocą klucza prywatnego (ponieważ tylko prawidłowy serwer ma klucz prywatny, inne serwery nie będą w stanie odszyfrować wspólnego klucza)
  5. Klient wysyła rzeczywiste dane żądania, zaszyfrowane przy użyciu wspólnego hasła
  6. Serwer odszyfrowuje dane żądania, a następnie wysyła zaszyfrowaną odpowiedź
  7. Klient odszyfrowuje odpowiedź i przedstawia ją użytkownikowi.

Zwróć uwagę na kilka ważnych punktów tutaj:

  • Łańcuch certyfikatów pozwala klientom upewnić się, że serwer, z którym rozmawia, jest prawdziwy, a nie ktoś przechwytuje ich żądania. Dlatego powinieneś kupić prawdziwy certyfikat SSL i dlaczego przeglądarki rzucają ci przerażające ostrzeżenia, gdy trafisz na stronę, która używa nieprawidłowego, wygasłego lub w inny sposób niepoprawnego certyfikatu: całe szyfrowanie na świecie nie pomaga, jeśli jesteś rozmowa z niewłaściwą osobą.
  • Szyfrowanie publiczne / prywatne używane do wymiany tajnego klucza zapewnia, że ​​pomyślna komunikacja będzie działać tylko między tą konkretną parą klienta i serwera: sniffowane pakiety sieciowe zostaną zaszyfrowane i będą wymagały prywatnego klucza serwera, aby uzyskać dostęp do danych.
  • Szyfrowanie symetryczne jest stosowane w przypadku większości żądań, ponieważ ma znacznie niższy narzut wydajnościowy niż szyfrowanie kluczem prywatnym / publicznym. Klucz (wspólny klucz tajny) jest jednak wymieniany przy użyciu szyfrowania klucza prywatnego / publicznego, ponieważ jest to jedyny sposób, aby to zrobić w bezpieczny sposób (z wyjątkiem przeniesienia go osobnym kanałem, takim jak usługa kurierska).

Oczywiście wiąże się to z pewnymi kosztami ogólnymi, ale nie jest tak źle, jak mogłoby się wydawać - głównie w skali, w której „rzuć na to więcej sprzętu” jest odpowiednią reakcją, chyba że przygotowujesz się na absolutnie ogromne natężenie ruchu ( pomyśl Google lub Facebook). W normalnych okolicznościach, to jest w typowym użyciu aplikacji internetowych, narzut SSL jest znikomy, w związku z czym, gdy tylko masz jakiekolwiek poufne dane, najlepiej po prostu uruchomić wszystko przez SSL, w tym zasoby. SSL to także jedyny możliwy sposób zabezpieczenia ruchu HTTP; inne metody po prostu nie są tak ujednolicone i dlatego nie są szeroko wspierane, i absolutnie nie chcesz wdrażać tych rzeczy samodzielnie, ponieważ szczerze mówiąc, po prostu zbyt łatwo jest je pomylić.

TL; DR: Tak, uwierzytelnianie podstawowe SSL + jest dobrym pomysłem, tak, potrzebujesz bezpiecznego serwera (i ważnego certyfikatu ), tak, to trochę spowolni, ale nie, nie należy się tym martwić teraz.

tdammers
źródło
12

HTTPS (SSL) nie jest FYI uwierzytelnienia użytkownika. Po prostu zapewnia szyfrowanie między 2 punktami końcowymi.

Ale tak, jest z tego trochę drobny narzut (choć niewystarczający, aby uzasadnić zmianę planów / sprzętu). Spójrz tutaj :

/programming/548029/how-much-overhead-does-ssl-impose

Brian
źródło
7
Daj
2
Ta odpowiedź jest bardzo myląca. SSL to uwierzytelnianie, ale zwykle nie jest to uwierzytelnianie użytkownika . SSL uwierzytelnia, że ​​serwer, z którym rozmawiasz, naprawdę jest tym, za kogo się podaje. (Zadaniem urzędu certyfikacji jest wydawanie tylko certyfikatów dla facebook.com na Facebooku.) Ponadto SSL może przeprowadzać uwierzytelnianie użytkowników za pomocą certyfikatów klientów.
josh3736
@brian: Zgadzam się z josh3736. SSL zapewnia uwierzytelnianie w kryptograficznym znaczeniu tego słowa. Bez uwierzytelnienia (np. Serwera) jesteś otwarty na ataki typu man at the middle. SSL może zapewnić bezpieczne uwierzytelnianie klienta (użytkownika) przy użyciu kart inteligentnych lub jeśli uwierzytelnił serwer, innymi środkami (np. Nazwa użytkownika / hasło) można użyć w bezpiecznym kanale.
Guy Sirton,
Naprawdę było oczywiste, że OP pytał o uwierzytelnienie użytkownika i nie martwił się o to, że klient uwierzytelni, z kim rozmawia / człowiek w środku ataków. Zredagowałem swój post w obliczu surowej pedanterii;) technicznie poprawne to najlepszy rodzaj poprawek, w końcu
brian
6

W przypadku podstawowego uwierzytelniania HTTP nazwa użytkownika i hasło podane przez użytkownika są wysyłane z każdym żądaniem do serwera. Oznacza to, że są w postaci zwykłego tekstu, nawet w obszarach witryny, które niekoniecznie muszą być bezpieczne. Oczywiście, potrzebujesz SSL tutaj, aby zapewnić bezpieczeństwo użytkownikom.

Teoretycznie możesz użyć uwierzytelniania plików cookie i umieścić SSL tylko na stronie logowania (gdzie wysyłana jest nazwa użytkownika i hasło). Jeśli twoje pliki cookie są przyzwoicie bezpieczne i zabezpieczone przed atakami z powtórką, osoba atakująca nie byłaby w stanie nic z nimi zrobić, nawet gdyby udało się je zdobyć.

Earlz
źródło
3

Podstawowym uwierzytelnianiem jest ustawienie nazwy użytkownika i hasła w nagłówku żądania http. Jeśli nie używasz protokołu SSL lub równoważnego, ta nazwa użytkownika i hasło są wysyłane zwykłym tekstem i są banalne dla każdego, kto może je ukraść.

Większość serwerów WWW obsługuje obecnie HTTPS od razu po wyjęciu z pudełka i chociaż powoduje to dodatkowe obciążenie w przypadku każdego połączenia, to narzut jest minimalny.

Możesz zabezpieczyć niektóre punkty końcowe, a nie inne (tj. Mieć uwierzytelniony punkt końcowy, który produkuje token, którego można używać do innych połączeń). Zdecydowanie poleciłbym protokół SSL dla całej usługi, ponieważ jest on znacznie bardziej bezpieczny. (jeśli nic innego nie zatrzymuje przechwytywania poufnych danych)

Tom Squires
źródło
Tak, myślę, że to najlepszy pomysł. Moja aplikacja internetowa zarządza sesją użytkowników itp., Więc może tam zapisać token. Ale ktoś nadal może węszyć token tej sesji, prawda? Może nadal stanowić zagrożenie dla bezpieczeństwa danych
Gaz_Edge
Tak, ogólnie. Są rzeczy, które możesz zrobić, aby zabezpieczyć pliki cookie (tj. Zaszyfrować je), ale prostszą i bardziej skuteczną drogą jest zabezpieczenie całej witryny. Chyba że masz konkretny przypadek użycia, poleciłbym najprostsze rozwiązanie
Tom Squires,
2

Jeff Atwood napisał niedawno krótki post na blogu o tym, czy najlepszym rozwiązaniem jest pełne szyfrowanie. Opisuje kilka przykładów z prawdziwego świata i ma też kilka uwag na temat wydajności.

Odwołuje się także do tego artykułu na temat studium przypadku Gmaila, cytując:

W styczniu tego roku (2010) Gmail domyślnie przełączył się na używanie HTTPS do wszystkiego. Wcześniej był wprowadzany jako opcja, ale teraz wszyscy nasi użytkownicy używają HTTPS do zabezpieczenia poczty e-mail między przeglądarkami a Google przez cały czas. W tym celu nie musieliśmy instalować żadnych dodatkowych maszyn ani specjalnego sprzętu. Na naszych produkcyjnych maszynach frontendowych SSL / TLS stanowi mniej niż 1% obciążenia procesora, mniej niż 10 KB pamięci na połączenie i mniej niż 2% obciążenia sieci. Wiele osób uważa, że ​​SSL zajmuje dużo czasu procesora i mamy nadzieję, że powyższe liczby (publiczne po raz pierwszy) pomogą to rozproszyć.

Wspomina także o niedawnych ulepszeniach buforowania stron po stronie klienta przez HTTPS przez przeglądarkę .

Mimo to, zauważa, istnieją inne kary, z których większość nie dotyczy wydajności, ale koszty wdrożenia:

  • Utrzymanie jakości oprogramowania przy jednoczesnym zwiększeniu złożoności i tak już zapracowanych zespołów
  • Buforowanie proxy jest znacznie trudniejsze do prawidłowej konfiguracji i wymaga również zmian kodu,
  • Trudno jest uzyskać odpowiednie zabezpieczenia dla mieszanki treści z różnych źródeł,
  • Niższe urządzenia mobilne mogą mieć problemy z szyfrowaniem.
Daniel Dinnyes
źródło
Rozwiń swoją odpowiedź i dołącz najważniejsze informacje z bloga.
Walter
Dodano wyróżnienia z posta na blogu.
Daniel Dinnyes,
0

Podstawowe uwierzytelnianie HTTP bez obsługi własnej sesji prawdopodobnie pozostawi cię otwartym na ataki fałszowania żądań między witrynami. Prawdopodobnie możesz go użyć, jeśli połączysz się z własną obsługą sesji, ale możesz mieć problemy z zapewnieniem czystej funkcji „wylogowania”.

Bez względu na to, czego używasz do uwierzytelniania, będziesz musiał użyć HTTPS do szyfrowania połączenia (chyba że aplikacja internetowa jest dostępna tylko w kontrolowanej, bezpiecznej sieci). Może to nieco spowolnić (ustanawianie połączeń jest drogie, ale przeglądarki zazwyczaj utrzymują połączenia przez pewien czas), ale jeśli chcesz bezpiecznej aplikacji, nie będziesz w stanie jej ominąć, więc tak naprawdę nie potrzebujesz martwić się o to.

Uwaga: „Uwierzytelnianie HTTPS” (o którym wspomniałeś w tytule) wprowadza w błąd - może odnosić się do uwierzytelniania certyfikatu klienta SSL, które ma niewiele wspólnego z tekstem twojego pytania i ma własny zestaw korzyści i problemów. Prawdopodobnie nie chcesz tego dotykać.

Jan Schejbal
źródło
0

Jak zamierzasz przeprowadzić podstawowe uwierzytelnianie?
Jeśli jest to mocno zakodowana nazwa użytkownika / hasło i używasz do tego wbudowanej funkcjonalności swojego serwera, prawdopodobnie będzie to miało prawie zerowy wpływ. Jeśli robisz szalone rzeczy w bazie danych lub coś podobnego, to może to mieć wpływ.

Jak zauważyli inni, SSL i wysyłanie dodatkowych nagłówków sprawi, że technicznie będzie to wolniejsze, ale w żaden sposób nie będzie znaczące.

brianfeucht
źródło