กลยุทธ์ในการเก็บรักษาข้อมูลลับเช่นคีย์ API อยู่นอกการควบคุมของแหล่งที่มาหรือไม่


217

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

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

ในฐานะที่ฉันเป็นไอ้เลวราคาถูกฉันก็อยากใช้บริการควบคุมแหล่งข้อมูลฟรีเช่น TFS ในคลาวด์หรือ GitHub สิ่งนี้ทำให้ฉันมีปริศนาเล็กน้อย:

ฉันจะรักษาร่างกายของฉันให้เหมือนเดิมได้อย่างไรเมื่อคีย์ API ของฉันอยู่ในรหัสของฉันและรหัสของฉันจะมีอยู่ในที่เก็บสาธารณะ

ฉันสามารถนึกถึงวิธีการต่าง ๆ ในการจัดการกับสิ่งนี้ แต่ไม่มีวิธีใดที่น่าพอใจ

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

ฉันกำลังมองหาวิธีการรับประกันเพื่อให้แน่ใจว่าฉันจะไม่แบ่งปันทรัพย์สินส่วนตัวของฉันกับโลก (ยกเว้นใน snapchat) ที่จะทำงานได้อย่างราบรื่นผ่านการพัฒนาการแก้ไขข้อบกพร่องและการปรับใช้และจะเข้าใจผิดได้เช่นกัน นี่ไม่สมจริงอย่างสมบูรณ์ แล้วฉันจะทำอะไรที่แนบเนียน?

รายละเอียดทางเทคนิค: VS2012, C # 4.5, การควบคุมแหล่งข้อมูลอาจเป็นบริการ TF หรือ GitHub ขณะนี้ใช้คลาสบางส่วนเพื่อแยกคีย์ที่ละเอียดอ่อนออกในไฟล์. cs แยกที่จะไม่ถูกเพิ่มลงในการควบคุมแหล่งที่มา ฉันคิดว่า GitHub อาจมีข้อได้เปรียบเนื่องจากสามารถใช้. gignignore เพื่อให้แน่ใจว่าไฟล์คลาสบางส่วนไม่ได้เช็คอิน แต่ฉันเมาก่อนหน้านี้ ฉันหวังว่าจะเป็น "โอ้ปัญหาทั่วไปนี่คือวิธีที่คุณทำ" แต่ฉันอาจต้องจัดการเพื่อ "ที่ไม่ดูดมากเท่าที่จะมี",: /


6
คุณสามารถตรวจสอบให้แน่ใจว่าไฟล์การกำหนดค่าที่เก็บคีย์ API ของคุณไม่ได้อยู่ในไดเรกทอรีควบคุมที่มาซึ่งจะทำให้ไม่สามารถตรวจสอบได้ในตอนแรก
David Sergey

22
BitBucket.org มีที่เก็บส่วนตัวไม่ จำกัด ฟรี. และผู้นำเข้าพื้นที่เก็บข้อมูล gitHub (เก็บประวัติ)
Rob van der Veer

4
@Dainius ฉันไม่ไว้วางใจนักพัฒนาของฉันเพราะฉันรู้จักพวกเขา อย่างใกล้ชิด ที่จริงแล้วฉันสนิทสนมกับตัวเองอย่างน้อย ... ไม่ฉันจะปล่อยให้สิ่งนั้นโกหก แต่ฉันรู้ว่ามันง่ายแค่ไหนที่จะทำให้เมาขึ้นและมันยากแค่ไหนที่จะขัดเกลาประวัติของอาการเมายาดังกล่าว
จะ

15
@Dainius: ใช่ ฉันดูอักขระทุกตัวในรหัสทีมของฉัน อย่างจริงจัง. ฉันไม่มีทางเลือก. ฉันไม่สามารถปิดตารหัสได้ ไม่น่าเชื่อถืออย่างน้อย แต่ฉันทำเพราะฉันเป็นทีมของฉัน ฉันเป็นคนในทีม มีผู้พัฒนารายหนึ่งและเป็นฉัน ฉันเขา ใช่. ฉันเป็นคนที่จะทำให้เสียโฉมถ้าเขาทำไม่ถูก ฉัน.
จะ

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

คำตอบ:


128

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

ดูเพิ่มเติมที่คำถามการควบคุมเวอร์ชันและไฟล์กำหนดค่าส่วนบุคคลสำหรับวิธีการทำเช่นนี้ได้ดี


8
@RobertHarvey เพียงแค่ไม่ใส่ไว้ในการควบคุมเวอร์ชันโดยเพิ่มกฎการเพิกเฉยเมื่อจำเป็น ทุกคนที่ใช้ซอฟต์แวร์จะต้องสร้างไฟล์กำหนดค่าของตนเองด้วยคีย์ API ของตนเอง
ฟิลิปป์

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

4
ค่าเริ่มต้นจากโรงงานเป็นส่วนหนึ่ง "ตัวติดตั้ง" หรือ "ตัวช่วยสร้างการเรียกใช้ครั้งแรก" อีกตัวหนึ่ง
johannes

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

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

29

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

private.key=#{systemEnvironment['PRIVATE_KEY']}

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

private.key=A_DEVELOPMENT_LONG_KEY

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

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

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

ปัญหานี้อาจเป็นเพราะทุกคนในเซิร์ฟเวอร์สามารถอ่านสภาพแวดล้อมได้
JasonG

envvars ของผู้ใช้สามารถอ่านได้โดยผู้ใช้หรือรูทเท่านั้น (Linux โบราณและ AIX ไม่ได้ทำสิ่งนี้)
Neil McGuigan

27

วิธี Git บริสุทธิ์

  • .gitignore ไฟล์ที่รวมอยู่กับข้อมูลส่วนตัว
  • ใช้สาขาท้องถิ่นที่คุณแทนที่TEMPLATEด้วยDATA
  • ใช้ตัวกรอง smudge / clean ซึ่งสคริปต์ของตัวกรอง (ภายในเครื่อง) ดำเนินการแทนที่แบบสองทิศทางTEMPLATE<->DATA

วิธี Mercurial

  • MQ-patch (es) ที่ด้านบนของรหัสจำลองซึ่งแทนที่TEMPLATEด้วยDATA(เซ็ตการแก้ไขเป็นแบบสาธารณะส่วนแพตช์เป็นแบบส่วนตัว)
  • ส่วนขยายคำหลักพร้อมคำหลักที่ออกแบบมาเป็นพิเศษ (ขยายเฉพาะในไดเรกทอรีทำงานของคุณ )

วิธี SCM ผู้ไม่เชื่อเรื่องพระเจ้า

  • มีการแทนที่คำหลักซึ่งเป็นส่วนหนึ่งของกระบวนการสร้าง / ปรับใช้

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

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

11
@shabunc - RTFM! ไฟล์ที่ถูกเพิกเฉยไม่ได้เก็บไว้ใน repo
Lazy Badger

9
@ LazyBadger - ฉันรู้ดีว่ามันถูกละเว้น ฉันยังรู้ว่าเมื่ออยู่ในการซื้อคืนมีโอกาสเสมอที่ใครบางคนที่ไม่เคยผิดพลาดจะเพิ่มมันอย่างใดเพื่อซื้อคืน เส้นทางการกำหนดค่าภายนอกบางอย่างดีกว่า
shabunc

4
@shabunc - จุดที่ดีในการป้องกันไม่ให้ config ออกจากเส้นทาง SCM นี่คือเหตุผลที่ยกตัวอย่างเช่น Postgres อนุญาตให้คุณข้ามการตรวจสอบรหัสผ่านโดยใส่รหัสผ่านลงในไฟล์ แต่พวกเขาต้องการให้ใส่รหัสผ่านใน ~ / .pgpass - ซึ่งสันนิษฐานว่าไม่ใช่ตำแหน่งที่สะดวกมากในการตรวจสอบการควบคุมแหล่งที่มา พวกเขารู้ว่าสำหรับระบบอัตโนมัติพวกเขาต้องให้ปืนกับคุณ แต่พวกเขาทำงานอย่างหนักเพื่อป้องกันไม่ให้คุณยิงด้วยตัวคุณเองด้วยเท้าของมัน ..
Steve Midgley

14

ฉันใส่ความลับลงในไฟล์ที่เข้ารหัสซึ่งฉันจะส่ง วลีรหัสผ่านมีให้เมื่อระบบเปิดตัวหรือถูกเก็บไว้ในไฟล์ขนาดเล็กที่ฉันไม่ได้กระทำ เป็นเรื่องดีที่ Emacs จะจัดการไฟล์ที่เข้ารหัสเหล่านี้อย่างมีความสุข ตัวอย่างเช่นไฟล์ init ของ emacs รวมถึง: (โหลด "secret.el.gpg") ซึ่งใช้ได้เพียงแจ้งรหัสผ่านเกี่ยวกับเหตุการณ์ที่เกิดขึ้นได้ยากเมื่อฉันเริ่มแก้ไข ฉันไม่ต้องกังวลกับคนที่ทำลายการเข้ารหัส


3
นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยม - ฉันประหลาดใจที่คุณไม่มีคะแนนมากขึ้น ฉันทำงานกับ บริษัท ที่จัดการกับข้อมูลนักเรียนซึ่งถูกควบคุมโดยรัฐบาลกลางในสหรัฐอเมริกาดังนั้นพวกเขาจึงต้องระมัดระวังเป็นพิเศษกับข้อมูลประจำตัวและความลับ พวกเขายังเป็น บริษัท ขนาดใหญ่ดังนั้นพวกเขาจึงจำเป็นต้องใช้ SCM สำหรับข้อมูลประจำตัวเพื่อให้ IT สามารถค้นหา / จัดการพวกเขาหลังจากที่ engr สร้างพวกเขา ทางออกของคุณคือสิ่งที่พวกเขาทำ มีคีย์ไฟล์ถอดรหัสที่เก็บคีย์ถอดรหัสสำหรับ dev / staging / prod / etc (หนึ่งไฟล์สำหรับแต่ละไฟล์) จากนั้นความลับทั้งหมดจะถูกเข้ารหัสและตรวจสอบลงในไฟล์ ถอดรหัสไฟล์จะใช้ในการรับพวกเขาในแต่ละสภาพแวดล้อม
Steve Midgley

7
ในบางแง่การเข้ารหัสลับ (คีย์ API ในกรณีนี้) เพียงแค่เปลี่ยนปัญหาจากการไม่ส่งข้อมูลลับเพื่อไม่ส่งวลีรหัสผ่าน (ซึ่งตอนนี้กลายเป็นข้อมูลลับ ) แต่แน่นอนว่าการขอเปิดใช้ระบบเป็นตัวเลือกที่ดี
siegi

ฉันชอบวิธีนี้ ชนิดของไฟล์ที่เข้ารหัสที่คุณยอมรับอาจเป็นไฟล์ KeePass มันจะมีรายการสำหรับแต่ละสภาพแวดล้อมโดยใช้notesฟิลด์เพื่อเก็บเนื้อหาของไฟล์. env ไม่กี่เดือนหลังฉันเขียนเครื่องมือที่สามารถอ่านไฟล์ keepass และสร้างไฟล์. env โดยใช้notesฟิลด์ของรายการ ฉันกำลังคิดที่จะเพิ่มคุณสมบัติเพื่อให้ฉันสามารถทำrequire('switchenv').env()ที่ด้านบนของโปรแกรม Node.js และสร้างตัวแปร process.env ตามรายการที่ตรงกับ NODE_ENV หรืออะไรทำนองนั้น -> github.com/christiaanwesterbeek/switchenv
Christiaan Westerbeek

14

นี่เป็นเฉพาะสำหรับ Android / Gradle แต่คุณสามารถกำหนดคีย์ในgradle.propertiesไฟล์โกลบอลของคุณuser home/.gradle/ได้ สิ่งนี้ยังมีประโยชน์เนื่องจากคุณสามารถใช้คุณสมบัติที่แตกต่างกันขึ้นอยู่กับ buildType หรือรสชาติเช่น API สำหรับ dev และอีกหนึ่งคุณสมบัติที่จะปล่อย

gradle.properties

MY_PRIVATE_API_KEY=12356abcefg

build.gradle

buildTypes {
        debug{
            buildConfigField("String", "GOOGLE_VERIFICATION_API_KEY", "\"" + MY_PRIVATE_API_KEY +"\"")
            minifyEnabled false
            applicationIdSuffix ".debug"
            }
        }

ในรหัสที่คุณต้องการอ้างอิงเช่นนี้

String myAPI = BuildConfig.GOOGLE_VERIFICATION_API_KEY;

BuildConfig แปลเป็นไฟล์ต้นฉบับที่สอดคล้องกันดังนั้นวิศวกรรมย้อนกลับง่าย ๆ ใน apk ของคุณจะเปิดเผยกุญแจและความลับเหล่านั้นทั้งหมดที่คุณใส่ไว้ใน BuildConfig
Dmitri Livotov

1
แน่นอนจุดที่ถูกต้อง แต่คำถามก็คือวิธีที่จะทำให้รหัส API จากรหัสแหล่งที่มาไม่ใช่ไบนารี
scottyab

11

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

แอปพลิเคชันเว็บมือถือ

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

แอปพลิเคชันเว็บที่โฮสต์

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

รหัสที่มาเผยแพร่

คุณจัดเก็บซอร์สโค้ดของคุณในที่เก็บสาธารณะ แต่ไม่ใช่ KEY ในการกำหนดค่าของไฟล์ที่คุณเพิ่มสาย* ที่สำคัญเกิดขึ้นที่นี่ * เมื่อนักพัฒนาใช้ซอร์สโค้ดของคุณพวกเขาจะทำสำเนาsample.cfgไฟล์และเพิ่มรหัสของตนเอง

คุณไม่เก็บconfig.cfgไฟล์ของคุณไว้ใช้สำหรับการพัฒนาหรือการผลิตในที่เก็บ


4
คำถามนี้ถามว่าจะทำอย่างไรไม่อย่างแน่นอน ความจริงก็คือรหัสเหล่านี้จำเป็นต้องใช้รหัสดังนั้นจึงสามารถเข้าถึงได้โดยรหัสและมักจะหมายถึงผ่านรหัสหรือไฟล์การกำหนดค่าซึ่งหากพวกเขาไม่ได้อยู่ในแหล่งที่มาด้วยกันอย่างน้อยพวกเขาอย่างใกล้ชิดและอาจจบด้วย แหล่ง แอพพลิเคชั่นเว็บที่โฮสต์นั้นไร้สาระโชคไม่ดี คุณไม่ต้องสมัครเพื่อใช้รหัส api เพื่อเข้าสู่ StackOverflow ผ่านบัญชี facebook ของคุณ วางรหัสที่นี่เป็น oversimplification ขนาดใหญ่ที่จะไม่ทำงานในสภาพแวดล้อม dev-> ผับตามที่อธิบายไว้ในคำถาม
Will

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

7
ถ้าเช่นนั้นเราจะป้องกันบริการเผยแพร่ทางเว็บที่สำคัญได้อย่างไร ใช้กุญแจอีกดอก?
Jiangge Zhang

Ditto สิ่งที่ @JianggeZhang พูด - นี่เป็นคำแนะนำที่อันตราย
David K. Hess

5

ใช้ตัวแปรสภาพแวดล้อมสำหรับสิ่งลับที่เปลี่ยนแปลงสำหรับแต่ละเซิร์ฟเวอร์

http://en.wikipedia.org/wiki/Environment_variable

วิธีใช้งานจะขึ้นอยู่กับภาษา


3
การรักษาความปลอดภัยผ่านความสับสนไม่ได้เป็นวิธีที่แนะนำสำหรับหลาย ๆ คน คุณสนใจที่จะอธิบายรายละเอียดให้ชัดเจนขึ้นหรือไม่?

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

4

ฉันคิดว่านี่เป็นปัญหาที่ทุกคนประสบปัญหาในบางครั้ง

นี่คือขั้นตอนการทำงานที่ฉันใช้ซึ่งอาจใช้ได้ผลกับคุณ มันใช้. gignignore ด้วยการบิด:

  1. ไฟล์การกำหนดค่าทั้งหมดไปในโฟลเดอร์พิเศษ (ด้วยไฟล์กำหนดค่าตัวอย่าง - ตัวเลือก)
  2. ไฟล์การกำหนดค่าทั้งหมดจะรวมอยู่ใน. gitignore เพื่อไม่ให้เป็นสาธารณะ
  3. ติดตั้งเซิร์ฟเวอร์ gitolite (หรือเซิร์ฟเวอร์ git ที่คุณชื่นชอบ) บนกล่องส่วนตัว
  4. เพิ่ม repo ด้วยไฟล์ปรับแต่งทั้งหมดในเซิร์ฟเวอร์ส่วนตัว
  5. เพิ่มสคริปต์เพื่อคัดลอกไฟล์กำหนดค่าไปยังโฟลเดอร์พิเศษใน repo หลัก (ตัวเลือก)

ตอนนี้คุณสามารถโคลน repo config กับระบบการพัฒนาและการปรับใช้ใด ๆ เพียงแค่เรียกใช้สคริปต์เพื่อคัดลอกไฟล์ไปยังโฟลเดอร์ที่ถูกต้องและคุณเสร็จแล้ว

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

ฉันใช้กล่อง 15 $ / ปีสำหรับเซิร์ฟเวอร์ git ส่วนตัว แต่คุณสามารถติดตั้งที่บ้านได้ตามความต้องการของ cheapskate ;-)

PS: คุณยังสามารถใช้ submodule git ( http://git-scm.com/docs/git-submodule ) แต่ฉันมักจะลืมคำสั่งเสมอกฎที่รวดเร็วและสกปรก!


2

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

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


1

3 กลยุทธ์ที่ยังไม่ได้กล่าวถึง (?)

เมื่อเช็คอินหรืออยู่ในตะขอเช็คอิน VCS ล่วงหน้า

  • ค้นหาสตริงที่มีเอนโทรปีสูง, ตัวอย่าง - detect-secret
  • regex ค้นหารูปแบบคีย์ API ที่เป็นที่รู้จักกันดี ปุ่ม AKIA * ของ AWS เป็นตัวอย่างหนึ่งความลับ gitเป็นเครื่องมือหนึ่งที่อ้างอิง นอกจากนี้ชื่อตัวแปรเช่น 'รหัสผ่าน' ที่มีการกำหนดค่าคงที่
  • ค้นหาความลับที่รู้จัก - คุณรู้ความลับของคุณค้นหาข้อความสำหรับพวกเขา หรือใช้เครื่องมือฉันเขียนหลักฐานแนวคิดนี้

กลยุทธ์ที่กล่าวมาแล้ว

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

0

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

ประโยชน์ที่ได้รับ:

  • ไม่ถือว่าเอนทิตีพัฒนา == เอนทิตีผลิต
  • ไม่ถือว่าผู้ทำงานร่วมกัน / ผู้ตรวจสอบรหัสทั้งหมดเชื่อถือได้
  • ป้องกันข้อผิดพลาดง่าย ๆ โดยทำให้มันอยู่นอกเหนือการควบคุมเวอร์ชัน
  • ง่ายต่อการติดตั้งอัตโนมัติด้วยการกำหนดค่าที่กำหนดเองสำหรับ QA / สร้าง

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

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


-2

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

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

แก้ไข: ลองใช้Stanford Javascript Crypto Libraryซึ่งจะช่วยให้การเข้ารหัส / ถอดรหัสสมมาตรมีความปลอดภัย


1
โดยทั่วไปแล้วแฮ็ชจะมีสัญญาณรบกวนแบบทางเดียว มีอัลกอริธึมการเข้ารหัสแบบสมมาตรที่จะทำตามที่คุณแนะนำ

3
เพื่อนคุณไม่สามารถถอดรหัส (ง่าย) แฮช นั่นคือจุดรวมของการแฮช สิ่งนี้มีไว้สำหรับ ME ที่ใช้ API ของคนอื่นซึ่งพวกเขากำหนดรหัสลับให้ฉัน hashing ของฉันช่วยให้มั่นใจได้ (เว้นแต่ฉันจะเลือก algo ที่ไม่ดีและแตกมันทุกครั้ง) ที่ฉันไม่สามารถใช้ API ของพวกเขาได้
จะ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.