Nginx zabezpieczenia strony hasłem

0

Cześć,
mam na vps stronkę napisaną w Spring Boot.
Składa się ona z kilku stron z dostępem ogólnym oraz kilku która gdzie wymagane jest logowanie. Rejestracja w serwisie i logowanie ogarnięte jest przez Spring Boota.

Wszystko fajnie działa jednak strona jest jeszcze testowana więc chciałbym zablokować dostęp z zewnątrz poprzez ustawienie hasła na poziomie Nginx.
Wprowadzaiłem takie zmiany w default.conf

server {
    listen   80;
    location / {
        auth_basic 'Restricted';
        auth_basic_user_file /etc/apache2/.htpasswd;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://page:3080;
    }
}

i to również działa, kiedy wchodzę na stronę wymagane jest podanie loginu i hasła.
Jednak kiedy wprawdzie te dane i na działającej stronie chce się zalogować na moim koncie w serwisie już się wysypuje.
Zakładam, że jest to związane z tym że nginx i spring korzysta z oauth i coś tam sypie się z tokenami.
Czy ktoś spotkał się z podobnym problemem i wie jak można to rozwiązać?
Wiem, że mógłbym zablokować dostęp do wszystkich stron w projekcie spring boota ale może jest jakaś możliwość, żeby nie mieszać w projekcji i zrobić to na poziomie nginx?

0

Jednak kiedy wprawdzie te dane i na działającej stronie chce się zalogować na moim koncie w serwisie już się wysypuje.

Co się dokładniej dzieje - wysypuje, czyli 401 leci, czy bardziej w kierunku 502/500?

Jeśli bez asic autha skonfigurujesz nginxa, to wtedy dobrze proxuje? Lepiej to potwierdzić, może po prostu występują jakieś błędy związane z różnicą konfiguracji profili w jakich odpalasz apkę lokalnie vs na serwerze.

0

nginx i spring korzysta z oauth

To chyba nie w kodzie który pokazałeś, bo ustawiłeś basic-auth na poziomie nginxa. Jeśli to samo masz w springboocie to siłą rzeczy się posypie, bo musiałbyś wysłać request z twoma różnymi headerami Authorization na raz.

0

@DonStefano:

Co się dokładniej dzieje - wysypuje, czyli 401 leci, czy bardziej w kierunku 502/500?

W momencie przesłania username i password logowanie na poziomie springa jest udane i zwraca token, w kolejnym requescie leci już 401 więc z frontu pewnie dostaje błędy token

Jeśli bez asic autha skonfigurujesz nginxa, to wtedy dobrze proxuje?

tak.

@Shalom:
racja, mój błąd, w obu systemach jest basic-auth

Czy znacie jakiś sposób jak rozwiązać problem wprowadzając zmiany tylko po stronie nginx?

1

racja, mój błąd, w obu systemach jest basic-auth

No to tak to się za bardzo nie da*, chyba że będziesz w obu miejscach miał tego samego usera i hasło ;] Albo zmienisz auth w jednym miejscu na coś innego (np. na ten oauth albo na jakieś session cookies)

* wydaje mi się że RFC w sumie pozwala na wysłanie 2 headerów z różnymi wartościami, ale mam wątpliwosci czy nginx/spring to ogarną. Możesz spróbować.

Generalnie polecałbym jednak spróbować zrozumieć jak działa to co robisz. Bo mylenie oauth i tokenów z basic sugeruje że nie bardzo wiesz co robisz. Basic Auth polega na tym, że każdy twój request do serwera zawiera specjalny header Authorization: Basic base64(username:password). To że przeglądarka promptuje cię o user i password a potem automatycznie dodaje taki header do każdego requestu to jest tylko i wyłącznie takie udogodnienie.
I teraz taki request leci sobie od twojej przeglądarki do serwera. Najpierw dostaje go nginx a potem, jeśli podoba mu sie user i hasło, forwarduje ten request do springa. Tylko że tu jest właśnie problem -> header jest jeden i zawiera jeden zestaw credentiali, a dwie różne aplikacje sprpawdzają czy im się te credentiale podobają.

0

@zawsze_cos: Jeśli zależy Ci na niepublicznym dostępie, to możesz też zastosować inne rozwiązanie - np whitelistowanie w nginx'ie adresów IP (jeśli posiadasz serwer VPN to będzie jak znalazł :P / ewentualnie od biedy swój IP whiteliste'ować). Albo też zmienić po stronie Spring'a mechanizm security na sesję z ciasteczkami / oauth jak wspomniał Shalom. Wtedy możesz w nginxie mieć nawet kombinację whitelistowania dla IP oraz basic autha w przeciwnym przypadku.

0

Filtrowanie ip odpada bo tam kilka osób zagląda z różnych adresów. Teraz zablokowałem wszystkie strony i jeśli ktoś nie jest zalogowany przekierowuje na stronę logowania, ale jest z tym trochę zabawy a ja jestem leniwy więc szukałem jakiegoś prostszego rozwiązania po stronie nginx ;) Może ten sam login i hasło w obu systemach to nie taki głupi pomysł ;D

btw. też macie taki komunikat jak próbujecie edytować posta? :D
image

0

@zawsze_cos: Raczej słaby pomysł, będziesz musiał zarządzać dwoma źródłami użytkowników - tymi z pliczku /etc/apache2/.htpasswd dla nginx'a oraz tymi po stronie Springa i je ze sobą synchronizować, aby to miało sens. No chyba, że każdy będzie korzystał z tego samego użytkownika na potrzeby testowania (?), to się może sprawdzić.

0

@DonStefano: Niczym nie będę zarządzał, stworze im 2 konta i niech się cieszą. Nie da się to się nie da! ;)
btw. orientuje się ktoś jak to jest zrobione w Panelu DirecAdmin? nie mam teraz dostępu do żadnego ale tam też chyba można było założyć hasło na folder. Tam też używany jest basic-auth?

1 użytkowników online, w tym zalogowanych: 0, gości: 1