Ogranicz Apache, aby zezwalać na dostęp tylko za pomocą SSL dla niektórych katalogów

34

Mam serwer Apache 2.2 z certyfikatem SSL, na którym znajduje się kilka usług, do których dostęp powinien odbywać się wyłącznie przy użyciu SSL.

tzn .: https : //myserver.com/topsecret/ powinno być dozwolone, podczas gdy http : //myserver.com/topsecret/ powinno być albo odrzucone, albo, najlepiej, przekierowane do https. http://myserver.com/public nie powinien mieć tego ograniczenia i powinien działać przy użyciu protokołu HTTP lub https.
Decyzja o zezwoleniu / odmowie http jest podejmowana w katalogu najwyższego poziomu i wpływa na całą zawartość pod nim.

Czy istnieje konfiguracja, którą można umieścić w konfiguracji Apache w celu ponownego uzyskania dostępu w ten sposób?

DrStalker
źródło

Odpowiedzi:

38

SSLRequireSSL dyrektywy jest to, czego szukasz.

Wewnątrz <VirtualHost>lub na najwyższym poziomie, jeśli nie korzystasz z hostów wirtualnych:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

Lub w .htaccess:

SSLRequireSSL
Tomasz
źródło
1
Witaj w Server Fault! Naprawdę wolimy, aby odpowiedzi zawierały treść, a nie wskaźniki do treści. Może to teoretycznie odpowiedzieć na pytanie, jednak lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik. Dziękuję Ci!
Chris S
8
Ok, zaktualizowałem swój pięcioletni post o przykład :)
Thomas
1
Szczerze mówiąc, 5 lat lub nie, powodem jest to, że link, na który wskazujesz, może zniknąć, co czyni twoją odpowiedź w większości lub całkowicie bezużyteczną dla kogoś, kto przyjdzie poszukać informacji później. Więc właściwie głosowałem za waszym ponurym komentarzem (szczerze), ale całkowicie zgadzam się, że odpowiedź powinna mieć pewien kontekst, aby była użyteczna. Zwłaszcza, że ​​jest oznaczony jako poprawna odpowiedź.
Craig
Nie sądzę, żeby społeczność SO / SF była tak rygorystyczna wobec samego linku i odpowiedzi „lmgtfy”. Ale zgadzam się; zmiana retroaktywna ma sens w dowolnym momencie.
Thomas
Do jakiego pliku konfiguracyjnego dodałbym tę instrukcję dyrektywy?
Dan Carter
8

W konfiguracji globalnej możesz użyć:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

Podobnie możesz użyć pliku .htaccess w pierwszym katalogu bezpiecznego drzewa katalogów:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

Ten ostatni można również umieścić w dyrektywie katalogowej w konfiguracji hosta globalnego lub wirtualnego.

Chris S.
źródło
Przekierowanie HTTP na HTTPS otwiera cię na niektóre rodzaje ataków MiTM. Tylko uwaga.
Craig
1

Alternatywnie możesz użyć języka po stronie serwera, aby wykonać przetwarzanie za Ciebie, zamiast korzystać z opcji konfiguracji Apache (jeśli być może nie masz dostępu do konfiguracji serwera).

Na przykład z PHP:

if (!isset($_SERVER['HTTPS'])) {
  // put your redirect here
  header('Location: http://myserver.com/public');
}

(choć należy pamiętać - jeśli używasz ISAPI w Microsoft IIS, jeśli żądanie nie jest kierowane przez HTTPS, wówczas wartość zmiennej $ _SERVER ['HTTPS'] będzie „wyłączona”)

Magsol
źródło
1

Ktoś wspomniał o SSLRequireSSL, ale nie sądzę, aby działał sam i nie znalazłem z nim udanego przykładu. Zalecany sposób to https://wiki.apache.org/httpd/RedirectSSL Zastosowałem to i działa dobrze!

Robert
źródło
0

Zakładając, że korzystasz z dyrektyw VirtualHost,

Umieść dyrektywę Directory w wirtualnym hoście innym niż ssl, odmawiając dostępu.

Następnie umieść dyrektywę katalogową w wirtualnym hoście ssl udzielającym dostępu.


źródło
0

Zawsze robiłem ten mod_rewrite w pliku .htaccess, chociaż powinieneś być w stanie to zrobić również w głównym pliku konfiguracyjnym.

Oto przewodnik z kilkoma sposobami na dokonanie tego: Inteligentne przekierowania HTTP i HTTPS RewriteRule

Jason Wadsworth
źródło