Sử dụng an toàn tìm với sudo


10

Trên máy chủ Linux, tôi cần xóa quyền root khỏi một nhóm người dùng. Nhưng những người dùng đó có lý do chính đáng để có thể sử dụng tiện ích "tìm" để tìm kiếm tệp dựa trên tên tệp, ngày sửa đổi và siêu dữ liệu khác.

Trên máy chủ, tên tệp không nhạy cảm, nhưng nội dung tệp có thể.

Tôi muốn sử dụng sudo để cho phép người dùng tìm kiếm tệp ở bất kỳ đâu trên máy chủ. Tiện ích "find" rất tuyệt, nhưng nó cho phép tất cả các loại tác dụng phụ, chẳng hạn như sử dụng "-exec" để sinh ra các lệnh tùy ý.

Tôi có findthể làm việc với những hạn chế của mình không?


14
Thông thường, bạn không muốn kết quả tìm kiếm cho các mẫu tên tệp chứa các tệp mà bạn thực sự không thể truy cập. Về vấn đề đó yêu cầu của bạn là một chút kỳ lạ.
HBruijn

2
Không ai buộc bạn tham gia vào câu hỏi. Tôi nghĩ một trong những mục đích của Server Fault là phục vụ như một diễn đàn cho các tình huống kỳ lạ.
Quân đội Arvin

2
Server Fault không phải là một diễn đàn và những nỗ lực trong tâm lý học ngược không làm thay đổi tính hợp lệ của quan sát của HBruijn (điều mà tôi chắc chắn đã đặt ra trong nỗ lực giúp bạn).
Các cuộc đua nhẹ nhàng trong quỹ đạo

Câu trả lời:


19

Còn định vị thì sao?

xác định vị trí đọc một hoặc nhiều cơ sở dữ liệu được chuẩn bị bởi updateb (8) và ghi tên tệp khớp với ít nhất một trong số các MẪU vào đầu ra tiêu chuẩn, mỗi cái trên một dòng. Nếu --regex không được chỉ định, các MẪU có thể chứa các ký tự toàn cầu. Nếu bất kỳ MẪU ​​NÀO không chứa các ký tự toàn cầu, xác định vị trí ứng xử như thể mẫu đó là MẪU .

Theo mặc định, định vị không kiểm tra xem các tệp được tìm thấy trong cơ sở dữ liệu có còn tồn tại không. định vị không bao giờ có thể báo cáo các tệp được tạo sau khi cập nhật gần đây nhất của cơ sở dữ liệu có liên quan.

Hoặc thậm chí có thể nghiêng :

Secure Locate cung cấp một cách an toàn để lập chỉ mục và nhanh chóng tìm kiếm các tệp trên hệ thống của bạn. Nó sử dụng mã hóa gia tăng giống như GNU xác định vị trí để nén cơ sở dữ liệu của mình để giúp tìm kiếm nhanh hơn, nhưng nó cũng sẽ lưu trữ quyền và quyền sở hữu tệp để người dùng sẽ không thấy các tệp mà họ không có quyền truy cập.

Trang hướng dẫn này ghi lại phiên bản GNU của slocate. slocate Cho phép người dùng hệ thống tìm kiếm toàn bộ hệ thống tệp mà không hiển thị các tệp trái phép.


Ý tưởng tốt. Tôi không biết tại sao tôi không nghĩ về điều này. Nhưng tôi e rằng tham số "-d" có thể được sử dụng bằng cách nào đó để đọc vào các tệp tùy ý, nếu quy tắc sudo cho phép người dùng chạy bất kỳ lệnh "định vị" nào?
Quân Arvin

2
@TroelsArvin: locatekhông cần sudo; chỉ có updatedbcông việc của nó đòi hỏi đặc quyền. Do đó, người dùng của bạn không nên chạy hoặc có thể chạy sudo locate.
jwodder

1
@jwodder: Trên máy chủ RHEL 7: Giả sử người dùng không có quyền truy cập vào / data / foo. Trong / data / foo, có một tệp "somefile.csv". Bây giờ, khi bạn thực hiện "xác định vị trí somefile.csv", đầu ra từ "định vị" không bao gồm /data/foo/somefile.csv - trừ khi người dùng u thực hiện "định vị" qua sudo. (Sử dụng đối số "--nofollow" không có ích.)
Troels Arvin

1
@TroelsArvin nhưng -dcờ chỉ đặt đường dẫn cơ sở dữ liệu? Có lẽ tôi đã hiểu lầm bạn.
Lenniey

21

Dựa theo man 7 capabilities

   CAP_DAC_READ_SEARCH
          * Bypass file read permission checks and directory read and execute permission checks;
          * Invoke open_by_handle_at(2).

Điều này làm việc cho tôi. (các dòng bắt đầu bằng '#' là root, những dòng có '$' không phải là root) trong trường hợp này, người dùng không root nằm trong wheelnhóm.

# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root 
find: ‘/root’: Permission denied
$ sudofind /root
/root /root 
/root/Testbed 
...
... 
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied 
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec  4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =

Cho những gì khả năng cấp, nó phù hợp với chính xác những gì bạn muốn. Tôi chưa kiểm tra kỹ xem findcó tính năng nào cho phép bạn đọc byte bên trong tệp hay không, nhưng các công cụ rõ ràng như LD_PRELOADcác cuộc tấn công shim thư viện không nên hoạt động do bản chất của kiểm tra setuid trong Linux và các bit khả năng không nhận được được kế thừa bởi các tiến trình con hoặc (không giống như setuid thô) vì vậy đó là một phần thưởng khác.

Hãy nhớ rằng những gì bạn muốn làm sẽ gây ra những lo ngại về quyền riêng tư liên quan đến việc tạo hoặc truy cập tệp tạm thời và chương trình có thể được sử dụng làm cơ sở để thực hiện một nỗ lực leo thang điều kiện / đặc quyền chủng tộc (chống lại các chương trình tạo tên tệp nổi tiếng nhưng không kiểm tra bảo mật chính xác).

Ngoài ra, một số ứng dụng được viết kém có thể dựa vào siêu dữ liệu tệp hoặc cấu trúc cây như một cách để truyền đạt ý nghĩa hoặc ẩn dữ liệu. Điều này có thể gây ra việc phát hành thông tin bị hạn chế hoặc tiết lộ các tài liệu đặc quyền không được biết đến (bảo mật thông qua che khuất tôi biết, nhưng đây là điều mà các nhà cung cấp nguồn đóng đặc biệt thích làm, thật không may).

Do đó, hãy cẩn thận và cảnh giác khi thực hiện nó và hiểu rằng vẫn có rủi ro liên quan đến việc này ngay cả khi những điều rõ ràng không hoạt động.

Ồ, và tôi rất muốn xem liệu ai đó có bằng chứng về tấn công khái niệm sử dụng cơ chế này làm cơ sở cho sự leo thang đặc quyền trong các bình luận!


5
Điều này thực sự trông khá thú vị!
Sven

Như thế này? Chà, dù sao cũng không có PoC, nhưng dù sao cũng thú vị: forum.grsecurity.net/ trên
Lenniey

Tôi thích ý tưởng này, nhưng nó có một nhược điểm đáng kể: sudofind hiện là một tệp nhị phân không phải là một phần của bất kỳ gói phần mềm (ví dụ RPM) nào trên hệ thống. Vì vậy, nếu bản phân phối gửi ra một bản vá cho "find", thì sudofind sẽ không được cập nhật.
Quân Arvin

2
@TroelsArvin Đó không hẳn là một điều xấu. Nếu bạn đang thêm các khả năng giống như setuid vào một tiện ích hiện có không được thiết kế cho các khả năng đó, bạn sẽ không muốn bất kỳ cập nhật nào cho tiện ích cơ bản trước khi bạn xác minh rằng tiện ích cập nhật có thể được sử dụng an toàn với tiêu chuẩn không chuẩn của bạn khả năng. Hãy tưởng tượng trong trường hợp này nếu một bản cập nhật cung cấp findkhả năng thực thi trực tiếp một số mã do người dùng cung cấp, tương tự như những gì awkcó thể làm.
Andrew Henle

4
Vấn đề lớn nhất tôi có thể thấy với điều này là các thư mục có thể ghi trên thế giới nằm bên dưới các thư mục không thể tìm kiếm có thể đột nhiên được ghi vào.
Tavian Barnes

2

Tôi sẽ cung cấp cho người dùng quyền thích hợp.

Theo mặc định, nếu umask là 022, các thư mục được tạo để mọi người có thể liệt kê và thống kê các tệp trong đó. Nếu không, bạn có thể tự thay đổi quyền của thư mục thành bitwise hoặc quyền cũ của nó và 0555:

chmod +0555 foo

Và nếu những người dùng đó không có quyền thực thi trên tất cả các cha mẹ của thư mục đó (ví dụ: thư mục chính của người dùng khác), điều đó có nghĩa là bạn nên đặt thư mục đầu tiên ở một nơi khác.

Nếu bạn muốn chỉ cho phép một số người dùng đọc và thực thi thư mục đó, bạn có thể thay đổi chế độ của nó thành 0750, đặt những người dùng đó vào một nhóm và thay đổi chủ sở hữu nhóm của thư mục thành nhóm đó:

groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo
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.