เห็นได้ชัดว่าsudoจะเป็นตัวเลือกแรกสำหรับฉันในกรณีเช่นนี้ จุดสำคัญที่ดูเหมือนจะเป็นว่าส่วนใหญ่ (จริง) ผู้ดูแลระบบไม่ได้ใช้งานจริง/etc/sudoersเท่าที่เป็นไปได้อย่างเต็มที่ ( User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias)
ผู้ดูแลระบบส่วนใหญ่จะใช้เพียงบางส่วนของกฎที่มีอยู่และเพิ่มผู้ใช้หรือแย่กว่านั้นเพียงเพิ่มผู้ใช้ไปยังsudoกลุ่มที่มักจะมีกฎอยู่ในการตั้งค่า Ubuntu ( %sudo... ) แน่นอนว่าสิ่งนี้จะช่วยให้ผู้ใช้แต่ละคนสามารถครอบครองได้อย่างอิสระและเต็มพลังของบัญชี superuser
รับความคิดเห็นของคุณ:
ดังนั้นฉันจึงเพิ่มพวกเขาไป /etc/sudoers
ฉันคิดว่าคุณไม่ได้ใช้มันเท่าที่จะเป็นไปได้
ในสถานการณ์เช่นของคุณฉันจะเขียนสคริปต์การกระทำบางอย่างที่บ๊อบจะถูก จำกัด ในความเป็นจริงนี่คือสิ่งที่ฉันทำบนเซิร์ฟเวอร์ที่ฉันดูแลเพื่ออนุญาตให้ผู้ใช้สองคนทำการรีบูตผู้เยี่ยมชม KVM เฉพาะบนโฮสต์ สคริปต์จะมี hashbang พร้อมพา ธ สัมบูรณ์ไปยังล่าม (เช่น#!/bin/dashแทน#!/usr/bin/env bash) และอาจทำงานด้วยเชลล์ที่ใช้ที่อื่นสำหรับงานที่มีสิทธิพิเศษ ( /bin/dashหรือ/bin/sh) นี่เป็นเพียงข้อควรระวัง นอกจากนั้นฉันจะทำให้แน่ใจว่า hardcode เส้นทางสัมบูรณ์ทั้งหมดไปยังไบนารีและใช้น้อยที่สุดเท่าที่จะทำได้ เช่นเมื่อใช้bash/ dashฉันจะชอบbuiltinมากกว่าcommand(ดูman bash) คุณสามารถทำให้การบำรุงรักษานี้โดยการกำหนดตัวแปรเส้นทางที่แน่นอนและอ้างอิงถึงโปรแกรมตามตัวแปรนั้น ($VIRSHแทน/usr/bin/virsh) หากทำได้ให้ตรวจสอบรหัสของสคริปต์ภายนอกก่อนเรียกใช้ โดยเฉพาะอย่างยิ่งถ้าคุณต้องการเรียกพวกเขาในบริบทพิเศษ ในกรณีของฉันฉันยัง จำกัด ผู้ใช้ไปยังไดเรกทอรีรากเฉพาะและระบบย่อย SSH เฉพาะเพราะพวกเขาเชื่อมต่อกับเครื่องผ่านsshdการตรวจสอบและรหัสสาธารณะ เห็นได้ชัดว่าคุณไม่ต้องการสิ่งนั้น
ตรวจสอบให้แน่ใจเพื่อchown root: <the-script>; chmod u=rw,a=,a+rx <the-script>ป้องกันทุกคน แต่rootเหมาะสมจากการแก้ไขด้วย ระวังด้วยsetuidและsetgidเปิดใช้งานบิตบนไบนารีเป้าหมาย ( findสามารถใช้เพื่อตรวจสอบได้) สมมติว่าสคริปต์ของคุณอยู่ใน/usr/sbin/priv-actionขณะนี้
/etc/sudoersตอนนี้แก้ไข noexecสามารถใช้เพื่อป้องกันไบนารีอื่น ๆ นอกเหนือจากที่ได้รับอนุญาตอย่างชัดเจนเช่นกัน จริงๆแล้วมีการตั้งค่าเพิ่มเติมมากมายไม่ใช่เฉพาะที่ฉันกำลังอธิบายที่นี่ man sudoersเพื่อให้แน่ใจว่าจะให้คำปรึกษา
ตอนนี้ฉันต้องการตั้งชื่อผู้ใช้ ( User_Alias) ในsudoersไฟล์ของฉันแต่คุณสามารถใช้Group_Alias( man sudoers) หรือกลุ่มระบบจริง (เช่น%sudo):
# The list is comma-separated: bob,alice,...
User_Alias LIMITED_ADMINS=bob
จากนั้นเพิ่มนามแฝงคำสั่งเพื่ออนุญาตให้เรียกใช้งานสคริปต์เฉพาะนั้น:
# The list is comma-separated: /usr/sbin/priv-action,/bin/bash,...
Cmnd_Alias PRIV_ACTION=/usr/sbin/priv-action
สิ่งสุดท้ายที่ต้องทำก็คือสายเวทย์มนตร์ที่จะอนุญาตให้bob(หรือมากกว่าผู้ใช้ที่อยู่ในรายการLIMITED_ADMINS) ดำเนินการคำสั่งพิเศษผ่านสคริปต์:
LIMITED_ADMINS ALL=(root) PRIV_ACTION
ไม่เหมือนกับคำจำกัดความของนามแฝงก่อนหน้านี้ที่บรรทัดต้องการคำอธิบาย งั้นลองขุดลงไปในส่วนต่าง ๆ ในบรรทัด "ข้อมูลจำเพาะของผู้ใช้" ที่นี่man sudoersช่วย:
who where = (as_whom) whatโครงสร้างพื้นฐานของสเปคใช้เป็น
บรรทัดตัวอย่าง (พบในการตั้งค่า Ubuntu ส่วนใหญ่):
root ALL=(ALL) ALL
สิ่งนี้บอกว่าผู้ใช้ชื่อ root (ใช้#0เพื่อเชื่อมโยงกับ UID 0) ในโฮสต์ทั้งหมดอาจเรียกใช้ภายใต้บริบทของผู้ใช้ แต่จะถามรหัสผ่านของเขา (สมมติว่ามีพฤติกรรมเริ่มต้น) การเพิ่มNOPASSWDแท็กก่อนที่สุดท้ายALLก็จะยังอนุญาตให้rootทำเช่นเดียวกันโดยไม่ต้องถูกถามรหัสผ่าน (เช่นดังนั้น: root ALL=(ALL) NOPASSWD:ALL) ALLเป็นนามแฝงตัวแทนที่แท้จริงสำหรับประเภทนามแฝงต่างๆ
แต่กลับไปที่บ็อบ:
LIMITED_ADMINS ALL=(root) PRIV_ACTION
จะช่วยให้bobสมาชิกและจดทะเบียนอื่น ๆ ของUser_Alias LIMITED_ADMINSการเรียกใช้ (บนโฮสต์ทั้งหมดที่ว่าอะไรALLเป็น) เป็นผู้ใช้root(กลุ่มโดยนัย แต่จะได้รับดูman sudoers) Cmnd_Alias PRIV_ACTIONคำสั่งที่กำหนดใน มันจะดีขึ้น ยังคงสมมติว่าคุณเขียนสคริปต์นี้คุณสามารถอนุญาตให้พารามิเตอร์ต่าง ๆ ดังนั้นจึงหลีกเลี่ยงการเขียนสคริปต์หลาย ๆ /etc/sudoersยินดีใช้สัญลักษณ์แทนเชลล์เพื่อจำกัดความเป็นไปได้ของข้อโต้แย้งที่อนุญาตให้ส่งผ่าน
ฉันพบว่าผู้ดูแลระบบไม่ได้ใช้sudoersวิธีที่ควรใช้ซึ่งเป็นเหตุผลว่าทำไมฉันจึงชอบ "แฮ็ค" จากหนังสือสองเล่ม "Linux Server Hacks" และ "Linux Server Hacks Volume Two" ซึ่งทำให้ฉันเริ่มต้นด้วย การใช้สิ่งอำนวยความสะดวกที่ยอดเยี่ยมนี้มีความซับซ้อนยิ่งขึ้น
คุณสามารถสร้างความสับสนทุกประเภท - ซึ่งอาจไม่ช่วยด้านความปลอดภัย - โซลูชั่นสำหรับกรณีของคุณโดยเฉพาะ แต่เมื่อคุณพูดคำศัพท์พื้นฐานของ/etc/sudoersคุณสามารถทำได้ค่อนข้างดี :)
หมายเหตุ: โปรดทราบว่าคุณยังสามารถสร้างไฟล์ใหม่ภายใต้/etc/sudoers.d/หากคุณรู้สึกอยาก สิ่งนี้จะถือว่าคุณ/etc/sudoersมีบรรทัด:
#includedir /etc/sudoers.d