Thiết lập PHP phổ biến không an toàn?


10

Tôi làm việc với quản trị hệ thống tại một trường đại học và tình cờ phát hiện ra điều gì đó có lẽ phổ biến, nhưng lại gây sốc cho tôi.

Tất cả các thư mục và khu vực web chung_html được lưu trữ trên afs, với quyền đọc cho các máy chủ web. Vì người dùng được phép có các tập lệnh php trong public_html, điều này có nghĩa là họ có thể truy cập các tệp của nhau từ bên trong php (và các tệp web chính!).

Điều này không chỉ khiến cho bất kỳ bảo vệ mật khẩu .htaccess nào hoàn toàn vô dụng, nó còn cho phép người dùng đọc các tệp nguồn php chứa mật khẩu cơ sở dữ liệu mysql và thông tin nhạy cảm tương tự. Hoặc nếu họ thấy rằng những người khác có thư mục mà máy chủ web có quyền truy cập ghi (ví dụ: đối với nhật ký cá nhân hoặc để lưu dữ liệu biểu mẫu đã gửi), họ có thể lưu trữ tệp trong các tài khoản đó.

Một ví dụ đơn giản:

<?
  header("Content-type: text/plain");
  print file_get_contents("/afs/example.com/home/smith/public_html/.htpasswd"); 
?>

đây là một vấn đề phổ biến phải không? Và làm thế nào để bạn thường giải quyết nó?

CẬP NHẬT:

Cảm ơn các đầu vào. Thật không may, dường như không có câu trả lời đơn giản. Trong một môi trường chia sẻ lớn như thế này, người dùng có lẽ không nên có nhiều sự lựa chọn này. Cách tiếp cận tốt nhất tôi có thể nghĩ đến là đặt "open_basingir" trong cấu hình chính cho tất cả các thư mục "public_html", chạy suphp và chỉ cho phép dọn dẹp php (không có tập lệnh cgi, chạy các lệnh bên ngoài với backticks, v.v.).

Thay đổi chính sách như thế này sẽ phá vỡ rất nhiều thứ, và hoàn toàn có thể khiến người dùng chộp lấy cây chĩa của họ và đuổi theo chúng tôi ... Tôi sẽ thảo luận với các đồng nghiệp của mình và cập nhật ở đây nếu chúng tôi đưa ra quyết định về cách thay đổi thiết lập.


Đây là một câu hỏi thú vị. Tôi chắc chắn trên các nhà cung cấp dịch vụ lưu trữ chia sẻ lớn (ví dụ Dreamhost), điều này là không thể. Nhưng tôi sẽ quan tâm đến cách họ bảo vệ khỏi điều này. suphp, như cstamas đã đề cập, có vẻ như là một giải pháp tốt, nhưng đây có phải là điều mà hầu hết các nhà cung cấp dịch vụ lưu trữ sử dụng?
Lèse majesté

1
Tôi đã sử dụng open_basedirgiải pháp bên dưới trên các hệ thống lưu trữ chia sẻ sản xuất, nhưng chúng tôi chia mọi người thành vhost riêng của họ - Không chắc nó có hoạt động cho các thư mục đơn không ...
voretaq7

Câu trả lời:


8

Người ta có thể sử dụng suphp chạy tập lệnh php với uid của chủ sở hữu.

http://www.suphp.org


Điều này có thể sẽ không giải quyết được vấn đề trên (ít nhất là trong môi trường lưu trữ chia sẻ. Các tệp .htpasswd thường thuộc sở hữu của người dùng sở hữu trang web và nhóm (apache) hoặc thế giới (vì người dùng không biết / quan tâm đến bảo mật) có thể đọc được, vì vậy ngay cả với suphp họ cũng có thể đọc các tệp đó)
voretaq7

@ voretaq7: Một số hạn chế khác có thể được áp dụng. Theo tôi nhớ, bạn thậm chí có thể từ chối quyền truy cập vào các tệp bạn không sở hữu. Vì vậy, quy tắc này ra khỏi cuộc tấn công ở trên.
cstamas

Tôi biết bạn có thể hạn chế quyền trên các tệp ("Không thể ghi theo nhóm / người khác / bất cứ ai"), nhưng tôi không biết cách chặn đọc vượt quá quyền của FS. Họ có check_vhost_docroot, nhưng AFAIK chỉ áp dụng cho tập lệnh đang được thực thi (? Tôi có thể sai về điều đó)
voretaq7

1
Tôi không chắc liệu suphp có phải là giải pháp tốt trong môi trường như thế này không. Một người dùng có thể có tất cả các loại quyền mà người dùng www không có. Kẻ tấn công tìm thấy đường đi qua php có thể tìm thấy khóa ssh hoặc keytabs hoặc thay đổi tập lệnh đăng nhập của người dùng để tạo backtime. Và cài đặt "vhosts" không hữu ích vì các thư mục public_html có sẵn thông qua "/ ~ tên người dùng" trên máy chủ ảo chính. Tôi nghĩ có lẽ các tập lệnh trong public_html nên bị vô hiệu hóa hoàn toàn.
Pontus

4

Đề xuất của tôi sẽ là giới hạn quyền truy cập của PHP vào các tệp (thông qua open_basedir& các chỉ thị tương tự, trên cơ sở mỗi vhost): Bạn muốn người dùng có thể mở / đọc / ghi tệp dưới webroot của họ và có thể cao hơn một cấp không gian), nhưng không phải là một thư mục nơi họ sẽ lưu trữ, ví dụ như htpasswdcác tệp.

Một cấu trúc thư mục như:

/Client
    /auth
    /site
        /www_root
        /www_tmp

Sẽ đáp ứng yêu cầu này: open_basedircó thể được chỉ vào /Client/sitemột cách an toàn và htpasswdcác tệp được lưu trữ trong /Client/auth(với .htaccesscác tệp hoặc httpd.confđược sửa đổi để trỏ đến vị trí thích hợp thay thế).
Điều này ngăn khách hàng của bạn mở tệp của bất kỳ ai khác, VÀ vì lợi ích người dùng độc hại không thể đọc nội dung trong /Client/auth(hoặc bất kỳ thứ gì khác trên hệ thống của bạn, như /etc/passwd:-)

Xem http://php.net/manual/en/ini.core.php để biết thêm chi tiết về triển khai open_basingir & per-vhost.


1
suphpnhư được lưu ý bởi cstamas cũng là một ý tưởng thực sự tốt trong môi trường lưu trữ được chia sẻ - Có một chút chi phí được thiết lập, nhưng tôi sẽ nói rằng lợi ích bảo mật là hoàn toàn xứng đáng. Thiếu hộp cát tất cả các trang web PHP của bạn trong một cái gì đó như Nhà tù FreeBSD hoặc một máy ảo chuyên dụng là một trong những chiến thắng bảo mật lớn nhất.
voretaq7

"open_basingir" dường như là một cách đơn giản để tách các tệp web chính khỏi các tệp người dùng, miễn là "public_html" được cung cấp thông qua máy chủ ảo của chính nó. Nhưng nó không bảo vệ người dùng khỏi nhau, vì họ không có máy chủ ảo riêng. Đúng?
Pontus

Tôi chưa thử cài đặt open_basedirbên trong một lệnh <Directory>, nhưng tôi nghĩ nó nên được cho phép ("thử và xem" - tệ nhất là nó không thể hoạt động :)
voretaq7

1
Cho đến nay, có vẻ như open_basingir là thứ mà hầu hết các máy chủ web thương mại sử dụng (thông thường người đăng ký có tên miền trả phí riêng hoặc nhận được tên miền phụ miễn phí), nhưng đối với các trang chủ dựa trên thư mục như trong một tổ chức học thuật, suphp dường như là câu trả lời tốt nhất.
Lèse majesté

1

Không, đó không phải là vấn đề phổ biến vì hầu hết các máy chủ được chia sẻ sẽ xác định cấu hình open_basingir trong tệp htaccess trong thư mục chung_html của mỗi người dùng (hoặc trong vhost nếu mỗi người dùng có vhost riêng).

ví dụ: tệp .htaccess:

# Assuming these are not set globally - its good practice to limit:
  php_flag magic_quotes_gpc off
  php_flag magic_quotes_runtime off
  php_flag register_globals off
  php_flag short_open_tag off
  php_value max_execution_time 60

# These set the user-specific paths
  php_value open_basedir /afs/example.com/home/smith:/usr/share/php/include
  php_value session.save_path /afs/example.com/home/smith/tmp
  php_value upload_tmp_dir /afs/example.com/home/smith/tmp

Nhưng hãy đảm bảo rằng bạn đã đặt quyền phù hợp trên tệp .htaccess để ngăn người dùng thay đổi open_basingir (nếu họ cố gắng ghi đè nó trong subir / .htaccess, nó không nên hoạt động - nhưng có lẽ bạn nên kiểm tra điều này để đảm bảo) .

HTH

C.


2
Điều này có thể giúp cung cấp một số bảo vệ ban đầu cho các tài khoản mới. Nhưng thực tế là người dùng không thể chỉnh sửa nó có thể khiến cho việc xóa tệp .htaccess trở nên hấp dẫn (điều họ có thể làm vì nó chỉ yêu cầu quyền truy cập ghi vào thư mục public_html) và tạo riêng cho họ. Thêm một "<Directory>" - khối trong cấu hình chính cho mỗi người dùng sẽ hoạt động, nhưng ở đây họ vẫn được phép sao lưu các lệnh bên ngoài từ php, điều đó có nghĩa là open_basingir dễ dàng bị phá vỡ.
Pontus

@Pontus: điểm hay về việc xóa tệp (Tôi không chắc afs có hỗ trợ thuộc tính tệp không thay đổi không). Tôi đã cho +1 nếu bạn nói rằng chạy máy chủ web trong nhà tù chroot sẽ bảo vệ chống lại tất cả các loại lỗ hổng thực thi chương trình.
symcbean

1

AFS bỏ qua các quyền người dùng unix đơn giản. suPHP thực thi một setuid trước khi chạy chương trình php, nhưng điều đó không cung cấp cho quá trình các mã thông báo kerberos cần thiết để truy cập AFS và bị hạn chế quyền của nó. suPHP sẽ phải được sửa đổi theo một cách nào đó để có được các mã thông báo đó trước khi nó có thể tự hiển thị cho hệ thống AFS với tư cách là người dùng đó. Theo tôi biết, điều đó đã không được thực hiện. (Trên thực tế, tôi đã tìm thấy câu hỏi này khi tìm kiếm xem có ai khác đã làm như vậy không.)

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.