มีวิธีจัดการกับข้อมูลที่ละเอียดอ่อนอย่างไรเมื่อใช้ Github และ Heroku


49

ฉันยังไม่คุ้นเคยกับวิธีการทำงานของ Git (และสงสัยว่ามีบางคนที่อยู่นอกเหนือจาก Linus คือ))

หากคุณใช้ Heroku เพื่อโฮสต์แอปพลิเคชันของคุณคุณจะต้องตรวจสอบรหัสของคุณใน Git repo หากคุณทำงานในโครงการโอเพ่นซอร์สคุณมีแนวโน้มที่จะแบ่งปัน repo นี้กับ Github หรือโฮสต์ Git อื่น ๆ

ไม่ควรตรวจสอบบางสิ่งใน repo สาธารณะ รหัสผ่านฐานข้อมูล, คีย์ API, ใบรับรอง ฯลฯ ... แต่สิ่งเหล่านี้ยังคงต้องเป็นส่วนหนึ่งของ Git repo เนื่องจากคุณใช้มันเพื่อส่งรหัสของคุณไปยัง Heroku

วิธีการทำงานกับกรณีการใช้งานนี้?

หมายเหตุ: ฉันรู้ว่า Heroku หรือ PHPFog สามารถใช้ตัวแปรเซิร์ฟเวอร์เพื่อหลีกเลี่ยงปัญหานี้ คำถามของฉันเกี่ยวกับวิธี "ซ่อน" บางส่วนของรหัส


3
ฉันจะเริ่มต้นด้วยการใช้ repo ส่วนตัว จากนั้นขึ้นอยู่กับว่าฉันไว้ใจมากแค่ไหนฉันอาจ. gog ลงชื่อเข้าใช้ไฟล์ปรับแต่งของฉันที่มีข้อมูลที่ละเอียดอ่อน (Local เป็นตำแหน่งที่ไม่ใช่ภายนอกกลางซึ่งอาจจะเป็นในบ้านหรือเซิร์ฟเวอร์ที่รู้)
Rig

คำตอบ:


30

วิธีที่ต้องการในการเก็บรหัสผ่าน / คีย์ api เป็นความลับใน heroku คือการตั้งค่ากำหนดค่าผ่านทางแอพพลิเคชั่นบรรทัดคำสั่ง heroku ตัวอย่างต่อไปนี้นำมาจากบทความในศูนย์ dev heroku

(ตัวอย่างด้านล่างและคำตอบทั้งหมดของฉันเกี่ยวข้องกับแอพทางรถไฟ)

$ cd myapp
$ heroku config:add S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190
Adding config vars and restarting myapp... done, v14
S3_KEY:     8N029N81
S3_SECRET:  9s83109d3+583493190

จากนั้นอ้างอิงค่ากำหนดเหล่านี้ในรหัสของคุณโดยใช้ตัวแปร ENV []

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

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

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

นอกจากนี้หากคุณใช้แอปพลิเคชั่นของคุณเองและต้องการให้มันเป็นแบบส่วนตัวทางเลือกที่ดีสำหรับ GitHub คือbitbucketซึ่งให้บริการพื้นที่เก็บข้อมูลส่วนตัวฟรี


17

แนวคิดหลายประการ ... การเข้ารหัสคีย์สาธารณะเป็นคำตอบที่ยืดหยุ่นที่สุด

ความสับสน (สำหรับรหัสเท่านั้น)

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

พื้นที่เก็บข้อมูล GIT ส่วนตัว

มันต้องเป็นที่เก็บคอมไพล์สาธารณะหรือไม่?

ที่เก็บข้อมูลเซิร์ฟเวอร์

คุณสามารถเก็บข้อมูลนี้ไว้ในไฟล์ที่มีการป้องกันในโฮมไดเร็กตอรี่ของบัญชีผู้ใช้ที่แอปพลิเคชันทำงานอยู่ได้หรือไม่? ฉันจะคัดลอกวิธีที่ ssh ทำเช่นนี้กับ ~ / .ssh / id_rsa และ chmod ของ 600 หากไม่สามารถใช้ตัวแปรสภาพแวดล้อมได้ คุณต้องการที่อื่นบนเซิร์ฟเวอร์เพื่อจัดเก็บคีย์บางประเภทหรือไม่มีวิธีใดที่คุณสามารถป้องกันสิ่งใด ๆ ได้

การเข้ารหัสแบบสมมาตร (สำหรับคุณเท่านั้น)

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

การเข้ารหัสแบบอสมมาตร (สำหรับนักพัฒนาหลายคน)

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

เครื่องมือ

Openssl อาจเป็นเครื่องมือเข้ารหัสเท่านั้นที่คุณต้องการ อย่าเขียนอัลกอริทึมการเข้ารหัสของคุณเองหรือการใช้อัลกอริทึมที่เผยแพร่ของคุณเอง

ปิดความคิด

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


ในการเพิ่ม WRT ไปยังที่เก็บข้อมูลฝั่งเซิร์ฟเวอร์ - ฉันไม่รู้ว่าคุณสามารถทำสิ่งนี้กับ Heroku ได้หรือไม่ แต่ฉันได้เห็นการตั้งค่าที่สคริปต์ถูกเรียกใช้จากตะขอหลังการรับและ / หรือบางอย่างเช่น Capistrano บนเซิร์ฟเวอร์การปรับใช้ คัดลอกไฟล์ฐานข้อมูลการปรับใช้ไปยังตำแหน่งที่ถูกต้อง สิ่งนี้ช่วยให้คุณสามารถเก็บไฟล์ฐานข้อมูลออกจาก repo ได้อย่างสมบูรณ์และมีกลไกอัตโนมัติเพื่อให้แน่ใจว่าข้อมูลดังกล่าวยังคงอยู่
Shauna

แม้แต่ repos GIT ส่วนตัวก็ควรปกป้องข้อมูลที่สำคัญ ในกรณีที่มันสาธารณะโดยอุบัติเหตุในขณะที่ นอกจากนี้ฉันคิดว่าควรใช้ crypto แบบอสมมาตรแทนการใช้สมมาตร ฉันไม่เห็นข้อเสียของมันเลยมีเพียงข้อเสียเท่านั้น: คุณสามารถปล่อยให้ API อยู่ที่ไหนสักแห่งเพื่อให้ง่ายต่อการเข้ารหัสข้อมูลที่ละเอียดอ่อนที่ต้องเข้ารหัสแบบใหม่
Tiberiu-Ionuț Stan

7

หากคุณต้องการเรียกใช้รหัสของคุณบน Heroku คุณต้องให้รหัสกับพวกเขา - คุณไม่สามารถเก็บ "ความลับ" จากผู้ให้บริการโฮสต์ของคุณ

ถ้าโครงการของคุณเป็นโอเพ่นซอร์ส แต่คุณไม่ต้องการแชร์รายละเอียดของโฮสติ้งคุณจะต้องรักษาความเป็นส่วนตัวของโปรเจ็กต์ของคุณเพื่อจุดประสงค์ในการปรับใช้


1
ขอบคุณ แต่เวิร์กโฟลว์สำหรับสิ่งนี้คืออะไร
Jonas

6

คุณไม่ควรซ่อนบางส่วนของรหัส ความปลอดภัยของระบบของคุณไม่ควรขึ้นอยู่กับความลับของรหัส ที่เรียกว่า "ความปลอดภัยผ่านความสับสน" ซึ่งผู้เชี่ยวชาญด้านความปลอดภัยขมวดคิ้วเพราะมันทำงานได้ไม่ดีนัก

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

สำคัญ: อย่าเข้ารหัสคีย์รหัสลับรหัสผ่านหรือความลับอื่น ๆ ในซอร์สโค้ดของคุณ! นั่นเป็นการฝึกฝนที่แย่มาก

ดูสิ่งนี้ด้วย:

Plug: IT Security.SEเป็นสถานที่ที่เหมาะสำหรับถามคำถามเกี่ยวกับความปลอดภัย!

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