Người dùng trên mỗi máy chủ ảo trong Nginx


31

Có thể trong nginx cấu hình người dùng khác nhau cho mỗi máy chủ ảo?

Cái gì đó như

 server {
     user myprojectuser myprojectgroup;
     ...
 }

Câu trả lời:


7

Không, bởi vì tất cả các khổ máy chủ trong cấu hình nginx đều được phục vụ từ cùng một bộ quy trình worker. Hơn nữa, từ góc độ bảo mật, tốt hơn hết là bạn nên chạy nó như vậy, vì điều đó có nghĩa là nội dung tự động không thể nhận được bởi máy chủ web (vắng mặt ngu ngốc như a chmod -R 0777), do đó, nếu có lỗ hổng trong nginx, thì không có nội dung nào có nguy cơ.


2
Vì vậy, không có cách nào để ẩn các tập tin của người dùng từ người dùng khác? Tất cả nội dung của người dùng nên được đọc bởi dữ liệu www?
Alex Netkachov

1
Làm cho các tệp có thể truy cập được vào dữ liệu www (hoặc bất kỳ người dùng nào mà máy chủ web chạy dưới dạng) theo cách không yêu cầu các tệp có thể truy cập được đối với người dùng khác trên hệ thống.
womble

2
Cung cấp cho nhóm tài liệu gốc www-datavà cho phép 0710khi bạn thiết lập vhost (vì điều này cần root để định cấu hình nginx, không có vấn đề gì khi tự động hóa của bạn cũng đặt các quyền cần thiết). Sau đó, nội dung của docroot chỉ cần o+xcho các thư mục và o+rcho các tệp.
womble

13
Chú ý: nếu tập lệnh PHP (hoặc quy trình cgi-bin) chạy bên dưới www-data, mọi người dùng có thể phục vụ tập lệnh PHP hoặc quy trình cgi-bin có thể truy cập bất kỳ tệp nào mà www-datangười dùng có thể truy cập . Điều này dường như không rõ ràng đối với bất kỳ ai lưu trữ mật khẩu cơ sở dữ liệu trong config.php.inchoặc tương tự trên một máy dùng chung.
Ivan Vučica

2
@Ricalsin Hãy nhớ rằng UNIX là một hệ điều hành nhiều người dùng và các máy chủ có thể có nhiều hơn một người dùng. Ví dụ, peterjohn. Họ đang lưu trữ các trang web của họ trong ~/public_html. Không có một cách tiếp cận khác không được đề cập bởi bất kỳ ai trong số những người thảo luận về điều này ở trên, tập lệnh .php có các quyền tương tự như máy chủ web vì nó cũng đang được thực thi theo www-data. Điều này có nghĩa là, giống như máy chủ web và trình thông dịch PHP, nó có thể đọc bất kỳ tập lệnh .php nào khác.
Ivan Vučica

9

Vâng. Có thể và được khuyến nghị để bảo mật thêm (xem tại sao bên dưới).

Xem xét rằng bạn đang sử dụng PHP-FPM (có lẽ bạn là như vậy, vì nó là thông thường nhất), bạn có thể tạo một ống chỉ, thuộc sở hữu của một người dùng khác nhau, cho mỗi tên miền.

PS: Tôi đã viết một hướng dẫn chi tiết từng bước ở đây:

https://learnwithdaniel.com/2019/06/user-per-virtual-host-nginx/

1. Tạo cuộn chỉ:

Thêm các cuộn chỉ /etc/php/7.0/fpm/pool.d/www.confhoặc tạo một .conftệp mới cho mỗi ống chỉ mới.

Ống chỉ số 1 (myuser1):

[myprojectuser1]
user = myuser1
group = myprojectgroup
..
listen = /run/php/myuser1.sock
...  
listen.owner = www-data
listen.group = www-data

Ống chỉ số 2 (myuser2):

[myprojectuser2]
user = myuser2
group = myprojectgroup
..
listen = /run/php/myuser2.sock
...  
listen.owner = www-data
listen.group = www-data

PS: Giữ lắng nghe của bạn.owner / lắng nghe. Nhóm cho cùng một người dùng nginx (thường là dữ liệu www ).

2. Gán từng ống chỉ cho khối máy chủ của nó (máy chủ ảo cho người dùng apache):

Máy chủ 1:

server {
  ...
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/myuser1.sock;
  }
  ...
}

Máy chủ 2:

server {
  ...
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/myuser2.sock;
  }
  ...
}

Khởi động lại dịch vụ FPM và NGINX

sudo /etc/init.d/php7.0-fpm restart
sudo service nginx restart

Kiểm tra:

Tạo tệp pinfo.php (hoặc bất kỳ tên nào) sẽ hiển thị cho người dùng quy trình hiện tại:

<?php 
echo str_replace("\n", '<br>', shell_exec('ps -u -p '.getmypid()));

Hoặc tạo tệp pinfo.php qua bash:

echo "<?php echo str_replace(\"\\n\", '<br>', shell_exec('ps -u -p '.getmypid()));" > pinfo.php

Sau đó mở " http: //.../pinfo.php " trên trình duyệt của bạn.


Tại sao nên sử dụng nhiều người dùng (lý do bảo mật):

Nếu bạn chạy tất cả các trang web của mình dưới cùng một người dùng ( dữ liệu www ), một lệnh gọi PHP tới system () / passthru () / exec () sẽ có quyền truy cập vào tất cả các trang web! NGINX sẽ không bảo vệ bạn trước điều này. PHP chỉ là một ví dụ, nhưng bất kỳ ngôn ngữ máy chủ web phổ biến nào cũng có các cuộc gọi tương tự. Là một hacker, bạn có thể " ls .. " để điều hướng qua tất cả các trang web và " cp / echo / mv " để viết mã của riêng bạn vào bất kỳ tệp nào (bao gồm các tệp trang web khác). Ngay cả khi tất cả các trang web trên máy chủ được sở hữu bởi cùng một người (ví dụ: bạn), bạn nên chạy mỗi trang web với một người dùng khác nhau, vì nó sẽ ngăn chặn tin tặc / vi rút (ví dụ: vi rút Wordpress) truy cập vào các trang web khác của bạn.


5

Đáp lại bình luận của Ivan ở trên và dường như có thể áp dụng cho OP. Hai điều:

  1. Các tài liệu gốc ứng dụng sẽ là một cái gì đó như /blah/peterWeb/html/blah/johnWeb/html. Cả NGINX và Apache2 sẽ không cho phép một người lướt qua hoặc hoạt động trong thư mục khác ngay cả khi cả hai đều chạy dữ liệu www dưới dạng nhóm.

  2. Đặt từng cây thư mục dưới sự cho phép của người dùng riêng sẽ cho phép mỗi người dùng ssh / đăng nhập vào hệ thống UNIX và giữ các thư mục của họ ở chế độ riêng tư cho từng người - chỉ cần không đặt mỗi người dùng vào nhóm dữ liệu www. Nếu bạn đồng ý, thì câu của bạn:

    mọi người dùng có thể phục vụ tập lệnh PHP hoặc quy trình cgi-bin có thể truy cập bất kỳ tệp nào có thể truy cập được đối với người dùng dữ liệu www.

    có thể được viết chính xác hơn như sau:

    mọi người dùng mà bạn đặt trong cùng một nhóm với máy chủ apache / nginx (dữ liệu www) sau đó có thể làm bất cứ điều gì họ muốn (bao gồm chạy tập lệnh php) trong bất kỳ tệp nào có thể truy cập được (về cơ bản sẽ là mọi thứ trên web máy chủ).

EDIT 1: Phải giải quyết một số vấn đề về Quản trị viên Máy chủ, tôi đã tìm hiểu sâu hơn về chủ đề này. Tôi không biết thông tin của Ivan chính xác đến mức nào! Nếu bạn có ý định cung cấp cho người dùng khả năng tải lên và chạy các tập lệnh trên cấu hình lưu trữ được chia sẻ thì hãy chú ý. Đây là một cách tiếp cận . Hat tip cho Ivan để đảm bảo tôi hiểu lỗ hổng này.


4
Không. Bạn đang thiếu nó. Các tập lệnh PHP, khi được thực thi trong quy trình của Apache (hoặc các máy chủ web khác) sẽ chạy theo các đặc quyền quy trình lưu trữ. Trên một số lượng lớn các thiết lập ngây thơ người dùng này là www-data. Nếu Johnny có thể tạo một kịch bản và để nó chạy theo www-data(mà trên các thiết lập ngây thơ mà anh ta có thể), thì kịch bản của Johnny có thể đọc các kịch bản của Peter và gửi lại cho Johnny. Điều này không có gì để làm với các nhóm. Giải pháp phù hợp là có suPHP (nếu thiết lập một cách ngây thơ, xấu, vì mã được viết kém thì gây nguy hiểm cho tất cả các tệp của người dùng này), hoặc một nhà tù hoặc người dùng web chuyên dụng bổ sung cho mỗi người dùng.
Ivan Vučica

(Ngoài ra, việc thêm câu trả lời thay vì nhận xét là lạm dụng các trang web kiểu StackOverflow, ấn tượng bạn thực sự đang cung cấp câu trả lời. Vui lòng tránh điều đó.)
Ivan Vučica

@ IvanVučica Cập nhật và thêm một liên kết hữu ích hỗ trợ lời khuyên của bạn. Cảm ơn.
Ricalsin
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.