Bảo mật máy chủ web PHP


31

Các ứng dụng PHP có uy tín cao hơn các vấn đề bảo mật trung bình. Những kỹ thuật cấu hình nào bạn sử dụng để đảm bảo ứng dụng được bảo mật nhất có thể?

Tôi đang tìm kiếm những ý tưởng như:

Tôi thường sử dụng Linux, nhưng cũng thoải mái đề xuất các giải pháp Windows.

Câu trả lời:


15
  1. Sử dụng chỉ thị open_basingir để giới hạn các tập lệnh PHP của bạn vào thư mục chính của chúng và các thư mục ứng dụng bổ sung cuối cùng. Điều này là rất hiệu quả của chính nó.

  2. Sử dụng php cứng vì chi phí không có gì và nó có thể giúp đỡ.

  3. Sử dụng suPHP để các tập lệnh PHP thực thi với tư cách là chủ sở hữu của tệp (một người dùng trên mỗi trang web) và tránh sử dụng các tệp có quyền xấu như 777 ... suPHP cũng có thể cho phép bạn có trên php.ini trên mỗi trang web để một trang web trở nên ngu ngốc yêu cầu không phá hủy mọi thứ.

  4. Mod_security là một điểm cộng lớn nhưng cần được sử dụng và cấu hình tốt.


Một số trang web xấu thực sự cần register_globals và fopen, vì vậy đó là lý do tại sao bạn sử dụng php.ini trên mỗi trang web với suPHP. Một trang web chỉ có thể đi kamikaze và những trang khác (gần như) hoàn toàn an toàn.
Antoine Benkemoun

4
Nếu họ sử dụng register_globals và fopen, điều đó cho thấy chất lượng rất tệ, bạn có thể muốn xem xét lại bằng cách sử dụng chúng :)
David Pashley

Nếu họ đang trả 150 € / tháng, bạn không nên xem xét lại.
Antoine Benkemoun

3

Theo kinh nghiệm của tôi, hầu hết các lỗ hổng trên một trang web dựa trên PHP là kết quả của thiết kế (trang web) kém, thay vì các lỗ hổng trong chính PHP.

Một số mẹo nhanh:

  • Toàn cầu lọc đầu vào, đầu ra thoát. Clarificaiton: bộ lọc không có nghĩa là thoát, nó có nghĩa là "nếu tôi tìm thấy thứ gì đó tanh trong đầu vào của người dùng này, khiến cho việc gửi không thành công và yêu cầu người dùng định dạng lại."
  • Thay vì sử dụng escapeshellcmd (), chỉ cần không cho phép bất kỳ đầu vào nào của người dùng được thực thi trong trình bao . Điều đó nguy hiểm và có lẽ không bao giờ thực sự cần thiết.
  • Không gọi các hàm như phpinfo () trên trang web sản xuất (hoặc nếu bạn làm như vậy, xem bên dưới *).
  • Khi thiết kế một ứng dụng web, luôn luôn xem xét "đây có phải là một vector tấn công có thể không?" Nói, SQL tiêm. Nếu câu trả lời là "có", hãy cắm nó ngay lập tức - đừng nói "ok, tôi sẽ thêm nó sau này trong quá trình phát triển như một tính năng." Bảo mật không bao giờ là một tính năng.
  • Không bao giờ xuất lỗi thô cho người dùng; điều này có nghĩa là thiết lập display_errors = Tắt, log_errors = Bật. Bẫy lỗi thời gian chạy và đầu ra một cái gì đó đẹp. Lấy cá voi của Twitter làm ví dụ: nó sẽ không cung cấp cho người dùng thông tin cấp độ gỡ lỗi, nó chỉ nói "woops, một cái gì đó bị hỏng, vui lòng làm mới".

* Bạn cũng có thể xem qua một bài đăng ngắn mà tôi đã viết có tên là "Bảo mật phpinfo (), sắp xếp" và chắc chắn đọc các bình luận http://egovsergo.com/2009/04/03/protecting-your-phpinfo/ Đó là một ý tưởng nhanh chóng mà tôi phải (phần nào) bảo vệ phpinfo () nếu tôi bằng cách nào đó quên xóa nó trên một trang web sản xuất.

Nói một cách tổng quát hơn, một số nhà phát triển viết các hàm bao cho các chức năng nhạy cảm để kiểm tra xem cờ "trang sản xuất" có được đặt hay không và vô hiệu hóa chức năng nhạy cảm trong sản xuất.


Câu hỏi của tôi là về cách bảo vệ máy chủ của bạn chống lại PHP viết kém. :) Tôi không có nghĩa là bản thân PHP không an toàn, hơn nữa nó thu hút các nhà phát triển ít kinh nghiệm hơn và thư viện tiêu chuẩn yêu cầu họ phải nhớ bảo vệ mọi cuộc gọi, thay vì thư viện bảo vệ tất cả người dùng. +1 vì đây là một câu trả lời rất hữu ích.
David Pashley

Tôi có ấn tượng đó và trả lời phù hợp :) Cảm ơn đã nhận xét! Tôi không thể có được tất cả ở đây, rõ ràng, nhưng đó là một số hố lớn. Nếu bạn có câu hỏi cụ thể hơn, bạn chắc chắn có thể đặt chúng trên Stack Overflow và tôi và mọi người khác sẽ đóng góp. (Và với những gì đáng giá, tôi là một ZCE).
msanford

3

Các tham số khác cần được thay đổi để làm cứng PHP:

safe_mode = Off
register_globals = Off
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
log_errors = On
error_log = /var/log/phperror.log
display_errors = Off
enable_dl = Off
disable_functions="popen,exec,system,passthru,proc_open,shell_exec,show_source,phpinfo"

Lưu trữ tất cả các lỗi PHP trong tệp /var/log/phperror.log :

touch /var/log/phperror.log
chmod 666 /var/log/phperror.log

1

Tôi đã thêm kho lưu trữ dotdeb vào /etc/apt/source.lst của tôi

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

Khi họ vá php / apache / mysql thường xuyên hơn Debian.


1

Xem xét việc thiết lập open_basedirtrên cơ sở "mỗi trang web". open_basedirlà một cài đặt php.ini sẽ ngăn các tập lệnh của bạn truy cập các tệp bên ngoài danh sách trắng được xác định. Nếu máy chủ của bạn lưu trữ một số trang web, nó sẽ ngăn một trang web đọc cài đặt cơ sở dữ liệu từ một trang web khác. Nó cũng sẽ ngăn tập lệnh php truy cập / sửa đổi các tệp hệ thống lõi. Openir rất dễ thiết lập, chỉ cần thêm dòng " php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list" vào mỗi vhost Apache.

Ngoài ra, hãy xem xét tắt công cụ tập lệnh PHP cho tất cả các trang web / thư mục không chứa tập lệnh PHP (ví dụ: thư mục hình ảnh được tải lên). Một lần nữa, điều này rất đơn giản, hãy thêm "php_admin_value engine off" vào bất kỳ Virtualhost nào của Apache không cần php. Để vô hiệu hóa PHP trong một thư mục, hãy đặt điều tương tự vào thẻ Thư mục.

Chạy các quyền của tệp càng chặt chẽ càng tốt, tránh truy cập ghi vào các tập lệnh PHP cho người dùng Apache, điều này ngăn một tập lệnh đang chạy tự sửa đổi hoặc các tập lệnh khác trên cùng một trang / máy chủ. Tránh các quyền 777 nếu có thể, hãy tìm ra các quyền tối thiểu cần thiết để chạy ứng dụng và sử dụng các quyền đó.

Nếu bạn đang lưu trữ nhiều trang web, mỗi trang có cơ sở dữ liệu riêng, hãy sử dụng một người dùng MySQL / Postgres riêng biệt cho từng trang và đặt quyền cho mỗi người dùng để họ chỉ có quyền truy cập vào cơ sở dữ liệu có liên quan. Một lần nữa, điều này sẽ ngăn một tập lệnh giả mạo làm xáo trộn cơ sở dữ liệu của ứng dụng khác.

Suosin, HardenedPHP, mod_security và những thứ tương tự đều có giá trị, nhưng sử dụng chúng ngoài cấu hình được khóa chặt, thay vì.


0

Suhosin có chi phí hiệu năng khá lớn, do đó, nhận xét "không có chi phí" là một chút.


2
Những gì tốt là một trang web nhanh, bị hack? :) hardened-php.net/suhosin/benchmark.html cho thấy chậm hơn 8,85% trên một điểm chuẩn. Điều đó có thể được chấp nhận cho những lợi ích bảo mật mà nó cung cấp. Đây có lẽ nên là một bình luận chứ không phải là một câu trả lời.
David Pashley

Suhosin bảo vệ chủ yếu chống lại các cuộc tấn công địa phương. Vì vậy, nếu bạn chia sẻ máy chủ của mình với những người bạn không tin tưởng, điều đó có thể đáng để làm chậm lại. Nếu bạn có máy chủ của riêng bạn, hoặc lát cắt vm của riêng bạn, tôi không thấy điểm này.

0

Bạn đang tìm kiếm một số đề xuất tường lửa / cấu trúc cơ bản? Tôi thích ý tưởng sử dụng những thứ như bảng Anh để ngăn truy cập trực tiếp vào máy chủ web PHP từ các mạng nội bộ chưa được quét. Bằng cách đó, bạn cũng có thể tách biệt máy chủ web khỏi các phần khác trong mạng của mình.


Không, tôi đang tìm cách để cải thiện tính bảo mật của thời gian chạy PHP.
David Pashley

0

Sử dụng Suhosin / mod_security / SuPHP chắc chắn sẽ biến máy chủ PHP của bạn an toàn. Vô hiệu hóa một số chức năng như exec, passthru, system và escapeshellcmd cũng sẽ giúp ích rất nhiều.


1
Không phải escapeshellcmd () chỉ được sử dụng để thoát chuỗi? Nó không cung cấp bất kỳ cách nào để thực hiện một quy trình. Làm thế nào ai đó có thể sử dụng nó để gây ra một vấn đề?
David Pashley
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.