อย่าวางการเสริมความแข็งแกร่งของ systemd ซ้อนบนการลดสิทธิ์ user ของ OpenVPN
สูตรสิทธิ์ขั้นต่ำสองสูตรรวมกันไม่ใช่สูตรที่เข้มงวดกว่า เลือกว่าใครเป็นผู้เปลี่ยนตัวตน แล้วจึงจับคู่อำนาจตลอดทั้งวงจรชีวิต
สูตรสิทธิ์ขั้นต่ำสองสูตรที่นำมาต่อกันไม่ได้ให้การติดตั้งที่เข้มงวดกว่า รูปแบบหนึ่งให้เดมอนเริ่มด้วยสิทธิ์แล้วลดลงไปยังบัญชีที่ไม่มีสิทธิ์หลังการเริ่มต้นทำงาน อีกรูปแบบหนึ่งให้ตัวจัดการบริการเริ่มทำงานภายใต้ตัวตนที่จำกัดตั้งแต่คำสั่งแรก แต่ละแบบทำงานได้ด้วยตัวเอง และการรวมกันมักได้บริการที่ไม่สามารถทำงานใดในสองงานได้อย่างสะอาดตา ส่วนที่เหลือจะไล่ตามลำดับการตัดสินใจ
สองรูปแบบ เจ้าของเดียวของการสลับ
รูปแบบแรกเป็นของเดมอน ตัวเลือก OpenVPN ของชุมชน user และ group จะเปลี่ยนตัวตนหลังจากตั้งอุโมงค์และกุญแจเรียบร้อยแล้ว และ persist-key พร้อมกับ persist-tun จะรักษาทรัพยากรเหล่านั้นให้ใช้ได้ต่อไป
รูปแบบที่สองเป็นของผู้จัดการบริการ การตั้งค่า systemd User= หรือ Group= กำหนดตัวตนที่โปรเซสเริ่มทำงาน และคำสั่งความสามารถกำหนดสิ่งที่ถือไว้ได้ การเลือกระหว่างสองรูปแบบเป็นคำถามเรื่องการแพ็กเกจก่อนจะเป็นคำถามเรื่องความปลอดภัย และผู้ดูแลแพ็กเกจได้ตอบไปแล้ว งานของคุณคือหาคำตอบนั้น ไม่ใช่คิดค้นทางเลือกที่สาม
ทั้งสองแบบชอบด้วยเหตุผล ข้อผิดพลาดคือการถือว่าเป็นชั้นของดีไซน์เดียว เพราะรูปแบบที่สองอาจทำให้การสลับตัวตนของรูปแบบแรกกลายเป็นการดำเนินการที่โปรเซสไม่ได้รับอนุญาตอีกต่อไป
ตัดสินใจว่าตัวตนเปลี่ยนที่ใด
หากยูนิตเริ่มทำงานในฐานะบัญชีเฉพาะอยู่แล้ว การเพิ่มคำสั่งให้เดมอนกลายเป็นบัญชีอื่นต้องใช้การเปลี่ยนผ่าน setuid ที่บริการที่เสริมความแข็งแกร่งไม่เคยถูกออกแบบให้ทำ ความล้มเหลวปรากฏเป็นข้อผิดพลาดด้านสิทธิ์ตอนเริ่มทำงาน ไม่ใช่ข้อความนโยบายที่ชัดเจน สิ่งนี้อ่านได้เหมือนความสามารถที่หายไป ซึ่งผลักดันผู้คนไปสู่ชุดขอบเขตที่กว้างขึ้นแทนที่จะไปสู่คำถามเรื่องตัวตน
อ่านว่าแพ็กเกจที่ติดตั้งให้มาอะไรจริง ๆ ก่อนแก้ไขสิ่งใด รวมถึงไดเรกทอรี drop-in ของมัน ยูนิตบางตัวตั้งใจละการลดลงของเดมอนเองเพราะผู้จัดการดูแลอยู่แล้ว และบางตัวพึ่งพาตัวเลือกเหล่านั้นสำหรับการสลับหลังการเริ่มต้นทำงาน การลบอย่างใดอย่างหนึ่งโดยไม่รู้ว่าได้รับรูปแบบใดมา คือวิธีที่บริการที่ทำงานอยู่หยุดเริ่มทำงาน
เขียนรูปแบบที่เลือกไว้ในบรรทัดเดียว: เป็นของผู้จัดการหรือของเดมอน คำสั่งถัดไปทุกข้อต้องสอดคล้องกับประโยคนั้น และยูนิตแบบผสมควรถือเป็นข้อบกพร่องไม่ใช่การประนีประนอม
ความสามารถคือขีดจำกัด ไม่ใช่การมอบให้
ชุดขอบเขตความสามารถบอกว่าโปรเซสถือได้มากที่สุดเท่าใด มันคือเพดาน และการระบุความสามารถไว้ที่นั่นไม่ได้ให้สิ่งใดด้วยตัวเอง ดังนั้นยูนิตที่มีชุดขอบเขตใจกว้างก็ยังอาจสร้างอุโมงค์ไม่ได้
สิ่งที่วางความสามารถไว้ในชุดสภาพแวดล้อมของบริการจริง ๆ คือ AmbientCapabilities=. เอกสารอ้างอิงการทำงานของ systemd อธิบายคำสั่งทั้งสองแยกกัน และความแตกต่างนี้อธิบายคำแนะนำเรื่องความสามารถที่สับสนส่วนใหญ่บนอินเทอร์เน็ต
เพิ่มความสามารถหลังจากที่การดำเนินการที่ล้มเหลวระบุได้แล้วเท่านั้น ชุดขอบเขตที่กว้างขึ้นซ่อนสาเหตุจริงและปล่อยให้บริการมีสิทธิ์มากกว่าที่ดีไซน์ตั้งใจ ทำให้ยูนิตตรวจสอบได้ยากขึ้นเพราะเพดานไม่ได้อธิบายงานอีกต่อไป ลบความสามารถส่วนเกินเมื่อแก้ไขข้อบกพร่องจริงแล้ว
จับคู่อำนาจตลอดวงจรชีวิต
ระบุว่าโปรเซสต้องทำอะไรในแต่ละระยะ: การเริ่มต้น สถานะคงที่ การยืนยันตัวตนใหม่ และการรื้อถอน การสร้างอินเทอร์เฟซ การเปลี่ยนเส้นทาง การอ่านกุญแจที่ป้องกัน และการเรียกตัวช่วย ไม่ได้เกิดขึ้นทั้งหมดในเวลาเดียวกันหรือภายใต้ข้อกำหนดเดียวกัน จัดเรียงรายการตามระยะก่อนจัดเรียงตามความสามารถ
ตัวเลือกความคงทนรักษาทรัพยากรข้ามการเจรจาใหม่ และไม่ได้ให้สิทธิ์ที่ไม่เคยมี กุญแจที่โปรเซสอ่านไม่ได้ตอนเริ่มต้นจะยังอ่านไม่ได้ต่อไป ไม่ว่าธงความคงทนจะพูดอย่างไร ธงรักษาสิ่งที่ทำงานได้อยู่แล้ว
ใช้บัญชีเฉพาะไม่ใช่บัญชีที่ใช้ร่วมกัน นักพัฒนา OpenVPN เตือนถึงนิสัยการใช้ nobody เป็นตัวอย่างทั่วไป เพราะบริการอื่นบนโฮสต์อาจทำงานภายใต้บัญชีนั้นอยู่แล้ว และการแยกที่คุณคิดว่ามีนั้นไม่มีอยู่
คุณสมบัติที่เปลี่ยนภาระงานภายใน เช่น การถ่ายโอนช่องข้อมูล หรือบิลด์ที่เชื่อมโยงต่างกัน อาจเลื่อนว่าต้องใช้การดำเนินการใด ตรวจสอบแผนที่เมื่อแพ็กเกจเปลี่ยน ไม่ใช่เฉพาะเมื่อมีบางอย่างพัง
เขียนแผนไว้และรักษาการเข้าถึงเพื่อกู้คืน
บันทึกการติดตั้งควรระบุผู้จัดการ ตัวตนตอนเริ่มต้น ตัวตนคงที่ที่ตั้งใจ และการมอบสิทธิ์แต่ละรายการพร้อมการดำเนินการที่ต้องใช้ บันทึกนั้นทำให้การเปลี่ยนแปลงครั้งถัดไปตรวจสอบได้แทนที่จะเป็นการทดลอง
เปิดการเข้าถึงคอนโซลไว้ขณะแก้ไข เพราะยูนิตที่ล้มเหลวตอนเริ่มต้นซ่อมจากระยะไกลได้ยาก ทดสอบการรีสตาร์ตและการรีบูตเต็มรูปแบบก่อนประกาศว่าการเปลี่ยนแปลงเสร็จสิ้น ยูนิตที่รอดจากการรีสตาร์ตก็ยังอาจล้มเหลวก่อนที่เครือข่ายจะพร้อม
ความสำเร็จคือวงจรชีวิตอำนาจขั้นต่ำที่เข้าใจได้ ไม่ใช่โปรเซสที่บังเอิญทำงานภายใต้ชื่อที่ไม่ใช่ root