สูตรสิทธิ์ขั้นต่ำสองสูตรที่นำมาต่อกันไม่ได้ให้การติดตั้งที่เข้มงวดกว่า รูปแบบหนึ่งให้เดมอนเริ่มด้วยสิทธิ์แล้วลดลงไปยังบัญชีที่ไม่มีสิทธิ์หลังการเริ่มต้นทำงาน อีกรูปแบบหนึ่งให้ตัวจัดการบริการเริ่มทำงานภายใต้ตัวตนที่จำกัดตั้งแต่คำสั่งแรก แต่ละแบบทำงานได้ด้วยตัวเอง และการรวมกันมักได้บริการที่ไม่สามารถทำงานใดในสองงานได้อย่างสะอาดตา ส่วนที่เหลือจะไล่ตามลำดับการตัดสินใจ

สองรูปแบบ เจ้าของเดียวของการสลับ

รูปแบบแรกเป็นของเดมอน ตัวเลือก OpenVPN ของชุมชน user และ group จะเปลี่ยนตัวตนหลังจากตั้งอุโมงค์และกุญแจเรียบร้อยแล้ว และ persist-key พร้อมกับ persist-tun จะรักษาทรัพยากรเหล่านั้นให้ใช้ได้ต่อไป

รูปแบบที่สองเป็นของผู้จัดการบริการ การตั้งค่า systemd User= หรือ Group= กำหนดตัวตนที่โปรเซสเริ่มทำงาน และคำสั่งความสามารถกำหนดสิ่งที่ถือไว้ได้ การเลือกระหว่างสองรูปแบบเป็นคำถามเรื่องการแพ็กเกจก่อนจะเป็นคำถามเรื่องความปลอดภัย และผู้ดูแลแพ็กเกจได้ตอบไปแล้ว งานของคุณคือหาคำตอบนั้น ไม่ใช่คิดค้นทางเลือกที่สาม

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

ตัดสินใจว่าตัวตนเปลี่ยนที่ใด

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

อ่านว่าแพ็กเกจที่ติดตั้งให้มาอะไรจริง ๆ ก่อนแก้ไขสิ่งใด รวมถึงไดเรกทอรี drop-in ของมัน ยูนิตบางตัวตั้งใจละการลดลงของเดมอนเองเพราะผู้จัดการดูแลอยู่แล้ว และบางตัวพึ่งพาตัวเลือกเหล่านั้นสำหรับการสลับหลังการเริ่มต้นทำงาน การลบอย่างใดอย่างหนึ่งโดยไม่รู้ว่าได้รับรูปแบบใดมา คือวิธีที่บริการที่ทำงานอยู่หยุดเริ่มทำงาน

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

ความสามารถคือขีดจำกัด ไม่ใช่การมอบให้

ชุดขอบเขตความสามารถบอกว่าโปรเซสถือได้มากที่สุดเท่าใด มันคือเพดาน และการระบุความสามารถไว้ที่นั่นไม่ได้ให้สิ่งใดด้วยตัวเอง ดังนั้นยูนิตที่มีชุดขอบเขตใจกว้างก็ยังอาจสร้างอุโมงค์ไม่ได้

สิ่งที่วางความสามารถไว้ในชุดสภาพแวดล้อมของบริการจริง ๆ คือ AmbientCapabilities=. เอกสารอ้างอิงการทำงานของ systemd อธิบายคำสั่งทั้งสองแยกกัน และความแตกต่างนี้อธิบายคำแนะนำเรื่องความสามารถที่สับสนส่วนใหญ่บนอินเทอร์เน็ต

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

จับคู่อำนาจตลอดวงจรชีวิต

ระบุว่าโปรเซสต้องทำอะไรในแต่ละระยะ: การเริ่มต้น สถานะคงที่ การยืนยันตัวตนใหม่ และการรื้อถอน การสร้างอินเทอร์เฟซ การเปลี่ยนเส้นทาง การอ่านกุญแจที่ป้องกัน และการเรียกตัวช่วย ไม่ได้เกิดขึ้นทั้งหมดในเวลาเดียวกันหรือภายใต้ข้อกำหนดเดียวกัน จัดเรียงรายการตามระยะก่อนจัดเรียงตามความสามารถ

ตัวเลือกความคงทนรักษาทรัพยากรข้ามการเจรจาใหม่ และไม่ได้ให้สิทธิ์ที่ไม่เคยมี กุญแจที่โปรเซสอ่านไม่ได้ตอนเริ่มต้นจะยังอ่านไม่ได้ต่อไป ไม่ว่าธงความคงทนจะพูดอย่างไร ธงรักษาสิ่งที่ทำงานได้อยู่แล้ว

ใช้บัญชีเฉพาะไม่ใช่บัญชีที่ใช้ร่วมกัน นักพัฒนา OpenVPN เตือนถึงนิสัยการใช้ nobody เป็นตัวอย่างทั่วไป เพราะบริการอื่นบนโฮสต์อาจทำงานภายใต้บัญชีนั้นอยู่แล้ว และการแยกที่คุณคิดว่ามีนั้นไม่มีอยู่

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

เขียนแผนไว้และรักษาการเข้าถึงเพื่อกู้คืน

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

เปิดการเข้าถึงคอนโซลไว้ขณะแก้ไข เพราะยูนิตที่ล้มเหลวตอนเริ่มต้นซ่อมจากระยะไกลได้ยาก ทดสอบการรีสตาร์ตและการรีบูตเต็มรูปแบบก่อนประกาศว่าการเปลี่ยนแปลงเสร็จสิ้น ยูนิตที่รอดจากการรีสตาร์ตก็ยังอาจล้มเหลวก่อนที่เครือข่ายจะพร้อม

ความสำเร็จคือวงจรชีวิตอำนาจขั้นต่ำที่เข้าใจได้ ไม่ใช่โปรเซสที่บังเอิญทำงานภายใต้ชื่อที่ไม่ใช่ root

บทความที่เกี่ยวข้อง