ทำไมระบบถึงมี /etc/sudoers.d ฉันจะแก้ไขได้อย่างไร


48

ครั้งที่แล้วฉันถามถึงความเสี่ยงของสิ่งเหล่านี้ (ใน / etc / sudoers):

    user_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
    %group_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

ในขณะที่ฉันกำลังคิดเกี่ยวกับปัญหานี้ฉันพบไดเร็กทอรี/etc/sudoers.d ไฟล์ในไดเรกทอรีควรมีฟังก์ชั่นที่คล้ายกับ / etc / sudoers (หมายถึงสคริปต์ข้างต้นยังคงเป็นปัญหาแม้ใน /etc/sudoers.d) และอย่างไรก็ตามบทความหนึ่งกล่าวว่าเราไม่ควรใช้ไดเรกทอรีเพราะเราไม่สามารถใช้visudoเพื่อแก้ไขไฟล์ใน มัน. นั่นคือเราสูญเสียสิทธิ์ในการใช้sudoหากเราทำผิดพลาดในไดเรกทอรี

ถ้าเป็นจริงทำไมเรามี/etc/sudoers.d ? เราไม่หรือมีวิธีการที่ดีในการแก้ไขไฟล์ใน/etc/sudoers.d ?

คำตอบ:


45

การเปลี่ยนแปลงที่เกิดขึ้นกับไฟล์จะ/etc/sudoers.dยังคงอยู่หากคุณอัปเกรดระบบ สิ่งนี้สามารถป้องกันผู้ใช้ปิดล็อคเมื่อระบบอัพเกรด Ubuntu มีแนวโน้มที่จะชอบพฤติกรรมนี้ ดิสทริบิวชันอื่นก็ใช้เลย์เอาต์นี้เช่นกัน

/etc/sudoersจะได้รับประสบการณ์ของผมว่ากฎระเบียบเกี่ยวกับไฟล์ในไดเรกทอรีนี้จะโยกกว่า สิ่งนี้ได้รวม:

  • ข้อผิดพลาดในไฟล์ไม่ได้ทำให้เกิดความsudoล้มเหลว อย่างไรก็ตามไฟล์นั้นถูกละเว้น
  • กฎการอนุญาตปรากฏขึ้นเข้มงวดน้อยลง อนุญาตให้กลุ่มที่เกี่ยวข้องหรืออื่น ๆ อ่านไฟล์ได้ /etc/sudoersผมไม่เชื่อว่าเป็นไปได้ด้วย สิทธิ์ในการเขียนต้องถูก จำกัดrootเพื่อรักษาความปลอดภัย sudo เวอร์ชันปัจจุบันของ Ubuntu อนุญาตให้อ่านสิทธิ์สำหรับกลุ่มหรืออื่น ๆ (ความสามารถนี้ช่วยให้สามารถเข้าถึงการตรวจสอบการใช้ sudo โดยไม่ต้องใช้การเข้าถึงรูท)

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

ความสามารถในการมีไฟล์แบบสแตนด์อะโลนทำให้แอปพลิเคชันสามารถเปิดใช้งานsudoความสามารถในการติดตั้งและลบออกเมื่อไม่ได้ติดตั้ง เครื่องมือกำหนดค่าอัตโนมัติยังสามารถใช้ความสามารถนี้ได้

ฉันใช้ความสามารถนี้เพื่อแยกการเปลี่ยนแปลงที่จำเป็นเพื่อให้สิทธิ์การเข้าถึงกลุ่มผู้ใช้เฉพาะบนระบบเฉพาะ


1
ลักษณะสองอย่างของ sudoers.d ที่คุณพูดถึงดูเหมือนจะสำคัญและเป็นประโยชน์จริงๆ ขอขอบคุณ!
aob

ดูคำตอบและคำเตือนของฉันเกี่ยวกับสาเหตุที่ไม่ใช่ sudoers.d
dragon788

1
ไม่เห็นด้วยอย่างยิ่งกับข้อความ 'ข้อผิดพลาดในไฟล์ไม่ทำให้เกิดความsudoล้มเหลว' ฉันแตก sudo บน RHEL ด้วยไวยากรณ์ที่ไม่ถูกต้องในไฟล์จาก /etc/sudoers.d นี่ใช้ความพยายามอย่างมากในการแก้ไขและฉันคิดว่าคำแนะนำควรใช้visudo -fเพื่อแก้ไขไฟล์เหล่านั้นเสมอ
79E09796

@ 79E09796 ฉันมีไฟล์ที่เสียหายใน /etc/sudoers.d โดยไม่ทำให้เกิดปัญหากับกฎในไฟล์อื่น YMMV หากคุณแบ่งการกำหนดค่า sudo ที่นำคุณเข้าสู่ระบบคุณจะมีปัญหา หากคุณสามารถเข้าถึงการรีบูตระบบได้ค่อนข้างง่ายในการรีบูตเข้าสู่โหมดการกู้คืนและแก้ไขไฟล์ ฉันยอมรับว่าเป็นแนวปฏิบัติที่ดีที่สุดที่จะใช้ visodo เพื่อแก้ไขหรืออย่างน้อยก็ตรวจสอบการเปลี่ยนแปลงกับไฟล์การกำหนดค่า sudo
BillThor

62

ใช่คุณสามารถใช้visudoเพื่อแก้ไขไฟล์เหล่านั้น สิ่งที่คุณต้องทำคือระบุชื่อของไฟล์ที่คุณต้องการแก้ไขด้วย-fตัวเลือก ตัวอย่างเช่น:

visudo -f /etc/sudoers.d/somefilename

หรือถ้าจำเป็น:

sudo visudo -f /etc/sudoers.d/somefilename

เอกสาร

จากman visudo:

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

สรุป:

  1. ไวยากรณ์:ทั้งสองvisudoและดำเนินการตรวจสอบไวยากรณ์เดียวกันvisudo -f

  2. การอนุญาต / การเป็นเจ้าของ: เนื่องจากคุณสมบัติที่เพิ่มเข้ามาเพื่อช่วยในการดูแลระบบขนาดใหญ่ไฟล์ที่ถูกแก้ไขภายใต้visudo -fจะไม่ถูกตรวจสอบความเป็นเจ้าของหรือการอนุญาต: สิ่งนี้ช่วยให้การตรวจสอบไวยากรณ์ของไฟล์ออฟไลน์หรือเป็นส่วนหนึ่งของระบบควบคุมการแก้ไข

ทำไมต้องใช้ /etc/sudoers.d/

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

เมื่อไหร่sudoไม่สนใจไฟล์ใน/etc/sudoers?

หาก/etc/sudoersไฟล์ของคุณมีบรรทัด:

#includedir /etc/sudoers.d

แล้วจะอ่านไฟล์ในไดเรกทอรีsudo/etc/sudoers.d

ข้อยกเว้นคือ:

  1. ไฟล์ที่มีชื่อลงท้ายด้วย ~
  2. ไฟล์ที่ชื่อมี.อักขระ

สิ่งนี้ทำ (ก) เพื่อความสะดวกของผู้จัดการแพคเกจและ (ข) เพื่อไม่ให้ไฟล์สำรองข้อมูลจากผู้แก้ไขถูกตัดทิ้ง


ขอบคุณ แต่ฉันมีข้อสงสัย คือvisudo -fความปลอดภัยหรือไม่
aob

5
ใช่การแก้ไขในแฟชั่นที่ปลอดภัยเช่นเดียวกับปกติvisudo -f visudoนั่นคือเหตุผลที่เรามีvisudoและเหตุผลที่ให้-fตัวเลือก
John1024

ข้อควรทราบที่ดีเกี่ยวกับการเพิกเฉยการอนุญาตเมื่อใช้งาน-fเพราะอาจทำให้ใครบางคนที่คัดลอกลงใน /etc/sudoers.d/ โดยไม่ต้องตรวจสอบอีกครั้ง
dragon788

1
ขอขอบคุณสำหรับข้อยกเว้น ฉันตั้งชื่อไฟล์ของฉันเป็นอย่างไร/etc/sudoers.d/mysudorules.sudoและไม่สามารถใช้ชีวิตของฉันได้ว่าทำไมกฎภายในไม่ถูกนำไปใช้ก่อนที่จะอ่านคำตอบของคุณ
Zaroth

1
ขอบคุณสำหรับการกล่าวถึงข้อยกเว้น ไฟล์ของฉัน/sudoers.d/mysite.co.ukไม่ทำงานและหลังจากเปลี่ยนชื่อเป็นmysiteไฟล์แล้ว! :)
J86

20

ทำไมเราถึงมี / etc / sudoers.d

เนื่องจากง่ายขึ้นสำหรับเครื่องมืออัตโนมัติ (เช่น Chef หรือ Puppet) เพื่อวางไฟล์แต่ละไฟล์ลงในไดเรกทอรีนี้แทนที่จะทำการเปลี่ยนแปลง/etc/sudoersซึ่งอาจจะบอบบาง

ไฟล์ที่อยู่ใน/etc/sudoers.d(มีผล) ต่อกัน คุณจะเห็นหลายกรณีอื่น ๆ ของรูปแบบนี้ใน/etcเช่นและ/etc/cron.d/etc/logrotate.d


ฉันไม่ทราบว่ามีไดเรกทอรีที่คล้ายกันอื่น ๆ ขอขอบคุณ.
aob

14

ประโยชน์อีกประการของการใช้visudo -fดังที่กล่าวไว้ในคำตอบคือมีตัวเลือกที่เกี่ยวข้อง-cหรือ--checkยืนยันว่าคุณไม่มีข้อมูลที่ไม่ถูกต้องในไฟล์ sudoers.d หรือไฟล์อื่น ๆ ที่คุณอาจต้องการใส่ใน sudoers.d นี่เป็นประโยชน์อย่างมากในกรณีที่กล่าวถึงด้วยเครื่องมืออัตโนมัติตามที่คุณสามารถเรียกใช้เช่น

sudo visudo -c -q -f /home/myuser/mysudoers && \
sudo chmod 600 /home/myuser/mysudoers && \
sudo cp /home/myuser/mysudoers /etc/sudoers.d/mysudoers

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

นอกจากนี้ยังมีคำเตือนเกี่ยวกับข้อความเหล่านี้จากคำตอบอื่น ๆ

เป็นประสบการณ์ของฉันที่กฎในไฟล์ในไดเรกทอรีนี้จะหลวมกว่าสำหรับ / etc / sudoers สิ่งนี้ได้รวม:

ข้อผิดพลาดในไฟล์ไม่ได้ทำให้ sudo ล้มเหลว อย่างไรก็ตามไฟล์นั้นถูกละเว้น กฎการอนุญาตปรากฏขึ้นเข้มงวดน้อยลง ฉันอนุญาตให้กลุ่มที่เกี่ยวข้องอ่านไฟล์ได้ ฉันไม่เชื่อว่าเป็นไปได้ด้วย / etc / sudo

ไฟล์ใน /etc/sudoers.d จำเป็นต้องใช้ไวยากรณ์เดียวกันกับ / etc / sudoers เนื่องจากภายใต้หน้าปกของระบบจะเชื่อมไฟล์ทั้งหมดเข้าด้วยกันโดยใช้ไฟล์ล่าสุดที่มี "สุดท้าย" หากมีหลายรายการในรายการเดียวกัน การตั้งค่าเอกพจน์

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

คุณสามารถอนุญาตให้ไฟล์ sudoers สามารถอ่านได้ทั่วโลกถ้าคุณอนุญาตให้ 'อื่น ๆ ' ได้รับอนุญาตให้เขียนคุณต้อง sudo ในฐานะผู้ใช้รายอื่นหรือจากเทอร์มินัลรูทเรียกใช้คำสั่งนี้ สิ่งนี้สามารถทำลายได้ถ้าไฟล์นั้นเป็นของบุคคลอื่นที่ไม่ใช่ root: root

sudo chmod 644 /etc/sudoers.d/mysudoers
sudo chown root:root /etc/sudoers.d/mysudoers

ฉันเพิ่งยืนยันว่าถ้าฉันรันchmod o+w /etc/sudoers.d/vagrantฉันไม่สามารถ sudo ในฐานะผู้ใช้คนจรจัดได้อีกต่อไปฉันจะขอรหัสผ่านของฉันจากนั้นล้มเหลว

เมื่อฉันวิ่งsudo -lไปดูการอนุญาตคำสั่งที่ใช้เป็นผู้ใช้ sudo อื่นที่ถูกต้องฉันยังได้รับคำเตือนเกี่ยวกับสิทธิ์ของไฟล์ นี่เป็นคำสั่งเดียวกับที่ฉันใช้เพื่อยืนยันว่าผู้ใช้ 'คนจรจัด' สูญเสีย sudo เมื่อฉันใช้การo+wอนุญาตกับไฟล์ที่ให้สิทธิ์ผู้ใช้ sudo


3

เพียงแค่สั้น ๆ เพิ่มไปยังคำตอบทั่วไป ... ไม่มีคำตอบอื่นใดที่แก้ไขปัญหาของฉันซึ่งเป็นลำดับที่มีความสำคัญ

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

ฉันมีสิ่งที่ชอบ:

somebody ALL=(ALL): somecommand
somebody ALL=(someoneelse) NOPASSWD: somecommand

และอันที่สองก็ไม่มีผลเพราะคู่แรกนั้นเข้าคู่กันแล้ว NOPASSWD ไม่ใช่เงื่อนไข แต่เป็นวิธีการแก้ไขการกระทำบางอย่าง

และมันก็ไม่ชัดเจนเพราะมันไม่ได้อยู่ในไฟล์เดียวเนื่องจากไดเรกทอรี sudoers.d

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