ให้สิทธิ์เข้าถึงชุดคำสั่งแก่ผู้ใช้ที่ไม่ใช่รูทโดยไม่ต้องใช้ sudo


13

ฉันต้องการให้ผู้ใช้ที่ไม่ใช่รูทบนเครื่องของฉันมีผู้ใช้ dns-manager บทบาทเดียวของเขาคือเรียกใช้คำสั่ง BIND ทั้งหมด (rndc, dnssec-keygen) เป็นต้น

ตอนนี้ทุกครั้งที่เขาต้องเรียกใช้คำสั่งเขาพิมพ์

sudo rndc reload

มีวิธีที่ฉันสามารถกำจัด sudo นี้ แต่เฉพาะในชุดคำสั่งเฉพาะ (และเฉพาะสำหรับผู้จัดการ DNS)?


5
การควบคุมการเข้าถึงการตัดสินใจเช่นนี้เป็นสิ่งที่สวยมากsudoสำหรับ ธุรกิจของคุณคัดค้านอะไรที่เขาใช้sudoในเรื่องนี้?
MadHatter

1
@peterh ฉันทำซ้ำคำถามของฉัน: การควบคุมการเข้าถึงการตัดสินใจ (เช่น SYSADM บางส่วนคณะผู้แทน) sudoเป็นบทบาทของ การคัดค้านคืออะไร?
MadHatter

3
sudoแล้วรหัสผ่านล่ะ? หรือรหัสผ่าน sudo เพื่อเรียกใช้เครื่องมือการจัดการ DNSซึ่งสามารถทำงานกับnamedกลุ่มหรือสิทธิ์ผู้ใช้หรือสิทธิ์รูตได้ตามต้องการ
MadHatter

4
@ peterh "เหตุผลที่ดีที่จะทำแบบนี้" จะเป็นบิตที่ขาดหายไป โดยปกติแล้วคำถามเช่นนี้จะกลายเป็นปัญหา XY ที่ปลอมตัวและฉันพบว่าการเข้าใจปัญหาพื้นฐานเป็นกุญแจสำคัญในการตอบคำถามเหล่านี้อย่างเต็มที่และเป็นมืออาชีพ
MadHatter

2
@ peterh ฉันคิดว่าเราเห็นด้วยกัน ฉันก็เหมือนกันที่ต้องการเห็น OP ปรับปรุงคำถามของเขา การเจาะลึกลงไปทำงานได้ดีสำหรับฉันเพื่อช่วยให้ผู้เขียนคิดนอกกรอบที่เขาสร้างขึ้นรอบตัวเขา sudoเขาอาจจะมีเหตุผลที่ดีเพื่อต้องการที่จะหลีกเลี่ยง ในการพยายามแสดงความรู้สึกต่อเราเขาอาจขจัดความสับสนของเราหรือของเขา - หรือทั้งสองอย่าง!
MadHatter

คำตอบ:


31

หากฉันเข้าใจความคิดเห็นของคุณอย่างถูกต้องปัญหาในที่นี้คือคำสั่งจะถูกส่งผ่านการเชื่อมต่อที่ไม่มีความสามารถในการป้อนรหัสผ่านที่ sudo เป็นค่าเริ่มต้นสำหรับการร้องขอ นอกจากนี้ในการกระจาย OS หลาย ๆ ค่า sudo จะใช้ค่าเริ่มต้นเป็น TTY ซึ่งโปรแกรมนี้อาจไม่มี

อย่างไรก็ตาม sudo สามารถมีโครงสร้างสิทธิ์ที่ละเอียดมากทำให้ผู้ใช้หนึ่งรายขึ้นไปสามารถออกคำสั่งหนึ่งโดยไม่ต้องใช้รหัสผ่านและ TTY ด้านล่างฉันจะแสดงสามวิธีในการกำหนดค่านี้สำหรับความต้องการของคุณ ไม่ว่าคุณจะเลือกแบบใดผู้ใช้จะสามารถออกคำสั่งได้sudo rndc reloadโดยไม่ต้องป้อนรหัสผ่าน

(นอกจากนี้อาจไม่จำเป็น แต่ ... โปรดจำไว้ว่าให้ทำสำเนาสำรองของไฟล์ sudoers ของคุณก่อนทำการแก้ไขเพื่อเก็บเชลล์ที่คุณเปิดรูทไว้ในกรณีที่คุณต้องการเปลี่ยนกลับเป็นแบ็คอัพและแก้ไข มันใช้visudoแทนsudo vi /etc/sudoersหวังว่าข้อควรระวังเหล่านี้จะไม่จำเป็น แต่ ... ดีกว่าที่จะมีพวกเขาและไม่ต้องการพวกเขากลับกัน!)

1. หากคุณไม่ต้องการให้มี TTY สำหรับการร้องขอใด ๆ

วิธีที่ง่ายที่สุดในการกำจัดของความต้องการ TTY (ถ้ามี) เพื่อให้แน่ใจว่าเส้นเริ่มต้นด้วยDefaultsใน/etc/sudoersไม่ได้มีคำว่าrequiretty- !requirettyแทนก็ควรมี อย่างไรก็ตามหากคุณทำสิ่งนี้หมายความว่าไม่มีคำสั่ง sudo ที่จะต้องใช้ tty!

คุณจะต้องเพิ่มบรรทัด

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. หากคุณต้องการ TTY สำหรับผู้ใช้ทั้งหมดยกเว้นอันนี้

สิ่งนี้สามารถทำได้โดยการตั้งค่าเริ่มต้นสำหรับผู้ใช้รายนี้ดังนี้:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. หากคุณต้องการสร้าง TTY สำหรับคำสั่งทั้งหมดยกเว้นคำสั่งเดียวนี้โดยผู้ใช้รายนี้

นี่คือความซับซ้อนเล็กน้อยเนื่องจากไวยากรณ์ของไฟล์ sudoers คุณจะต้องสร้างนามแฝงคำสั่งสำหรับคำสั่งแล้วตั้งค่าเริ่มต้นสำหรับนามแฝงคำสั่งนั้นเช่น:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD

แน่นอนว่าสามารถรวมกับสคริปต์ตัวตัดคำที่เรียกใช้คำสั่งโดยใช้ sudo ได้ด้วยเหตุผลบางประการคุณไม่สามารถใช้ sudo ได้โดยตรงแม้ว่าจะไม่มีรหัสผ่านก็ตาม
Jenny D

4

ใช่. sudo สามารถกำหนดค่าได้อย่างยืดหยุ่นมาก ถึงกระนั้นฉันต้องพูดถึง: วิธีแก้ปัญหาประเภทนี้ไม่ควรได้รับการพิจารณาว่าปลอดภัยมากและควรใช้ในสภาพแวดล้อมที่ร่วมมือกันเมื่อมีการควบคุมอื่น (เช่นคุณสามารถให้สิทธิ์พิเศษเหล่านี้แก่ผู้ใต้บังคับบัญชาของคุณ แต่ ไม่ควรทำเพื่อลูกค้าที่คุณรู้จักจากอินเทอร์เน็ตเท่านั้น)

sudo config อยู่ใน/etc/sudoersระบบส่วนใหญ่ คุณสามารถค้นหาไวยากรณ์ของมันโดย Googling หรือโดยman sudoคำสั่ง

คุณไม่ควรแก้ไขไฟล์นี้โดยตรง การทำเช่นนั้นอาจนำไปสู่เงื่อนไขการแข่งขันด้านความปลอดภัย ให้ใช้visudoคำสั่งแทน (ซึ่งเป็นตัวล้อมรอบ$EDITORตัวแปรสภาพแวดล้อมของคุณ)


หลังจากที่คุณกำหนดค่า sudo คุณสามารถล้อมรอบคำสั่งที่มองเห็นได้อย่างง่ายดาย มันง่ายมาก:

  1. สร้างไดเรกทอรีสำหรับรายการสคริปต์ sudo wrapper ของคุณ (fe /usr/local/dnsadmin/bin)
  2. สร้างสคริปต์ตัวตัดคำสั่งที่คุณต้องการให้ใช้งานได้โดยไม่ต้องใช้ sudo มันจะเป็นคำสั่งที่ง่ายมากตัวอย่างเช่น/usr/local/dnsadmin/bin/rndcจะเป็น:

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. รับไดเร็กทอรีนี้ไปยังPATHตัวแปรสภาพแวดล้อม (เช่นโดยทั้งระบบหรือโลคัล.profile)


ไม่อยากรู้ - ทำไมคุณถึงใช้execในเชลล์สคริปต์แทนที่จะเรียกคำสั่งโดยตรง? (ฉันไม่ได้บอกว่ามันผิดฉันแค่อยากรู้ว่าทำไมคุณต้องทำมันเพื่อที่ฉันจะได้เรียนรู้บางอย่าง)
Jenny D

2
ฉันทำด้วยบิต sudo ที่ไม่มีรหัสผ่านความคิดสคริปต์ของ wrapper นั้นยอดเยี่ยม
Anss

2
@ JennyD :-) เพราะความเสถียรและประสิทธิภาพ ในกรณีของexecคำสั่งที่เรียกว่าจะถูกแทนที่ในสถานที่ของเปลือก เปลือกจะหายไป หากไม่มี exec แล้วเชลล์จะเริ่มคำสั่งนั้นแล้วรอการยกเลิกจากนั้นจึงออก วินาทีนี้ exec-less หมายถึงกระบวนการร่วมมือหลายกระบวนการซึ่งไม่จำเป็น แต่ก็ไม่แตกต่างกันมากนักหากไม่มีผู้บริหารระดับสูงจะสามารถใช้งานได้ดี
peterh - Reinstate Monica

@JennyD คำขอร้องของฉัน :-)
peterh - Reinstate Monica

@Snowbody ขอบคุณมาก lectoring! เป็นเกียรติอย่างมาก
peterh - Reinstate Monica

2

แม้ว่านี่จะไม่ใช่โซลูชันทั่วไปในกรณีเฉพาะที่rndcคุณไม่ต้องการsudoเลย

rndcสามารถสื่อสารกับnamedกระบวนการใด ๆผ่านซ็อกเก็ตท้องถิ่นหรือพอร์ตระยะไกลโดยใช้รหัสลับในการตรวจสอบตัวเอง โดยค่าเริ่มต้น (หรืออย่างน้อยสำหรับเดเบียนซึ่งคือการใช้ฉัน distro) ไฟล์นี้สามารถพบได้ใน/etc/bind/rndc.keyและเป็นปกติที่สามารถอ่านได้เฉพาะกับผู้ใช้และกลุ่มbindbind

ทุกคนที่มีสิทธิ์เข้าถึงเพื่ออ่านไฟล์คีย์นั้น (หรือสำเนาที่เหมือนกัน) สามารถใช้rndcเพื่อควบคุมเซิร์ฟเวอร์ BIND ดังนั้นทางออกที่ง่ายที่สุดในกรณีนี้คือการเพิ่มผู้ใช้ในbindกลุ่ม

เดมอนทั่วไปจำนวนน่าแปลกใจมีบางสิ่งที่คล้ายกันตั้งค่า (ฉันยังคงคิดออกความเป็นไปได้ของ powerdns ในเรื่องนั้น แต่มันดูมีแนวโน้มที่ดี) หากคุณไม่ต้องการทำสิ่งนั้นsudoคุณจะต้องตรวจสอบว่าสิ่งที่คุณต้องการสำเร็จนั้นเป็นไปได้หรือไม่


-1

คุณไม่ต้องการใช้ sudo เพื่อให้สิทธิ์รูทสำหรับบางคำสั่ง แต่คุณสามารถ chmod 4750 โปรแกรมเฉพาะ [ที่สามารถล้อมรอบคำสั่ง] เพื่อยกระดับสิทธิ์ของผู้ใช้ปกติในการดำเนินการในฐานะที่เป็นราก

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