ubuntu: ให้ผู้ใช้เรียกใช้สคริปต์ด้วยการอนุญาตรูท


9

ฉันมีอูบุนตู 8.04 และฉันต้องการเขียนสคริปต์ทุบตีที่ทำงานrootซึ่งผู้ใช้ทุกคนสามารถเรียกใช้ได้

ฉันเองสามารถทำได้ sudo

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

การชี้แจง : ฉันไม่ต้องการทำด้วย sudo เพราะผู้ใช้จะต้องพิมพ์รหัสผ่านของพวกเขา ฉันแค่อยากให้พวกเขาเรียกใช้สคริปต์ในฐานะที่เป็นรูท

คำตอบ:


23

หากนี่เป็นไบนารีปกติคุณสามารถตั้งค่าได้โดยการเรียกใช้

# chmod u+s /path/to/binary

น่าเสียดายที่สคริปต์ไม่สามารถตั้งค่าได้ (คุณทำได้ แต่ไม่สนใจ) เหตุผลสำหรับสิ่งนี้คือบรรทัดแรกของสคริปต์บอกระบบปฏิบัติการว่าตัวแปลใดที่จะเรียกใช้สคริปต์ภายใต้ ตัวอย่างเช่นหากคุณมีสคริปต์ด้วย:

#!/bin/bash

คุณต้องลงเอยจริง ๆ

/bin/bash /path/to/script

เห็นได้ชัดว่าคุณต้องการล่ามที่จะ setuid ซึ่งหมายความว่าสคริปต์ทั้งหมดจะ setuid มันจะไม่ดี

คุณสามารถทำได้ด้วย sudo โดยใส่ต่อไปนี้ในไฟล์ / etc / sudoers ของคุณโดยใช้ visudo

ALL ALL=NOPASSWD: /path/to/script

และตอนนี้ผู้ใช้สามารถเรียกใช้

$ sudo /path/to/script

สิ่งนี้ช่วยให้พวกเขาเรียกใช้สคริปต์โดยไม่ต้องพิมพ์รหัสผ่าน

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


ฉันคิดว่านี่เป็นคำตอบที่ฉันกำลังมองหา ฉันไม่สามารถตั้งค่าสคริปต์ทุบตีให้เป็นไบนารีได้หรือไม่ (แน่นอนฉันจะใช้มาตรการที่จะทำให้มันไม่สามารถแก้ไขได้)
flybywire

ไม่คุณไม่สามารถสร้างสคริปต์ setuid
wfaulk

wfaulk: คุณเคยสามารถทำได้ แต่ distros Linux ล่าสุดไม่อนุญาตอีกต่อไป คุณสามารถใช้เครื่องมือเช่น shc เพื่อ 'คอมไพล์' สคริปต์แล้วทำให้มันเป็น setuid
Kyle Brandt

wfaulk: แน่นอนว่ามันจะออกนอกเส้นทางของคุณเพื่อทำสิ่งที่ถูกปิดใช้งานโดยเจตนาดังนั้นมันอาจเป็นความคิดที่ไม่ดี :-)
Kyle Brandt

แทนที่คำALLด้วยชื่อผู้ใช้เพื่ออนุญาตให้ sudoer ตัวเดียวสามารถรันได้โดยไม่ต้องป้อนรหัสผ่าน
hdave

3

ฉันต้องการแทรกบรรทัดนั้นที่ส่วนท้ายของ / etc / sudoers: ALL ALL = NOPASSWD: <filename> เห็นได้ชัดว่าการ%admin ALL=(ALL) ALLแทนที่ภายหลังจำเป็นต้องใช้รหัสผ่านสำหรับผู้ใช้ที่เป็นผู้ดูแลระบบ

ไม่มีปัญหาด้านความปลอดภัยที่อนุญาตให้สคริปต์รันเป็น root ตราบใดที่สคริปต์ทำงานได้ดีไม่เป็นอันตรายและได้รับอนุญาตและหากค่าสำหรับพารามิเตอร์ใด ๆ ไม่สามารถทำให้สคริปต์ทำงานผิดปกติได้

แต่ก็มี gotcha ...

ใช้เส้นทางแบบเต็มเสมอในคำสั่งและชื่อไฟล์ ถ้าคุณเขียนสิ่งที่ต้องการecho Hello world!ในmyrootscriptบางคนอาจจะเขียน~/bin/echo scriptและmyrootscriptจะดำเนินการเป็นรากสิ่งที่อยู่ในนั้น

/bin/echo "Hoping this will keep you safe" :-)


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

2

โดยค่าเริ่มต้นสมาชิกของwheelกลุ่มได้รับอนุญาตให้ใช้คำสั่งใดsudorootนี่อาจเป็นวิธีที่คุณใช้sudoจนถึงปัจจุบัน

หากต้องการอนุญาตผู้ใช้รายอื่นคุณจะต้องสร้างsudoersกฎ ตัวอย่างเช่น:

mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh

จะช่วยให้ผู้ใช้mickey.mouseในการเรียกใช้คำสั่ง/usr/local/bin/test.shเป็นrootโดยไม่ต้องมีรหัสผ่าน prompt เพิ่มเติม

คุณควรอ่านเอกสารนี้สำหรับข้อมูลเพิ่มเติม


Debian / Ubuntu ใช้กลุ่มผู้ดูแลระบบแทนวงล้อ อาจเป็นชื่อที่แม่นยำกว่านี้เล็กน้อย
David Pashley

โทรหาฉันแบบเก่า แต่ .. ;)
Dan Carley

1
ล้าสมัย: P
David Pashley

0

ใช้chmod +s <filename>ในการดูบิตของ suid ซึ่งหมายความว่าเมื่อไฟล์ถูกดำเนินการมันจะทำงานโดยได้รับอนุญาตจากเจ้าของไฟล์ (ดังนั้นให้ chown ไปที่รูทเพื่อให้ไฟล์ทำงานตามนั้น)

อย่างไรก็ตามสิ่งนี้อาจเป็นอันตรายอย่างยิ่งกับบางสิ่งบางอย่างเช่นสคริปต์ทุบตีเนื่องจากผู้ใช้พบวิธีที่จะเปลี่ยนแปลงพวกเขาสามารถได้รับรูตเชลล์ได้อย่างง่ายดาย ตรวจสอบให้แน่ใจว่าทุกคนไม่สามารถเขียนได้ยกเว้นผู้ใช้ root

ลีนุกซ์ไม่อนุญาตให้คุณกำหนดสคริปต์, คุณต้องรวบรวมมันเป็นโปรแกรม แต่คุณสามารถใช้ไฟล์ sudoers (/ etc / sudoers) และเพิ่มบรรทัดเช่นนี้

<username> ALL = NOPASSWD: /path/to/script


0

อีกทางเลือกหนึ่ง: คุณสามารถใช้ setuid C wrapper รอบ ๆ สคริปต์นั้นได้

  • ตรวจสอบข้อ จำกัด ที่คุณอาจต้องการบังคับใช้ (รายชื่อผู้ใช้เวลาโหลดระบบ, ... )
  • บันทึก / ตรวจสอบการดำเนินการถ้าต้องการ
  • execs สคริปต์

ชนิดเช่นชุดย่อยของตัวเองของหลาย capablities sudoของ

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