Hạn chế Apache chỉ cho phép truy cập bằng SSL đối với một số thư mục


34

Tôi có một máy chủ Apache 2.2 có chứng chỉ SSL lưu trữ một số dịch vụ chỉ nên truy cập bằng SSL.

tức là: https : //myserver.com/topsecret/ nên được cho phép trong khi http : //myserver.com/topsecret/ nên bị từ chối hoặc, lý tưởng nhất là được chuyển hướng đến https. http://myserver.com/public không nên có hạn chế này và nên hoạt động bằng cách sử dụng http hoặc https.
Quyết định cho phép / từ chối http được đưa ra ở thư mục cấp cao nhất và ảnh hưởng đến tất cả nội dung bên dưới nó.

Có một lệnh nào có thể được đặt trong cấu hình Apache để hạn chế quyền truy cập theo cách này không?

Câu trả lời:


38

Các SSLRequireSSL chỉ là những gì bạn đang tìm kiếm.

Bên trong <VirtualHost>hoặc ở cấp cao nhất nếu bạn không sử dụng máy chủ ảo:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

Hoặc trong .htaccess:

SSLRequireSSL

1
Chào mừng bạn đến với Lỗi Máy chủ! Chúng tôi thực sự thích câu trả lời có nội dung, không phải con trỏ đến nội dung. Về mặt lý thuyết, điều này có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Cảm ơn bạn!
Chris S

8
Ok, tôi đã cập nhật bài viết năm tuổi của mình bằng một ví dụ :)
Thomas

1
Công bằng mà nói, 5 tuổi hay không, lý do là liên kết bạn trỏ đến có thể biến mất, khiến câu trả lời của bạn chủ yếu hoặc hoàn toàn vô dụng với ai đó đi tìm thông tin sau này. Vì vậy, tôi thực sự đã bỏ phiếu nhận xét lén lút của bạn (trung thực), nhưng tôi cũng hoàn toàn đồng ý rằng câu trả lời nên có một số bối cảnh để nó vẫn hữu ích. Đặc biệt là vì nó được đánh dấu là câu trả lời đúng.
Craig

Tôi không nghĩ rằng cộng đồng SO / SF nghiêm ngặt về câu trả lời chỉ là một liên kết và "lmgtfy" hồi đó. Nhưng tôi đồng ý; một chỉnh sửa hồi tố có ý nghĩa bất cứ lúc nào.
Thomas

Để tập tin cấu hình nào tôi sẽ thêm câu lệnh đó?
dan carter

8

Trong cấu hình toàn cầu, bạn có thể sử dụng:

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

Tương tự, bạn có thể sử dụng tệp .htaccess trong thư mục đầu tiên của cây thư mục bảo mật:

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

Cái cuối cùng cũng có thể được đặt trong một thư mục trong cấu hình máy chủ ảo hoặc toàn cầu.


Chuyển hướng HTTP sang HTTPS sẽ mở ra cho bạn một số loại tấn công MiTM nhất định. Chỉ là một sự thận trọng.
Craig

1

Ngoài ra, bạn có thể sử dụng ngôn ngữ phía máy chủ để xử lý cho bạn, thay vì sử dụng các tùy chọn cấu hình của Apache (nếu, có lẽ, bạn không có quyền truy cập vào cấu hình của máy chủ).

Ví dụ: với PHP:

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

(mặc dù chỉ cần lưu ý - nếu bạn đang sử dụng ISAPI trên Microsoft IIS, nếu yêu cầu không được chuyển qua HTTPS, thì giá trị của biến $ _SERVER ['HTTPS'] sẽ bị "tắt")


1

Ai đó đã đề cập đến SSLRequireSSL nhưng tôi không nghĩ rằng nó hoạt động một mình và tôi đã không tìm thấy một ví dụ thành công với nó. Cách được đề xuất là https://wiki.apache.org/httpd/RedirectSSL Tôi đã áp dụng điều đó và nó hoạt động tốt!


0

Giả sử bạn đang sử dụng các chỉ thị Virtualhost,

Đặt một thư mục thư mục trong truy cập từ chối Virtualhost không ssl.

Sau đó, đặt một lệnh Directory trong truy cập cấp ssl virtualhost.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.