Cách tốt nhất để xử lý các quyền đối với dữ liệu www của người dùng Apache 2 trong / var / www là gì?


215

Có ai có một giải pháp tốt đẹp để xử lý các tập tin trong /var/www? Chúng tôi đang chạy Máy chủ ảo dựa trên tên và người dùng Apache 2 là dữ liệu www .

Chúng tôi đã có hai người dùng thường xuyên & root. Vì vậy, khi gửi tin nhắn vào /var/www, thay vì phải ...

chown -R www-data:www-data

... mọi lúc, cách xử lý này tốt là gì?

Câu hỏi bổ sung: Làm thế nào để bạn khó khăn về quyền?

Điều này luôn luôn là một vấn đề trong môi trường phát triển hợp tác.


Câu trả lời:


206

Cố gắng mở rộng câu trả lời của @ Zoredache , khi tôi tự mình thực hiện điều này:

  • Tạo một nhóm mới (www-pub) và thêm người dùng vào nhóm đó

    groupadd www-pub

    usermod -a -G www-pub usera ## phải sử dụng -a để nối vào các nhóm hiện có

    usermod -a -G www-pub userb

    groups usera ## nhóm hiển thị cho người dùng

  • Thay đổi quyền sở hữu của mọi thứ trong / var / www thành root: www-pub

    chown -R root:www-pub /var/www ## -R cho đệ quy

  • Thay đổi quyền của tất cả các thư mục thành 2775

    chmod 2775 /var/www ## 2 = đặt id nhóm, 7 = rwx cho chủ sở hữu (root), 7 = rwx cho nhóm (www-pub), 5 = rx cho thế giới (bao gồm cả người dùng dữ liệu www apache)

    Đặt bit ID nhóm ( SETGID ) (2) khiến nhóm (www-pub) bị sao chép vào tất cả các tệp / thư mục mới được tạo trong thư mục đó. Các tùy chọn khác là SETUID (4) để sao chép id người dùng và STICKY (1) mà tôi nghĩ chỉ cho phép chủ sở hữu xóa các tệp.

    Có một -Rtùy chọn đệ quy, nhưng sẽ không phân biệt giữa các tệp và thư mục, vì vậy bạn phải sử dụng find , như vậy:

    find /var/www -type d -exec chmod 2775 {} +

  • Thay đổi tất cả các tệp thành 0664

    find /var/www -type f -exec chmod 0664 {} +

  • Thay đổi ô cho người dùng của bạn thành 0002

    Umask kiểm soát các quyền tạo tệp mặc định, 0002 có nghĩa là các tệp sẽ có 664 và thư mục 775. Đặt cài đặt này (bằng cách chỉnh sửa umaskdòng ở dưới cùng /etc/profiletrong trường hợp của tôi) có nghĩa là các tệp được tạo bởi một người dùng sẽ được ghi bởi người dùng khác trong www- nhóm mà không cần đến chmodhọ.

Kiểm tra tất cả điều này bằng cách tạo một tệp và thư mục và xác minh chủ sở hữu, nhóm và quyền với ls -l.

Lưu ý: Bạn sẽ cần đăng xuất / đăng nhập để thay đổi nhóm của bạn có hiệu lực!


6
@Tom Thật tuyệt khi thấy bạn khuyên dùng findlệnh này. Một mẹo hiệu suất nhỏ tôi sẽ đưa ra nếu bạn có nhiều tệp / thư mục và bạn đang sử dụng GNU find là sử dụng +thay vì \;để lệnh sẽ hoạt động trên nhiều tệp"chạy lệnh trên càng nhiều tệp càng nhanh tại một thời điểm, thay vì một lần cho mỗi tệp. Việc này giúp tiết kiệm thời gian cần thiết để khởi động lệnh mỗi lần. " Ngoài ra, nó dễ dàng hơn để gõ vì nó không cần dấu gạch chéo ngược.
aculich

2
Đã cập nhật với đề xuất của @ aculich để sử dụng + không \;
Tom

1
@SunnyJ. hãy thử điều này (không có dấu ngoặc kép bên ngoài): "find / var / www -type f -exec chmod 0664 '{}' \ +" Hãy thử điều đó. Có một khoảng cách giữa '{}' và \ +.
Butussy Butkus

1
tại sao chúng ta cần phải cho phép người khác nhìn thấy và thực thi.
Kevin Parker

1
@ Tom- cách để phá vỡ nó, cảm ơn. Chỉ cần một lưu ý - Tôi nghĩ rằng "SETUID (4) để sao chép id người dùng" như trong câu trả lời của bạn là sai- SETUID bị bỏ qua khi áp dụng cho các thư mục trong Linux / Unix - Ref
Yarin

60

Tôi không hoàn toàn chắc chắn về cách bạn muốn cấu hình các quyền, nhưng điều này có thể cung cấp cho bạn một điểm khởi đầu. Có lẽ có những cách tốt hơn. Tôi giả sử bạn muốn cả hai người dùng có thể thay đổi bất cứ điều gì trong / var / www /

  • Tạo một nhóm mới (www-pub) và thêm người dùng vào nhóm đó.
  • Thay đổi quyền sở hữu của mọi thứ trong / var / www thành root: www-pub.
  • Thay đổi quyền của tất cả các thư mục thành 2775
  • Thay đổi tất cả các tệp thành 0664.
  • Thay đổi ô cho người dùng của bạn thành 0002

Điều này có nghĩa là bất kỳ tệp mới nào được tạo bởi một trong hai người dùng của bạn phải là tên người dùng: www-pub 0664 và bất kỳ thư mục nào được tạo sẽ là tên người dùng: www-pub 2775. Apache sẽ có quyền truy cập đọc vào mọi thứ thông qua thành phần 'người dùng khác'. Bit SETGID trên các thư mục sẽ buộc tất cả các tệp được tạo phải thuộc sở hữu của nhóm sở hữu thư mục. Điều chỉnh ô là cần thiết để đảm bảo rằng bit ghi được đặt để bất kỳ ai trong nhóm cũng có thể chỉnh sửa các tệp.

Đối với cách tôi khó khăn về quyền. Nó hoàn toàn phụ thuộc vào trang web / máy chủ. Nếu chỉ có 1-2 biên tập viên và tôi chỉ cần giữ cho họ không phá vỡ mọi thứ quá tệ thì tôi sẽ đi dễ dàng. Nếu doanh nghiệp yêu cầu một cái gì đó phức tạp hơn thì tôi sẽ thiết lập một cái gì đó phức tạp hơn.


1
Bổ sung có thể - đặt các thư mục bộ đệm / tải lên cần được ghi bởi máy chủ web vào dữ liệu www: dữ liệu www và 775.
gacrux

Nó có hoạt động tốt không khi thêm người dùng vào nhóm apache thay vì dựa vào các quyền 'khác'? Nếu tất cả những gì bạn đang làm là tải lên các tệp và các tệp đó cần phải được đọc bởi apache, nhóm thứ 3 dường như chỉ hữu ích nếu bạn cần chỉnh sửa các tệp đó.
Simurr

1
Bất kỳ cơ hội nào bạn có thể mở rộng điều này một chút @Zoredache? Tôi tìm hiểu cách sử dụng cơ bản của các bit rwx, chmod, chown, adduser, usermod, nhưng bạn đã mất tôi với chữ số đầu tiên thêm vào các quyền bát phân, ô và tất cả những thứ đó. Một số lệnh mẫu minh họa phương pháp tiếp cận được phác thảo của bạn sẽ được đánh giá rất cao.
Tom

1
Bằng cách này, mọi người dùng có thể truy cập mọi tập tin người dùng khác! Điều này có nghĩa là userA có thể đọc config.php của userB ... lấy ví dụ về thông tin mysql của nó
drAlberT

1
Sử dụng acl, bạn có thể xử lý cả bảo mật và hợp tác :)
drAlberT

39

Tôi nghĩ rằng bạn có thể thấy POSIX ACL (danh sách kiểm soát truy cập) hữu ích. Chúng cho phép một mô hình cấp phép chi tiết hơn so với người dùng: nhóm: mô hình khác. Tôi đã thấy chúng dễ dàng giữ thẳng trong đầu hơn vì tôi có thể rõ ràng hơn và cũng có thể đặt hành vi "mặc định" cho một nhánh của hệ thống tệp.

Ví dụ: bạn có thể chỉ định rõ ràng từng quyền của người dùng:

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

Hoặc bạn có thể làm điều đó dựa trên một số nhóm được chia sẻ:

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

Và có lẽ bạn muốn giữ người dùng Apache của mình ở chế độ chỉ đọc

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

Trang nam:

Hướng dẫn


2
Đó là cách ! +1
drAlberT

ACL để giành chiến thắng +1 ... Để biết thêm chi tiết, hãy xem serverfault.com/a/360120/41823
Yarin

1
Tôi tự hỏi nếu có bất kỳ nhược điểm hiệu suất cho ACL so với các quyền cơ bản.
Butussy Butkus

2
Thật không may, ACL quá thường xuyên bị thiếu trong các bản cài đặt / phân phối tiêu chuẩn. Đôi khi việc biên dịch kernel trên mọi máy chủ mà tôi quản lý, hoặc tệ hơn là thay đổi hệ thống tập tin. Thêm vào đó, bạn phải rất cẩn thận khi sao lưu các tập tin, đặc biệt nếu bạn đang chuyển đổi máy chủ. ACL là tuyệt vời nhưng hỗ trợ hiện tại của nó thấp đến mức tôi sẽ khuyên bạn nên chống lại nó cho bất kỳ ai không có toàn quyền kiểm soát mọi thứ trên máy chủ và môi trường xung quanh. Nhưng +1 để chỉ ACL ra nơi nó thực sự có ý nghĩa!
Ninj

Câu trả lời tốt +1; Lưu ý về việc thay đổi quyền đọc / ghi quá trình apache ( www-dataví dụ) thành chỉ đọc cho toàn bộ trang web (thông qua setfacl hoặc chmod - hoặc cả hai) -> Điều này rõ ràng sẽ chặn tất cả ghi (tải lên / cập nhật mô-đun từ phía trình duyệt trên hầu hết CMS chẳng hạn). Tôi tin rằng nhiều người phổ biến cũng chỉ kiểm tra quyền truy cập ghi ở cấp độ người dùng chứ không phải cấp độ nhóm. Bạn vẫn có thể cập nhật, nhưng các bản cập nhật phải được áp dụng thủ công và mọi quyền tùy chỉnh cho các thư mục ghi (nhật ký / temp / tải lên / vv). Chỉ đọc là bảo mật tuyệt vời nếu trang web của bạn hoạt động với nó .. bởi và hầu hết không.
bshea

11

Câu hỏi này đã được hỏi lại và như đã thảo luận về meta, các thực tiễn tốt nhất hiện tại cung cấp các cách tiếp cận tốt hơn so với có sẵn trong năm 2009, khi điều này được hỏi. Câu trả lời này cố gắng đưa ra một số giải pháp hiện tại để xử lý môi trường phát triển web hợp tác một cách an toàn .


Đối với một máy chủ web an toàn và phát triển hợp tác, không chỉ có các quyền của tệp:

  • Có người dùng riêng biệt cho mọi trang web, tức là không phục vụ tất cả các trang web đang sử dụng www-data. Điều này rất quan trọng, vì ngày nay Apache hiếm khi chỉ phục vụ các tệp nội dung tĩnh , nhưng chạy các trang web động . Câu trả lời này tập trung vào PHP vì đây là ngôn ngữ trang web máy chủ phổ biến nhất , nhưng các nguyên tắc tương tự cũng áp dụng cho các ngôn ngữ khác.

    Nếu bạn gặp vấn đề về bảo mật trên một trang web, nó có thể lây lan sang mọi trang web đang chạy với cùng một người dùng. Kẻ tấn công có thể thấy mọi thứ người dùng nhìn thấy, bao gồm thông tin đăng nhập cơ sở dữ liệu và sửa đổi mọi trang web mà người dùng có quyền ghi.

  • Sử dụng Giao thức truyền tệp SSH (SFTP). Mặc dù sử dụng FTP nên bị bỏ qua để bảo mật (vì nó gửi cả mật khẩu và nội dung bằng văn bản thuần túy), SFTP thay thế an toàn cũng có một tính năng là một giải pháp hoàn hảo để phát triển web hợp tác.

    Khi bạn đã cách ly các trang web và một người dùng trên mỗi trang, bạn cần cấp quyền truy cập cho các nhà phát triển web của mình, câu hỏi này là gì. Thay vì cung cấp cho họ mật khẩu cho những người dùng trang này - hoặc truy cập vào các tệp của trang bằng tài khoản người dùng cá nhân của họ như đề xuất ban đầu - bạn có thể sử dụng các khóa SSH để đăng nhập.

    Mọi nhà phát triển đều có thể tạo ra cặp khóa và giữ bí mật khóa riêng. Sau đó, khóa chung được thêm vào ~/.ssh/authorized_keystệp cho mọi tài khoản người dùng trang web mà nhà phát triển đang làm việc. Điều này có nhiều lợi thế để quản lý mật khẩu và đăng nhập:

    • Mọi nhà phát triển có thể có quyền truy cập vào bất kỳ số lượng trang web nào mà không cần phải nhớ hoặc lưu trữ tất cả các mật khẩu liên quan đến việc sắp xếp người dùng trên mỗi trang.

    • Không cần thay đổi và chia sẻ mật khẩu mỗi khi ai đó rời công ty.

    • Bạn có thể sử dụng mật khẩu rất mạnh hoặc vô hiệu hóa hoàn toàn dựa trên mật khẩu.

  • Sử dụng PHP-FPM . Đó là cách tiếp cận hiện tại để chạy PHP với tư cách là người dùng. Tạo mới hồ bơi cho mỗi người dùng tức là một hồ bơi mỗi mỗi trang web. Điều này là tốt nhất cho cả bảo mật và hiệu suất, vì bạn cũng có thể chỉ định số lượng tài nguyên mà một trang web có thể tiêu thụ.

    Xem ví dụ: Chạy php-fpm của NeverEinatingSecurity với người dùng / uid và nhóm riêng biệt trên linux . Có những hướng dẫn như HowtoForge sử dụng PHP-FPM với Apache trên Ubuntu 16.04 không sử dụng PHP-FPM để tăng tính bảo mật thông qua việc tách người dùng, hướng dẫn sử dụng một ổ cắm FPM duy nhất trên máy chủ.

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.