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


23

ฉันมีกลุ่มของเซิร์ฟเวอร์แต่ละไฟล์ที่มีการกำหนดค่าที่ปัจจุบันมีรหัสผ่านข้อความธรรมดาสำหรับระบบที่สำคัญภารกิจสำคัญ (คิวข้อความที่เก็บข้อมูลและบริการอื่น ๆ )

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

นี่เป็นวิธีที่ดีที่สุดในการหลีกเลี่ยงรหัสผ่านในไฟล์กำหนดค่าข้อความล้วนหรือมีวิธีที่ดีกว่านี้หรือไม่?


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

ความคิดที่ดีแฟรงค์ ถ้าคุณใช้ crypto คุณจะใช้ระบบประเภทใด มีบางอย่างที่ใช้คีย์ RSA / SSH เครื่องมือพวงกุญแจหรืออย่างอื่นใช่ไหม ขณะนี้เราใช้ Linux> 2.6 ระบบเช่น CentOS และ Amazon
Steve HHH

คำตอบ:


11

หากคุณใช้ระบบ Linux ให้ดูที่ / proc / * / environ และตัดสินใจว่าตัวแปรสภาพแวดล้อมเป็นสถานที่ที่ดีในการจัดเก็บข้อมูลที่สำคัญหรือไม่ / proc / self เป็นกระบวนการปัจจุบัน:

$ tr '\0' '\n' < /proc/self/environ
USER=me
LOGNAME=me
HOME=/home/me
PATH=/usr/bin:/bin:/usr/sbin:/sbin
MAIL=/var/mail/me
SHELL=/usr/bin/sh
SSH_CLIENT=1.2.3.4 58195 22
SSH_CONNECTION=1.2.3.4 58195 7.8.9.0 22
SSH_TTY=/dev/pts/1
TERM=xterm

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

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

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


2
สำหรับรุ่นล่าสุดของลินุกซ์ตัวแปรสภาพแวดล้อมอาจจะเป็นเช่นเดียวกับการรักษาความปลอดภัยเป็นไฟล์
Kenny Evitt

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

1
คำสั่ง tr ที่คุณให้ใช้ไม่ได้ผลกับฉัน - สิ่งนี้ทำได้:cat /proc/self/environ | tr '\0' '\n'
robocat

ฉันอยู่ในโทรศัพท์ของฉันดังนั้นจึงเป็นการยากที่จะบอก ... นั่นควรจะเป็นศูนย์ คุณพิมพ์ตัวอักษร "o" หรือไม่?
dannysauer

8

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

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

ฉันควรทำอย่างไรถ้าฉันต้องการปกป้องข้อมูลบางอย่างในระบบที่มีภารกิจวิกฤติ:

  1. ใช้การเข้ารหัสดิสก์แบบเต็มเพื่อให้เนื้อหาของที่เก็บข้อมูลถาวรทั้งหมดได้รับการเข้ารหัส

  2. จำกัด การเข้าถึงทางกายภาพของเครื่อง ล็อคตัวเครื่องของเครื่องด้วยกลไกการล็อคที่ปลอดภัยและควบคุมการเข้าใช้กุญแจ จ้างกล้ามเนื้อ (ยามติดอาวุธ) เพื่อเฝ้าประตูเพื่อเข้าใช้

  3. บังคับใช้ Mandatory Access Control (MAC) อย่างละเอียดในระบบปฏิบัติการของอุปกรณ์ คุณสามารถเริ่มต้นด้วยสิ่งต่าง ๆ เช่น SELinux บน GNU / Linux และตั้งค่าเป็นบังคับใช้แล้วปรับนโยบายให้ตรงกับความต้องการที่แท้จริงของซอฟต์แวร์ที่ใช้งานจริงซึ่งอนุญาตให้บัญชีเหล่านั้น (และเท่านั้น) ได้รับอนุญาตที่จำเป็นสำหรับไฟล์ที่ต้องการ

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

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

นี่ไม่ใช่รายการที่สมบูรณ์ แต่โดยเฉพาะอย่างยิ่งจุดที่ 4 อาจเกี่ยวข้องกับคุณแม้ว่าคุณจะไม่ได้ทำตามขั้นตอนที่ 1 ถึง 3 อย่างน้อยการพิจารณาถึงจุดที่ 4 และจุดที่ 5 จะไม่ช่วยคุณมากนักเนื่องจากคุณ ระบบไม่ปลอดภัยในระดับพื้นฐานพอสมควร


ฉันจะข้าม # 1 หากระบบกำลังทำงานอยู่ระบบไฟล์จะถูกเมาท์และไม่เข้ารหัส หากไม่ได้ทำงานการควบคุมการเข้าถึงทางกายภาพของคุณควรจะเพียงพอ หากต้องการเริ่มระบบใหม่คุณต้องการใครสักคนที่จะให้รหัสถอดรหัสในการบู๊ตทุกครั้ง (ซึ่งน่ารำคาญ) หรือคุณต้องมีเครื่องที่ให้บริการ - ในกรณีนี้ข้อมูลประจำตัวมักจะมีให้ทุกคนที่สามารถเข้าถึงฮาร์ดไดรฟ์ได้ . เครื่อง "เซิร์ฟเวอร์" ส่วนใหญ่มักจะไม่ใช้การเข้ารหัสดิสก์เนื่องจากเสียค่าใช้จ่าย :)
dannysauer

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

1
# 1 มีความสำคัญในกรณีที่บางส่วนของ ram ชนกับดิสก์ (การแลกเปลี่ยน) หรือถ้ามันเข้าสู่เซกเตอร์ ssd ซึ่งกลายเป็น "ไม่ดี" ในภายหลังและถูกย้ายออกไปจากระบบปฏิบัติการ แต่ยังคงเก็บชิ้นส่วนนั้นไว้ แม้ว่าดิสก์จะถูกปลดล็อกในขณะนั้นข้อมูลจำนวนมากก็ถูกรบกวนบนจาน
akira

3

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

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

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

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

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

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

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