Quyền SFTP bị từ chối trên các tệp thuộc sở hữu của dữ liệu www


23

Tôi có một máy chủ khá chuẩn được thiết lập để chạy Apache và PHP. Một ứng dụng tôi đang chạy tạo các tệp và chúng được sở hữu bởi người dùng Apache www-data. Các tệp mà tôi tải lên qua SFTP được sở hữu bởi chính người dùng của tôi charlesr. Tất cả các tập tin là một phần của www-datanhóm. Vấn đề của tôi là tôi không thể sửa đổi hoặc ghi đè bất kỳ tệp nào thông qua SFTP được sở hữu bởi www-data, mặc dù charlesrlà một phần của www-datanhóm. Tôi có thể sửa đổi các tệp không có vấn đề thông qua phiên SSH.

Vì vậy, tôi không biết phải làm gì. Làm cách nào để cung cấp quyền phiên SFTP của tôi để sửa đổi www-datacác tệp sở hữu?

Đối với một chút nền tảng, đây là những ghi chú tôi đã viết cho chính mình khi thiết lập máy chủ:

Now set up permissions on `/var/www` where your files are served from by
default:

$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www

Now log out and log in again to make the changes take hold.

The previous set of commands does the following:

1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.

Và sau đó tôi tiếp tục tự giải thích về việc thiết lập bit SGID có nghĩa là gì (tức là tất cả các tệp được tạo trong tự động /var/wwwtrở thành một phần của www-datanhóm).


CẬP NHẬT

Có vẻ như sự cố là do chính ứng dụng hoặc cụ thể hơn là khung ứng dụng ( Kohana ) thiết lập một số tệp nhất định mà nó ghi thành 0644 (rw-r - r--); tức là không thể ghi nhóm. Điều này, cùng với thực tế là các tệp cũng thuộc sở hữu www-datacó nghĩa là tôi không thể chỉnh sửa các tệp qua SFTP khi đăng nhập dưới dạng charlesr. Tôi không chắc tại sao tôi có thể chỉnh sửa các tệp qua SSH. Tôi đoán là tôi đã sử dụng sudo.

Đây là chiến lược cấp phép mà tôi hiện đang sử dụng nhờ sự giúp đỡ không mệt mỏi của Marty Fried , người đã chỉ ra những sai sót trong chiến lược trước đây của tôi và cũng giúp tôi ướp trong thế giới quyền Linux cho đến khi cuối cùng tôi cũng mò mẫm nó. Cảm ơn Marty!

Tổng quan

  • Các tập tin và thư mục /var/wwwnên được sở hữu bởiroot:webmasters
  • Tất cả các nhà phát triển nên là thành viên của webmastersnhóm
  • Tất cả các thư mục trong /var/wwwnên được đặt thành: 2775hoặc u=rwx,g=rwxs,o=rx(rwxrwx-rx)
  • Tất cả các tệp trong /var/wwwphải được đặt thành: 0664hoặc ug=rw,o=r(rw-rw-r--)

Những thứ sau đây phải được sở hữu bởi www-data:webmasters(tức là đây là những thư mục mà Apache cần để có thể ghi vào):

  • ứng dụng / bộ đệm
  • ứng dụng / nhật ký
  • tải lên
  • client_helpers / tải lên

LÀM THẾ NÀO ĐỂ

Để thiết lập quyền trên /var/wwwnơi các tệp của bạn được phục vụ theo mặc định:

  1. sudo addgroup webmasters
  2. sudo adduser $USER webmasters
  3. sudo chown -R root:webmasters /var/www
  4. sudo find /var/www -type f -exec chmod 664 {} \;
  5. sudo find /var/www -type d -exec chmod 775 {} \;
  6. sudo find /var/www -type d -exec chmod g+s {} \;
  7. sudo chown -R www-data:webmasters application/cache/ [vv ...]

Bây giờ hãy đăng xuất và đăng nhập lại để thay đổi được thực hiện.

Nhóm lệnh trước thực hiện như sau:

  1. Tạo một nhóm mới được gọi là webmasters; tất cả người dùng cần quyền truy cập ghi vào tệp ứng dụng sẽ được thêm vào nhóm này.
  2. thêm người dùng hiện tại ( $USER) vào webmastersnhóm.
  3. thay đổi chủ sở hữu của /var/wwwđể rootvà nhóm để webmastersnhóm.
  4. thêm 664 quyền (-rw-rw-r--) cho tất cả các tệp trong /var/www.
  5. thêm 775 quyền (drwxrwxr-x) cho tất cả các thư mục trong /var/www.
  6. đặt bit SGID trên /var/wwwvà tất cả các thư mục trong đó; điểm cuối cùng này mang một số giải thích. Cũng lưu ý rằng bạn cũng có thể đặt số 2 ở phía trước bát phân chmod của mình (ví dụ 2644) để làm điều tương tự.
  7. đặt chủ sở hữu thành www-data(người dùng của Apache) và nhóm thư mục được cung cấp thành webmaster. Điều này đảm bảo thư mục có thể ghi được bởi Apache và bất kỳ ai trong webmastersnhóm. Làm tương tự cho tất cả các thư mục khác cần phải ghi.

Câu trả lời:


10

Ubuntu.com có ​​các hướng dẫn máy chủ khá tốt, chẳng hạn như hướng dẫn Apache . Trường hợp bạn nhận được các thủ tục của bạn, bạn rất cẩn thận viết ra? Tôi chưa bao giờ phải gặp nhiều rắc rối như vậy đối với bất kỳ máy chủ nào tôi đã thiết lập, mặc dù tôi có khả năng là tôi đã không làm đúng - đồng thời, tôi thực sự chưa cài đặt máy chủ cho bất cứ điều gì rất công khai hoặc rất lớn, vì vậy có thể có những lỗ hổng bảo mật mà tôi không biết.

Tuy nhiên, tôi chưa bao giờ cần phải là thành viên của nhóm dữ liệu www và không có tệp nguồn nào trong www được sở hữu bởi dữ liệu www. Tôi hiểu rằng cái này chỉ được sử dụng bởi Apache cho các tệp của chính nó và nó sẽ không có quyền ghi vào bất kỳ tệp nào khác, vì theo lý thuyết, không có tệp quan trọng nào cho phép dữ liệu www có quyền ghi. Tôi đoán rằng các tệp thuộc sở hữu của dữ liệu www sẽ cấp quyền chỉ đọc cho mọi người khác và không ai có quyền ghi vào các tệp của nó. Tất nhiên tôi có thể sai, và nếu là tôi, tôi hy vọng ai đó sẽ nói với tôi và chỉ cho tôi tài liệu thực tế giải thích khác nhau (không phải với một diễn đàn nơi một người dùng internet ngẫu nhiên như tôi đã đưa ra các hướng dẫn làm việc cho anh ta).

Có lẽ tôi đang thiếu một cái gì đó, nhưng vấn đề của bạn khá đơn giản. Người dùng đã đăng nhập bằng sftp cần phải là thành viên của dữ liệu www của nhóm và các tệp bạn đang cố gắng sửa đổi phải có quyền ghi cho dữ liệu www của nhóm. Nó không có nghĩa với tôi rằng bạn có thể sửa đổi các tệp bằng ssh, nhưng không sử dụng sftp; bạn có chắc là bạn đang đăng nhập vào cùng một tài khoản cho cả hai không? Trong sftp, bạn có thể nhập các lệnh như !groupsđể liệt kê các nhóm của bạn hoặc !whoamiđể kiểm tra tên đăng nhập bạn đang sử dụng. Các kết quả sẽ khớp với những gì bạn thấy bằng ssh (với cùng các lệnh trừ đi dấu chấm than).

Bạn cũng có thể sử dụng chmod, chown, chgrp từ sftp nếu bạn được phép làm như vậy.

Nhân tiện, tôi nghĩ rằng danh sách của bạn có ít nhất một lệnh khá tệ:

sudo chmod -R g+rw /var/www

Điều này cho phép thế giới ghi quyền vào mọi tệp và thư mục trong / var / www. Điều này nghe có vẻ là một ý tưởng tồi. Thông thường, chỉ root mới có quyền ghi vào các thư mục này, trừ khi các thư mục cụ thể cần thêm quyền, thường chỉ có các thư mục đơn.

Lưu ý: Đây là một lỗi về phía tôi. Cảm ơn DonalLafferty đã chỉ ra điều này, nó chỉ định "g" chứ không phải "a", vì vậy nó chỉ thay đổi quyền của nhóm. Đôi mắt già nua mệt mỏi của tôi (hoặc một phông chữ xấu) phải đọc nó là "a".

Chỉnh sửa để làm rõ

Thông thường, các tệp được tạo bởi Apache là chỉ đọc cho cả nhóm dữ liệu www và tất cả người dùng khác, giống như các tệp thuộc sở hữu gốc trong / var / www. Vì vậy, không có lý do gì để biến bất kỳ ai thành thành viên của dữ liệu www. Vấn đề là cho mọi người quyền truy cập viết, đó là một trường hợp khác nhau. Điều này nên được thực hiện bằng cách cung cấp các thư mục cụ thể có sẵn trong trang web của bạn và điều này được thực hiện đơn giản bằng cách sử dụng chmod, với sudo, vì nó có thể được sở hữu bởi root hoặc bằng cách tự tạo chủ sở hữu và không sử dụng sudo.

Nếu bạn có nhiều nhà phát triển cần truy cập vào toàn bộ trang web, đó là khi bạn muốn tạo một nhóm người dùng + như "quản trị trang web", hãy biến nó thành chủ sở hữu của trang web, cấp quyền ghi cho nhóm đó và tạo tất cả thành viên của nhà phát triển của nhóm đó. Vì vậy, danh sách cho các thư mục trang web sẽ là một cái gì đó như:

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

Chỉnh sửa thêm

Kể từ đó tôi đã nhận ra rằng bạn không thực sự cần phải tạo một "quản trị web" người dùng, chỉ là một nhóm. Sau đó, các tệp có thể được sở hữu bởi root: webmaster, tức là root là chủ sở hữu, nhưng webmaster là nhóm.

Trả lời các câu hỏi dưới đây, các tệp mà Apache viết sẽ được sở hữu bởi dữ liệu www và dữ liệu www nhóm. Các tệp này thường không phải là thứ bạn ghi vào, vì vậy những người không phải là thành viên của dữ liệu www có thể có quyền truy cập chỉ đọc - Tôi nghĩ rằng nó phụ thuộc vào quyền của thư mục. Nếu bạn cần nhiều hơn truy cập ghi thỉnh thoảng, thì việc thêm bản thân vào nhóm có thể hữu ích. Thông thường, bạn tạo các thư mục cụ thể trên thế giới có thể ghi được cho nội dung được lưu bởi Apache. Cũng xem xét rằng hầu hết các lưu trữ web được chia sẻ chạy Apache mà không có quyền truy cập shell thậm chí sẽ không có cách nào để thiết lập các nhóm.

Nhưng, Apache có thể đọc các tệp thậm chí thuộc sở hữu của root. Hầu như tất cả các tệp có quyền truy cập dễ đọc trên thế giới, chỉ là không thể ghi. Vì vậy, trừ khi bạn muốn thay đổi điều này, Apache không cần phải nằm trong nhóm quản trị web.

Đây là tất cả các thiết lập Linux cơ bản, không thực sự là Apache. Apache chỉ quan tâm đến quyền truy cập từ bên trong máy chủ web và được thiết lập bởi các tệp cấu hình. Vì lý do này, liên kết tài liệu Ubuntu mà tôi đưa vào bài đăng của mình nên được coi là một nguồn tốt hơn so với wiki công khai.

Nhân tiện, O'Reilly Apache Cookbook cho biết "Các thư mục tài liệu, chẳng hạn như htdocs, cgi-bin và các biểu tượng, sẽ phải có các quyền được thiết lập theo cách có ý nghĩa nhất đối với mô hình phát triển của trang web cụ thể của bạn, nhưng trong mọi trường hợp, bất kỳ thư mục hoặc tệp nào trong đó đều có thể ghi được bởi người dùng máy chủ web. "

Cuối cùng, sử dụng ACL là một cách tốt để đặt quyền truy cập tệp nếu bạn cần kiểm soát nhiều hơn. Nó thậm chí có thể là một cách tốt để đặt chúng mọi lúc, và là điều tôi nên điều tra.


Hi @ marty-Fried, cảm ơn vì câu trả lời, nó cho tôi rất nhiều để thử. Re. Những câu hỏi của bạn. Tôi đã ghép các thông tin lại với nhau từ nhiều nguồn khác nhau (do đó tôi đã viết nó vào hướng dẫn sử dụng của riêng mình) và không thể nhớ chính xác nguồn đó. Mặc dù tôi đã không sử dụng nguồn đặc biệt này (giải pháp 1) (tôi chỉ tìm thấy nó), nhưng nó đưa ra một lý do hợp lý cho quyết định của tôi. Trong hướng dẫn Apache mà bạn đề cập, nó khuyên bạn nên tạo một nhóm gọi là 'webmaster', nhưng nếu tôi làm điều đó, làm thế nào Apache viết vào /var/wwwmà không thêm nó vào nhóm đó?
Charles Roper

Và tôi làm cần phải cung cấp cho người dùng khác truy cập vào /var/wwwvì vậy tôi nghĩ cho phép truy cập nhóm www-datavà làm cho tất cả mọi người một thành viên của nhóm đó sẽ là một giải pháp tốt. Bây giờ tôi có thể thấy vấn đề của Apache là có thể ghi đè lên bất kỳ tệp nào trong đó. Chỉ có 2 nhà phát triển (bao gồm cả bản thân tôi) có quyền truy cập vào mã, nó tương đối an toàn trong thời gian ngắn.
Charles Roper

1
Cảm ơn Marty. Phần này trong Apache Cookbook khiến tôi bật cười: "Bạn nên lưu ý rằng nếu bạn hỏi 12 người về các cách chính xác để đặt quyền truy cập tệp trên máy chủ Apache của bạn, bạn sẽ nhận được hàng tá câu trả lời khác nhau." Bạn đã cho tôi hầu hết mọi thứ tôi cần để tiến bộ ngay bây giờ. Cảm ơn bạn rất nhiều vì thời gian của bạn. :-)
Charles Roper

1
Tôi cũng đã học được một ít, đó là lý do tại sao tôi thích các cuộc thảo luận chuyên sâu - nó thường giúp làm rõ một số phần mơ hồ. Tôi chủ yếu là một lập trình viên được yêu cầu sửa chữa các vấn đề và thiết lập các trang web, vì vậy tôi luôn học hỏi những cách tốt hơn để làm mọi việc. Hãy hỏi nếu có bất kỳ câu hỏi khác.
Marty Fried

1
AFAIK, sudo chmod -R g + rw / var / www cho phép truy cập 'nhóm'. Sử dụng 'a + rw' để truy cập thế giới.
Donal Lafferty

7

Tôi nhận thấy bạn đã không sử dụng chown.

Để đặt quyền sở hữu chính xác cho các tệp / thư mục, bạn có thể đặt toàn bộ thư mục theo cách này: chown -R www-data:www-data

Điều này đặt quyền sở hữu cho nhóm www-datavà người dùngwww-data

Ngoài ra, bạn có thể làm điều này như một cách giải quyết tạm thời:

chmod 777 /var/data/<filename> hoặc là chmod 777 /var/data/<foldername>

chỉnh sửa (các) tập tin khi cần thiết, sau đó

chmod 644 /var/data/<filename> hoặc là chmod 755 /var/data/<foldername>

Hãy cẩn thận khi sử dụng công tắc "-R", vì nó cũng thay đổi quyền của tất cả các tệp và thư mục phụ.

664 là các quyền của tệp tiêu chuẩn Apache và 755 các quyền của thư mục chuẩn.

Hi vọng điêu nay co ich :)

Ngôi sao


Xin chào, cảm ơn vì đã dành thời gian trả lời, thật đáng trân trọng. Tuy nhiên, nó không thực sự có ích. Chown các tệp làm cho TẤT CẢ chúng không thể thay đổi khi sử dụng SFTP (loại ngược lại với những gì tôi đang theo sau!). Tôi thực sự không thể sử dụng cách giải quyết chmod vì a) Tôi không có quyền để chmod trong SFTP; b) Tôi không thực sự muốn đăng nhập thông qua SSH, thay đổi quyền, thực hiện SFTPing của tôi, thay đổi lại, v.v.; và c) một số tệp có các quyền khác nhau vì lý do bảo mật, vì vậy tôi không thể chmod en masse.
Charles Roper

/var/datagì Ngoài ra, thư mục nào bạn đề nghị anh ta sử dụng lệnh chown -R www-data:www-data? Hy vọng là không /var/www.
Marty Fried
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.