Vấn đề về quyền với / var / www / html và thư mục nhà riêng của tôi cho một tài liệu gốc trang web


34

Tôi đang cố gắng không cho phép 777 trong /var/www/htmlthư mục của mình , nhưng tôi muốn chỉnh sửa các tệp của mình mà không cần sudo. Vì vậy, tôi mặc dù trong việc tạo một liên kết tượng trưng của một thư mục trong thư mục nhà của tôi trong /var/www/html. Tôi đã tạo nó bằng cách sử dụng sudo ln -sT /home/andre/www/moodle/ moodlels -lađầu ra là thế này:

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

Vì vậy, thư mục moodle của tôi đã đọc, viết và thực thi quyền cho mọi người và đó không phải là điều tôi muốn. Tôi đã sử dụng lệnh sudo chmod -R 775 moodle/cố gắng thay đổi nó, nhưng nó vẫn ở lại với quyền đọc, ghi và thực thi quyền đối với tất cả. Tôi đã thử tương tự với thư mục moodle trong /home/andre/www/moodle, nhưng nó vẫn giữ nguyên. Kết quả của ls -lanăm /home/andre/www/là:

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

Vì vậy, thư mục moodletrong /home/andre/www/có quyền tôi muốn.

Là một vấn đề khác, khi tôi truy cập, localhost/moodletôi gặp lỗi 403 Cấm.

Tôi làm gì sai ở đây?

Câu trả lời:


63

Bạn không bao giờ phải chạy một trang web từ trong thư mục nhà của bạn . KHÔNG BAO GIỜ. Mặt khác, bạn sẽ phải cung cấp cho máy chủ web khả năng duyệt qua/home/để xem cấu trúc thư mục, nhưng cũng vào/home/$USER/(thư mục chính của người dùng của bạn, nơi chúng tôi có thể thử và xem những gì khác tồn tại trong thư mục người dùng của bạn), cũng như bất kỳ thư mục con nào khác trong đó. Máy chủ web được cấu hình kém hoặc cấu hình sai hoặc chưa được vá có thể gây rò rỉ dữ liệu lớn theo cách này hoặc mất thông tin xác thực và điều đó sẽ khiến dữ liệu cá nhân và thông tin đăng nhập của bạn gặp rủi ro. Cách tiếp cận symlink mà bạn đang sử dụng không giúp ích gì cho cùng một lý do như cố gắng cấp quyền cho Apache để đọc/home/andre/www/moodle- máy chủ web phải có khả năng duyệt qua thư mục chính của bạn để đến vị trí mà liên kết tượng trưng /var/www/htmlchỉ đến, điều này vẫn gây ra rủi ro bảo mật.

Thứ nhất, sử dụng sudo cp -r /home/andre/www/moodle/ /var/www/html/. Điều này sẽ sao chép các tập tin của bạn vào /var/www/htmlvà để nó ra khỏi thư mục nhà của riêng bạn. Sau đó, chúng tôi sẽ làm lại các quyền để bạn và máy chủ web có thể truy cập mọi thứ trong thư mục đó và cung cấp cho người dùng của bạn đọc / ghi đầy đủ vào tất cả các tệp và thư mục. Sau đó, bạn sẽ chỉ phải làm việc /var/www/htmlcho trang web của bạn.

Điều này có hiệu lực, bốn bước, sau khi bạn sao chép dữ liệu của mình trở lại /var/www/html:

  1. Cấp cho Apache quyền truy cập vào các thư mục và tệp, để nó có thể phục vụ trang web mà không gặp lỗi 403.
  2. Cung cấp cho người dùng 'chủ sở hữu' của bạn qua các tệp và thư mục và tự đọc / ghi trên tất cả các tệp và thư mục, cũng như khả năng duyệt qua các thư mục.
  3. (Tùy chọn nhưng được khuyến nghị) Thiết lập nó sao cho mọi tệp hoặc thư mục được tạo từ đây trong toàn bộ cấu trúc thư mục có nhóm được đặt www-data.
  4. (Tùy chọn) Dọn dẹp bảo mật cuối cùng, nơi chúng tôi thiết lập quyền để bạn và máy chủ web có thể xem dữ liệu trang web, nhưng người dùng khác không thể truy cập các tệp hoặc cấu trúc thư mục cho trang web.

(1) Cho phép Apache truy cập vào các thư mục và tệp.

sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +

Điều này đệ quy đặt 'nhóm' là www-datadành cho các thư mục và tệp. Điều này sau đó cho phép máy chủ web lặp lại và có quyền truy cập vào cấu trúc thư mục gốc của tài liệu trang web (chỉ +xdành cho thư mục). Sau đó, nó cũng đảm bảo máy chủ web có quyền đọc cho tất cả các tệp, do đó dữ liệu trang web có thể được nhận.

Có thể có một số trường hợp bạn phải cấp cho máy chủ web quyền ghi vào tệp hoặc vào thư mục - điều này có thể đạt được bằng cách thực hiện sudo chmod g+w /var/www/html/PATH( PATHđường dẫn đến tệp hoặc thư mục trong cấu trúc thư mục nơi bạn cần áp dụng quyền viết cho máy chủ web).

THÔNG BÁO : Có rất nhiều trường hợp điều này có thể làm lộ thông tin 'an toàn' về cấu hình trang web (chẳng hạn như thông tin truy cập cơ sở dữ liệu, v.v.) và bạn nên xóa quyền truy cập 'khác' đối với dữ liệu đó trên các tệp hoặc thư mục riêng lẻ đó với như sau: sudo chmod o-rwx /var/www/html/FILEPATH(thay thế FILEPATHbằng đường dẫn liên quan đến /var/www/htmlthư mục của tệp).

Cũng lưu ý rằng bạn có thể phải chạy lại các lệnh này trong tương lai nếu 'tệp mới' gặp phải 403 vấn đề, để cấp quyền chính xác cho máy chủ web để có thể truy cập các tệp và thư mục được tạo hoặc sao chép trong và không www-datađặt nhóm chính xác.


(2) Cung cấp cho chủ sở hữu của bạn quyền đọc / ghi vào các thư mục và tệp và cho phép truy cập thư mục để duyệt qua cấu trúc thư mục.

sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +

Thay thế USERtrong lệnh đầu tiên với tên người dùng của riêng bạn!

Chúng tôi làm ba điều ở đây. Đầu tiên, chúng tôi đặt người dùng của bạn là "Chủ sở hữu" của tất cả các tệp và thư mục trong /var/www/html. Tiếp theo, chúng tôi đặt quyền đọc và ghi trên các thư mục và cho phép bạn truy cập các thư mục để truy cập chúng ( +xmục trên mục thư mục). Sau đó, chúng tôi đặt tất cả các tệp để có quyền đọc / ghi cho chủ sở hữu mà chúng tôi vừa đặt.


(3) (Tùy chọn) Đảm bảo mọi tệp mới sau khi tệp này được tạo với www-datatư cách là người dùng 'truy cập'.

sudo find /var/www/html -type d -exec chmod g+s {} +

Cái này đặt bit "set gid" cho nhóm trên các thư mục. Các tệp và thư mục được tạo bên trong các thư mục này sẽ luôn có www-datadưới dạng nhóm, cho phép truy cập máy chủ web.


(4) (Tùy chọn) Dọn dẹp bảo mật cuối cùng, nếu bạn không muốn người dùng khác có thể xem dữ liệu

Chúng tôi cần người dùng của bạn để xem các thư mục và tập tin. Chúng tôi cũng cần máy chủ web để làm như vậy. Chúng tôi có thể không muốn người dùng hệ thống khác (trừ root) xem dữ liệu. Vì vậy, cho phép không cung cấp cho họ quyền truy cập đó và làm cho nó để chỉ người dùng của bạn và máy chủ web có thể xem dữ liệu.

sudo chmod -R o-rwx /var/www/html/

LƯU Ý: Bạn sẽ không phải chạy lại điều này sau, hoặc chỉnh sửa các quyền cho danh mục quyền 'khác' ở đây. Nếu người dùng 'khác' không thể truy cập /var/www/html/(họ không có +xbit cần thiết /var/www/htmlđể duyệt qua cấu trúc thư mục và cấu trúc thư mục, cũng như +rbit để đọc danh sách tệp), thì quyền trên các mục bên dưới thư mục đó cho người dùng khác hoặc các nhóm không thực sự quan trọng quá nhiều.


Cũng có một giải pháp ít xâm lấn hơn cho vấn đề này, mặc dù nó không được bảo đảm để hoạt động cho tất cả các tệp mới, cũng không được đảm bảo hoạt động trên tất cả các hệ thống tệp , liên quan đến danh sách kiểm soát truy cập tệp. Điều này cho phép bạn để lại quyền sở hữu các tệp www-datacho mọi thứ, nhưng cung cấp cho bạn quyền sở hữu hiệu quả, cho tất cả các ý định và mục đích, mặc dù bạn không sở hữu các tệp cá nhân.

Giải pháp này ít xâm lấn hơn và cho phép bạn có một thư mục và tất cả các tệp trong đó thuộc sở hữu của www-data:www-datahoặc root:www-datanhưng cũng cho phép bạn truy cập. Nó sử dụng Danh sách điều khiển truy cập , cho phép bạn có nhiều người dùng có quyền mà không cần thiết lập các nhóm riêng lẻ. Điều này cũng cho phép người dùng roothoặc www-datahệ thống sở hữu các tệp, nhưng cũng cho phép bạn thêm các quyền bổ sung cho từng trường hợp cụ thể và tinh chỉnh các quyền cho một số người dùng nhất định để họ có thể đọc mọi thứ nhưng không thể chỉnh sửa, v.v.

Giả sử chúng tôi vẫn đang làm việc /var/www/html/và chúng tôi không muốn rình mò những người dùng khác ngoài chúng tôi và hệ thống (và tất nhiên là root) để xem dữ liệu của chúng tôi, chúng tôi sẽ cần thực hiện những điều sau:

  1. Trả lại quyền sở hữu cho người dùng hệ thống máy chủ web www-data.
sudo chown -R www-data: www-data / var / www / html
  1. Đệ quy cung cấp cho bạn đọc / ghi trên các tệp, trong khi cung cấp cho người dùng khác (không bao gồm www-dataroottất nhiên) không có quyền truy cập vào các tệp.
sudo find / var / www / html -type f -exec setfacl -mu: YOUUSERNAME: rw -m other :: --- {} \;
  1. Đệ quy cung cấp cho bạn đọc / ghi / duyệt trên các thư mục, xóa quyền truy cập vào các thư mục cho người dùng khác (không bao gồm www-dataroot) và đặt đây là ACL 'mặc định' cho các tệp mới trong thư mục.
sudo find / var / www / html -type d -exec setfacl -d -mu: YOUUSERNAME: rwx -mo :: --- {} \;
  1. Chúng ta cũng cần đặt setgidbit cho tất cả các thư mục, để nếu bạn tạo tệp, máy chủ web vẫn có thể truy cập tệp đó www-datathông qua quyền của nhóm.
sudo find / var / www / html -type d -exec chmod g + x {} \;

Và bây giờ bạn đã có quyền truy cập vào tất cả các thư mục bạn không cần phải truy cập từ www-datađó giúp vì máy chủ web vẫn có thể tạo các tệp ở mọi nơi mà nó cần (chẳng hạn như các tiền đề dựa trên PHP có các thư mục bộ đệm riêng của họ và như vậy cần phải được tạo ra và viết để hoạt động đúng).

Nhắc nhở duy nhất: Nếu bạn tự tạo các tệp mới, bạn cần phải chỉnh sửa chúng theo cách phù hợp để trao quyền sở hữu cho máy chủ web. Điều đó đơn giản sudo chown www-data:www-data filenamevà danh sách kiểm soát truy cập vẫn sẽ cho phép bạn có quyền sở hữu hiệu quả đối với tệp.

Có nhiều trường hợp tôi đã phải làm điều này như một sysadmin cho một số loại truy cập không chuẩn mà không thay đổi chủ sở hữu của một tệp nhất định. Điều này hoạt động, nhưng có đau đầu riêng của nó, vì không phải mọi hệ thống tệp đều hỗ trợ danh sách truy cập tệp.


2
@ AndréCarvalho +xđối với các tệp sẽ cung cấp quyền thực thi và chúng tôi không muốn các tệp PHP được thực thi, nhất thiết, thông qua dòng lệnh PHP hoặc dưới dạng thực thi trên chính máy chủ - chúng tôi muốn chúng được xử lý bởi trình phân tích cú pháp PHP trong máy chủ web (và chúng tôi không cần các tệp PHP để +xtrình phân tích cú pháp PHP đọc và xử lý chúng). Các thư mục cần +xđể cho phép truyền tải qua các thư mục - nghĩa là, nếu một thư mục không phải là +xtôi và tôi không thể root, tôi không thể truy cập vào thư mục, đó là vấn đề bạn gặp phải khi Apache không hoạt động với symlink và nhà của bạn danh mục.
Thomas Ward

1
@ AndréCarvalho www-datalà một nhóm hệ thống - đây không phải là nhóm dành cho người dùng chuẩn.
Thomas Ward

1
@JunaidQadirShekhanzai Không thể cung cấp vì cài đặt của mọi người khác rất nhiều so với môi trường họ cần và nhiều yếu tố khác. Một 'tập tin shell' như vậy sẽ không thể tạo ra nếu có các thành phần tùy chọn . Tôi có thể thử và tạo một tập lệnh Python có thể làm điều này, nhưng chúng tôi vẫn gặp phải những vấn đề như hạn chế hệ thống, tác vụ tùy chọn, đường dẫn khác nhau, v.v.
Thomas Ward

1
@ T.Todua đó không phải là những gì tôi nói. Tôi đã nói rằng bạn không bao giờ nên chạy một trang web ra khỏi (đọc: từ bên trong) thư mục "nhà" của bạn - nghĩa là bạn không nên chạy bất cứ thứ gì /home/USER/...trên máy chủ web. Bạn đã đọc sai và hiểu sai ý nghĩa của những từ tôi sử dụng. /var/www/*là một nơi tương đối 'an toàn' để chạy các trang web vì đó là thư mục / không gian dành riêng cho nó. Tuy nhiên, /var/www/htmlKHÔNG an toàn vì điều đó được ghi bởi máy chủ web khi cài đặt và như vậy, và dẫn đến việc ghi đè dữ liệu quan trọng (thay vào đó hãy sử dụng /var/www/SUBDIRECTORYvới các thư mục con trang web riêng lẻ)
Thomas Ward

1
Tôi đã điều chỉnh từ ngữ cho rõ ràng.
Thomas Ward

2

Toàn bộ ý tưởng sử dụng symlink để giải quyết vấn đề cấp phép là thiếu sót và không thể hoạt động. Các quyền được hiển thị cho chính symlink hầu như không liên quan, chúng không thể được sử dụng để phá vỡ các quyền của thư mục "thực". Tạo một liên kết tượng trưng /var/www/html/moodleđể /home/andre/www/moodle/không phá vỡ các quyền cho /home/andre/www/moodle/. Bất cứ ai, những người muốn làm công cụ trong /var/www/html/moodlechỉ có thể làm như vậy, nếu anh ta đã có quyền cần thiết cho /home/andre/www/moodle/.

Thực hiện lại sudo chmod -R 775 moodle/thực sự đã có ảnh hưởng, nhưng khác với những gì bạn nghĩ rằng nó không thay đổi sự cho phép của liên kết tượng trưng, nhưng trong những mục tiêu liên kết tượng trưng /home/andre/www/moodle/.

Lỗi 403 bạn gặp phải trong máy chủ web có thể là do máy chủ web của bạn không có quyền cần thiết để nhập /home/andre. Đây không phải là "một vấn đề bổ sung", nhưng do cùng một sự cố về quyền.

Vì vậy, thay vì sử dụng symlink, bạn phải tìm ra các quyền cho phép bạn chỉnh sửa các tệp và máy chủ web để truy cập chúng (hoặc thậm chí chỉnh sửa chúng, tùy thuộc vào ứng dụng). Chính xác những quyền đó là gì, tùy thuộc vào trường hợp sử dụng chính xác của bạn (ứng dụng và cấu hình máy chủ của bạn).

Nói chung, tôi nghĩ rằng bạn nên sở hữu các tệp và có quyền rw, máy chủ web chỉ đọc quyền truy cập vào các tệp thông qua quyền của nhóm và tất cả người dùng khác không có quyền truy cập nào.

Một ví dụ về quyền (có thể không hoạt động cho trường hợp sử dụng của bạn do thiếu thông tin):

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

Bạn có thể thấy rằng thư mục có đủ quyền truy cập để bạn là chủ sở hữu nhập nó và sửa đổi nội dung của nó, máy chủ web (trong nhóm www-data) có thể nhập và đọc. Bản thân các tệp có thể đọc và ghi được cho bạn (chủ sở hữu) và có thể đọc được cho máy chủ web (trong nhóm www-data). Tất cả người dùng khác không có quyền truy cập nào.

Một lần nữa, xin vui lòng chỉ lấy điều này làm ví dụ. Người dùng / nhóm chính xác của máy chủ web của bạn phụ thuộc vào cấu hình của bạn. Và ứng dụng của bạn (moodle) có thể cần các quyền khác nhau, bạn phải tham khảo tài liệu của nó.


Đồng ý, nhưng điều này không quá hữu ích nếu họ không biết cách đặt quyền chính xác và họ cũng sẽ gặp phải các vấn đề khác.
Thomas Ward

@ThomasW.: Sau đó, câu hỏi về cách đặt quyền đúng phải là một câu hỏi mới, bao gồm thông tin cần thiết, như cấu hình máy chủ web, cách chỉnh sửa tệp mong muốn và nhu cầu của ứng dụng.
mastov

hoặc được viết như một câu trả lời đúng - mà tôi đang làm bây giờ. Bạn cũng không bao giờ nên chạy bất cứ thứ gì ra khỏi / home / USER / cho một trang web, nó có quyền truy cập vào rất nhiều dữ liệu của 'người dùng' khác nếu máy chủ web không được vá hoặc định cấu hình chính xác.
Thomas Ward

@mastov Đã hiểu rồi. Bạn giải quyết rất nhiều câu hỏi tôi có với lời giải thích của bạn.
André Carvalho

2

Câu trả lời tuyệt vời của Thomas phường https://askubfox.com/a/767534/717860

Bạn có thể thực hiện tất cả các bước được đề xuất chỉ trong 3 lệnh thay vì 8 lệnh:

3 lệnh:

sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+

làm tương tự như 8 lệnh sau:

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/
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.