ในบทความที่แล้วของเรา 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 ได้ คุณควรสร้างคู่คีย์แยกต่างหากสำหรับกิจกรรมที่แยกจากกัน หนึ่งคู่คีย์สำหรับการอัปโหลดภาพ อื่นสำหรับการสำรองฐานข้อมูลของคุณ เป็นต้น
ด้วยการดำเนินการนี้ คุณสามารถจำกัดความเสียหายของการละเมิดความปลอดภัยได้