Quyền unix hoàn hảo cho các thư mục dự án web thông thường là gì?


12

Các quyền tối thiểu hoàn hảo ở định dạng bát phân cho các phần sau trong một ứng dụng web được viết là gì?

  1. 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ú
  2. 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ẽ nằm trong
  3. Một thư mục chứa các thư viện được sử dụng trong ứng dụng
  4. Một thư mục chứa các tập lệnh phía máy chủ có thể thực thi / duyệt được
  5. 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ủ

Dưới đây là những gợi ý và biện minh của tôi

  1. 555, mọi người đều có thể đọc và viết, không ai có thể thực thi
  2. 544, một mình chủ sở hữu có thể viết, mọi người khác chỉ có thể đọc, không ai có thể thực thi
  3. 000, không ai cần đọc, viết hay thực thi, sẽ chỉ được sử dụng bởi máy chủ web?
  4. 661, chủ sở hữu có thể đọc, viết, mọi người khác chỉ có thể thực thi
  5. 600, chủ sở hữu có thể đọc, viết (có thể không cần thiết), không ai khác có thể làm bất cứ điều gì

Bây giờ tôi quan tâm đến hai điều:

  1. Có một cái gì đó thường được sử dụng trong các ứng dụng dựa trên web mà tôi đã bỏ lỡ trong danh sách đầu tiên?
  2. Có bất cứ điều gì bạn không đồng ý trong danh sách thứ hai, sự thay thế của bạn là gì và tại sao nó tốt hơn?

1
Tôi không hiểu tại sao mọi người KHÔNG sử dụng ACL những ngày này ...
pfo

Câu trả lời:


20

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ế).


@Iain: Hoàn toàn - đã nghĩ đến quyền truy cập tệp ngay lúc đó - sẽ khắc phục điều đó - cảm ơn.
cyberx86

1

Việc có các quyền tối thiểu để hoàn thành công việc là điều bình thường. Nếu bạn có máy chủ web và người dùng chia sẻ một nhóm chung thì bạn có thể loại bỏ nhu cầu cấp quyền truy cập o. Quyền cũng liên quan đến người dùng. Bạn dường như đã hiểu nhầm các quyền bát phân.

  1. 555 thì r-xr-xr-xkhông rw-rw-rw. Vì đó là một thư mục để tạo / xóa các tập tin bạn cần phải xthiết lập nên 750 rwxr-x---sẽ là một nơi tốt để bắt đầu. Điều này cho phép người dùng sở hữu thư mục thêm / xóa tệp và mọi người trong nhóm chung truy cập chúng.
  2. Giống như 1. ở trên.
  3. Nếu chúng thực sự là các tệp tĩnh hơn 050 sẽ cung cấp cho máy chủ web quyền truy cập tuy nhiên để tạo các tệp ở vị trí đầu tiên 750 sẽ là tối thiểu.
  4. Giống như 3 ở trên.
  5. 070 sẽ là mức tối thiểu để cho phép máy chủ web đọc và thay đổi các tệp nhưng các tệp cần được tạo để 770 có thể thực tế hơn.

Máy chủ web có cần thực thi quyền trên thư mục để đọc các tệp không (điểm # 1 (740?), 3, 5)?
cyberx86

Đừng! thực sự x là cần thiết để truy cập vào các tập tin r chỉ cho phép bạn liệt kê chúng ... tắt để có thêm cà phê.
dùng9517

0

Nói chung, người ta sẽ sử dụng chế độ 0755, 0775 hoặc 2775 trên các thư mục (bit SGID trên thư mục, cho BSD và cho Linux nếu hệ thống tệp được gắn với ngữ nghĩa BSD sẽ làm cho liên kết nhóm của các tệp mới khớp với cài đặt thư mục mẹ thay vì GID mặc định của người tạo tập tin). Điều này cho phép tất cả người dùng duyệt qua (chdir vào và qua) và đọc (chạy lệnh ls hoặc thực hiện các cuộc gọi hệ thống readdir / read) các thư mục được đề cập. Các lựa chọn thay thế thêm tùy chọn nhóm / ghi và, như đã lưu ý, bit SGID, trên các thư mục, có thể giúp giữ tất cả các tệp và thư mục con được liên kết với một nhóm phù hợp.

Đối với các tệp, người ta thường sử dụng 0644 hoặc có thể 0664 (có thể đọc được trên thế giới và nhóm có thể ghi hoặc không). Rõ ràng đối với các tập lệnh và nhị phân CGI, người ta phải thêm x-bit; và đối với một số tình huống đặc biệt, với các nhị phân được kiểm tra cực kỳ tốt, người ta có thể thêm các bit SUID hoặc SGID. Thông thường UNIX và Linux sẽ bỏ qua bit SUID / SGID trên các tập lệnh và chỉ tôn trọng ngữ nghĩa của nó cho các nhị phân thực thi được biên dịch riêng. Tuy nhiên, bạn có thể đang chạy trang web của mình dưới một cái gì đó như Apache với một số mô-đun như "setuidhack" có thể được sử dụng để làm cho máy chủ web tôn vinh các bit SUID / SGID ngay cả trên các tập lệnh được giải thích. (Điều này được thực hiện bởi HTTP daemon stat () trong mỗi tệp và sử dụng mã fork () / execve () tùy chỉnh của chính nó, nội suy chuỗi trình thông dịch chính xác vào vectơ execve () thay vì chỉ truyền vào tệp thực thi '

Đó chỉ là những hướng dẫn chung nhất. Chúng không "hoàn hảo" cho mọi tình huống và bạn chắc chắn nên tham khảo tài liệu cho máy chủ web của mình và mọi ứng dụng hoặc khung công tác web mà bạn đang cài đặt và định cấu hình ... và bạn có thể muốn tham khảo ý kiến ​​chuyên gia bảo mật UNIX trước bạn để lộ bất kỳ tệp, mã hoặc máy chủ nào của bạn ra Internet công cộng.

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.