> คำถามที่ 1: เครื่องควบคุม
ที่ Userify (การเปิดเผยอย่างเต็มรูปแบบ: เราเสนอซอฟต์แวร์เพื่อจัดการคีย์ ssh) เราจัดการกับเรื่องนี้ตลอดเวลาเนื่องจากเรายังใช้คลังคีย์ SSH ที่ใหญ่ที่สุด โดยทั่วไปเราแนะนำให้ติดตั้งภายในเครื่องแทนที่จะใช้ระบบคลาวด์เนื่องจากคุณมีการควบคุมที่เพิ่มขึ้นลดพื้นที่ผิวของคุณคุณสามารถล็อคมันลงไปยังเครือข่ายที่เชื่อถือได้
สิ่งสำคัญที่ต้องจำคือในระบบที่สร้างขึ้นอย่างถูกต้องเช่นนี้ไม่มีความลับสำคัญใด ๆ ที่สามารถรั่วไหลไปยังผู้โจมตีได้ หากมีคนขับรถยกของลงในดาต้าเซ็นเตอร์ของคุณและเดินไปกับเซิร์ฟเวอร์ของคุณพวกเขาจะไม่ได้รับอะไรมากมายยกเว้นรหัสผ่านที่ถูกแฮชอย่างมากบางไฟล์ที่เข้ารหัสอย่างหนักและกุญแจสาธารณะบางอันโดยไม่มีกุญแจส่วนตัวที่เกี่ยวข้อง ในคำอื่น ๆ ไม่มาก
ในขณะที่คุณชี้ให้เห็นเวกเตอร์ภัยคุกคามที่แท้จริงที่นี่คือสิ่งที่เกิดขึ้นหากผู้โจมตีได้รับการควบคุมของเครื่องนั้นและใช้มันเพื่อปรับใช้บัญชีผู้ใช้ของตนเองและ (สาธารณะ) คีย์ นี่เป็นความเสี่ยงสำหรับแทบทุกแพลตฟอร์มคลาวด์ (เช่น: Linode) คุณควรให้ความสำคัญอย่างยิ่งกับการป้องกันการเข้าถึงระนาบควบคุมซึ่งหมายถึงการลดพื้นผิวการโจมตีให้น้อยที่สุด (เปิดเผยเพียงไม่กี่พอร์ตและล็อคพอร์ตเหล่านั้นให้มากที่สุดเท่าที่จะเป็นไปได้) และควรใช้ซอฟต์แวร์ที่เสริมความแข็งแกร่ง การฉีด SQL, XSS, CSRF, ฯลฯ ) เปิดใช้งานการเข้าถึง 2FA / MFA ไปยังระนาบการควบคุมและมุ่งเน้นไปที่การล็อคระนาบการควบคุมนั้นให้มากที่สุด
ดังนั้นจะดีกว่าถ้ามีเครื่องควบคุมเฉพาะในศูนย์ข้อมูลหรือเครื่องควบคุมระยะไกล (เช่นแล็ปท็อปของฉันเชื่อมต่อกับศูนย์ข้อมูลจากระยะไกล)
เป็นการดีกว่าที่จะมีเครื่องควบคุมเฉพาะในดาต้าเซ็นเตอร์ที่ปลอดภัยเพราะคุณสามารถแยกมันและล็อคมันลงเพื่อป้องกัน / ลดความเสี่ยงจากการถูกขโมยหรือการเข้าถึงที่ไม่ได้รับอนุญาต
หากปฏิบัติที่ดีที่สุดคือการใช้แล็ปท็อปของฉัน (ซึ่งอาจจะถูกขโมยแน่นอน แต่ฉันจะมีกุญแจสาธารณะของฉันบันทึกออนไลน์ได้อย่างปลอดภัยในระบบคลาวด์หรือออฟไลน์บนอุปกรณ์ crypted พกพา), สิ่งที่ถ้าฉันต้องการที่จะใช้อินเตอร์เฟซบางเว็บด้วย Ansible เช่น Ansible Tower, Semaphore, Rundeck หรือโฟร์แมนที่ต้องติดตั้งบนเครื่องที่รวมศูนย์ไว้ในดาต้าเซ็นเตอร์?
คุณไม่จำเป็นต้องเรียกใช้เว็บอินเตอร์เฟสใด ๆหรือเครื่องบินควบคุมรองเพื่อจัดการคีย์ของคุณ (แม้แต่ Userify) จนกว่าคุณจะมีขนาดใหญ่พอที่จะเริ่มมีปัญหาด้านการจัดการเนื่องจากมีผู้ใช้จำนวนมากขึ้นและมีระดับการอนุญาตที่แตกต่างกันทั่วทั้งเซิร์ฟเวอร์ จับมือกับผู้ใช้ของคุณที่อาจไม่มีความรู้หรือการเข้าถึง Ansible เพื่ออัปเดตคีย์ ตอนแรกผู้ใช้ไม่มากไปกว่าเชลล์สคริปต์ (วันนี้พวกเขาจะเป็น Ansible, อาจ!) และไม่มีอะไรผิดปกติเลยจนกระทั่งคุณเริ่มต้องการการควบคุมการจัดการเพิ่มเติมและวิธีการที่ง่ายสำหรับผู้ใช้ในการจัดการ / หมุน กุญแจของตัวเอง (แน่นอนโปรดดูที่ Userify ถ้าคุณไปถึงจุดนั้น!)
จะรักษาความปลอดภัยและหลีกเลี่ยงให้เป็น "จุดการโจมตีเพียงจุดเดียว" ได้อย่างไร?
แน่นอนว่าตรวจสอบทรัพยากรทั้งหมดในเน็ตเพื่อล็อคสิ่งต่าง ๆ แต่ที่สำคัญที่สุดเริ่มต้นด้วยรากฐานที่ปลอดภัย:
1. สร้างโซลูชันของคุณโดยคำนึงถึงความปลอดภัยตั้งแต่เริ่มแรก เลือกเทคโนโลยี (เช่นฐานข้อมูลหรือภาษา) ที่มีปัญหาตามปกติน้อยกว่าจากนั้นให้โค้ดกับความปลอดภัยที่อยู่ด้านหน้า ฆ่าเชื้อข้อมูลที่เข้ามาทั้งหมดแม้จากผู้ใช้ที่เชื่อถือได้ ความหวาดระแวงเป็นคุณธรรม
2. ในที่สุดทุกอย่างก็พัง ลดความเสียหายให้น้อยที่สุดเมื่อเกิดขึ้น: เมื่อคุณชี้ไปแล้วให้พยายามลดการจัดการวัสดุลับให้เหลือน้อยที่สุด
3. ทำให้มันง่าย อย่าทำสิ่งแปลกใหม่ล่าสุดเว้นแต่คุณจะแน่ใจว่าสามารถเพิ่มความปลอดภัยของคุณได้อย่างแน่นอน ตัวอย่างเช่นเราเลือก X25519 / NaCl (libsodium) เหนือ AES สำหรับเลเยอร์การเข้ารหัสของเรา (เราเข้ารหัสทุกอย่างที่เหลือและในการเคลื่อนไหว) เพราะมันถูกออกแบบและเขียนโดยคนที่เราเชื่อถือ (DJB et al) และถูกตรวจสอบโดยโลก นักวิจัยที่มีชื่อเสียงเช่น Schneier และทีมรักษาความปลอดภัยของ Google ใช้สิ่งต่าง ๆ ที่มีแนวโน้มไปสู่ความเรียบง่ายถ้ามันใหม่กว่าเนื่องจากความเรียบง่ายทำให้ยากที่จะปกปิดบั๊กลึก ๆ
4. เป็นไปตามมาตรฐานความปลอดภัย แม้ว่าคุณจะไม่ตกอยู่ในระบอบการรักษาความปลอดภัยเช่น PCI หรือกฎความปลอดภัย HIPAA อ่านมาตรฐานเหล่านั้นและหาวิธีที่จะตอบสนองพวกเขาหรืออย่างน้อยก็มีการชดเชยที่แข็งแกร่งมาก สิ่งนี้จะช่วยให้มั่นใจว่าคุณจะได้พบ 'แนวทางปฏิบัติที่ดีที่สุด' อย่างแท้จริง
5. นำการทดสอบการเจาะภายนอก / อิสระและเรียกใช้การจ่ายบั๊กเพื่อให้แน่ใจว่าคุณกำลังปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเหล่านั้นอย่างต่อเนื่อง ทุกอย่างดูดีจนกระทั่งคุณได้รับคนที่ฉลาดและมีแรงจูงใจสูงต่อสู้กับมัน ... เมื่อเสร็จแล้วคุณจะมีความมั่นใจอย่างมากในการแก้ปัญหาของคุณ
คำถามที่ 2: ปุ่ม SSH ตัวเลือกที่ดีที่สุดคืออะไร: ปล่อยให้ Ansible ใช้ผู้ใช้รูท (ด้วยการพับลิกคีย์สาธารณะใน~/.ssh/authorized_keys
/ ให้ผู้ใช้ Ansible ให้รันทุกคำสั่งผ่าน sudo ที่ระบุรหัสผ่าน (ซึ่งเป็นที่ต้องการของผู้ดูแลระบบทุกคน ซึ่งใช้ Ansible เพื่อควบคุมเซิร์ฟเวอร์นั้น)
พยายามหลีกเลี่ยงการใช้รหัสผ่านบนเซิร์ฟเวอร์แม้แต่ใน sudo นั่นคือการจัดการกับความลับและในที่สุดจะทำลายความปลอดภัยของคุณ (คุณไม่สามารถเปลี่ยนแปลงรหัสผ่าน sudo ระหว่างเครื่องได้อย่างง่ายดายจริงๆคุณต้องเก็บไว้ที่ไหนสักแห่งรหัสผ่านหมายความว่าคุณไม่สามารถดำเนินการอัตโนมัติแบบเซิร์ฟเวอร์ต่อเซิร์ฟเวอร์ซึ่งเป็น แน่นอนว่ามันคือทั้งหมดที่เกี่ยวกับนอกจากนี้ถ้าคุณปล่อยให้ SSH ที่ค่าเริ่มต้นรหัสผ่านเหล่านั้นสามารถถูกบังคับให้เดรัจฉานซึ่งทำให้คีย์ค่อนข้างไม่มีความหมายนอกจากนี้หลีกเลี่ยงการใช้ผู้ใช้รูทเพื่อวัตถุประสงค์ใด ๆ
สร้างผู้ใช้ที่ไม่มีสิทธิพิเศษโดยเฉพาะสำหรับ Ansible ด้วยการเข้าถึง sudo / ให้ผู้ใช้ Ansible ให้เรียกใช้ทุกคำสั่งผ่าน sudo โดยไม่ต้องระบุรหัสผ่านใด ๆ
เผง ผู้ใช้ที่ไม่มีสิทธิพิเศษที่คุณสามารถตรวจสอบย้อนกลับไปยังสิ่งที่สามารถตรวจสอบได้ด้วยบทบาท sudo เป็นการดีที่สร้างผู้ใช้มาตรฐานที่ทุ่มเทให้กับการสื่อสารระหว่างเซิร์ฟเวอร์กับเซิร์ฟเวอร์ / ansible ด้วยการเข้าถึง sudo (ไม่มีรหัสผ่าน)
... NB, ถ้าคุณใช้ Userify, วิธีที่ฉันอยากจะแนะนำก็คือการสร้างผู้ใช้ Userify สำหรับ ansible (คุณยังสามารถแยกมันได้ตามโครงการหรือกลุ่มเซิร์ฟเวอร์ถ้าคุณมีเครื่องควบคุม ansible หลายตัว), สร้าง คีย์ SSH บนเซิร์ฟเวอร์ควบคุมและให้กุญแจสาธารณะในหน้าโปรไฟล์ผู้ใช้ (กล่องข้อความนี้กลายเป็นหลัก/home/ansible/.ssh/authorized_keys
) คุณควรเก็บบัญชีระบบที่แยกได้จากบัญชีระบบเซิร์ฟเวอร์ต่อเซิร์ฟเวอร์อื่น ๆ เช่นบัญชีสำรองระยะไกลการจัดการความลับ ฯลฯ จากนั้นเชิญคนของคุณและพวกเขาสามารถสร้างและจัดการกุญแจของตัวเองได้และทุกอย่างแยกจากกัน แต่เช่นเดียวกับการล็อคเซิร์ฟเวอร์ควบคุม Ansible ให้ลองล็อคเซิร์ฟเวอร์ Userify ของคุณ (หรือโซลูชันใดก็ตามที่คุณปรับใช้) ด้วยวิธีเดียวกัน
คำแนะนำอื่น ๆ ?
ฉันคิดว่าคุณกำลังทำสิ่งนี้อย่างถูกต้องและถามคำถามที่ถูกต้อง หากคุณต้องการพูดคุยเกี่ยวกับเรื่องนี้โปรดส่งอีเมลฉัน (ชื่อแรกนามสกุลที่ผู้ใช้) และฉันยินดีที่จะแชทไม่ว่าคุณจะไล่ตามทิศทางใด โชคดี!