Hạn chế người dùng Linux đối với các tệp mà anh ta sở hữu


24

Hãy tưởng tượng một thiết lập máy chủ của một công ty lưu trữ web được chia sẻ nơi có nhiều (~ 100) khách hàng có quyền truy cập shell vào một máy chủ.

Rất nhiều "phần mềm" web khuyên dùng tệp chmod 0777 . Tôi lo lắng về khách hàng của mình một cách không chính xác khi làm theo các hướng dẫn này, mở tệp của họ cho các khách hàng khác của chúng tôi. (Tôi chắc chắn không sử dụng cmod 0777bản thân một cách không cần thiết!) Có phương pháp nào để đảm bảo rằng khách hàng chỉ có thể truy cập các tệp của riêng họ và ngăn họ truy cập các tệp có thể đọc được từ người dùng khác không?

Tôi đã xem xét AppArmor , nhưng điều đó rất chặt chẽ với một quá trình, dường như thất bại trong môi trường đó.


12
Tôi thực sự sẽ xem xét liệu các khuyến nghị của "phần mềm web" chmod files 0777có thực sự cần thiết hay không, tức là giải quyết nguyên nhân gốc rễ của vấn đề, chứ không phải là triệu chứng mà bằng cách đó, bất kỳ ai cũng có thể đọc tệp của bất kỳ ai khác. Nhiều lần, tất cả các đề xuất cho phép chỉ đơn giản là một cách rẻ tiền để tránh các cuộc gọi hỗ trợ hoặc thiếu năng lực kỹ thuật trong việc có thể thiết lập quyền chính xác. Trong hầu như không có trường hợp nào tôi phải đặt tệp 0777hoặc cấp cho ứng dụng quyền truy cập root đầy đủ khi được yêu cầu. Giáo dục của người dùng và / hoặc nhà cung cấp giúp ồ ạt ở đây.
Vũ trụ Ossifrage

3
@CosmicOssifrage, người dùng không thể được giáo dục một cách dễ dàng, họ không muốn đọc hướng dẫn hoặc hướng dẫn sử dụng.
Cristian Ciupitu

12
Bất kỳ "phần mềm web" nào vẫn khuyến nghị 777 quyền cần phải được lấy ra và bắn . Sử dụng suexechoặc mpm_itkhoặc tương đương.
Shadur

3
@CosmicOssifrage Tôi không nghĩ Phillipp đang nói hay ép buộc người dùng vào chmod 0777tập tin của họ. Tôi nghĩ rằng anh ấy lo lắng về việc họ sẽ tự đi loltoturialz.com/php_problemschmod 0777tự mình làm theo trong khi mù quáng theo dõi một bài viết kém. Thực sự không có cách nào để ngăn họ làm như vậy, hoặc để ngăn họ buồn bã khi ai đó ăn cắp đồ của họ.
Kevin - Tái lập Monica

2
@kevin - đó chính xác là lý do tại sao khoảng trống bảo hành được tạo ra. Tôi gần như chưa bao giờ thấy một thiết bị nghiêm túc nào (có thể là phần mềm được biên dịch, một loạt các tập lệnh hoặc bất cứ thứ gì) mà không có một điều khoản như vậy. Và tin hay không - trong hầu hết các môi trường corpprate, người dùng đều biết rõ điều này
Dani_l

Câu trả lời:


34

Đặt một thư mục bị hạn chếkhông thay đổi giữa thế giới bên ngoài và các tệp được bảo vệ, ví dụ:

/
 ├─ bin
 ├─ home
 │  └─ joe <===== restricted and immutable
 │     └─ joe <== regular home directory

hoặc /home/joe/restricted/public_html.

Bị hạn chế có nghĩa là chỉ người dùng và có lẽ máy chủ web có thể đọc nó (ví dụ: chế độ 0700/ 0750hoặc một số ACL ).

Bất biến có thể được thực hiện với chattr +ihoặc bằng cách thay đổi quyền sở hữu thành một cái gì đó như root:joe.

Một cách dễ dàng để tạo cấu trúc phân cấp đó trên Ubuntu sẽ là chỉnh sửa /etc/adduser.confvà đặt GROUPHOMESthành yes.


15

Có một tùy chọn mà bạn có thể muốn xem xét (tùy thuộc vào số lượng công việc bạn muốn làm cho việc đó).

Như những người khác đã đăng, "thông thường", bạn không thể ngăn người nào đó có quyền truy cập shell để đọc các tệp có thể đọc được trên thế giới.

Tuy nhiên, bạn có thể chroot chúng vào nhà riêng của chúng, về cơ bản giới hạn quyền truy cập shell, đầu tiên, chỉ thư mục gốc mà bạn muốn (AKA thư mục chính) và thứ hai, ngăn người dùng thực thi mọi thứ bạn không muốn chúng thực thi.

Tôi đã thực hiện một cách tiếp cận tương tự khi tôi có một người dùng có quyền truy cập vào các tệp web, nhưng tôi không muốn anh ta nhìn thấy các tệp khác bên ngoài webfolder.

Điều này đã có rất nhiều chi phí, là một mớ hỗn độn để thiết lập và mỗi khi tôi cập nhật một cái gì đó, nó đã bị hỏng.

Nhưng hôm nay tôi nghĩ bạn có thể đạt được điều đó khá dễ dàng với tùy chọn chroot OpenSSH :

WikiBooks OpenSSH


chroot cho SFTP rất dễ thực hiện, nhưng tôi không chắc nó dễ truy cập shell. Bạn sẽ phải thiết lập một chroot với tất cả các nhị phân và thư viện cho mỗi người dùng.
Cristian Ciupitu

2
Đó là thực hiện cụ thể. ARCHLINEUX có một lệnh arch-chroot cụ thể, đảm nhiệm tất cả các liên kết gắn kết bổ sung, v.v. wiki.archlinux.org/index.php/Change_Root#Change_root
Dani_l

@CristianCiupitu đó là những gì tôi đã làm, chỉ cho phép một tập hợp con các lệnh cụ thể với việc liên kết tất cả các thư viện không cần thiết, đó là lý do tại sao tôi nói đó là một mớ hỗn độn :) Dani_l đúng, thiết lập của tôi là một máy chủ debian, tôi không bao giờ có thời gian để kiểm tra một cách đáng buồn .
Dennis Nolte

@Dani_l: những gì về các gói được cài đặt? Các arch-chrootlệnh dường như không che đó. Và sau đó cũng có vấn đề lãng phí không gian đĩa với tất cả các bản sao. Tôi không nói rằng không thể làm điều đó, chỉ là nó có thể phức tạp hơn một chút hiện tại.
Cristian Ciupitu

1
Một cái gì đó để làm cho việc này trở nên dễ dàng hơn là sử dụng UnionFS để chroot người dùng vào một liên kết đặc biệt của rootfs trong chế độ chỉ đọc và thư mục đọc ghi, điều này có nghĩa là họ thấy tất cả các gói và nhị phân hệ thống nhưng việc ghi được tự động thực hiện trong thư mục nhà của họ. điều này - phải được kết hợp với việc tạo tất cả các thư mục chính 700 quyền mà người dùng khác có thể đọc tệp từ người dùng khác.
Vality

11

Tôi đã tìm thấy Danh sách kiểm soát truy cập POSIX cho phép bạn, với tư cách là quản trị viên hệ thống, bảo vệ người dùng của bạn khỏi sự thiếu hiểu biết tồi tệ nhất của họ, bằng cách ghi đè quyền của hệ thống tệp nhóm người dùng thông thường, mà không có nhiều cơ hội phá vỡ mọi thứ quan trọng .

Chúng có thể đặc biệt hữu ích nếu bạn (ví dụ) các thư mục nhà cần thiết có thể truy cập được trên thế giới vì webcontent cần có thể truy cập được cho apache ~/public_html/. (Mặc dù với ACL, giờ đây bạn có thể thực hiện ngược lại, xóa quyền truy cập cho tất cả và sử dụng ACL hiệu quả cụ thể cho người dùng apache.)

Có, một người dùng có kiến ​​thức có thể xóa / ghi đè lại họ, chỉ là không phổ biến đến mức không thể, và những người dùng đó thường không phải là những người thuận tiện chmod -R 777 ~/, phải không?

Bạn cần gắn hệ thống tập tin với acltùy chọn gắn kết:

 mount -o remount,acl /home

Trong nhiều bản phân phối, mặc định là tạo các nhóm người dùng, mỗi người dùng có nhóm chính của họ và tôi đã đặt tất cả người dùng trong một nhóm thứ cấp với tên không thể tưởng tượng được users.

Sử dụng ACL giờ đây không đáng kể để ngăn người dùng khác truy cập vào các thư mục chính:

Trước:

 chmod 0777 /home/user* 

 ls -l /home/user*
 drwxrwxrwx.  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx.  2 user2  user2  4096 Jul 11 15:24 user2

Bây giờ đặt quyền truy cập thư mục hiệu quả cho các thành viên của usersnhóm thành 0không đọc, ghi hoặc truy cập:

 setfacl setfacl -m g:users:0 /home/user*

 ls -l 
 drwxrwxrwx+  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx+  2 user2  user2  4096 Jul 11 15:24 user2

Các +dấu hiệu biểu thị sự hiện diện của các thiết lập ACL ở đó. Và getfaclcó thể xác nhận rằng:

getfacl /home/user1
getfacl: Removing leading '/' from absolute path names
# file: home/user1
# owner: user1
# group: user1
user::rwx
group::rwx
group:users:---
mask::rwx
other::rwx

Chương group:users:---trình cho thấy nhóm thực sự không có quyền truy cập, mặc dù có quyền thường xuyên cho người khácother::rwx

Và thử nghiệm như user1:

[user1@access ~]$ ls -la /home/user2
ls: cannot open directory /home/user2: Permission denied

Một giải pháp phổ biến thứ hai trên các hệ thống được chia sẻ là có các máy chủ tự động gắn kết các thư mục nhà theo yêu cầu một máy chủ dành riêng cho truy cập shell. Đó là xa bằng chứng ngu ngốc, nhưng thông thường chỉ một số ít người dùng sẽ được đăng nhập đồng thời có nghĩa là chỉ các thư mục nhà của những người dùng đó có thể nhìn thấy và có thể truy cập.


5
Là gì "fi" ? Tôi không khuyên bạn nên sử dụng các từ viết tắt hoặc viết tắt trừ khi chúng là một từ cổ điển như "vd", "tức là", "vv" và có lẽ là OP.
Cristian Ciupitu

3

Linux Container (LXC) có thể là sự kết hợp tốt nhất giữa chroot và hệ thống riêng biệt.

  1. Chúng giống như một chroot tiên tiến, không phải ảo hóa, nhưng bạn có thể kết hợp các hệ điều hành khác nhau trong một máy chủ.

  2. Bạn có thể cung cấp cho người dùng một hệ điều hành hoàn chỉnh và chroot anh ta ở đó, vì vậy khi người dùng đăng nhập, anh ta đi đến container của mình. Và bạn cũng có thể giới hạn bộ xử lý và sử dụng bộ nhớ ở đó.

Stéphane Graber, tác giả của LXC, có một hướng dẫn thú vị để giúp bạn bắt đầu.


Bạn thực sự không thể kết hợp các hệ điều hành khác nhau, vì tất cả chúng đều cần sử dụng nhân Linux , nhưng bạn có thể sử dụng các bản phân phối khác nhau .
Cristian Ciupitu

1
Cảm ơn :) Có, hệ điều hành dựa trên kernel linux khác nhau.
maniaque

@CristianCiupitu bạn có nghĩa là hạt nhân Linux giống hệt nhau không? hoặc bạn có nghĩa là mỗi container có thể có một phiên bản kernel khác nhau?
kích hoạt mehx

@agksmehx, tất cả các container LXC đều chia sẻ kernel của máy chủ . Chỉ các ứng dụng và thư viện của họ được sử dụng. Vì vậy, ví dụ, nếu bạn có máy chủ RHEL 7 với bộ chứa Ubuntu 14.04, hạt nhân RHEL (3.10.0-123) sẽ được sử dụng, trong khi Ubuntu một (3.13.0-24.46) sẽ không được sử dụng; cũng đọc bình luận này từ hướng dẫn. Nhân tiện, vì các hạt nhân của các container không được sử dụng, nên có thể loại bỏ chúng để tiết kiệm một số dung lượng đĩa.
Cristian Ciupitu

@CristianCiupitu đó là những gì tôi nghĩ. nó không rõ ràng từ câu trả lời hoặc bình luận, vì vậy tôi muốn làm rõ.
kích hoạt mehx

3

Ví dụ: nếu bạn muốn người dùng chỉ có quyền truy cập vào homethư mục của riêng mình , bạn nên làm:

cd /home
sudo chmod 700 *

Bây giờ /home/usernamechỉ hiển thị cho chủ sở hữu của nó. Để đặt mặc định này cho tất cả người dùng mới, hãy chỉnh sửa /etc/adduser.confvà đặt DIR_MODEthành 0700thay vì 0755mặc định.

Tất nhiên, nếu bạn muốn thay đổi DIR_MODE mặc định, nó phụ thuộc vào bản phân phối của bạn, cái tôi đã đăng hoạt động Ubuntu.

chỉnh sửa

Như @Dani_l đã đề cập chính xác, câu trả lời này là chính xác trong việc làm cho chúng KHÔNG thể đọc được trên thế giới.


Họ được gọi là "thế giới có thể đọc được" vì một lý do.
Mark K Cowan

1
@DennisNolte Trên thực tế, nó rất hữu ích, ngay cả khi các tệp có thể đọc được trên thế giới, nếu chúng nằm trong một thư mục mà bạn không đọc hoặc thực thi thì bạn vẫn không thể đọc chúng.
Vality

1
@Vality đúng, xóa nhận xét của tôi vì nó hoàn toàn sai.
Dennis Nolte

2

Chỉ là tầm phào - Không, không có.
@Marek đã đưa ra một câu trả lời đúng , nhưng câu hỏi của bạn không chính xác - bạn không thể ngăn bất kỳ ai truy cập các tệp "có thể đọc được trên thế giới".
Hoặc là họ có thể đọc được trên thế giới, hoặc họ thì không. Câu trả lời của @ Marek là chính xác trong việc làm cho chúng KHÔNG thể đọc được trên thế giới.


2
sai, chroot / bẻ khóa người dùng đến thư mục con và ngần ngại không thể đọc các tệp "thế giới" có thể đọc được.
Dennis Nolte

1
-1 Tôi nghĩ rằng bạn không cần thiết phải phê phán câu hỏi của OP. Anh ta muốn cung cấp cho khách hàng của mình một mạng lưới an toàn trong trường hợp họ không thông minh về các quyền của họ. Nhưng đối với tôi, OP không nhận thức được các quyền của tệp Unix hoạt động như thế nào hoặc các nguyên tắc bảo mật cơ bản.
Kevin - Tái lập Monica

Ngoài ra, bạn có thể đặt các tệp vào một thư mục bên trong thư mục 000 quyền, sau đó không ai có thể truy cập chúng ngay cả khi các tệp có thể đọc được trên thế giới.
Vality

không ai? thậm chí không root? ;-)
Dani_l

@Kevin đồng ý rằng bình luận của tôi đang bị chỉ trích chặt chẽ đến mức không cần thiết. Tuy nhiên, Dani_I không nên nói rằng anh ấy đã phạm lỗi và nuôi ong sai. Không nói rằng tôi không đồng ý với phần còn lại của câu trả lời của anh ấy.
Dennis Nolte

0

Tôi không thấy đề cập đến 'vỏ bị hạn chế' trong các câu trả lời cho đến nay.

ln / bin / bash / bin / rbash

Đặt cái này làm vỏ đăng nhập của họ.


0

Nếu máy chủ web đang chạy như một người dùng và nhóm giống nhau cho mọi tên miền được lưu trữ, thì rất khó (nếu không thể) để thiết lập an toàn.

Bạn muốn một số tệp nhất định có thể truy cập được cho người dùng cũng như máy chủ web, nhưng không cho người dùng khác. Nhưng ngay khi máy chủ web có thể truy cập chúng, một người dùng khác có thể đọc chúng bằng cách đặt một liên kết tượng trưng đến tệp bên trong trang web của riêng họ.

Nếu bạn có thể khiến mỗi trang web chạy như một người dùng riêng biệt, thì nó trở nên khá đơn giản. Mỗi khách hàng giờ đây sẽ có hai người dùng trên hệ thống, một cho máy chủ web và một cho truy cập shell.

Tạo một nhóm có chứa hai người dùng này. Bây giờ tạo một thư mục với nhóm đó và người dùng root. Thư mục đó nên có quyền 750, có nghĩa là root có toàn quyền truy cập và nhóm đã đọc và thực thi quyền truy cập. Trong thư mục đó, bạn có thể tạo các thư mục nhà cho mỗi người dùng. Điều này có nghĩa là thư mục chính của người dùng sẽ không còn có biểu mẫu /home/username, mà là một cái gì đó có ít nhất một thành phần thư mục nữa. Đây không phải là một vấn đề, không có gì đòi hỏi các thư mục nhà phải được đặt tên theo quy ước cụ thể đó.

Bắt các trang web chạy với người dùng và nhóm khác nhau có thể khó khăn, nếu bạn đang sử dụng vhost dựa trên tên. Nếu bạn chỉ có thể làm cho việc phân tách hoạt động với các vhost dựa trên IP và bạn không có đủ IP cho mỗi trang web, bạn có thể lưu trữ từng trang web trên một địa chỉ IPv6 và đặt proxy ngược cho tất cả chúng trên một địa chỉ Địa chỉ IPv4.

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.