เราจะอนุญาตให้ผู้ใช้ที่ไม่ใช่รูทควบคุมบริการ system.d ได้อย่างไร?


60

ด้วยการsysvinitเป็นsudoersรายการเช่นนี้จะพอเพียง:

%webteam cms051=/sbin/service httpd *

สิ่งนี้จะช่วยให้คำสั่งเช่น:

  • sudo service httpd status
  • sudo service httpd restart

ขณะนี้ด้วยsystemdชื่อบริการเป็นอาร์กิวเมนต์สุดท้าย นั่นคือบริการเริ่มต้นใหม่จะทำกับ:

systemctl restart httpd.service

โดยธรรมชาติแล้วฉันคิดว่าการกำหนดคำสั่งsystemctl * httpd.serviceจะทำงานได้ แต่นั่นจะอนุญาตให้บางอย่างเช่นsystemctl restart puppet.service httpd.serviceซึ่งไม่ใช่ผลที่ต้องการ

เมื่อพิจารณาแล้วสิ่งใดจะเป็นวิธีที่ดีที่สุดที่จะทำให้ผู้ใช้ที่ไม่ใช่รูทสามารถควบคุมsystem.dบริการได้ สิ่งนี้ไม่จำเป็นต้องเป็นsudoers; บางทีการเปลี่ยนแปลงการอนุญาตไฟล์อาจจะเพียงพอหรือไม่


ฉันไม่ได้สัมผัสการsudoกำหนดค่าในช่วงเวลาหนึ่ง แต่คุณไม่สามารถทำอะไรเช่นนี้ได้cms051=systemctl * httpd.serviceใช่ไหม
John WH Smith

1
นี้จะช่วยให้คุณสามารถเริ่มบริการใด ๆ แล้ว ฉันควรจะรวมชิ้นอาหารอันโอชะที่อยู่ในคำถาม ขอโทษ
Belmin Fernandez

คำตอบ:


43

เพียงเพิ่มคำสั่งที่จำเป็นทั้งหมดเพื่อsudoersแยก:

%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service 
%webteam cms051=/usr/bin/systemctl status httpd.service

ฉันหวังว่าจะจับคำสั่งหน่วยทั้งหมด แต่ถ้าฉันต้องลงรายการพวกเขาแล้วฉันเดาว่านั่นคือสิ่งที่ฉันจะต้องทำ
Belmin Fernandez

9
สถานะไม่เป็นประโยชน์เนื่องจากผู้ใช้สามารถทำได้
Dereckson

5
คือcms051อะไร
วิน

1
ดังนั้นจะเกิดอะไรขึ้นถ้าฉันเรียกใช้ systemctl รีสตาร์ท http.service mariadb.service ;-) มาเรียบ์อาจจะถูกรีสตาร์ทด้วย
Marek Wajdzik

1
@MarekWajdzik sudo ไม่อนุญาตให้มีการขัดแย้งเพิ่มเติมหากไม่อนุญาตอย่างชัดเจนด้วย*หรือรูปแบบที่คล้ายกัน
jofel

31

@Jofel คำตอบคือสิ่งที่ฉันต้องการเพื่อให้ได้การตั้งค่าการทำงาน การสั่งซื้อนี้สำหรับคนอื่นสะดุดคำถามนี้ ฉันต้องการวิธีในการcapistranoรีสตาร์ทแอปพลิเคชัน Ruby ของฉันหลังจากการปรับใช้จากเครื่องท้องถิ่น นั่นหมายความว่าฉันต้องการการเข้าถึงโดยไม่ต้องใช้รหัสผ่านเพื่อเริ่มsystemdบริการใหม่ นี่คือสิ่งที่ฉันมีและมันใช้งานได้อย่างยอดเยี่ยม!

หมายเหตุ : ผู้ใช้และกลุ่มของฉันเรียกว่าdeployer
ใส่รหัสในไฟล์ที่กำหนดเองที่นี่: /etc/sudoers.d/deployer
รหัส:

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app

ฉันต้องเพิ่มสิ่งนั้นหลังจากที่ล็อกอินในฐานะผู้ใช้deployerในกรณีนี้คุณควรรันsystemctlคำสั่งด้วย sudo
Muyiwa Olu

8

สร้างนามแฝงคำสั่งด้วยคำสั่งที่คุณต้องการให้พวกเขาสามารถเข้าถึงได้ จากนั้นกำหนดกลุ่มให้กับนามแฝงคำสั่งนั้น:

Cmnd_Alias APACHE-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd

%webteam ALL=APACHE-SVC

เป็นวิธีที่ดีในการวางการแก้ไขใด ๆ ใน /etc/sudoers.d/filename แทนที่จะแก้ไขไฟล์ sudoers โดยตรง ตรวจสอบให้แน่ใจว่าชี้ไปที่. d / ชื่อไฟล์ของคุณใน sudoers ซึ่ง distros ใหม่ส่วนใหญ่ยังคงทำอยู่ การวาง 2 บรรทัดเหล่านี้ใน sudoers ของคุณควรทำตามขั้นตอนดังนี้:

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

หมายเหตุ: # ที่ด้านหน้าของ includeir ไม่ใช่ความคิดเห็น มันจะต้องคงอยู่


เพิ่มโอกาสในการดำเนินการหยุด / เริ่ม / รีสตาร์ทโดยไม่ใส่รหัสผ่านได้อย่างไร?
Nikolay Baranenko

คำตอบที่ดีที่สุด IMO ทุกคนควรเพิ่มนามแฝงคำสั่งและทำงานกับสิ่งนี้
DASKAjA

6

มันปลอดภัยที่สุดที่จะลงรายละเอียดพวกเขาเป็นjofelแนะนำ

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

"การservice httpd *" สายเป็นที่ค่อนข้างปลอดภัยเพราะ (ตรวจสอบนี้ :) serviceเพียง แต่มีธงที่มีประโยชน์อย่างใดอย่างหนึ่ง ( --status-all) ซึ่งไม่ได้ทำอะไรที่มีความสำคัญโดยเฉพาะอย่างยิ่งและ (ยืนยันนี้มากเกินไป :) /etc/init.d/httpdจะยอมรับบรรทัดคำสั่งที่คุณต้องการให้

หากมีชุดค่าผสมจำนวนมากที่แสดงรายการเหล่านั้นไม่สะดวกคุณควรถามว่าคุณกำลังทำอะไรอยู่ แต่คุณสามารถให้พวกเขาเข้าถึงสคริปต์ผู้ช่วยเหลือที่เขียนอย่างละเอียดซึ่งเรียกใช้คำสั่งสำหรับพวกเขา (เหมือน/etc/init.d/http) แม้ในกรณีนี้คุณควรแม่นยำและชัดเจนที่สุดเท่าที่จะทำได้เพื่อระบุรายการคำสั่งและตัวเลือกที่ได้รับอนุญาตอย่างชัดเจนและไม่ส่งผ่านการป้อนข้อมูลผู้ใช้ใด ๆ ไปยังคำสั่งเป้าหมายโดยตรง

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