Giả sử rằng một 'ứng dụng web' chạy trên một máy chủ (như apache, nginx, v.v.) và được viết bằng một số ngôn ngữ kịch bản động (như PHP, Ruby, v.v.), bạn có thể hiểu nhầm về 'người dùng' là ai.
Người dùng không phải là người đăng nhập vào ứng dụng của bạn - điều đó và vai trò của họ trong ứng dụng (quản trị viên, v.v.) hoàn toàn không liên quan đến kịch bản. Người dùng là người dùng hệ thống linux mà quá trình chạy theo. Mã của trang web của bạn được chạy dưới dạng chỉ một người dùng - đó có thể là người dùng máy chủ web của bạn (điều này không thực sự tốt) hoặc có thể là người dùng cụ thể cho trang web của bạn (tốt hơn nhiều).
Trên linux, người dùng thuộc nhóm - chúng tôi có thể thêm người dùng vào nhóm khác và gán đặc quyền cho nhóm đó.
Một thiết lập tốt sẽ giúp máy chủ của bạn chạy như một người dùng (hãy gọi người dùng này là 'máy chủ web') và ngôn ngữ kịch bản động của bạn chạy (ví dụ: qua FastCGI) với tư cách là người dùng của chính họ (một người dùng trên mỗi trang web - hãy gọi người dùng đầu tiên của chúng tôi là 'site1') .
Để phục vụ các tệp của bạn, máy chủ web cần quyền truy cập vào chúng và ngôn ngữ kịch bản cần quyền truy cập vào chúng. Điều đó có nghĩa là: 'site1' và 'máy chủ web' cần có thể đọc các tệp của bạn. Tuy nhiên, chỉ một trong số họ có thể 'sở hữu' các tệp. Chủ sở hữu là 'người dùng' (trong người dùng, nhóm, người khác). Chúng tôi cũng cần ngôn ngữ kịch bản của chúng tôi để có thể ghi vào thư mục (và đọc các tệp mà nó đã viết). Do đó, người dùng 'site1' cần có quyền đọc và ghi. Vì chúng tôi muốn nhóm và các quyền khác càng hạn chế càng tốt, 'chủ sở hữu' của chúng tôi sẽ là 'site1' và các quyền người dùng tương ứng sẽ được đọc và ghi.
Vì chúng tôi không thể chỉ định các quyền cho máy chủ web của mình là 'người dùng' khác, nên chúng tôi sẽ thêm 'máy chủ web' vào nhóm 'site1' (tất nhiên bạn có thể tạo một nhóm khác có cả 'site1' và 'máy chủ web' trong đó. các thành viên của nhóm này sẽ được cấp các quyền giống nhau. Các quyền lỏng lẻo nhất (của người dùng, nhóm, nhóm khác) sẽ được áp dụng cho bất kỳ người dùng cụ thể nào để xác định quyền của họ.
Điều đáng chú ý là một thiết lập tốt không nên yêu cầu các tệp phải có quyền thực thi cho ngôn ngữ động. Các tệp không được chạy trực tiếp mà thay vào đó được đọc vào một trình thông dịch - chỉ cần có quyền đọc để chạy một tập lệnh thông thường (một tập lệnh không viết bất cứ điều gì).
Quyền 'thực thi' trên các thư mục có một ý nghĩa khác - nó cho phép truyền tải mà không thể đọc nội dung. Để có thể đọc tệp trong thư mục, người dùng phải có quyền 'thực thi' trên thư mục MERYI phía trên nó.
Đối với một ứng dụng web, mọi tệp phải có quyền đọc bởi chủ sở hữu của nó - nếu không, đó là một tệp khá vô nghĩa. Cho dù người dùng hoặc quản trị viên tải lên các tệp (thông qua ứng dụng web của bạn), 'chủ sở hữu' (tức là ngôn ngữ động) cần có quyền ghi. Một thiết lập hiệu quả sẽ cố gắng phân phát các tệp tĩnh trực tiếp qua máy chủ web, vì các ngôn ngữ động có xu hướng chậm đọc trong các tệp lớn và lặp lại nội dung. Do đó, máy chủ web cần truy cập đọc vào các tệp tĩnh của bạn.
Do đó, quyền truy cập tệp tối thiểu có thể là:
- Một tệp trong thư mục nơi người dùng tải lên các tệp tĩnh (tệp hình ảnh / swf / js) sẽ nằm trong: 640
- Một tệp trong thư mục mà quản trị viên đã tải lên các tệp tĩnh (tệp hình ảnh / swf / js) sẽ nằm trong: 640
- Một tệp trong thư mục chứa các thư viện được sử dụng trong ứng dụng: 400 (hoặc 440)
- Một tệp trong thư mục chứa các tập lệnh phía máy chủ có thể thực thi / duyệt được sẽ nằm trong: 400 (hoặc 440)
- Một tệp trong thư mục chứa các tệp đã có (txt hoặc xml) sẽ được chỉnh sửa bằng mã ở phía máy chủ: 640 hoặc 600
- (tùy thuộc vào việc máy chủ web sẽ hiển thị những thứ này hay không, không thay đổi vào các thời điểm)
Trong khi, các quyền thư mục tối thiểu có thể là:
- Một thư mục nơi người dùng tải lên các tệp tĩnh (tệp hình ảnh / swf / js) sẽ cư trú: 750
- Một thư mục nơi quản trị viên tải lên các tệp tĩnh (tệp hình ảnh / swf / js) sẽ cư trú: 750
- Một thư mục nơi các thư viện được sử dụng trong ứng dụng cư trú: 500 (hoặc 550) [ít nhất phải là 510]
- Một thư mục chứa các tập lệnh phía máy chủ có thể thực thi / có thể duyệt sẽ nằm trong: 500 (hoặc 550) [ít nhất là 510]
- Một thư mục chứa các tệp đã có (txt hoặc xml) sẽ được chỉnh sửa bằng mã ở phía máy chủ: 750 hoặc 700
- (tùy thuộc vào việc máy chủ web sẽ phục vụ các tệp từ đây hay không, không thay đổi theo thời gian)
Một lần nữa - máy chủ web của bạn phải có quyền 'thực thi' trên mọi thư mục phía trên thư mục cần truy cập - vì vậy ngay cả khi máy chủ web không phục vụ các tệp từ một thư mục nhất định, chúng tôi nên cấp quyền thực thi.
Điều khá phổ biến là cung cấp cho máy chủ web quyền truy cập đọc vào hầu hết các tệp (vì vậy hãy thay đổi 500 thành 550). Các quyền 'hơi an toàn' mặc định thường là 755 cho các thư mục và 644 cho các tệp - không có quyền thực thi, mọi người đều có thể đọc và chỉ người dùng có thể viết - bạn sẽ lưu ý rằng phần lớn các tệp trên hệ thống linux có các quyền này.
Hãy nhớ rằng các quyền của 'người khác' đề cập đến bất kỳ người dùng hệ thống nào không phải là chủ sở hữu hoặc trong nhóm (tức là tất cả người dùng hệ thống còn lại). Giữ hạn chế quyền 'khác' của bạn là tốt, bởi vì những người dùng này là một ẩn số - bạn rõ ràng không cấp cho họ quyền. Các quyền khác thường dễ tận dụng nhất trên hệ thống bị xâm nhập (ví dụ: một trong những lý do tại sao / tmp là mục tiêu chung).
Trong bối cảnh ở trên, tôi không nghĩ hai câu hỏi cuối cùng của bạn có liên quan. Đặt quyền thư mục của bạn thành 550 (và quyền tệp thành 440), sau đó cấp cho người dùng quyền ghi cho bất kỳ thư mục nào mà ứng dụng của bạn sẽ ghi vào (ví dụ: thư mục: 750; tệp: 640).
(Rõ ràng bạn sẽ cần quyền ghi để tải lên các tệp - nhưng nếu bạn muốn, bạn có thể xóa chúng sau đó - mặc dù, nếu có ai đó đang ghi vào thư mục mà chỉ chủ sở hữu mới có thể ghi vào - tài khoản của bạn đã bị xâm phạm - đó là một về các lý do để giữ quyền hạn chế).