ฉันจะป้องกันการหลอกลวงโดยไม่ตั้งใจกับฐานข้อมูลการผลิตได้อย่างไร


31

เมื่อเร็ว ๆ นี้ฉันมีนักพัฒนาซอฟต์แวร์โดยไม่ได้ตั้งใจพยายามคืนค่าฐานข้อมูลเป็นการผลิตเมื่อเขาควรได้รับการคืนค่าไปยังสำเนาการจัดเตรียม เป็นเรื่องง่ายที่จะทำเพราะชื่อ db นั้นคล้ายกันคือ CustomerName_Staging กับ CustomerName_Production

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

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

ฉันชอบที่จะได้ยินคำแนะนำในแง่ของการปฏิบัติการกำหนดค่าและการควบคุมเกี่ยวกับวิธีการป้องกันสิ่งนี้


25
นักพัฒนาไม่ควรมีสิทธิ์เข้าถึงเพื่อเขียนไปยังฐานข้อมูลการผลิตหรือโดยเฉพาะอย่างยิ่งการเข้าถึงใด ๆ
Michael Hampton

12
@MichaelHampton - ฉันและเขา ฉันยังเป็นนักพัฒนา คุณแนะนำอะไร?
Chris B. Behrens

10
แยกบัญชีผู้ใช้สำหรับแต่ละบทบาท (dev vs ops / DBA) และความระมัดระวังอย่างมากมาย
Michael Hampton

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

1
เพียงแค่มีผู้ใช้ / รหัสผ่านแยกต่างหากไปยังฐานข้อมูลเหล่านั้น
neutrinus

คำตอบ:


32

หากนี่คือสิ่งที่คุณเห็นว่าตัวเองกำลังทำอยู่โดยอัตโนมัติ และเนื่องจากคุณเป็นทั้งนักพัฒนาซอฟต์แวร์การเขียนรหัสควรอยู่ใน Wheelhouse ของคุณ :) อย่างจริงจังแม้ว่า ... โดยอัตโนมัติคุณสามารถทำสิ่งต่าง ๆ เช่น:

  • ตรวจสอบว่าคุณกำลังกู้คืนบนเซิร์ฟเวอร์ที่ถูกต้อง (เช่นไม่มี dev -> prod คืนค่า)
  • ตรวจสอบว่าเป็นฐานข้อมูล "ประเภท" ที่ถูกต้อง (ในกรณีของคุณ "การจัดเตรียม" และ "การผลิต")
  • กำหนดว่าแบ็กอัพใดที่จะกู้คืนโดยอัตโนมัติโดยดูที่ตารางสำรองข้อมูลใน msdb

เป็นต้น คุณถูก จำกัด ด้วยจินตนาการของคุณ


1
นั่นเป็นแนวคิดที่น่าสนใจ ... เรามีรหัสที่จัดการคืนค่าฐานข้อมูล (สำหรับการทดสอบอัตโนมัติ) แล้ว เราสามารถใส่ชั้น abstraction ในระหว่างที่มีเพียงชี้ที่เคยแสดงละครเพื่อให้การฟื้นฟูเพื่อการผลิตเป็นกระบวนการที่แตกต่างกันอย่างสิ้นเชิง ...
คริสบี Behrens

11
ตอนนี้คุณกำลังคิดกับพอร์ทัล :)
Ben Thul

4
สำหรับงานอัตโนมัติที่มีผลต่อการผลิตฉันต้องการเพิ่มในขั้นตอนแบบกำหนดเองที่ต้องการให้ผู้ใช้พิมพ์คำว่า "การผลิต" เพื่อลดความเป็นไปได้ที่พวกเขาคิดว่าพวกเขากำลังมองหาเช่นการแสดงละครที่เทียบเท่า
Joe Lee-Moyet

2
ฉันลงคะแนนเพราะไม่มีใครควรเข้าถึงการผลิตตามค่าเริ่มต้น คุณต้องมีกระบวนการพิเศษในการดึงรหัสผ่านของผลิตภัณฑ์ มันไม่สะดวก แต่เป็นขั้นต่ำจริง ๆ
OliverS

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

32

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

คุณไม่ควรทำอะไรกับการผลิตโดยไม่ตั้งใจ !

ซึ่งรวมถึงการทำสิ่งอัตโนมัติโดยไม่ตั้งใจ

คุณกำลังสับสนความปลอดภัยของระบบด้วยแนวคิดเช่น "ใครได้รับอนุญาตให้ทำอะไร" บัญชีการพัฒนาของคุณควรจะสามารถเขียนไปยังสำเนาเซิร์ฟเวอร์การควบคุมเวอร์ชันและฐานข้อมูล dev เท่านั้น หากพวกเขาสามารถอ่าน / เขียนการผลิตพวกเขาสามารถแฮ็กและใช้ประโยชน์จากการขโมยข้อมูลลูกค้าหรือ (ดังที่คุณแสดง) อาจผิดพลาดไปในการสูญเสียข้อมูลลูกค้า

คุณต้องเริ่มต้นด้วยการแยกเวิร์กโฟลว์ของคุณออก

  • บัญชีนักพัฒนาซอฟต์แวร์ของคุณควรจะสามารถเขียนไปยังสำเนาของตนเองการควบคุมเวอร์ชันและอาจดึงจากการควบคุมเวอร์ชันไปสู่สภาพแวดล้อมการทดสอบ

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

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

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

ระบบอัตโนมัติเป็นส่วนหนึ่งของโซลูชัน

ฉันไม่ได้ตาบอดกับความจริงที่ว่าการเปลี่ยนแปลงทั้งหมด (การอัปโหลดไปยัง VCS, การตรวจสอบความครอบคลุม, การดึงไปยังเซิร์ฟเวอร์ทดสอบ, การทดสอบแบบอัตโนมัติ, การรับรองซ้ำ, การสร้างการสำรองข้อมูล, การดึงจาก VCS) เป็นกระบวนการที่ยาวนาน

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

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

เหมาะสำหรับทีมทุกขนาด

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


2
นอกจากนี้สิ่งหนึ่งที่ฉันชอบคือใช้สองชื่อบัญชีต่อผู้ใช้ หนึ่งคือการเข้าสู่ระบบผู้ใช้ปกติการดำเนินงานวันต่อวัน ฯลฯ ในขณะที่บัญชีที่สอง (มักจะมีคำต่อท้ายเช่น + หรือขีดเส้นใต้บางชนิด) มีสิทธิเต็มที่ที่จะแยงและ dev ที่ผู้ใช้ต้องการ ด้วยวิธีนี้ผู้ใช้จะต้องทำการตัดสินใจอย่างแข็งขันเพื่อผลักดันให้แยงเมื่อเทียบกับ dev สิ่งนี้คล้ายกับ bullet 3 ที่อธิบายข้างต้น แต่ไม่ต้องการโครงสร้างพื้นฐานหรือค่าใช้จ่ายเพิ่มเติมที่มีนัยสำคัญในการแสดงค่า
user24313

3
นอกจากนี้ยังเป็นสิ่งสำคัญที่จะหลีกเลี่ยงนิสัยการทำสิ่งใดนอกจากการบำรุงรักษาผลิตภัณฑ์ในบัญชีผลิต ไปสิ้นสุดที่ให้แน่ใจว่าแยงไม่สามารถดูรหัสที่มาไม่สามารถเริ่มต้น IDE ฯลฯ
เอริคลอยด์

ฉันจะได้รับหนึ่งใน contraptions แบบ dual-key เหล่านั้นพร้อมกันและมันมาพร้อมกับ USB?
Lilienthal

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

1
@Lilienthal มันเป็นคำเปรียบเทียบสำหรับโรงละครที่มีความปลอดภัยสูง แต่คุณสามารถเลียนแบบการจู่โจม USB ที่มีราคาถูกต่อผู้พัฒนาแต่ละคนและจากนั้นให้ตรวจสอบระบบอัตโนมัติของคุณอย่างน้อยสองหมายเลขซีเรียล ในทีมที่ใหญ่กว่านั้นคุณสามารถบันทึกเพื่อดูว่าใครรบกวนการผลิตและถือคนที่รับผิดชอบเมื่อทุกอย่างผิดพลาด
Oli

12

หนึ่งในเพื่อนร่วมงานของฉันมีแนวทางที่น่าสนใจในเรื่องนี้ โทนสีของเขามินัลสำหรับการผลิตเป็นfugly สีเทาและชมพูและยากที่จะอ่านซึ่งในทางทฤษฎีควรให้แน่ใจว่าสิ่งที่เขาเขียนเขาตั้งใจจะเขียน

ระยะของคุณอาจแตกต่างกันไป ... และฉันอาจไม่ต้องบอกว่ามันเป็นกระสุนที่แทบจะไม่มีในตัว :)


2
ฉันยังใช้สีพื้นหลังสีแดงขนาดใหญ่บนการเชื่อมต่อเทอร์มินัล / ฐานข้อมูลไปยังเซิร์ฟเวอร์การผลิตเช่นเดียวกับวอลล์เปเปอร์สีแดงสดสำหรับผู้ดูแลระบบบนพีซี ...
Falco

ใช่ฉันคิดอย่างนั้น ทำให้เกิดเพลิงไหม้เครื่องยนต์สีแดง ...
Chris B. Behrens

การเข้ารหัสสีช่วย เช่นเดียวกับใน IDE
Thorbjørn Ravn Andersen

1

นักพัฒนาไม่ควรรู้รหัสผ่านไปยังฐานข้อมูลการผลิต รหัสผ่านของการผลิตควรเป็นแบบสุ่มและไม่เป็นที่จดจำ - บางอย่างเช่นผลลัพธ์ของการบดแป้นพิมพ์ ( Z^kC83N*(#$Hx) รหัสผ่าน dev ของคุณสามารถเป็น$YourDog'sNameหรือcorrect horse battery stapleหรืออะไรก็ตาม

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

(เช่นเคยคุณควรมีการสำรองข้อมูล ณ จุดเวลาสำหรับฐานข้อมูลการผลิตของคุณตัวอย่างเช่นด้วย MySQL ให้จัดเก็บบันทึกการทำงานแบบไบนารีเป็นการสำรองแบบส่วนเพิ่มสำหรับ PostgreSQL ให้เก็บบันทึกการเขียนล่วงหน้าไว้ก่อน ภัยพิบัติชนิดใด ๆ การทำร้ายตนเองหรืออื่น ๆ )


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

1
@Falco นั่นคือสิ่งที่ฉันแนะนำ ไม่สะดวก แต่เป็นไปได้
200_success

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

2
@Falco เนื่องจากสภาพแวดล้อมของ prod ควรทำมิรเรอร์สภาพแวดล้อม dev อย่างใกล้ชิดไฟล์การกำหนดค่าจะอยู่ในตำแหน่งแบบอะนาล็อกบนเซิร์ฟเวอร์ prod เนื่องจากอยู่บนเครื่อง dev นักพัฒนาที่มีความสามารถใด ๆ ควรรู้ว่าจะต้องดูที่ใดและหากพวกเขาไม่ทราบว่าจะต้องดูที่ใดคุณต้องมีการหน่วงเวลานั้น - เพื่อป้องกันความเสียหายของประเภทที่ระบุในคำถาม
200_success

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

0

คำตอบสั้น ๆ คือ RBAC - การควบคุมการเข้าถึงตามบทบาท

สิทธิ์ของคุณในทุกสภาพแวดล้อมจะต้องแตกต่าง - และน่ารำคาญเหมือนสิ่งต่าง ๆ เช่น UAC คือคุณต้องการ: โดยเฉพาะอย่างยิ่งสำหรับสภาพแวดล้อมที่มีการควบคุม

นอกจากนี้ไม่เคยเป็นเหตุผลสำหรับ devs ที่จะมีการเข้าถึงโดยตรง Prod - ไม่คำนึงถึงวิธีการขนาดเล็กองค์กร / ทีม "Dev" ของคุณอาจสวมหมวก "Stage" และ "Prod" แต่เขาต้องมีข้อมูลประจำตัวและกระบวนการที่แตกต่างกันเพื่อให้เข้ากับสภาพแวดล้อมที่แตกต่างกัน

มันน่ารำคาญไหม อย่างแน่นอน แต่ [ช่วย] ป้องกันไม่ให้บอร์กสภาพแวดล้อมของคุณหรือไม่ อย่างแน่นอน


0

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

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


นี่เป็นวิธีการเดียวกันกับดูแลระบบที่มีบัญชีที่ไม่ใช่ผู้ดูแลระบบมาตรฐานสำหรับการทำงานประจำ (อ่านอีเมล, ท่องเว็บ, ติดตามตั๋ว, ยื่นแผ่นเวลา, เขียนเอกสาร ฯลฯ ) และบัญชีผู้ดูแลระบบเต็มรูปแบบที่แตกต่างกันเมื่อใช้งานจริง บนเซิร์ฟเวอร์และ / หรือ Active Directory

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