Làm cách nào để thiết lập quyền linux cho thư mục WWW?


69

Tóm tắt cập nhật

Thư mục / var / www được sở hữu bởi root:rootđiều đó có nghĩa là không ai có thể sử dụng nó và nó hoàn toàn vô dụng. Vì tất cả chúng ta đều muốn một máy chủ web thực sự hoạt động (và không ai nên đăng nhập dưới dạng "root"), nên chúng ta cần sửa lỗi này.

Chỉ có hai thực thể cần truy cập.

  1. PHP / Perl / Ruby / Python đều cần truy cập vào các thư mục và tệp vì chúng tạo ra nhiều trong số chúng (tức là /uploads/). Các ngôn ngữ script này nên được chạy dưới nginx hoặc apache (hoặc thậm chí một số thứ khác như FastCGI cho PHP).

  2. Các nhà phát triển

Làm thế nào để họ có quyền truy cập? Tôi biết rằng ai đó, một nơi nào đó đã làm điều này trước đây. Tuy nhiên, với hàng tỷ trang web ngoài kia, bạn sẽ nghĩ rằng sẽ có nhiều thông tin hơn về chủ đề này.


Tôi biết rằng 777 là quyền đọc / ghi / thực thi đầy đủ cho chủ sở hữu / nhóm / người khác. Vì vậy, điều này dường như không cần thiết chính xác vì nó cung cấp cho người dùng ngẫu nhiên toàn quyền.

Những quyền nào cần được sử dụng /var/wwwđể:

  1. Kiểm soát nguồn như git hoặc svn
  2. Người dùng trong một nhóm như "trang web" ( hoặc thậm chí được thêm vào "dữ liệu www" )
  3. Máy chủ như apache hoặc lighthttpd
  4. Và PHP / Perl / Ruby

tất cả có thể đọc, tạo và chạy các tập tin (và thư mục) ở đó không?

Nếu tôi đúng, các tập lệnh Ruby và PHP không được "thực thi" trực tiếp - mà được chuyển cho một trình thông dịch. Vì vậy, không cần thực thi quyền trên các tệp trong /var/www...? Vì vậy, có vẻ như sự cho phép chính xác sẽ được chmod -R 1660thực hiện

  1. tất cả các tệp có thể chia sẻ bởi bốn thực thể này
  2. tất cả các tệp không thể thực thi do nhầm lẫn
  3. chặn tất cả những người khác từ thư mục hoàn toàn
  4. đặt chế độ cấp phép thành "dính" cho tất cả các tệp trong tương lai

Điều này có đúng không?

Cập nhật 1: Tôi mới nhận ra rằng các tệp và thư mục có thể cần các quyền khác nhau - Tôi đã nói về các tệp ở trên vì vậy tôi không chắc các quyền của thư mục sẽ cần là gì.

Cập nhật 2: Cấu trúc thư mục /var/wwwthay đổi mạnh mẽ vì một trong bốn thực thể ở trên luôn luôn thêm (và đôi khi loại bỏ) thư mục và thư mục con sâu nhiều cấp. Họ cũng tạo và xóa các tệp mà 3 thực thể khác có thể cần quyền truy cập đọc / ghi. Do đó, các quyền cần phải thực hiện bốn điều trên cho cả tệp và thư mục. Vì không ai trong số họ cần phải có quyền thực thi (xem câu hỏi về ruby ​​/ php ở trên) nên tôi cho rằng rw-rw-r--quyền đó là tất cả những gì cần thiết và hoàn toàn an toàn vì bốn thực thể này được điều hành bởi nhân viên đáng tin cậy (xem # 2) và tất cả người dùng khác trên hệ thống chỉ có quyền truy cập đọc.

Cập nhật 3: Đây là dành cho máy phát triển cá nhân và máy chủ của công ty tư nhân. Không có "khách hàng web" ngẫu nhiên như một máy chủ được chia sẻ.

Cập nhật 4: Bài viết này của lát lưu trữ dường như là tốt nhất để giải thích những gì cần thiết để thiết lập quyền cho thư mục www của bạn. Tuy nhiên, tôi không chắc người dùng hoặc nhóm apache / nginx nào với PHP HOẶC svn / git chạy như thế nào và làm thế nào để thay đổi chúng.

Cập nhật 5: Cuối cùng tôi đã tìm thấy một cách để làm cho tất cả điều này hoạt động (câu trả lời dưới đây). Tuy nhiên, tôi không biết liệu đây có phải là cách chính xác và AN TOÀN để làm việc này không. Vì vậy, tôi đã bắt đầu một tiền thưởng. Người có phương pháp bảo mật và quản lý thư mục www tốt nhất sẽ thắng.

Câu trả lời:


47

Sau khi nghiên cứu nhiều hơn, có vẻ như một cách khác (có thể là tốt hơn) để trả lời điều này sẽ là thiết lập thư mục www như vậy.

  1. sudo usermod -a -G developer user1 (thêm từng người dùng vào nhóm nhà phát triển)
  2. sudo chgrp -R developer /var/www/site.com/ để các nhà phát triển có thể làm việc trong đó
  3. sudo chmod -R 2774 /var/www/site.com/ để chỉ nhà phát triển mới có thể tạo / chỉnh sửa tệp (khác / thế giới có thể đọc)
  4. sudo chgrp -R www-data /var/www/site.com/uploads để dữ liệu www (apache / nginx) có thể tạo tải lên.

gitchạy như bất cứ người dùng nào đang gọi nó, nên miễn là người dùng nằm trong nhóm "nhà phát triển", họ sẽ có thể tạo thư mục, chỉnh sửa tệp PHP và quản lý kho git.

Lưu ý: Trong bước (3): '2' trong 2774 có nghĩa là 'đặt ID nhóm' cho thư mục. Điều này khiến các tệp mới và thư mục con được tạo trong nó kế thừa ID nhóm của thư mục mẹ (thay vì nhóm chính của người dùng) Tham khảo: http://en.wikipedia.org/wiki/setuid#setuid_and_setgid_on_directories


Có vẻ hợp lý với tôi.
wazoox

Tốt Có lẽ nếu tôi có thể xác nhận điều này với một vài người nữa thì tôi sẽ sử dụng phương pháp này. Nó dường như là câu trả lời tốt nhất mà tôi có thể vắt kiệt sức người.
Xeoncross

Bạn không chỉ định ai sẽ là chủ sở hữu của các tệp. Bạn sẽ để nó là root? Sau đó, chỉ sudoers có thể chỉnh sửa thư mục tải lên của bạn (có thể không phải là những gì bạn dự định).
Nic

Có, root sẽ vẫn là chủ sở hữu. Tuy nhiên, vì chủ sở hữu nhóm hiện là "nhà phát triển" (và có quyền wrx) nên tất cả các nhà phát triển (và apache / nginx) cũng có thể đọc được. Không cần sudo.
Xeoncross

7
Một điều nữa để xem là umask. Nhiều hệ thống có ô mặc định là 022 sẽ loại bỏ quyền ghi cho cả nhóm và công khai trên các tệp mới. Tôi nghi ngờ bạn muốn 002 (không viết cho công chúng) hoặc 007 (không có quyền truy cập cho công chúng). Bạn có thể đặt ô trong cấu hình của Apache và / hoặc các tập lệnh khởi động cho bất kỳ quy trình nào cần truy cập vào thư mục. Đừng quên thêm nó vào / etc / profile hoặc / etc / bashrc để nó được đặt theo mặc định cho các nhà phát triển của bạn
Mark Porter

8

Tôi không chắc liệu nó có "đúng" hay không, nhưng đây là những gì tôi làm trên máy chủ của mình:

  • / var / www chứa một thư mục cho mỗi trang web.
  • Mỗi trang web có một chủ sở hữu được chỉ định, được đặt là chủ sở hữu của tất cả các tệp và thư mục trong thư mục của trang web.
  • Tất cả người dùng duy trì trang web được đưa vào một nhóm cho trang web.
  • Nhóm này được đặt là chủ sở hữu nhóm của tất cả các tệp và thư mục trong thư mục.
  • Bất kỳ tệp hoặc thư mục nào cần được ghi bởi máy chủ web (ví dụ: PHP) có chủ sở hữu của chúng đã thay đổi thành dữ liệu www, người dùng mà apache chạy theo.

Hãy nhớ rằng bạn nên kích hoạt bit thực thi trên các thư mục để bạn có thể liệt kê nội dung.


Làm thế nào để git / svn hoặc PHP tạo các thư mục mới sau đó?
Xeoncross

2
PHP chạy trong cùng bối cảnh người dùng với máy chủ web, vì vậy nó có thể tạo các tệp và thư mục trong bất kỳ thư mục nào thuộc sở hữu của máy chủ web. Nhìn chung chỉ có một vài thư mục như thế này (/ tải lên / chẳng hạn). Tôi không chắc chắn về git / svn - bạn có thể thêm chúng vào tài khoản nhóm kiểm soát trang web không?
Nic

rõ ràng git chạy khi người dùng chạy nó - giống như bất kỳ công cụ nào khác.
Xeoncross

Sau đó thêm người dùng git vào nhóm apache và cấp quyền ghi cho nhóm thư mục.
David Rickman

Tôi vừa nói, git không có người dùng - nó chạy như người dùng hiện tại đang sử dụng nó.
Xeoncross

7

Sau khi thực hiện nhiều nghiên cứu hơn, có vẻ như CÔNG CỤ git / svn KHÔNG phải là vấn đề vì chúng chạy như bất kỳ người dùng nào đang sử dụng chúng. (Tuy nhiên, trình nền git / svn là một vấn đề khác!) Mọi thứ tôi tạo / nhân bản bằng git đều có quyền của tôi và công cụ git được liệt kê /usr/binphù hợp với luận điểm này.

Quyền Git đã được giải quyết.

Quyền của người dùng dường như có thể giải quyết được bằng cách thêm tất cả người dùng cần truy cập vào thư mục www vào www-datanhóm mà apache (và nginx) chạy như.

Vì vậy, có vẻ như một câu trả lời cho câu hỏi này như sau:

Theo mặc định /var/wwwđược sở hữu bởi root:rootkhông ai có thể thêm hoặc thay đổi các tập tin ở đó.

1) Thay đổi chủ sở hữu nhóm

Trước tiên, chúng ta cần thay đổi nhóm thư mục www để được sở hữu bởi "dữ liệu www" thay vì nhóm "root"

sudo chgrp -R www-data /var/www

2) Thêm người dùng vào dữ liệu www

Sau đó, chúng ta cần thêm người dùng hiện tại (và bất kỳ ai khác) vào nhóm dữ liệu www

sudo usermod -a -G www-data demousername

3) thư mục CHMOD www

Thay đổi quyền để CHỈ chủ sở hữu (root) và tất cả người dùng trong nhóm "www-data" có thể rwx (đọc / ghi / thực thi) các tệp và thư mục ( thậm chí không ai có thể truy cập được ).

sudo chmod -R 2770 /var/www

Bây giờ tất cả các tệp và thư mục được tạo bởi bất kỳ người dùng nào có quyền truy cập (tức là trong nhóm "dữ liệu www") sẽ có thể đọc / ghi được bằng apache và do đó php.

Điều này có đúng không? Còn các tệp mà PHP / Ruby tạo ra - người dùng dữ liệu www có thể truy cập chúng không?


6
Tôi không thích ý tưởng có tất cả các tệp web có thể ghi được bằng PHP, nó sẽ tăng khả năng hiển thị của bạn nếu có lỗ hổng tập lệnh.
Nic

Ok, tôi biết rằng tôi sử dụng PHP để tạo nhiều tệp văn bản, tar, log và hình ảnh (cộng với các thư mục) vì vậy tôi chỉ giả sử rằng mọi thứ đều có thể ghi được. Tuy nhiên, có lẽ quyền và PHP của bạn chỉ có thể THAY ĐỔI TẠO PHIM TẠO CNTT sẽ vô hại vì 99% tất cả các ứng dụng PHP không bao giờ tạo tệp tập lệnh. Sự lựa chọn khác dường như chỉ cho phép một số thư mục nhất định PHP truy cập ghi (/ tải lên /) mà không thực hiện được vì sau đó PHP vẫn có thể được sử dụng để tạo ra thứ gì đó xấu ở đó. Có ý kiến ​​gì không?
Xeoncross

2
Cố gắng giữ tập lệnh và dữ liệu riêng biệt. Ngay cả khi kẻ tấn công quản lý để thả thứ gì đó vào / tải lên /, thì nó cũng không thể thực thi được. Bảo mật trong các lớp là chìa khóa.
Nic

6

Độ dính không phải là quyền thừa kế. Độ dính trên một thư mục có nghĩa là chỉ chủ sở hữu của một tệp hoặc chủ sở hữu thư mục mới có thể đổi tên hoặc xóa tệp đó trong thư mục, bất chấp các quyền nói khác. Do đó, 1777 trên / tmp /.

Trong Unix cổ điển, không có sự kế thừa quyền dựa trên hệ thống tệp, chỉ dựa trên quy trình hiện tại. Trên * BSD hoặc Linux với setgid trên thư mục, trường nhóm của các tệp mới được tạo sẽ được đặt giống như của thư mục mẹ. Đối với bất cứ điều gì hơn nữa, bạn cần xem xét ACL, với ACL 'mặc định' trên các thư mục, cho phép bạn có quyền thừa kế.

Bạn nên bắt đầu bằng cách xác định: * những gì người dùng có quyền truy cập vào hệ thống * mô hình mối đe dọa của bạn là gì

Ví dụ: nếu bạn đang thực hiện lưu trữ web với nhiều khách hàng và bạn không muốn họ nhìn thấy các tệp của nhau, thì bạn có thể sử dụng một nhóm "webcust" chung cho tất cả những người dùng đó và chế độ thư mục là 0705. Sau đó, các tệp được phục vụ bởi quá trình máy chủ web ( không phải trong "webcust") sẽ thấy các perm khác và được cho phép; khách hàng không thể xem các tệp khác và người dùng có thể gây rối với các tệp của riêng họ. Tuy nhiên, điều này không có nghĩa là thời điểm bạn cho phép CGI hoặc PHP bạn phải đảm bảo rằng các quy trình chạy như một người dùng cụ thể (dù sao đi nữa, đối với nhiều người dùng trên một máy chủ, vì trách nhiệm giải trình). Nếu không, khách hàng có thể gây rối với các tệp của nhau bằng cách sử dụng CGI.

Tuy nhiên, nếu người dùng thời gian chạy cho một trang web giống như chủ sở hữu của trang web, thì bạn có vấn đề với việc không thể bảo vệ nội dung khỏi những kẻ lạm dụng trong trường hợp lỗ hổng bảo mật trong tập lệnh. Đó là nơi các máy chủ chuyên dụng giành chiến thắng, để bạn có thể có một người dùng thời gian chạy khác biệt với chủ sở hữu nội dung tĩnh và không phải lo lắng quá nhiều về tương tác với những người dùng khác.


Câu trả lời tốt. Trên MacOS X, hệ thống hoạt động như thể bit SGID tự động trên các thư mục. Các bit dính thường có nghĩa là bạn chỉ có thể loại bỏ các tập tin nếu bạn có thể viết nó. Đó là, bất kỳ ai cũng có thể xóa một tệp có thể ghi công khai trong / tmp. Trên MacOS X, / tmp là một liên kết tượng trưng đến một thư mục riêng cho người dùng - vì vậy không có chia sẻ nào cả.
Jonathan Leffler

Cảm ơn câu trả lời, tôi đã cập nhật câu hỏi với nhiều thông tin hơn.
Xeoncross

Jonathan: bit dính có nghĩa là chỉ chủ sở hữu của thư mục hoặc chủ sở hữu của tệp, có thể đổi tên hoặc xóa nó (nghĩa là hành động theo mục nhập của nó trong thư mục 'tệp'). Quyền trên tệp riêng lẻ không phát huy tác dụng đối với các hoạt động thư mục này ( rename(), unlink()), chỉ dành cho các hành động trên chính tệp ( open()). Đây là hành vi "thông thường".
Phil P

2

Tôi tin rằng cách tốt nhất để làm điều này là sử dụng Posix ACL. Họ thoải mái làm việc và cung cấp tất cả các chức năng bạn cần.

http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs


+1 cho thông tin hữu ích về ACL. Tuy nhiên, tôi không muốn thêm rác làm hỏng hệ thống chỉ để quản lý một máy chủ đơn giản với một vài nhà phát triển. Tôi cũng không thoải mái với việc biên dịch lại kernel để sử dụng ACL.
Xeoncross

@Xeoncross: ACL không làm hỏng bất cứ điều gì. Họ chỉ là siêu dữ liệu như quyền tập tin bình thường. Đó không phải là tất cả "thêm" và phức tạp, tôi tin rằng đó là cách đơn giản nhất và tốt nhất để quản lý các quyền thay vì một số giải pháp dính / nhóm / bất cứ điều gì khó hiểu. Đừng sợ hãi, chỉ cần làm lại với acl và thử nó!
Tie-Fighter

1

Chủ sở hữu của tệp phải là người tạo ra nó, trong khi nhóm phải là dữ liệu www. Chế độ cho các thư mục / tập tin nói chung là 755/644. Trong khi đối với các thư mục và tệp, nhóm cần truy cập ghi, mod là 775/664. Giả sử lúa là nhà phát triển. Hoàn toàn điều này làm cho:

chown -R paddy:www-data /var/www/websiteindevelopment
chmod -R 755 /var/www/websiteindevelopment
chmod -R 775 /var/www/websiteindevelopment/directorywritablebygroup
find /var/www/websiteindevelopment -type f -perm 755 -print -exec chmod 644 {} \;  
find /var/www/websiteindevelopment -type f -perm 775 -print -exec chmod 664 {} \;

0

Thêm vào câu trả lời của @ Xeoncross, tôi nghĩ sẽ tốt hơn nếu định cấu hình quyền trên các tệp và thư mục riêng biệt.

sudo find /var/www -type d -exec chmod 775 {} \;  # Change permissions of directories to rwxrwxr-x
sudo find /var/www -type f -exec chmod 664 {} \;  # Change file permissions to rw-rw-r--

Điều này sẽ cho phép các nhà phát triển tạo và sửa đổi các thư mục trong / var / www. Điều này có vẻ quan trọng bởi vì, các nhà phát triển có thể cần phải tạo các thư mục bổ sung hoặc xóa một thư mục không còn cần thiết nữa.

Nó cũng sẽ cho phép các nhà phát triển tạo và sửa đổi các tệp mã (đọc các tệp HTML, PHP và tương tự). Nhưng, vẫn sẽ chỉ cho phép truy cập chỉ đọc cho những người khác.

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.