Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การรักษาความปลอดภัยตัวแปรสภาพแวดล้อม

ในบทความที่แล้วของเรา The Rubyist's Guide To Environment Variables เราได้แสดงให้คุณเห็นว่าระบบตัวแปรสภาพแวดล้อมทำงานอย่างไร และได้ขจัดตำนานทั่วไปบางเรื่อง แต่ตามที่ผู้อ่านที่เป็นประโยชน์คนหนึ่งชี้ให้เห็น เราไม่ได้พูดถึงความปลอดภัยมากนัก

เนื่องจากเป็นเรื่องปกติที่จะใช้ env vars เพื่อจัดเก็บคีย์ API ลับและข้อมูลที่มีค่าอื่นๆ สิ่งสำคัญคือต้องเข้าใจนัยด้านความปลอดภัย มาดูกันเลย:

สถานการณ์กรณีที่แย่ที่สุด

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

วิธีแก้ปัญหาคือป้องกันไม่ให้ผู้คนเข้าถึงรูทเซิร์ฟเวอร์ของคุณ :)

ม้าโทรจัน

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

...คุณจึงทำในสิ่งที่ใครๆ ก็ทำได้ คุณติดตั้งในการผลิต ปัญหาเดียวคือออกแบบมาเพื่อขโมยตัวแปรสภาพแวดล้อมของคุณ

ที่นี่ฉันกำลังเรียกใช้คำสั่ง mogrify "ที่เป็นอันตราย" จาก Ruby โดยใช้ไวยากรณ์ back-ticks จากนั้น Mogrify จะขโมยตัวแปรสภาพแวดล้อมของฉัน และพิมพ์ข้อความเยาะเย้ย

การรักษาความปลอดภัยตัวแปรสภาพแวดล้อม ตัวแปรสภาพแวดล้อมได้รับการคัดลอกจากกระบวนการหลัก (irb) ไปยัง pocess ย่อย (mogrify)

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

มีสองวิธีที่จะเกิดขึ้น:

  • มีคนเกลี้ยกล่อมให้คุณติดตั้งซอฟต์แวร์ที่เป็นอันตรายใน toolchain ของคุณ

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

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

การฆ่าเชื้อสิ่งแวดล้อม

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

คุณสามารถแทนที่ตัวแปรสภาพแวดล้อมเฉพาะเมื่อคุณสร้างกระบวนการใหม่ โดยส่งแฮชไปยังเมธอดของระบบ:

การรักษาความปลอดภัยตัวแปรสภาพแวดล้อม วิธีส่งตัวแปรสภาพแวดล้อมที่กำหนดเองไปยังวิธีการระบบของ Ruby

หากคุณต้องการหยุดส่งตัวแปรสภาพแวดล้อมใดๆ เมื่อคุณทำเชลล์ออกไป คุณอาจทำบางอย่างเช่นตัวอย่างด้านล่าง ที่นี่เราสร้างแฮชที่สะท้อนถึง ENV ยกเว้นว่าค่าทั้งหมดถูกตั้งค่าเป็นศูนย์ มันไม่สวย แต่เป็นวิธีเดียวที่ฉันพบว่าลบ env vars ทั้งหมดเมื่อรันคำสั่งเชลล์

การรักษาความปลอดภัยตัวแปรสภาพแวดล้อม วิธีหยุดส่งตัวแปรสภาพแวดล้อมเมื่อคุณเรียกใช้คำสั่งเชลล์จากทับทิม

อย่าโยนทารกออกไปพร้อมกับน้ำ

การสืบทอดเป็นหนึ่งในคุณสมบัติที่มีประโยชน์ที่สุดของตัวแปร ENV

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

ความคงอยู่

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

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

อย่าใช้ git repo ของแอปของคุณ

ฉันแน่ใจว่าคนที่ github นั้นซื่อสัตย์เหมือนพวกเราที่เหลือ แต่คุณต้องการให้ทุกคนที่เข้าถึงซอร์สโค้ดของคุณได้รับคีย์ API ของคุณและเรียกใช้บิล AWS มูลค่า $10,000 หรือไม่

หลีกเลี่ยงการใช้ .bashrc หรือ .bash-profile สำหรับความลับ

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

เปิดเผยความลับของคุณต่อกระบวนการที่ต้องการเท่านั้น

หากแอป Rails ของคุณเป็นกระบวนการเดียวที่จำเป็นต้องทราบ HONEYBADGER_API_KEY ของคุณ จะเป็นความคิดที่ดีที่จะเผยแพร่ให้ใช้ได้เฉพาะกับกระบวนการนั้น

มีอัญมณีหลายอย่างที่ให้คุณเพิ่มตัวแปรสภาพแวดล้อมให้กับไฟล์ที่โหลดเมื่อ Rails เริ่มทำงาน env vars เหล่านี้ใช้ได้เฉพาะกับกระบวนการ Rails ของคุณและกระบวนการย่อยเท่านั้น มีหัวข้อเกี่ยวกับ figaro และ dotenv gems ที่ด้านล่างของคู่มือ Rubyist's Guide To Environment Variables

รักษาความปลอดภัยไฟล์การกำหนดค่าของคุณ

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

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

การรักษาความปลอดภัยตัวแปรสภาพแวดล้อม ทำให้ไฟล์การกำหนดค่าสามารถอ่านได้โดยผู้ใช้ที่ต้องการอ่านเท่านั้น

เนื่องจากคุณไม่ได้ตรวจสอบมันใน GitHub คุณจะต้อง SSH ในเซิร์ฟเวอร์และแก้ไขด้วยตนเองหรือใช้เครื่องมืออย่าง Chef เพื่อจัดการให้คุณ

สร้าง "ไฟร์วอลล์" หากเป็นไปได้

หนึ่งในสิ่งที่ยอดเยี่ยมจริงๆ เกี่ยวกับ AWS คือช่วยให้คุณสร้างนโยบายการควบคุมการเข้าถึงที่ละเอียดมาก ผู้ให้บริการจำนวนมากมีคุณสมบัติเช่นนี้

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

ด้วยการดำเนินการนี้ คุณสามารถจำกัดความเสียหายของการละเมิดความปลอดภัยได้