แนวทางปฏิบัติด้านความปลอดภัยที่ดีที่สุด


37

ฉันจะแนะนำ Ansible ให้กับศูนย์ข้อมูลของฉันและฉันกำลังมองหาวิธีปฏิบัติที่ดีที่สุดเกี่ยวกับความปลอดภัยเกี่ยวกับตำแหน่งที่จะค้นหาเครื่องควบคุมและวิธีจัดการกับคีย์ SSH

คำถามที่ 1: เครื่องควบคุม

แน่นอนเราต้องการเครื่องควบคุม เครื่องควบคุมมีการบันทึกคีย์ SSH สาธารณะไว้ หากผู้โจมตีมีการเข้าถึงเครื่องควบคุมอาจมีการเข้าถึงศูนย์ข้อมูลทั้งหมด (หรือเซิร์ฟเวอร์ที่จัดการโดย Ansible) ดังนั้นจะดีกว่าถ้ามีเครื่องควบคุมเฉพาะในศูนย์ข้อมูลหรือเครื่องควบคุมระยะไกล (เช่นแล็ปท็อปของฉันเชื่อมต่อกับศูนย์ข้อมูลจากระยะไกล)

หากวิธีปฏิบัติที่ดีที่สุดคือการใช้แล็ปท็อปของฉัน (ซึ่งอาจถูกขโมยแน่นอน แต่ฉันสามารถบันทึกกุญแจสาธารณะของฉันแบบออนไลน์อย่างปลอดภัยในระบบคลาวด์หรือออฟไลน์บนอุปกรณ์ที่เข้ารหัสแบบพกพา) ถ้าฉันต้องใช้เว็บอินเตอร์เฟส Ansible เช่น Ansible Tower, Semaphore, Rundeck หรือ Foreman ที่จะต้องติดตั้งลงในเครื่องที่รวมศูนย์ไว้ในดาต้าเซ็นเตอร์? จะรักษาความปลอดภัยและหลีกเลี่ยงให้เป็น "จุดการโจมตีเพียงจุดเดียว" ได้อย่างไร?

คำถามที่ 2: ปุ่ม SSH

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

  • ปล่อยให้ Ansible ใช้ผู้ใช้รูท (ด้วยรหัสสาธารณะที่บันทึกไว้ ~/.ssh/authorized_keys
  • สร้างผู้ใช้ที่ไม่มีสิทธิพิเศษโดยเฉพาะสำหรับ Ansible ด้วยการเข้าถึง sudo
  • ให้ผู้ใช้ Ansible เรียกใช้ทุกคำสั่งผ่าน sudo โดยระบุรหัสผ่าน (ซึ่งเป็นความต้องการเฉพาะที่ผู้ดูแลระบบทุกคนใช้ Ansible ในการควบคุมเซิร์ฟเวอร์นั้น)
  • ให้ผู้ใช้ Ansible เรียกใช้ทุกคำสั่งผ่าน sudo โดยไม่ต้องระบุรหัสผ่านใด ๆ
  • คำแนะนำอื่น ๆ ?

คุณต้องการซับเน็ตการจัดการเฉพาะ (หรือ VLAN) คอมพิวเตอร์ควบคุม ansible ของคุณอยู่ในซับเน็ตนั้น หากคุณต้องการสื่อสารกับคอมพิวเตอร์ควบคุมคุณใช้ VPN ในเครือข่ายย่อยนั้น อย่าปล่อยให้เป็นราก
Neil McGuigan

1
โฮสต์ตัวควบคุม Ansible จะอยู่ใน LAN ภายในและจะไม่สามารถเข้าถึงได้จากภายนอก แต่ฉันคิดว่ามันไม่เพียงพอ
Mat

คำตอบ:


15

โฮสต์ bastion (ศูนย์ควบคุม ansible) เป็นของซับเน็ตแยกต่างหาก ไม่ควรเข้าถึงได้โดยตรงจากภายนอกไม่ควรเข้าถึงได้โดยตรงจากเซิร์ฟเวอร์ที่ได้รับการจัดการ!

แล็ปท็อปของคุณเป็นอุปกรณ์ที่ปลอดภัยน้อยที่สุด หนึ่งจดหมายโง่หนึ่งช่องโหว่แฟลชโง่หนึ่งแขก Wifi โง่และมันได้รับ pwned

สำหรับเซิร์ฟเวอร์ไม่อนุญาตการเข้าถึงรูทผ่าน ssh เลย การตรวจสอบจำนวนมากเย้ยหยันในเรื่องนี้

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

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

หมายเหตุด้าน: พยายามอย่าสร้างบัญชีที่เรียกว่าคำบางคำ (เช่น "ansible" หรือ "admin" หรือ "cluster" หรือ "Management" หรือ "operator" หรือ "operator") หากมีรหัสผ่าน ชื่อที่ดีสำหรับบัญชีที่มีรหัสผ่านคือชื่อของมนุษย์เช่น "jkowalski" มีเพียงมนุษย์เท่านั้นที่สามารถรับผิดชอบต่อการกระทำที่กระทำผ่านบัญชีและรับผิดชอบต่อการรักษาความปลอดภัยรหัสผ่านที่ไม่เหมาะสม "ansible" ไม่สามารถทำได้


ขอบคุณคุณทำให้ฉันมั่นใจเกี่ยวกับการใช้โฮสต์ป้อมปราการส่วนกลางในซับเน็ตแยกต่างหากในศูนย์ข้อมูล ฉันทราบดีว่าควรใช้ผู้ใช้ส่วนบุคคลหนึ่งคนต่อ sysadmin ทุกครั้ง แต่ตอนนี้ฉันมีคำถามอื่น (อาจจะดีกว่าสำหรับคำถาม Serverfault ที่แยกต่างหาก): วิธีรวบรวมผู้ใช้และคีย์ SSH บนโฮสต์ Linux โดยไม่ต้องใช้ NIS, NFS แชร์หรืออะไรแบบนี้ โปรดทราบว่าฉันมี Active Directory สำหรับเซิร์ฟเวอร์ Windows แล้ว
Mat

ตกลงคิดคำถามของฉันดีกว่าฉันมีสองคำตอบที่เป็นไปได้: ใช้ที่เก็บคีย์ LDAP หรือ Userify (ดูคำตอบสองข้อด้านล่าง) แต่ ... ฉันต้องการมันจริงเหรอ? ไม่ถ้าฉันใช้ผู้ใช้ของฉันเองในการปรับใช้ผู้ใช้และคีย์ใหม่ผ่าน Ansible! :-)
Mat

@ Mat ตกลงกันอย่างสมบูรณ์ - ตามที่ฉันพูดไว้ด้านล่างคุณไม่จำเป็นต้องมี Userify หรือเครื่องมือใด ๆ ที่คล้ายกันจนกว่าทีมของคุณจะใหญ่ขึ้น (มันทำให้มันดีกว่านี้มาก) LDAP เป็นชนิดของความเจ็บปวดในการติดตั้ง (การวิจัย pam_ldap และ nss_ldap) แต่เราได้สร้างเครื่องมือในการรวมในไม่กี่วินาทีด้วย Ansible, Chef, Puppet และอื่น ๆ ฟรีสำหรับ <20 เซิร์ฟเวอร์
Jamieson Becker

16

> คำถามที่ 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 ของคุณ (หรือโซลูชันใดก็ตามที่คุณปรับใช้) ด้วยวิธีเดียวกัน

คำแนะนำอื่น ๆ ?

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


5

ตอบ 1: เครื่องควบคุม

ทั้งสองเล็กน้อยคุณสามารถใช้แล็ปท็อปของคุณเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ VIA ซึ่งเป็นป้อมปราการ สิ่งที่ต้องการ:

Host private1
  IdentityFile ~/.ssh/rsa_private_key
  ProxyCommand ssh user@bastion -W %h:%p

Host bastion
  IdentityFile ~/.ssh/bastion_rsa_key

ข้อมูลเพิ่มเติมเกี่ยวกับป้อมปราการโฮสต์

ที่ที่คุณมีกุญแจสำหรับเซิร์ฟเวอร์ป้อมปราการจากนั้นแยกกุญแจสำหรับโฮสต์ที่อยู่ด้านหลัง (ส่วนตัวฉันจะใช้ gpg-agent / ssh-agent)

คำตอบ 2: การรับรองความถูกต้อง

ฉันไม่แน่ใจว่าวิธีปฏิบัติที่ดีที่สุดเฉพาะ "ansible" แตกต่างจากวิธีปฏิบัติที่ดีที่สุดในการเชื่อมต่อ ssh อื่น ๆ แต่ไม่คุณต้องการเรียกใช้ ansible เหมือนตัวคุณเองไม่ใช่บัญชีบริการและไม่ใช่บัญชีรูท

การรวมกันของการรับรองความถูกต้องต่อไปนี้:

ความคิดอื่น ๆ:

  • เก็บข้อมูลลับ / ข้อมูลส่วนตัวใน ansible-vault เสมอ
  • Ansible ไม่ต้องใช้ SUDO / Root เพื่อทำงานเว้นแต่ว่าคุณกำลังทำอะไรอยู่ต้องใช้ sudo / root
  • Ansible สามารถยกระดับการอนุญาตได้หลายวิธี

สุดท้ายคุณไม่ได้พูดถึงหน้าต่างเลย ดังนั้นฉันสามารถสันนิษฐานได้ว่าคุณไม่ได้ใช้สิ่งนี้ อย่างไรก็ตามในกรณีนี้ฉันจะใช้ตัวเลือกตัวแทนเพื่อให้แล็ปท็อปของคุณใช้โฮสต์ bastion (delegate_to bastion.hostname.fqdn:) และ kerberos / winrm https พร้อมตั๋ว kerberos

ในกรณีที่คุณพลาดแนวทางปฏิบัติที่ดีที่สุดในการคำนวณไม่ควรทำอะไรในฐานะรูทให้ใช้บัญชีที่มีชื่อเสมอ

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