เห็นได้ชัดว่า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