Các tập tin / thư mục trang web của tôi nên có quyền gì trên máy chủ web Linux?


309

Đây là Câu hỏi Canonical về Quyền của Tệp trên máy chủ web Linux.

Tôi có một máy chủ web Linux chạy Apache2 lưu trữ một số trang web. Mỗi trang web có thư mục riêng trong / var / www /.

/var/www/contoso.com/
/var/www/contoso.net/
/var/www/fabrikam.com/

Thư mục cơ sở / var / www / được sở hữu bởi root: root. Apache đang chạy dưới dạng dữ liệu www: dữ liệu www. Trang web Fabrikam được duy trì bởi hai nhà phát triển, Alice và Bob. Cả hai trang web của Contoso đều được duy trì bởi một nhà phát triển, Eve. Tất cả các trang web cho phép người dùng tải lên hình ảnh. Nếu một trang web bị xâm phạm, tác động nên càng hạn chế càng tốt.

Tôi muốn biết cách tốt nhất để thiết lập quyền để Apache có thể phục vụ nội dung, trang web được bảo mật khỏi các cuộc tấn công và các nhà phát triển vẫn có thể thay đổi. Một trong những trang web có cấu trúc như thế này:

/var/www/fabrikam.com
    /cache
    /modules
    /styles
    /uploads
    /index.php

Làm thế nào các quyền nên được thiết lập trên các thư mục và tập tin? Tôi đã đọc ở đâu đó rằng bạn không bao giờ nên sử dụng quyền 777 trên trang web, nhưng tôi không hiểu vấn đề gì có thể gây ra. Trong thời gian bận rộn, trang web sẽ tự động lưu trữ một số trang và lưu trữ kết quả vào thư mục bộ đệm. Tất cả nội dung được gửi bởi khách truy cập trang web được lưu vào thư mục tải lên.


6
Đây được dự định là một câu trả lời chính tắc cho tất cả các câu hỏi chúng tôi nhận được về quyền của trang web.
Nic

"Tôi đã đọc ở đâu đó rằng bạn không bao giờ nên sử dụng quyền 777 trên trang web, nhưng tôi không hiểu ..." - khi đó người đọc có thể hiểu hoặc ít nhất có thể so sánh giá trị của câu trả lời ở đây không? Bất kỳ giải pháp nào cũng phải dựa trên các yêu cầu cụ thể - các yêu cầu ở đây không đủ cụ thể (mô hình mối đe dọa)
symcbean 6/212

6
Tôi thích rằng bạn đang hỏi về Apache, nhưng đang sử dụng các miền mà Microsoft thường sử dụng làm ví dụ.
gWaldo


Bạn có thể tham khảo tại đây để biết chi tiết đầy đủ về quyền được yêu cầu đặt trên các tệp và thư mục trang web trong linux serverfault.com/questions/124800/

Câu trả lời:


342

Khi quyết định sử dụng quyền nào, bạn cần biết chính xác người dùng của mình là ai và họ cần gì. Một máy chủ web tương tác với hai loại người dùng.

Người dùng được xác thực có tài khoản người dùng trên máy chủ và có thể được cung cấp các đặc quyền cụ thể. Điều này thường bao gồm quản trị viên hệ thống, nhà phát triển và tài khoản dịch vụ. Họ thường thay đổi hệ thống bằng SSH hoặc SFTP.

Người dùng ẩn danh là khách truy cập vào trang web của bạn. Mặc dù họ không có quyền truy cập các tệp trực tiếp, họ có thể yêu cầu một trang web và máy chủ web thay mặt họ hành động. Bạn có thể giới hạn quyền truy cập của người dùng ẩn danh bằng cách cẩn thận về các quyền mà quy trình máy chủ web có. Trên nhiều bản phân phối Linux, Apache chạy như www-datangười dùng nhưng nó có thể khác. Sử dụng ps aux | grep httpdhoặc ps aux | grep apacheđể xem người dùng Apache đang sử dụng cái gì trên hệ thống của bạn.


Ghi chú về quyền linux

Linux và các hệ thống tuân thủ POSIX khác sử dụng các quyền unix truyền thống. Có một bài viết tuyệt vời trên Wikipedia về quyền của Filesystem vì vậy tôi sẽ không lặp lại mọi thứ ở đây. Nhưng có một vài điều bạn nên chú ý.

Các bit thực thi Các
tập lệnh được giải thích (ví dụ: Ruby, PHP) chỉ hoạt động tốt mà không có sự cho phép thực thi. Chỉ nhị phân và shell script cần bit thực thi. Để duyệt (nhập) một thư mục, bạn cần có quyền thực thi trên thư mục đó. Máy chủ web cần sự cho phép này để liệt kê một thư mục hoặc phục vụ bất kỳ tệp nào bên trong nó.

Quyền truy cập tệp mới mặc định
Khi một tệp được tạo, nó thường kế thừa id nhóm của bất kỳ ai đã tạo. Nhưng đôi khi bạn muốn các tệp mới kế thừa id nhóm của thư mục nơi chúng được tạo, vì vậy bạn sẽ kích hoạt bit SGID trên thư mục mẹ.

Giá trị quyền mặc định phụ thuộc vào ô của bạn. Umask trừ các quyền từ các tệp mới tạo, do đó, giá trị chung của 022 dẫn đến các tệp được tạo với 755. Khi cộng tác với một nhóm, việc thay đổi ô của bạn thành 002 để các tệp bạn tạo có thể được sửa đổi bởi các thành viên nhóm. Và nếu bạn muốn tùy chỉnh các quyền của các tệp được tải lên, bạn cần phải thay đổi ô cho apache hoặc chạy chmod sau khi tệp đã được tải lên.


Vấn đề với 777

Khi bạn chmod 777trang web của bạn, bạn không có bảo mật nào. Bất kỳ người dùng nào trên hệ thống đều có thể thay đổi hoặc xóa bất kỳ tệp nào trong trang web của bạn. Nhưng nghiêm trọng hơn, hãy nhớ rằng máy chủ web thay mặt khách truy cập vào trang web của bạn và bây giờ máy chủ web có thể thay đổi cùng các tệp mà nó đang thực thi. Nếu có bất kỳ lỗ hổng lập trình nào trong trang web của bạn, chúng có thể bị khai thác để làm mất trang web của bạn, chèn các cuộc tấn công lừa đảo hoặc đánh cắp thông tin từ máy chủ của bạn mà bạn không hề biết.

Ngoài ra, nếu máy chủ của bạn chạy trên một cổng nổi tiếng (cần ngăn người dùng không phải root tạo ra các dịch vụ nghe có thể truy cập được trên thế giới), điều đó có nghĩa là máy chủ của bạn phải được khởi động bằng root (mặc dù mọi máy chủ lành mạnh sẽ ngay lập tức bị hủy đến một tài khoản ít đặc quyền hơn khi cổng bị ràng buộc). Nói cách khác, nếu bạn đang chạy một máy chủ web nơi thực thi chính là một phần của kiểm soát phiên bản (ví dụ: ứng dụng CGI), hãy để lại quyền của nó (hoặc, đối với vấn đề đó, quyền của thư mục chứa, vì người dùng có thể đổi tên thực thi) tại 777 cho phép bất kỳ người dùng nào chạy bất kỳ thực thi nào như root.


Xác định các yêu cầu

  • Các nhà phát triển cần truy cập đọc / ghi vào các tệp để họ có thể cập nhật trang web
  • Các nhà phát triển cần đọc / ghi / thực thi trên các thư mục để họ có thể duyệt xung quanh
  • Apache cần đọc quyền truy cập vào các tệp và các tập lệnh diễn giải
  • Apache cần đọc / thực thi quyền truy cập vào các thư mục có thể phục vụ
  • Apache cần đọc / ghi / thực thi quyền truy cập vào các thư mục cho nội dung được tải lên

Duy trì bởi một người dùng

Nếu chỉ có một người dùng chịu trách nhiệm duy trì trang web, hãy đặt họ làm chủ sở hữu người dùng trên thư mục trang web và cung cấp cho người dùng quyền rwx đầy đủ. Apache vẫn cần quyền truy cập để nó có thể phục vụ các tệp, vì vậy hãy đặt dữ liệu www làm chủ sở hữu nhóm và cấp quyền rx cho nhóm.

Trong trường hợp của bạn, Eve, có tên người dùng eve, là người dùng duy nhất duy trì contoso.com:

chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve      www-data   4096 Feb  5 22:52 contoso.com

Nếu bạn có các thư mục cần ghi bởi Apache, bạn có thể sửa đổi các giá trị cấp phép cho chủ sở hữu nhóm để dữ liệu www có quyền truy cập ghi.

chmod g+w uploads
ls -l
drwxrws--- 2 eve      www-data   4096 Feb  5 22:52 uploads

Lợi ích của cấu hình này là nó trở nên khó hơn (nhưng không phải là không thể *) đối với những người dùng khác trên hệ thống để rình mò, vì chỉ người dùng và chủ sở hữu nhóm mới có thể duyệt thư mục trang web của bạn. Điều này rất hữu ích nếu bạn có dữ liệu bí mật trong các tệp cấu hình của mình. Hãy cẩn thận về ô của bạn! Nếu bạn tạo một tệp mới ở đây, các giá trị quyền có thể sẽ mặc định là 755. Bạn có thể chạy umask 027để các tệp mới mặc định là 640 ( rw- r-- ---).


Được duy trì bởi một nhóm người dùng

Nếu có nhiều hơn một người dùng chịu trách nhiệm duy trì trang web, bạn sẽ cần tạo một nhóm để sử dụng để gán quyền. Đó là cách tốt để tạo một nhóm riêng cho mỗi trang web và đặt tên nhóm theo trang web đó.

groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob

Trong ví dụ trước, chúng tôi đã sử dụng chủ sở hữu nhóm để trao đặc quyền cho Apache, nhưng bây giờ nó được sử dụng cho nhóm nhà phát triển. Vì chủ sở hữu người dùng không còn hữu ích với chúng tôi nữa, nên đặt nó thành root là một cách đơn giản để đảm bảo rằng không có đặc quyền nào bị rò rỉ. Apache vẫn cần quyền truy cập, vì vậy chúng tôi cung cấp quyền truy cập đọc cho phần còn lại của thế giới.

chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root     dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Nếu bạn có các thư mục cần ghi bởi Apache, bạn có thể tạo Apache thành chủ sở hữu người dùng hoặc chủ sở hữu nhóm. Dù bằng cách nào, nó sẽ có tất cả quyền truy cập mà nó cần. Cá nhân, tôi thích biến nó thành chủ sở hữu người dùng để các nhà phát triển vẫn có thể duyệt và sửa đổi nội dung của các thư mục tải lên.

chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data     dev-fabrikam   4096 Feb  5 22:52 uploads

Mặc dù đây là một cách tiếp cận phổ biến, nhưng có một nhược điểm. Vì mọi người dùng khác trên hệ thống đều có cùng đặc quyền với trang web của bạn như Apache, người dùng khác dễ dàng duyệt trang web của bạn và đọc các tệp có thể chứa dữ liệu bí mật, chẳng hạn như các tệp cấu hình của bạn.

Bạn có thể có bánh của bạn và ăn nó quá

Điều này có thể được cải thiện hơn nữa. Hoàn toàn hợp pháp khi chủ sở hữu có ít đặc quyền hơn nhóm, vì vậy thay vì lãng phí chủ sở hữu người dùng bằng cách gán nó cho root, chúng tôi có thể biến Apache thành chủ sở hữu người dùng trên các thư mục và tệp trong trang web của bạn. Đây là một sự đảo ngược của kịch bản duy trì duy nhất, nhưng nó hoạt động tốt như nhau.

chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Nếu bạn có các thư mục cần ghi bởi Apache, bạn có thể sửa đổi các giá trị cấp phép cho chủ sở hữu người dùng để dữ liệu www có quyền truy cập ghi.

chmod u+w uploads
ls -l
drwxrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Một điều cần cẩn thận với giải pháp này là chủ sở hữu người dùng của các tệp mới sẽ khớp với người tạo thay vì được đặt thành dữ liệu www. Vì vậy, bất kỳ tệp mới nào bạn tạo sẽ không thể đọc được bởi Apache cho đến khi bạn truy cập chúng.


* Phân tách đặc quyền Apache

Tôi đã đề cập trước đó rằng những người dùng khác có thể rình mò trên trang web của bạn bất kể bạn đang sử dụng loại đặc quyền nào. Theo mặc định, tất cả các quy trình Apache chạy như cùng một người dùng dữ liệu www, do đó, bất kỳ quy trình Apache nào cũng có thể đọc các tệp từ tất cả các trang web khác được định cấu hình trên cùng một máy chủ và đôi khi thậm chí thực hiện thay đổi. Bất kỳ người dùng nào có thể khiến Apache chạy tập lệnh đều có thể có cùng quyền truy cập mà chính Apache có.

Để chống lại vấn đề này, có nhiều cách tiếp cận khác nhau để phân tách đặc quyền trong Apache. Tuy nhiên, mỗi cách tiếp cận đi kèm với những hạn chế về hiệu suất và bảo mật. Theo tôi, bất kỳ trang web nào có yêu cầu bảo mật cao hơn nên được chạy trên một máy chủ chuyên dụng thay vì sử dụng Virtualhost trên máy chủ dùng chung.


Xem xét bổ sung

Tôi đã không đề cập đến nó trước đây, nhưng thường thì sẽ có một nhà phát triển chỉnh sửa trang web trực tiếp. Đối với các trang web lớn hơn, tốt hơn hết là bạn nên có một số loại hệ thống phát hành cập nhật máy chủ web từ nội dung của hệ thống kiểm soát phiên bản. Phương pháp duy trì duy nhất có lẽ là lý tưởng, nhưng thay vì một người bạn có phần mềm tự động.

Nếu trang web của bạn cho phép tải lên mà không cần phải phục vụ, những tải lên đó sẽ được lưu trữ ở đâu đó bên ngoài web root. Mặt khác, bạn có thể thấy rằng mọi người đang tải xuống các tệp được dự định là bí mật. Ví dụ, nếu bạn cho phép sinh viên gửi bài tập, họ sẽ được lưu vào một thư mục không được Apache phục vụ. Đây cũng là một cách tiếp cận tốt cho các tập tin cấu hình có chứa bí mật.

Đối với một trang web có yêu cầu phức tạp hơn, bạn có thể muốn xem xét việc sử dụng Danh sách điều khiển truy cập . Chúng cho phép kiểm soát các đặc quyền tinh vi hơn nhiều.

Nếu trang web của bạn có các yêu cầu phức tạp, bạn có thể muốn viết một tập lệnh thiết lập tất cả các quyền. Kiểm tra kỹ, sau đó giữ an toàn. Nó có thể có giá trị trọng lượng của nó bằng vàng nếu bạn thấy mình cần phải xây dựng lại trang web của mình vì một số lý do.


10
"Chmod -R 775 fabrikam.com". Rất ít tệp trong hầu hết các trang web phải được thực thi; ví dụ: tập lệnh php có thể là 0640 miễn là máy chủ web có thể đọc chúng. chmod -R a + X fabrikam.com sẽ cung cấp quyền thực thi cho mọi người chỉ trên các thư mục.

7
Lưu ý rằng Apache chạy như người dùng apachetrên các hệ thống có nguồn gốc Red Hat.
Michael Hampton

Điều này thật tuyệt vời, nhưng có một điều tôi không hiểu: Tôi không hiểu mục tiêu hay lợi thế của chiến lược biến apache thành người dùng / chủ sở hữu của một thư mục tệp nếu nó đã có quyền sở hữu nhóm đối với tệp.
ngốc

Câu trả lời này, trong khi toàn diện, chỉ liên quan đến các quyền của DAC. Tôi nghĩ rằng quyền MAC cũng nên được xem xét.
dawud

1
Đây là một bài viết xuất sắc. Đây là đóng góp của tôi: Nhược điểm của việc sử dụng dữ liệu www là chủ sở hữu và dev-fabrikam làm nhóm (được đề cập trong Bạn có thể có bánh của bạn và cũng ăn nó (áp dụng ngược lại) cho kịch bản được cung cấp trong Duy trì bởi một người dùng . kịch bản, bất cứ khi nào Apache tạo một thư mục hoặc tệp, người dùng sẽ không có quyền truy cập vào nó để các tệp cần được trả lại cho người dùng ban đầu. Tôi chưa cập nhật câu trả lời vì tôi không chắc chắn 100% về tuyên bố của mình Tôi muốn người khác xác nhận nó trước khi vá câu trả lời.

14

Tôi tự hỏi tại sao rất nhiều người sử dụng (hoặc đề nghị) phần "khác" (o) của các quyền Linux để kiểm soát những gì có thể làm Apache (và / hoặc PHP). Bằng cách đặt phần bên phải này thành một cái gì đó khác với "0", bạn chỉ cần cho phép cả thế giới thực hiện một cái gì đó trên tệp / thư mục.

Cách tiếp cận của tôi là như sau:

  • Tôi tạo hai người dùng riêng biệt. Một cho truy cập SSH / SFTP (nếu cần), sẽ sở hữu tất cả các tệp và một cho người dùng PHP FastCGI (người dùng trang web sẽ chạy như). Hãy gọi những người dùng này tương ứng là bobbob-www .
  • bob sẽ có toàn quyền ( rwx trên các thư mục, rw- trên các tệp), để anh ấy / cô ấy có thể đọc và chỉnh sửa toàn bộ trang web.
  • Quá trình PHP FastCGI cần quyền rx đối với các thư mục và r-- quyền đối với các tệp, ngoại trừ các thư mục rất cụ thể như cache/hoặc uploads/, trong đó cũng cần có quyền "ghi". Để cung cấp cho PHP FastCGI khả năng này, nó sẽ chạy dưới dạng bob-wwwbob-www sẽ được thêm vào nhóm bob được tạo tự động .
  • Bây giờ chúng tôi đảm bảo chủ sở hữu và nhóm của tất cả các thư mục và tệp là bob bob .
  • Thiếu một cái gì đó: ngay cả khi chúng tôi sử dụng FastCGI, nhưng Apache vẫn cần quyền truy cập đọc, đối với nội dung tĩnh hoặc các tệp .htaccess mà nó sẽ cố đọc nếu AllowOverrideđược đặt thành thứ gì đó khác None. Để tránh sử dụng phần o của các quyền, tôi thêm người dùng dữ liệu www vào nhóm bob .

Hiện nay:

  • Để kiểm soát những gì các nhà phát triển có thể làm, chúng tôi có thể chơi với u một phần của quyền (nhưng điều này lưu ý dưới đây).
  • Để kiểm soát những gì Apache và PHP có thể làm, chúng ta có thể chơi với phần g của các quyền.
  • Phần o luôn được đặt thành 0, vì vậy không ai khác trên máy chủ có thể đọc hoặc chỉnh sửa trang web.
  • Không có vấn đề gì khi người dùng bob tạo các tệp mới, vì nó sẽ tự động thuộc về nhóm chính của nó ( bob ).

Đây là một bản tóm tắt, nhưng trong tình huống này, bob được phép SSH. Nếu không nên có bất kỳ người sử dụng được phép sửa đổi các trang web (ví dụ khách hàng. Chỉ đổi các trang web thông qua một bảng quản trị CMS và không có kiến thức Linux), tạo ra hai người dù sao, nhưng cung cấp /bin/falsenhư vỏ cho bob là tốt, và vô hiệu hóa đăng nhập của nó.

    adduser --home /var/www/bobwebsite --shell /bin/bash bob
    adduser --no-create-home --shell /bin/false --disabled-login --ingroup bob bob-www
    adduser www-data bob
    cd /var/www/bobwebsite
    chown -R bob:bob .
    find -type d -exec chmod 750 {} \;
    find -type f -exec chmod 640 {} \;

Lưu ý: mọi người có xu hướng quên rằng việc giới hạn quyền u (chủ sở hữu) hầu hết là vô dụng và không an toàn, vì chủ sở hữu của tệp có thể chạy chmodlệnh, thậm chí quyền là 000.

Hãy cho tôi biết nếu cách tiếp cận của tôi có một số vấn đề bảo mật, bởi vì tôi không chắc chắn 100%, nhưng đó là những gì tôi đang sử dụng.

Tôi nghĩ cấu hình này có vấn đề: khi PHP / Apache tạo một tệp mới (ví dụ: tải lên), nó sẽ thuộc về bob-www: bobbob sẽ chỉ có thể đọc được. Có lẽ setuid trên thư mục có thể giải quyết vấn đề.


Linux bỏ qua setuid. Các tập tin mới luôn thuộc sở hữu của người tạo.
Paul

Tôi không hiểu điều gì đó. Điều này dường như không kết hợp tình huống khi nhiều nhà phát triển hoạt động đồng thời trên trang web, vì người dùng duy nhất là bob. Làm thế nào để bạn đối phó với điều đó? Ví dụ. thông qua ssh, cả hai người dùng đăng nhập như bob. bob (1) cảm thấy anh ấy / cô ấy không thể nhớ mật khẩu và thay đổi nó thành mật khẩu khác nhưng vẫn an toàn. bob (2) cố gắng đăng nhập lần sau và anh ấy / cô ấy không thể.
n611x007

2
@naxa Bất kỳ hệ thống tốt nào cũng không bao giờ có bất kỳ nhà phát triển nào trực tiếp sửa đổi trang web. Lý tưởng nhất, trang web nằm dưới sự kiểm soát phiên bản sao cho tài khoản người dùng 'bob' kéo và triển khai tự động mỗi bản phát hành (ổn định). Vì vậy, các nhà phát triển thực hiện việc phát triển ngoại vi và các thay đổi sẽ được triển khai khi họ được đẩy đến máy chủ triển khai. 'bob' là người dùng hệ thống nên có quyền truy cập mạng rất hạn chế, không bao gồm đăng nhập từ xa; iptables thực sự cho phép bạn lọc theo UID cho những thứ như thế này.
Bắn Parthian

"Tôi tự hỏi tại sao rất nhiều người sử dụng (hoặc đề nghị) phần" khác "(o)" - thì có lẽ bạn nên đăng bài này dưới dạng câu hỏi thay vì trả lời. Không có gì lạ khi cố tình chạy máy chủ web (là phần tiếp xúc nhiều nhất với hệ thống) với mức đặc quyền thấp nhất trong khi hỗ trợ, phát triển, tài khoản quản trị viên cũng cần quyền truy cập khác
symcbean

@ParthianShot bạn không thể ép buộc điều đó với bên thứ ba (khi trang web không được bạn duy trì, nhưng thư mục tồn tại trong máy chủ của bạn). Đôi khi điều duy nhất họ biết phải làm là sử dụng ftp.
Peregring-lk

9

Với thứ hạng google về câu trả lời xuất sắc ở trên, tôi nghĩ có một điều cần lưu ý và dường như tôi không thể để lại một ghi chú sau câu trả lời.

Tiếp tục với ví dụ này, nếu bạn dự định sử dụng dữ liệu www làm chủ sở hữu và dev-fabrikam làm nhóm với quyền 570 trên thư mục (hoặc tệp), điều quan trọng cần lưu ý là Linux bỏ qua setuid , vì vậy tất cả các tệp mới sẽ được sở hữu bởi người dùng đã tạo ra chúng. Điều này có nghĩa là sau khi tạo các thư mục và tệp mới, bạn sẽ phải sử dụng một cái gì đó tương tự như:

chown -R www-data /newdirectory/
chmod -R 570 /newdirectory/

Trong Ubuntu 12.04 cho Rackspace OpenStack, tôi gặp một vấn đề kỳ lạ khi tôi không thể có quyền 570 để hoạt động cho đến khi tôi khởi động lại máy chủ, điều này đã khắc phục sự cố một cách kỳ diệu. Đã rụng tóc với tốc độ ngày càng tăng đối với vấn đề có vẻ đơn giản đó ....


Vui lòng để điều này được giải quyết: Trong Raspbian (còn gọi là trên mâm xôi pi, nếu bạn muốn thay đổi quyền sở hữu / var / www trong lighttpd (hoặc một trình duyệt web khác), bạn PHẢI khởi động lại.
gbronner

@gbronner Nếu đó là một vấn đề khó tìm giải pháp, bạn có thể xem việc đăng nó dưới dạng câu hỏi và cung cấp câu trả lời cho câu hỏi. Tuy nhiên, nó có lẽ phù hợp hơn trong một trang web Hỏi và Đáp khác. Tôi đoán là Unix & Linux có thể là một nơi tốt để làm điều đó.
Paul

1
Ngoài ra còn có raspberrypi.stackexchange.com; có vẻ như các trang web SE đang phân mảnh kiến ​​thức một chút.
gbronner

@gbronner lol. Tôi không biết về điều đó! Thẻ Raspbian trên U & L có khoảng 120 câu hỏi.
Paul

3

Tôi đi với cấu hình này:

  1. Tất cả các thư mục ngoại trừ tải lên một bộ cho chủ sở hữu rootvà nhóm root, quyền 0755.
  2. Tất cả các tập tin được đặt thành chủ sở hữu rootvà nhóm root, quyền 0644.
  3. Tải lên thư mục được đặt thành chủ sở hữu root, nhóm www-data, quyền 1770. Bit dính không cho phép chủ sở hữu nhóm xóa hoặc đổi tên thư mục và tệp bên trong.
  4. Bên trong thư mục tải lên một thư mục mới với www-datangười dùng và nhóm chủ sở hữu và 0700quyền cho mỗi www-datangười dùng tải lên tệp.
  5. Cấu hình Apache:

Từ chối AllowOverrideIndextrong thư mục tải lên, để Apache không đọc .htaccesstệp và người dùng Apache không thể lập chỉ mục nội dung của thư mục tải lên:

<Directory /siteDir>
   Options -Indexes
</Directory>

<Directory /siteDir/uploadDir>
   AllowOverride none
</Directory>

6. php.inicấu hình:

open_basedir = /siteDir:/tmp:/usr/share/phpmyadmin
post_max_size = 5M
file_uploads = On
upload_max_filesize = 3M
max_file_uploads = 20

Với cấu hình này, www-datangười dùng sẽ không thể vào được các thư mục khác ngoài siteDir/ /tmp/usr/share/phpmyadmin. Ngoài ra, bạn có thể kiểm soát kích thước tệp tối đa, kích thước bài đăng tối đa và các tệp tối đa để tải lên trong cùng một yêu cầu.


3

Khi bạn có một người dùng FTP có tên "leo" cần tải tệp lên thư mục web example.com và bạn cũng yêu cầu người dùng "apache" của mình có thể tạo tệp uploa-files / session / cache trong thư mục bộ đệm, sau đó thực hiện như sau:

Lệnh này gán leo là chủ sở hữu và nhóm là apache cho example.com, người dùng apache là một phần của apache nhóm nên nó sẽ kế thừa các quyền của nhóm apache

chown -R leo: apache example.com

Một lệnh khác đảm bảo sự cho phép đúng và cũng đáp ứng các mối quan tâm bảo mật.

chmod -R 2774 example.com

Ở đây, số 2 đầu tiên dành cho thư mục và đảm bảo mỗi tệp mới được tạo sẽ vẫn nằm trong cùng quyền của nhóm và chủ sở hữu. 77 là dành cho chủ sở hữu và nhóm có nghĩa là họ có quyền truy cập đầy đủ. 4 là cho người khác có nghĩa là họ chỉ có thể đọc máng.

sau đây là hữu ích để hiểu số cho phép

Number  Octal Permission Representation
0   No permission
1   Execute permission
2   Write permission
3   Execute and write permission: 1 (execute) + 2 (write) = 3
4   Read permission
5   Read and execute permission: 4 (read) + 1 (execute) = 5
6   Read and write permission: 4 (read) + 2 (write) = 6
7   All permissions: 4 (read) + 2 (write) + 1 (execute) = 7

1

IMO người ta phải tính đến:

  • Bạn có tin tưởng một quá trình đọc các tập tin của bạn? ví dụ. PHP?

Giả sử bạn có một máy chủ chứa nhiều dữ liệu khác nhau theo 'kiểm tra' của người dùng.

Người dùng 'kiểm tra' có ở đó:

  • dữ liệu của anh ấy trong $HOMEDIR
  • thư của anh ấy trong $MAIL
  • dữ liệu của anh ấy cho web trong /var/www/test

Bây giờ hãy nghĩ về:

  • một ứng dụng web chạy dưới testngười dùng (PHP-FPM) - nó có thể xóa bất kỳ tệp nào của anh ấy!
  • một ứng dụng web chạy theo testnhóm (PHP-FPM) - nó có thể xóa bất kỳ tệp nào của anh ta trong đó thư mục có 'w' cho nhóm và có thể sửa đổi bất kỳ tệp nào có 'r' cho nhóm; và nó vẫn có thể đọc chúng - ví dụ như khóa ssh của bạn!

Giả sử PHP là lỗi, và bạn có tin tưởng nó open_basedirkhông? Bạn có chrootquá trình PHP của bạn? Bạn không làm gì, bạn có muốn nó thu thập dữ liệu qua tất cả các hệ thống tập tin không?

Quá trình ứng dụng web của bạn, ví dụ. PHP-FPM, sau đó nên:

  • bị giới hạn trong đường dẫn cụ thể thông qua chroot
  • không nên chạy dưới sự cho phép của người dùng chính hoặc quyền của nhóm chính

Do đó bạn có thể làm:

  • người dùng thử là: test:test
  • người dùng thử nghiệm nằm trong một nhóm thứ cấp, vd. test-www
  • một ứng dụng web (PHP-FPM) chạy bên dưới test-www:test-www
  • kiểm tra người dùng nếu anh ta muốn ứng dụng web có thể đọc các tệp của anh ta sẽ làm: chmod u=rwX,g=rX,o= /var/www/test/public
  • kiểm tra người dùng nếu anh ta muốn ứng dụng web có thể ghi vào đường dẫn dữ liệu web của mình: chmod u=rwX,g=rwXs,o= /var/www/test/public/upload (do đó ứng dụng sẽ tạo các tệp mới dưới dạng: test-www:test-www- nó sẽ có nhóm test-www vì setgid trên thư mục!)

Do đó, nếu quy trình ứng dụng web không có thật, nó sẽ chỉ đọc các tệp cụ thể có nhóm đọc và nó chỉ có thể ghi vào uploadthư mục. Tôi thực sự khuyên bạn nên có uploadthư mục đó trên một hệ thống tệp với noexec,nodev,nosuid mountcác tùy chọn và theo dõi liên tục bất kỳ tệp bizzare mới nào trong thư mục đó, đồng thời cũng giám sát mọi quy trình mới trong test-wwwuid.

Trên Linux, người ta có thể sử dụng ACL để điều chỉnh quyền tốt hơn. Nếu có nhiều hơn một người nên tải lên dữ liệu web, tốt hơn là nên tách tài khoản của con người khỏi tài khoản được sử dụng để tải lên các tệp dữ liệu web, tức là. để tạo tài khoản mới, vd. test-uploadvà người dùng thử nghiệm sẽ quản lý các khóa ssh để hạn chế con người có thể ssh / sftp ở đó. sshd_configbiết ExposeAuthInfocác tùy chọn do đó nó có thể được cấu hình để ghi nhật ký khóa ssh nào được sử dụng để tải lên dữ liệu.

Tôi thực sự nghi ngờ hầu hết các dịch vụ lưu trữ web quan tâm đến việc phân tách đặc quyền, khi họ viết 'an toàn' mà không có bất kỳ thông tin nào bạn nhận được, tôi sẽ nói họ nói dối.


php-fpm cho phép chrootuser, groupđược đặt cho một nhóm. nhưng tôi sẽ không tin tưởng php_admin_value[open_basedir]tùy chọn. Tôi cũng đọc tốt hơn khi có một bậc thầy PHP-FPM riêng cho mỗi người dùng, xem ma.ttias.be/a-better-way-to-run-php-fpm Để khởi tạo một trình nền dễ dàng trên hầu hết các bản phân phối Linux và * BSD.
Jiri B
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.