Bảo mật PHP trong thư mục người dùng


1

Tôi là một sysadmin cho một máy chủ nhỏ tại trường đại học của tôi, được sinh viên sử dụng để thử nghiệm và điều hành các công việc lâu dài theo ý muốn của họ.

Tôi đã kích hoạt PHP trong các thư mục người dùng để họ có thể thử nghiệm với các trang web và tất cả đều thoải mái.

Gần đây, tôi nhận ra rằng tất cả mã PHP trong thư mục người dùng được điều hành bởi người dùng máy chủ web (dữ liệu www) có một số đặc quyền mà rõ ràng tôi không muốn cung cấp cho người dùng. Một trang web dễ bị tổn thương hoặc người dùng độc hại có thể xóa trang web thông thường của máy chủ.

Có cách nào để chạy PHP của người dùng với các đặc quyền của người dùng không?

Tôi đã nghĩ đến một cách giải quyết cho việc cung cấp cho máy chủ web gần như các đặc quyền gần như bằng không nên việc vi phạm vào nó không thể làm tổn hại bất cứ điều gì nghiêm trọng. Điều này là có thể thực hiện được trong tình huống của tôi vì trang web rất đơn giản (chỉ mục html đơn giản).

Máy chủ đang chạy Debian Jessie với Apache 2.4.10.


Tôi có thể hiểu nhầm, nhưng tại sao bạn không thể cấp quyền chỉ đọc dữ liệu www trên các thư mục này?
harrymc

Điều đó sẽ ngăn nó xóa trang web, nhưng nó vẫn có thể giết chết máy chủ web hoặc một số thứ khác như thế. Có lẽ cấm tất cả các loại exec () có thể hoạt động
Guido

Câu trả lời:


4

Tôi đã thực hiện điều này một số lần bằng cách sử dụng nginx, lighttpd và apache. Khái niệm về cơ bản là giống nhau trong tất cả chúng: [Nhanh] CGI xử lý chạy như người dùng.

Nếu bạn muốn tự cứu mình thật nhiều rắc rối, hãy thử làm rối với các quyền như những người khác đã đề xuất. Đặc biệt, nếu các trang web người dùng của bạn được sở hữu bởi người dùng và trang web chính của bạn được sở hữu bởi root hoặc tương tự, bạn sẽ có hình dạng khá. Nhưng người dùng vẫn sẽ không được tách riêng và có thể đọc các tệp của nhau, v.v (mật khẩu cơ sở dữ liệu?). Chạy các máy chủ ảo riêng biệt cho mỗi người dùng / trang web sẽ cung cấp cho bạn sự bảo mật cao nhất và chắc chắn sẽ đơn giản hơn so với việc cố gắng tách biệt người dùng bằng apache.

Cách thức được chấp nhận tiêu chuẩn để phân tách người dùng PHP trong apache là thông qua SuExec (cũng có mpm-itk). Nếu bạn Google apache fastcgi suexechoặc tương tự, bạn sẽ nhận được nhiều kết quả. Tôi nghĩ rằng sẽ không thực tế nếu bao gồm các hướng dẫn đầy đủ ở đây. Nó có thể thay đổi dựa trên các quyết định thiết kế khác nhau và phân phối sử dụng. Thay vào đó, tôi sẽ cố gắng cung cấp một số điểm tôi cho là quan trọng và mô tả ngắn gọn về cấu hình của mình. Thiết lập của tôi trở nên khá phức tạp (và trên hết, tôi chạy một mô-đun SELinux tùy chỉnh). Dưới đây là một tổng quan ngắn gọn [hy vọng]:

  • Tên máy chủ ảo dựa trên bằng cách trỏ * .somedomain đến máy chủ: user.somedomain là tên của máy chủ ảo (Tôi giả sử bạn có thể làm điều tương tự với thư mục người dùng?).
  • Một /etc/httpd/vhosts.d/user.confcho mỗi người dùng.
  • Một thư /var/www/vhosts_configmục cho mỗi người dùng.
    • /var/www/vhosts_config/$USER/wrapper-bin chứa trình bao bọc để thực thi PHP (sẽ nói thêm về điều này sau)
    • /var/www/vhosts_config/$USER/php/php.ini: Tôi muốn có một php.iningười dùng riêng biệt .
    • /var/www/vhosts_config/$USER/php/ext/*.ini: Một tệp ini cho mỗi phần mở rộng có sẵn
    • /var/www/vhosts_config/$USER/php/ext-active/*.ini: các liên kết tượng trưng quay lại ../extcho mỗi tiện ích mở rộng được bật (vì vậy tôi cũng có thể bật / tắt tiện ích mở rộng cho mỗi người dùng)
  • /var/www/vhosts/userchứa nội dung thực tế cho vhost. Tôi khuyên bạn nên luôn luôn sử dụng public_htmlthư mục con làm gốc tài liệu để người dùng có một thư mục nằm ngoài thư mục gốc để lưu trữ các tệp cấu hình, v.v.
  • Người dùng không thể đọc các tệp của nhau. Bạn cần cho phép máy chủ web +xtrên người dùng. Có nhiều cách bạn có thể làm điều này. Tôi sử dụng POSIX ACL.

Cấu hình httpd cho mỗi người dùng trông giống như thế này (được thay đổi cho ngắn gọn):

<VirtualHost *:80>
        ServerName someuser.somedomain
        DocumentRoot /var/www/vhosts/someuser/public_html

        SuexecUserGroup someuser someuser    

        FcgidWrapper /var/www/vhosts_config/someuser/wrapper-bin/php .php

        #max of 5 cgis per vhost
        FcgidMaxProcessesPerClass 5
        FcgidMinProcessesPerClass 0

        AddHandler php-fcgi .php
        Action php-fcgi /wrapper-bin/php

        Alias /wrapper-bin/ /var/www/vhosts_config/someuser/wrapper-bin/

        <Location /wrapper-bin/>
                Options +ExecCGI
                SetHandler fcgid-script
        </Location>
</VirtualHost>

suexeclà một setuidchương trình gốc mà apache gọi để bắt đầu các tiến trình như một người dùng nhất định. Nó là khá cầu kỳ. Nó yêu cầu chương trình mà nó thực thi thuộc sở hữu của người dùng và được chứa trong thư mục con của /var/www(điều này thay đổi trên các bản phân phối Linux khác nhau và được đặt ở thư mục thời gian biên dịch) do người dùng sở hữu. Đây là lý do tại sao mỗi người dùng cần tập lệnh bao bọc PHP của riêng mình.

/var/www/vhosts_config/someuser/wrapper-bin/php trông giống như:

export PHPRC=/var/www/vhosts_config/someuser/php
export PHP_INI_SCAN_DIR=$PHPRC/ext-active/
export PHP_FCGI_CHILDREN=0
umask 0077
exec /usr/bin/php-cgi
  • PHP_INI_SCAN_DIRthiết lập một thư mục để tìm kiếm php.inicác tệp bổ sung mà tôi sử dụng để tải cấu hình dành riêng cho tiện ích mở rộng.
  • PHPRCliệt kê các thư mục để tìm php.initập tin

Bạn không phải sử dụng một cấu hình PHP riêng cho mỗi người dùng và làm như vậy chắc chắn sẽ làm phức tạp mọi thứ. Tôi muốn cung cấp cho người dùng cấu hình rút gọn và chỉ bật những gì cần thiết (và một vài tiện ích mở rộng phổ biến theo mặc định). Tôi cũng tải suhoding với các cấu hình khác nhau cho mỗi người dùng (các khóa mã hóa khác nhau).

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.