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-data
người dùng nhưng nó có thể khác. Sử dụng ps aux | grep httpd
hoặ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 777
trang 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.