อนุญาตให้ผู้ใช้เรียกใช้คำสั่งที่มีอาร์กิวเมนต์ (ซึ่งมีช่องว่าง)


17

ฉันต้องการอนุญาตให้ผู้ใช้หนึ่งคนเรียกใช้ grep (ผ่าน sudo) และเพื่อ grep สำหรับสตริงที่ระบุหนึ่งไฟล์ในหนึ่งไฟล์ ฉันไม่ต้องการให้ผู้ใช้รายนี้สามารถรัน grep ในไฟล์ทั้งหมดได้ ผู้ใช้ไม่มีสิทธิ์เข้าถึงเพื่ออ่านไฟล์ดังนั้นความต้องการใช้ sudo ฉันพยายามเขียนเช็ค nagios ที่ greps ไฟล์บันทึกของบริการอื่นในเครื่อง

อย่างไรก็ตามมันใช้งานไม่ได้ sudo คอยขอรหัสผ่าน

คำสั่งของฉันคือ: sudo grep "string I want (" /var/log/thefilename.log(ใช่มี raw (และช่องว่างบางส่วนในสตริงที่ฉันต้องการ grep)

/etc/sudoers.d/user-can-grep มีเนื้อหานี้:

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

ไฟล์ sudoers นี้เป็นเจ้าของroot:rootและมีสิทธิ์-r--r-----

เซิร์ฟเวอร์คือ Ubuntu ที่เชื่อถือได้ 14.04.3 LTS

ฉันจะทำงานนี้ได้อย่างไร


nagios ตรวจสอบการโทร / bin / grep หรือ / usr / bin / grep อย่างชัดเจนหรือไม่
Jeff Schaller

sudoเขียนสคริปต์เปลือกที่ไม่นี้แล้วให้สคริปต์ที่จะวิ่งผ่าน
user253751

@JeffSchaller FYI สคริปต์เพิ่งโทรgrepมาและwhich grepบอกฉันว่ามันกำลังใช้/bin/grepอยู่ AFAIK ในไฟล์ sudo คุณต้องระบุเส้นทางแบบเต็มของไบนารีแม้ว่าคุณจะเรียกมันโดยไม่มีเส้นทางแบบเต็มก็ตาม
โรรี่

คำตอบ:


13

เห็นได้ชัดว่า sudo แบนคำสั่งลงในสตริงก่อนที่จะเปรียบเทียบกับข้อมูลจำเพาะในไฟล์ sudoers ดังนั้นในกรณีของคุณคุณไม่จำเป็นต้องใช้เครื่องหมายคำพูดหรือรูปแบบการหลบหนีอื่น ๆ :

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

แก้ไข : เนื่องจาก @ user23013 ชี้ให้เห็นในความคิดเห็นสิ่งนี้สามารถถูกใช้เพื่อ grep สำหรับ "สตริงที่ฉันต้องการ" ในไฟล์ใด ๆ (และโดยส่วนขยายรวมถึง "สตริงฉัน" และ "สตริง") โปรดพิจารณาอย่างรอบคอบก่อน ใช้การตรวจสอบอาร์กิวเมนต์ของ sudo!


นอกจากนี้โปรดทราบว่าการเรียกใช้ต่อไปนี้เทียบเท่ากันนั่นคือคุณจะไม่สามารถ จำกัด ผู้ใช้ในการแสดงแบบใดแบบหนึ่ง:

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

sudoเพราะนี่คือความจริงที่ว่าคำพูดและหนีจะถูกจัดการโดยเปลือกและไม่เคยเข้าถึง


น่าสนใจฉันสงสัยว่ามันเป็นการเอาเปรียบหรือไม่เช่นโน้มน้าวให้sudoคุณพิมพ์สิ่งหนึ่ง (ซึ่งตรงกับข้อกำหนด) แต่เมื่อมันมาถึงการดำเนินการมันเป็นอย่างอื่น
EightBitTony

4
@EightBitTony แน่นอนมันเป็น! ในของคุณsudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file(ที่มีความตั้งใจที่จะให้ผู้ใช้แก้ไข "การแก้ไข sudoers ไฟล์") สามารถใช้ประโยชน์จากcd'ไอเอ็นจีเข้ามาและทำงาน/etc/ sudo vim Editing sudoers fileฉันจะบอกว่าสำหรับคำสั่งใด ๆ ที่มีความซับซ้อนที่สมเหตุสมผลเราควรใช้แนวทางที่แนะนำในความคิดเห็นของคุณ - เชลล์มี$@ตัวแปรที่คุณสามารถตรวจสอบได้ว่าข้อโต้แย้งนั้นได้รับการจัดกลุ่มตามที่คุณคาดหวังไว้
อเล็กซานเด Batischev

8
สร้างเส้นทาง( /var/logได้ทุกที่และเชื่อมโยงthefilename.logไปยังไฟล์ใดก็ได้ผู้ใช้สามารถ grep string I wantจากไฟล์ใดก็ได้
23013

2
@ EightBitTony คำตอบ (เขียนสคริปต์ wrapper, อนุญาตให้ sudo เข้าถึงสคริปต์นั้น) ดีกว่าและปลอดภัยกว่ามาก
cas

ว้าวนั่นเป็นวิธีปฏิบัติที่แย่มากสำหรับเครื่องมือที่เน้นเรื่องความปลอดภัย
Sam Watkins

32
  1. เขียนสคริปต์ (เขียนโดย root เท่านั้น)
  2. ในสคริปต์นั้นดำเนินการตามที่grepคุณต้องการ
  3. ในการกำหนดค่า sudoers อนุญาตให้เข้าถึงสคริปต์นั้นเท่านั้น
  4. กำหนดค่าเครื่องมือใด ๆ หรือแนะนำผู้ใช้ให้เรียกใช้สคริปต์ผ่าน sudo

แก้จุดบกพร่องได้ง่ายขึ้นง่ายต่อการล็อคการเข้าถึงไฟล์ที่เฉพาะเจาะจงและยากที่จะใช้ประโยชน์


2

เนื่องจากคุณต้องการเพียงรากสำหรับการเข้าถึงไฟล์พิจารณาใช้cat, teeหรือสิ่งที่คล้ายกันและท่อที่grepหรือสิ่งที่โปรแกรมที่คุณจำเป็นต้องใช้ เช่นsudo cat /file/path | grep …วิธีนี้คุณ จำกัด การรูตที่คุณต้องการอย่างยิ่ง


0

sudoดีมาก แต่บางครั้งมันก็ไม่เหมาะที่สุด superสำหรับเรื่องนี้ผมชอบที่จะใช้ superยังอนุญาตให้ยกระดับสิทธิ์อย่างไรก็ตามมันจะสมมตินามแฝงคำสั่งซึ่งจะสะดวกเมื่ออนุญาตให้บรรทัดคำสั่งที่ซับซ้อนเพราะพวกเขาจะใช้เป็นบรรทัดคำสั่งง่าย

แท็บ super ของคุณจะมีลักษณะดังนี้:

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

super grepcmdและจะเรียกว่าเป็น


sudoมีCmnd_Alias(ซึ่งสามารถมีหนึ่งคำสั่งหรือมากกว่านั้นโดยมีหรือไม่มีข้อ จำกัด หาเรื่อง)
cas

ไม่เหมือนกันเลย Cmnd_Alias ​​เป็นเครื่องมือสำหรับการลดความซับซ้อนของไฟล์การกำหนดค่ามันไม่เปิดเผยนามแฝงให้กับผู้ใช้ซึ่งเป็นโหมดหลักของการดำเนินการขั้นสูง (ซึ่งเป็นเหตุผลที่ฉันใช้ sudo เมื่อฉันไม่ใช่คำสั่งนามแฝงหรือเรียกใช้สคริปต์ suid (ส่วนใหญ่) และสุดยอดสำหรับกรณีใช้งานสองกรณีนี้)
hildred

นั่นเป็นสิ่งที่สคริปต์ตัวห่อสำหรับ ... และพวกเขาไม่ได้ จำกัด อยู่ที่หนึ่งสมุทรหรือมีปัญหาการอ้างอิงที่น่ารำคาญ
cas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.