Cho phép người dùng chạy một lệnh với các đối số (có chứa khoảng trắng)


17

Tôi muốn cho phép một người dùng chạy grep (thông qua sudo) và grep cho một chuỗi cụ thể trong một tệp cụ thể. Tôi không muốn cho phép người dùng này có thể chạy grep trên tất cả các tệp. Người dùng không có quyền truy cập đọc vào tệp, do đó yêu cầu sử dụng sudo. Tôi đang cố gắng viết một kiểm tra nagios để kiểm tra tệp nhật ký của dịch vụ khác trên máy.

Tuy nhiên nó không hoạt động, sudo cứ hỏi mật khẩu.

Lệnh của tôi là: sudo grep "string I want (" /var/log/thefilename.log(vâng, có một phần thô (và một số khoảng trắng trong chuỗi tôi muốn grep)

/etc/sudoers.d/user-can-grep có nội dung này:

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

Tập tin sudoers này được sở hữu bởi root:rootvà có quyền-r--r-----

Máy chủ là Ubuntu đáng tin cậy 14.04.3 LTS.

Làm thế nào tôi có thể làm cho công việc này?


Là nagios kiểm tra rõ ràng gọi / bin / grep, hoặc / usr / bin / grep?
Jeff Schaller

Viết một kịch bản shell thực hiện điều này, và sau đó để cho kịch bản được chạy qua sudo.
dùng253751

@JeffSchaller FYI kịch bản chỉ gọi grepwhich grepcho tôi biết nó đang sử dụng /bin/grep. AFAIK trong tệp sudo bạn cần chỉ định đường dẫn đầy đủ của tệp nhị phân, ngay cả khi bạn gọi nó mà không có đường dẫn đầy đủ.
Rory

Câu trả lời:


13

Rõ ràng, sudo làm phẳng lệnh thành một chuỗi trước khi so sánh nó với một đặc tả trong tệp sudoers. Vì vậy, trong trường hợp của bạn, bạn không cần sử dụng dấu ngoặc kép hoặc bất kỳ hình thức thoát nào khác:

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

Chỉnh sửa : Như @ user23013 chỉ ra trong các nhận xét, điều này có thể được khai thác để grep cho "chuỗi tôi muốn" trong bất kỳ tệp nào (và, bằng phần mở rộng, cũng cho "chuỗi I" và "chuỗi".) Vui lòng xem xét cẩn thận trước khi sử dụng kiểm tra đối số của sudo!


Cũng lưu ý rằng các yêu cầu sau là tương đương, tức là bạn sẽ không thể giới hạn người dùng trong một đại diện cụ thể:

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

Điều này là do thực tế là dấu ngoặc kép và thoát được xử lý bởi vỏ và không bao giờ đạt được sudo.


Thật thú vị, tôi tự hỏi nếu điều đó có thể khai thác, tức là thuyết phục sudobạn gõ một thứ (phù hợp với đặc điểm kỹ thuật) nhưng khi thực hiện nó, nó hoàn toàn là một thứ khác.
EightBitTony

4
@EightBitTony Tất nhiên rồi! Trong của bạn sudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file(với ý định cho phép người dùng chỉnh sửa "Chỉnh sửa tệp sudoers") có thể được khai thác bằng cách cd'nhập vào /etc/và chạy sudo vim Editing sudoers file. Tôi muốn nói rằng đối với bất kỳ lệnh nào có độ phức tạp hợp lý, người ta nên đi theo cách tiếp cận được đề xuất trong bình luận của bạn. Shell shell cung cấp $@biến số mà bạn có thể kiểm tra xem các đối số có được nhóm theo cách bạn muốn chúng được nhóm lại không.
Alexander Batischev

8
Tạo một đường dẫn ở ( /var/logbất cứ đâu và symlink thefilename.logđến bất kỳ tệp nào, người dùng có thể grep string I wanttừ bất kỳ tệp nào sau đó.
dùng23013

2
Câu trả lời của @ EightBitTony (viết tập lệnh bao bọc, cho phép sudo truy cập vào tập lệnh đó) sẽ tốt hơn và an toàn hơn nhiều.
cas

Wow, đó là thực tế cực kỳ kém cho một công cụ tập trung vào bảo mật.
Sam Watkins

32
  1. Viết một kịch bản (chỉ có thể viết bằng root)
  2. Trong kịch bản đó, thực hiện những grepgì bạn cần
  3. Trong cấu hình sudoers, chỉ cho phép truy cập vào tập lệnh đó
  4. Định cấu hình bất kỳ công cụ nào hoặc khuyên người dùng nào chỉ chạy tập lệnh qua sudo

Dễ dàng gỡ lỗi hơn, dễ dàng khóa truy cập cụ thể vào một tệp cụ thể và khó khai thác hơn nhiều.


2

Vì bạn chỉ cần root để truy cập tập tin, hãy xem xét sử dụng cat, teehoặc một cái gì đó tương tự và dẫn nó đến grephoặc bất kỳ chương trình nào bạn cần để chạy. Ví dụ: sudo cat /file/path | grep …Cách này bạn hạn chế root đến nơi bạn thực sự cần nó.


0

sudolà tuyệt vời, nhưng đôi khi nó không phải là phù hợp nhất. Đối với điều này, tôi thích sử dụng super. supercũng cho phép các quyền nâng cao, tuy nhiên, nó giả sử các bí danh lệnh, thuận tiện khi cho phép các dòng lệnh phức tạp, vì chúng được sử dụng như các dòng lệnh đơn giản.

super.tab của bạn sẽ trông như:

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

và sẽ được gọi là super grepcmd.


sudoCmnd_Alias(có thể chứa một hoặc nhiều lệnh, có hoặc không có hạn chế arg).
cas

Không giống chút nào. Cmnd_Alias ​​là một công cụ để đơn giản hóa tệp cấu hình, nó không hiển thị bí danh cho người dùng là chế độ hoạt động chính của siêu nhân (đó là lý do tại sao tôi sử dụng sudo khi tôi không phải là các lệnh bí danh hoặc chạy các tập lệnh suid (hầu hết thời gian) và siêu cho hai trường hợp sử dụng này).
hildred

đó là những gì các kịch bản trình bao bọc dành cho ... và chúng không bị giới hạn ở một lớp hoặc có vấn đề trích dẫn gây phiền nhiễu.
cas
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.