ฉันจะใช้อาร์กิวเมนต์คำสั่งกับ Cmnd_Alias ​​ใน sudoers ได้อย่างไร


36

ฉันจะระบุอาร์กิวเมนต์คำสั่งใน sudoers ได้อย่างไร ในฐานะพื้นหลังawsคำสั่งนั้นเป็นประตูสู่กลุ่มย่อยของระบบย่อยทั้งหมดและฉันต้องการ จำกัด ผู้ใช้ให้ทำงานเท่านั้นaws s3 cp ...any other args...

เมื่อฉันลองทำสิ่งต่อไปนี้ /etc/sudoers

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp, /usr/local/aws/bin/aws s3 cp
gbt1 ALL=(gbt-ops) NOPASSWD: AWSS3_CMD

เชลล์โชคไม่ดีที่แจ้งให้ใส่รหัสผ่าน

$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
gbt-ops's password:

ถ้าฉันลบคำสั่งเกิดขึ้นใน Cmnd_Alias ​​มันจะไหลตามที่ต้องการ (โดยไม่ต้องใส่รหัสผ่าน) แต่การอนุญาตนั้นกว้างเกินไป ดังนั้นอะไรคือวิธีที่เหมาะสมในการ จำกัด การเรียกใช้คำสั่งบางประเภทเท่านั้น

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws, /usr/local/aws/bin/aws

แล้วก็

$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
...happy

ขอบคุณมาก.


ทำไมคุณมี / usr / local / bin / aws, / usr / local / aws / bin / aws ฉันหมายความว่าคุณทำซ้ำคำสั่งสองครั้งในบรรทัดเดียวกันหรือไม่
Mohammed Noureldin

คำตอบ:


47

คุณไม่ได้ใช้ wildcard ใด ๆ แต่ได้ระบุอาร์กิวเมนต์สองข้อไว้ ดังนั้นจึงsudoมองหาคำสั่งเหมือนที่เขียนไว้ (ยกเว้นการค้นหาเส้นทาง) (จากman 5 sudoers):

 If a Cmnd has associated command line arguments, then the arguments in
 the Cmnd must match exactly those given by the user on the command line
 (or match the wildcards if there are any).

ลองสิ่งที่ชอบ:

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp *, /usr/local/aws/bin/aws s3 cp *

โปรดทราบว่า:

 Wildcards in command line arguments should be used with care.  Because
 command line arguments are matched as a single, concatenated string, a
 wildcard such as ‘?’ or ‘*’ can match multiple words. 

ดังนั้นจำเป็นต้องใช้อักขระตัวแทนเพียงคำสั่งเดียวต่อคำสั่ง


1
+1 สำหรับคำอธิบายสั้น ๆ และแบ่งปันความรู้ขอบคุณ
Dinesh

1
โปรดทราบว่า sudo ไม่ถูกต้องเคารพการแยกของการขัดแย้งซึ่งสามารถนำมาใช้สำหรับการหาประโยชน์ในบางกรณีดูunix.stackexchange.com/a/279142/43920 ดังนั้นแทนที่จะระบุ/usr/local/bin/aws s3 cpใน sudoers จะปลอดภัยกว่าที่จะแทนที่ด้วยสคริปต์ (สามารถเขียนได้โดย root เท่านั้น)
pcworld

6

เช่นเดียวกับ @muru แต่สำหรับผู้ที่ชอบตัวอย่างการทำงานเต็มรูปแบบ:

# Cmnd alias specification
Cmnd_Alias ECHO_CMD=/bin/echo A *,/bin/echo B *

# Make USER run specific commands on given HOSTNAME
# USER_NAME 

#userx
userx ALL=(root) NOPASSWD: /sbin/cmd1,/sbin/cmd2,ECHO_CMD

ในขณะที่/sbin/cmd1, /sbin/cmd2สามารถเป็นคำสั่งอื่น ๆ

วัตถุประสงค์ของECHO_CMDการนำเสนอที่sudo echo X Aจะขอวลีรหัสผ่านในขณะที่sudo echo A Xไม่ได้และเพื่อให้คุณได้รับความมั่นใจผ่านการทดสอบง่ายๆ

(สันนิษฐานว่าเสียงสะท้อนอยู่ใน/bin/echoเพื่อตรวจสอบว่ามันอยู่ในระบบของคุณลองwhereis echo)


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