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ó 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:
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ơ.
www-data
và cho phép 0710
khi 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+x
cho các thư mục và o+r
cho các tệp.
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-data
ngườ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.inc
hoặc tương tự trên một máy dùng chung.
peter
và john
. 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.
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.conf
hoặc tạo một .conf
tệ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.
Đá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:
Các tài liệu gốc ứng dụng sẽ là một cái gì đó như /blah/peterWeb/html
và /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.
Đặ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.
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.